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)

}