void ChebyshevFitterTest::testFit() {
	ims::ChebyshevFitter fitter2(2);
	std::vector<double> a;
	std::vector<double> b;
	
	/* test identity transformation */
	a.push_back(-31.7);  b.push_back(-31.7);
	a.push_back(0.0);    b.push_back(0.0);
	a.push_back(2.0);    b.push_back(2.0);
	a.push_back(17.0);   b.push_back(17.0);
	a.push_back(22.0);   b.push_back(22.0);
	a.push_back(500.0);  b.push_back(500.0);
	a.push_back(2000.0); b.push_back(2000.0);
	a.push_back(3000.0); b.push_back(3000.0);
	
	std::auto_ptr<ims::PolynomialTransformation> pt1 = fitter2.fit(a.begin(), a.end(), b.begin(), b.end());
	
	std::vector<double>::const_iterator cit;
	for (cit = a.begin(); cit != a.end(); ++cit) {
		// TODO: it seems that CPPUNIT_ASSERT_DOUBLES_EQUAL does not fail if one of the doubles is NaN
		CPPUNIT_ASSERT_DOUBLES_EQUAL( *cit, pt1->transform(*cit), 1.0e-10 );
	}
	
	/* test a different transformation */
	// create a transformation
	ims::PolynomialTransformation pt_tmp(5);
	pt_tmp.setCoefficient(0, 3.7);
	pt_tmp.setCoefficient(1, 2.529);
	pt_tmp.setCoefficient(2, -19.3);
	pt_tmp.setCoefficient(3, 1409.7);
	pt_tmp.setCoefficient(4, 13.62);
	pt_tmp.setCoefficient(5, -7.0);
	
	// transform a to b using pt_tmp
	b.clear();
	//std::vector<double>::iterator it;
	for (cit = a.begin(); cit != a.end(); ++cit) {
		b.push_back(pt_tmp.transform(*cit));
	}
	
	// estimate 5th degree polynomial
	ims::ChebyshevFitter fitter5(5);
	std::auto_ptr<ims::PolynomialTransformation> pt2 = fitter5.fit(a.begin(), a.end(), b.begin(), b.end());
	
	// ... and compare to original
	for (size_t i = 0; i <= 5; ++i) {
		CPPUNIT_ASSERT( !isnan(pt2->getCoefficient(i)) );
		// leave 1.0e-5 in here, 1.0e-8 is too strict
		CPPUNIT_ASSERT_DOUBLES_EQUAL( pt_tmp.getCoefficient(i), pt2->getCoefficient(i), 1.0e-5 );
	}
}
Пример #2
0
void Fit2(){
  ///  dz = zs-z = -s*vr *(z0-s*z)+s*dzt
  ///  dzs/dl = dz/dl +s*s*vr*dz/dl
  ///  d(dz/dl) = vr*dz/dl

  TLinearFitter fitter2(7, "hyp6");
  // parameters
  // 0 - P3   offset
  // 1 - P1   offset
  // 2 - vdr  factor
  //
  // 3 - side offset P3
  // 4 - side offset P1
  //
  // 5 - vdr difference -A side - C side
  // 6 - vdr gradient   -sin(alpha)*tl dependence 


  //  dz = zs-z = -s*vr *(z0-s*z)+s*dzt = [1] + [2]*(-s*(z0-s*z))+ [4]*s +[5]* (-s*s*(z0-s*z))      
  //  dz+= [6]*(-s*(z0-s*z))*sa
  //    
  //  d(dz/dl) = vr*dz/dl               = [0] + [2]*dz/dl        + [3]*s +[5]* s*dz/dl
  //   d(dz/dl)+= [6]*dz/dl*sa
  Double_t xxx[100];
  for (Int_t i=0;i<npoints;i++){
    for (Int_t jc =0;jc<10;jc++) xxx[jc]=0;
    // P1
    xxx[0] = 1;
    xxx[1] = -vside[i]*(250.0-vside[i]*vz[i]);
    xxx[3] = vside[i];
    xxx[4] = -vside[i]*vside[i]*(250.0-vside[i]*vz[i]);
    xxx[5] = -vside[i]*(250.0-vside[i]*vz[i])*vsa[i];
    fitter2.AddPoint(xxx,vdz[i],vez[i]);
    //P3
    for (Int_t jc =0;jc<10;jc++) xxx[jc]=0;
    xxx[1] = vtl[i];
    xxx[2] = vside[i];
    xxx[4] = vside[i]*vtl[i];
    xxx[5] = vtl[i]*vsa[i];
    fitter2.AddPoint(xxx,vdtl[i],vetl[i]);
  }
  fitter2.Eval();
  fitter2.GetParameters(fitParam2);  
  fitter2.GetErrors(errParam2);
  //  dz = zs-z = -s*vr *(z0-s*z)+s*dzt = [1] + [2]*(-s*(z0-s*z))+ [4]*s +[5]* (-s*s*(z0-s*z))      
  //  dz+= [6]*(-s*(z0-s*z))*sa
  //    
  //  d(dz/dl) = vr*dz/dl               = [0] + [2]*dz/dl        + [3]*s +[5]* s*dz/dl
  //   d(dz/dl)+= [6]*dz/dl*sa


  TString fstrP1f2 ="";
  TString fstrP3f2 ="";
  fstrP1f2+=fitParam2[1];fstrP1f2+="-side*(250.0-side*z)*(";fstrP1f2+=fitParam2[2];
  fstrP1f2+=")+side*("; fstrP1f2+=fitParam2[4];
  fstrP1f2+=")-side*side*(250.0-side*z)*("; fstrP1f2+=fitParam2[5];
  fstrP1f2+=")-side*(250.0-side*z)*sa*tl*(";fstrP1f2+=fitParam2[6];fstrP1f2+=")";
  //
  fstrP3f2+=fitParam2[0];fstrP3f2+="+tl*(";fstrP3f2+=fitParam2[2];
  fstrP3f2+=")+side*("; fstrP3f2+=fitParam2[3];
  fstrP3f2+=")+side*tl*("; fstrP3f2+=fitParam2[5];
  fstrP3f2+=")*tl*sa*("; fstrP3f2+=fitParam2[6];fstrP3f2+=")";
 
  //
  tree->SetAlias("fP1f2",fstrP1f2->Data());
  tree->SetAlias("fP3f2",fstrP3f2->Data());
  //
}