SplitStreamFileFormatReader::SplitStreamFileFormatReader(QObject *parent): LogFileFormatReader(parent)
{

    string temp_accel_names[] = {"Gps", "Compass", "Odometry", "Falling", "Fallen", "MotionGetupActive", "LLegEndEffector", "RLegEndEffector"};
    vector<string> sensor_names(temp_accel_names, temp_accel_names + sizeof(temp_accel_names)/sizeof(*temp_accel_names));
    m_tempSensors.addSensors(sensor_names);
    setKnownDataTypes();
    m_fileGood = false;
}
mystr Sensitivity::GetHeaderString() const  //returns header for output file
{
	mystr str("%HOTINT_Sensitivity_Analysis_Solution_File\n");
	if(mbs->GetModelFunctionsIndex0()!=-1)
	{
		str = str + "%" + mbs->GetModelsLibrary()->GetModelInterface(mbs->GetModelFunctionsIndex0())->GetMBSModelName() + "\n";
	}
  time_t t;	time(&t);  struct tm *ts;  ts = localtime(&t); // get current date and time
	str = str + "%" + asctime(ts);
	str = str + "%Comment: " + mbs->GetSolSet().sol_file_header_comment + "\n";
	str = str + "%Compute sensitivity of sensor values with respect to parameters\n";
	
	mystr colnumbers, colnames;
	// sensors
	str = str + "%Sensors: (rows of sensitivity matrix)\n";
	colnames = "%";
	colnumbers = "%";
	for(int i=1; i<=sensor_names.Length();i++)
	{
		colnames = colnames + *sensor_names(i) + mystr(" ");
		colnumbers = colnumbers + mystr(i);
		for(int j=colnumbers.Length(); j<colnames.Length(); j++)
		{
			colnumbers = colnumbers + " ";
		}
	}
	str = str + colnumbers + mystr("\n");
	str = str + colnames + mystr("\n");	
	
	
	// parameters
	str = str + "%Parameters: (columns of sensitivity matrix)\n";
	colnumbers = "%";
	colnames = "%";
	for(int i=1; i<=param_names.Length();i++)
	{
		colnames = colnames + *param_names(i) + mystr(" ");
		colnumbers = colnumbers + mystr(i);
		for(int j=colnumbers.Length(); j<colnames.Length(); j++)
		{
			colnumbers = colnumbers + " ";
		}
	}
	str = str + colnumbers + mystr("\n");
	str = str + colnames + mystr("\n");
	return str;
}
void Sensitivity::Init()
{
	mbs->OpenFiles(0); //open files already here, do not append
	ElementDataContainer* edc = mbs->GetMBS_EDC_Options();

	mystr method = edc->TreeGetString("SolverOptions.Sensitivity.method");

	// choose type of analysis
	if(method.Compare(mystr("Forward")))
	{
		type_diff = 1;  //  1 ... df/dx =~ (f(x+dx)-f(x))/dx        forward differentiation
	}
	else if(method.Compare(mystr("Backward")))
	{
		type_diff = -1; // -1 ... df/dx =~ (f(x)-f(x-dx))/dx        backward differentiation
	}
	else
	{
		type_diff = 0;  //  0 ... df/dx =~ (f(x+dx/2)-f(x-dx/2))/dx central differentiation		
	}
	
	// get parameter names
	if(edc->TreeGetInt("SolverOptions.Sensitivity.use_optimization_parameters"))
	{
		number_of_params = edc->TreeGetInt("SolverOptions.Optimization.Parameters.number_of_params");
		for (int col=1; col <= number_of_params; col++)
		{
			mystr str =	edc->TreeGetString(mystr("SolverOptions.Optimization.Parameters.param_name")+mystr(col));
			param_names(col) = new mystr(str);
		}	
	}
	else
	{
		number_of_params = edc->TreeGetInt("SolverOptions.Sensitivity.Parameters.number_of_params");
		for (int col=1; col <= number_of_params; col++)
		{
			mystr str =	edc->TreeGetString(mystr("SolverOptions.Sensitivity.Parameters.param_name")+mystr(col));
			param_names(col) = new mystr(str);
		}
	}

	abs_diff_val = edc->TreeGetDouble("SolverOptions.Sensitivity.num_diff_parameter_absolute");
	rel_diff_val = edc->TreeGetDouble("SolverOptions.Sensitivity.num_diff_parameter_relative");

	NCompSensors = 0; // sensor with computation value (case use_final_sensor_values == 0)

	for(int i = 1; i<=mbs->NSensors();i++)
	{
		mystr str =	"";		
		if(mbs->GetMBS_EDC_Options()->TreeGetInt("SolverOptions.Sensitivity.use_final_sensor_values",0))
		{
			str = mbs->GetSensor(i).GetSensorName();
			sensor_names(i) = new mystr(str); // store names for header
		}
		else
		{
			if(mbs->GetSensor(i).HasSensorProcessingEvaluationData())
			{
				str = mbs->GetSensor(i).GetSensorName();
				NCompSensors++;
				sensor_names(NCompSensors) = new mystr(str); // store names for header
			}
		}	
	}	

	mbs->SolParFile() << GetHeaderString(); // write header into output file (use sensor_names and parameter_names)

}