/** * Rotiert den Vektor um die angegebe Achse. * Dabei wird nicht der eigentliche Vektor, sondern eine Kopie rotiert, die zurückgegeben wird. * @param RotVekt der Richtungsvektor der Rotationsachse * @param Amount der Winkel, um den rotiert werden soll (in Grad) * @return der rotierte Vektor */ SGLVektor SGLVektor::Rotate(dvector RotVekt, GLdouble Amount) { RotVekt/=boost::numeric::ublas::norm_2(RotVekt); dmatrix RotMat(3,3); GLdouble x=RotVekt.SGLV_X,y=RotVekt.SGLV_Y,z=RotVekt.SGLV_Z; GLdouble c=COS(Amount),s=SIN(Amount); RotMat(0,0)=x*x*(1-c)+c; RotMat(0,1)=x*y*(1-c)-z*s; RotMat(0,2)=x*z*(1-c)+y*s; RotMat(1,0)=y*x*(1-c)+z*s; RotMat(1,1)=y*y*(1-c)+c; RotMat(1,2)=y*z*(1-c)-x*s; RotMat(2,0)=z*x*(1-c)-y*s; RotMat(2,1)=z*y*(1-c)+x*s; RotMat(2,2)=z*z*(1-c)+c; return dvector(boost::numeric::ublas::prod(RotMat, *this)); }
double Chi2Func(const double *xx ){ const Double_t DX = xx[0]; const Double_t DY = xx[1]; const Double_t DZ = xx[2]; const Double_t DPHIEuler = xx[3]; ///==== Euler angles const Double_t DTHETAEuler = xx[4]; const Double_t DPSIEuler = xx[5]; /// The transform rotates first, then translates. /// The Euler angles are gotten from HepRotation::eulerAngles() /// (a HepTransform3D is a HepRotation and a HepTranslation). // CLHEP::HepEulerAngles RotMat((CLHEP::HepRotationZ( DPHIEuler )).eulerAngles()); CLHEP::HepEulerAngles RotMat(DPHIEuler,DTHETAEuler,DPSIEuler); HepGeom::Transform3D RotoTrasl( RotMat, CLHEP::Hep3Vector(DX,DY,DZ)); myTree->SetEntryList(0); myTree->Draw(">> myList",globalCut.Data(),"entrylist"); TEntryList *myList = (TEntryList*)gDirectory->Get("myList"); //==== bux fix in ROOT see https://savannah.cern.ch/bugs/?60569 ==== /* TIter next( myList->GetLists() ); if (myList->GetLists() != 0){ // if ((int) myList->GetLists() != 0){ TEntryList *ilist; while( (ilist = (TEntryList*) *next ) ) { ilist->SetTreeName(myTree->GetName()); next(); } TEntryList *duplist = (TEntryList*) myList->Clone(); delete myList; myList = duplist; } else { myList->SetTreeName(myTree->GetName()); } */ //==== end bux fix in ROOT see https://savannah.cern.ch/bugs/?60569 ==== myTree->SetEntryList(myList); myTree->Draw("DeltaEtaIn:DeltaPhiIn:etaSC:phiSC","","para goff"); int nEntries = myList->GetN(); Double_t *vTemp = myTree->GetV1(); Double_t *vDEta = new Double_t[nEntries]; for (int iEntry = 0; iEntry<nEntries; iEntry++){ vDEta[iEntry] = vTemp[iEntry]; } Double_t *vTemp2 = myTree->GetV2(); Double_t *vDPhi = new Double_t[nEntries]; for (int iEntry = 0; iEntry<nEntries; iEntry++){ vDPhi[iEntry] = vTemp2[iEntry]; } Double_t *vEta = myTree->GetV3(); Double_t *vPhi = myTree->GetV4(); myTree->Draw("E5x5:eleCharge","","para goff"); Double_t *vEnergy = myTree->GetV1(); Double_t *vCharge = myTree->GetV2(); Double_t vErrDEta; Double_t vErrDPhi; Double_t vErrEta; Double_t vErrPhi; double Chi2 = 0; int counter = 0; for (int iEntry = 0; iEntry < nEntries; iEntry++){ if ((even && !(iEntry%2)) || (odd && (iEntry%2))) { // if (!(iEntry%10)) { counter++; // for (int iEntry = 0; iEntry<nEntries; iEntry++){ // if (!(iEntry/100)) std::cout << " iEntry = " << iEntry << " : " << nEntries << std::endl; // std::cerr << " " << vDEta[iEntry] << std::endl; // std::cerr << " " << vDPhi[iEntry] << std::endl; // std::cerr << " " << vEta[iEntry] << std::endl; // std::cerr << " " << vPhi[iEntry] << std::endl; // std::cerr << " " << vEnergy[iEntry] << " " << std::endl; vErrDEta = fabs((sqrt(3.6 / sqrt(vEnergy[iEntry]) * 3.6 / sqrt(vEnergy[iEntry]) + 12. / vEnergy[iEntry] * 12. / vEnergy[iEntry] + 0.54*0.54)) / 1000. / (Z * tan(2*atan(exp(-vEta[iEntry])))) * fabs(sin(2*atan(exp(-vEta[iEntry]))))); ///===> /1000 perchè è in "mm" -> "m" vErrDPhi = 1.3 * fabs((sqrt(3.6 / sqrt(vEnergy[iEntry]) * 3.6 / sqrt(vEnergy[iEntry]) + 12. / vEnergy[iEntry] * 12. / vEnergy[iEntry] + 0.54*0.54)) / 1000. / (Z * tan(2*atan(exp(-vEta[iEntry]))))); ///===> /1000 perchè è in "mm" -> "m" vErrEta = 0.0; vErrPhi = 0.0; ///==== (x,y,z) HepGeom::Point3D<double> xyz( Z / cos(2*atan(exp(-vEta[iEntry]))) * sin(2*atan(exp(-vEta[iEntry]))) * cos (vPhi[iEntry]), Z / cos(2*atan(exp(-vEta[iEntry]))) * sin(2*atan(exp(-vEta[iEntry]))) * sin (vPhi[iEntry]), Z ); ///==== (x',y',z') = RotoTrasl(x,y,z) HepGeom::Point3D<double> xyz_prime = RotoTrasl * xyz; ///==== deta / dphi [(x',y',z'),(x,y,z)] double deta = xyz.pseudoRapidity() - xyz_prime.pseudoRapidity(); ///==== deta_data = SC - Tracker double dphi = deltaPhi(xyz.phi() , xyz_prime.phi()); ///==== check sign convention!!!!!!!!!!!!!!!!!!!!! double ddeta = (vDEta[iEntry] - deta); double ddphi = (vDPhi[iEntry] - dphi); ddeta = ddeta - FunctionDeta->Eval(vEta[iEntry],vCharge[iEntry]); ddphi = ddphi - FunctionDphi->Eval(vEta[iEntry],vCharge[iEntry]); Chi2 += (ddeta / vErrDEta * ddeta / vErrDEta + ddphi / vErrDPhi * ddphi / vErrDPhi); } } std::cout << " Chi2 = " << Chi2 << " / " << counter << " = " << Chi2/counter << " - " << DX*1000 << " mm: " << DY*1000 << " mm: " << DZ*1000 << " mm: " << DPHIEuler << " : " << DTHETAEuler << " : " << DPSIEuler << std::endl; return Chi2; }