//----------------------------------------------------------- // // Description: // 3D Straight Line fitter // // Author List: // Mathias Michel // //----------------------------------------------------------- // This Class' Header ------------------ #include "PndLmdLinFitTask.h" // C/C++ Headers ---------------------- #include // Collaborating Class Headers -------- #include "FairRootManager.h" #include "TClonesArray.h" #include "PndLinTrack.h" #include "TrackData/PndTrackCand.h" #include "PndSdsHit.h" #include "TrackData/PndTrackCandHit.h" #include "TFile.h" #include "TGeoTrack.h" #include "TGeoManager.h" #include "TLorentzVector.h" // Fit Classes ----------- #include #include #include //#include //#include #include #include #include #include #include #include using namespace ROOT::Math; using namespace std; Double_t PndLmdLinFitTask::fz0 = 1099.; PndLmdLinFitTask::PndLmdLinFitTask() : FairTask("3D-Straight-Line-Fit") { fTCandBranchName = "LMDTrackCand"; fRecoBranchName = "LMDHitsStrip"; } PndLmdLinFitTask::~PndLmdLinFitTask() { } InitStatus PndLmdLinFitTask::Init() { //Get ROOT Manager FairRootManager* ioman= FairRootManager::Instance(); if(ioman==0) { Error("PndLmdLinFitTask::Init","RootManager not instantiated!"); return kERROR; } // Get input collection fTCandArray=(TClonesArray*) ioman->GetObject(fTCandBranchName); if(fTCandArray==0) { Error("PndLmdLinFitTask::Init","trackcand-array not found!"); return kERROR; } fRecoArray=(TClonesArray*) ioman->GetObject(fRecoBranchName); if(fRecoArray==0) { Error("PndLmdLinFitTask::Init","reco-array not found!"); return kERROR; } fTrackArray = new TClonesArray("PndLinTrack"); ioman->Register("LMDTrack", "PndLmd", fTrackArray, kTRUE); std::cout << "-I- PndLmdLinFitTask: Initialisation successfull" << std::endl; return kSUCCESS; } void PndLmdLinFitTask::Exec(Option_t* opt) { std::cout<<"PndLmdLinFitTask::Exec"<Delete(); Int_t ntcand=fTCandArray->GetEntriesFast(); // Detailed output if(fVerbose>1)std::cout<<" -I- PndLmdLinFitTask: contains "<2){ std::cout<< " Detailed Debug info on the candidates:"<At(itr); std::cout<< "TrackCand no. "<GetNHits()<<" hits."<GetNHits(); ihit++){ //fill Graph PndTrackCandHit theHit = trcnd->GetSortedHit(ihit); //get hit index = theHit.GetHitId(); detid = theHit.GetDetId(); std::cout << ihit << "\t" << index <20){ // std::cout<<"ntcand="<1)std::cout<<" -I- PndLmdLinFitTask: start Fitting "<At(track); const int numPts = trcnd->GetNHits(); //read how many points in this track if(fVerbose>2) std::cout << "Track: "<< track<< " Points: "<< numPts <getPosSeed(); cout<<"posSeed = "<getDirSeed(); cout<<"dirSeed = "<GetSortedHit(ihit); //get hit Int_t index = theHit.GetHitId(); Int_t detId = theHit.GetDetId(); //if(fVerbose>2) std::cout << "Point: "<< ihit<< " index: "<< index <At(index); TVector3 addPos = addHit->GetPosition(); fitme.SetPoint(ihit, addPos.X(), addPos.Y(), addPos.Z()); fitme.SetPointError(ihit, addHit->GetDx(), addHit->GetDy(), addHit->GetDz()); }//end of Hits in TCand Double_t parFit[4]; //fit-parameter Double_t parFitErr[4]; //errors of parameters // Double_t accuracy = line3Dfit(numPts, &fitme, parFit, parFitErr); Double_t accuracy = line3Dfit(numPts, &fitme, posSeed, dirSeed, parFit, parFitErr); PndLinTrack* trackfit = new PndLinTrack("Lumi", fz0, parFit[0], parFit[1], parFit[2], parFit[3], parFitErr[0], parFitErr[1], parFitErr[2], parFitErr[3], accuracy, firstHit, lastHit, track); new((*fTrackArray)[track]) PndLinTrack(*(trackfit)); //save Track }// end of TCand's // Done-------------------------------------------------------------------------------------- std::cout<<"Fitting done"<GetN(); // cout<<"LocalFCN npoints="<1) // std::cout << "Total sum2 = " << sum << std::endl; //firstIt = false; } double PndLmdLinFitTask::line3Dfit(Int_t nd, TGraph2DErrors* gr, Double_t* fitpar, Double_t* fitparerr) { //gStyle->SetOptStat(0); //gStyle->SetOptFit(); //firstIt = true; Int_t Npoint = gr->GetN(); // cout<<"Npoint = "<SetObjectFit(gr); //min->SetFCN( *SumDistance2 ); min->SetFCN(*LocalFCN);//using local coordinate in FCN Double_t arglist[100]; arglist[0] = 1; min->ExecuteCommand("SET PRINT",arglist,1); double pStart[4] = {25.15,0.04,0.09,8.4e-5}; double pStartErr[4] = {4.5,0.004,4.5,0.004}; // double pStart[4] = {25,0.04,0,0}; // double pStartErr[4] = {0.001,0.001,0.001,0.001}; // min->SetParameter(0,"x0",pStart[0],pStartErr[0],pStart[0]-15*pStartErr[0],pStart[0]+15*pStartErr[0]); // min->SetParameter(1,"Ax",pStart[1],pStartErr[1],pStart[1]-15*pStartErr[1],pStart[1]+15*pStartErr[1]); // min->SetParameter(2,"y0",pStart[2],pStartErr[2],pStart[2]-15*pStartErr[2],pStart[2]+15*pStartErr[2]); // min->SetParameter(3,"Ay",pStart[3],pStartErr[3],pStart[3]-15*pStartErr[3],pStart[3]+15*pStartErr[3]); min->SetParameter(0,"x0",pStart[0],pStartErr[0],0,0); min->SetParameter(1,"Ax",pStart[1],pStartErr[1],0,0); min->SetParameter(2,"y0",pStart[2],pStartErr[2],0,0); min->SetParameter(3,"Ay",pStart[3],pStartErr[3],0,0); // min->SetPrecision(1e-10); // min->SetPrecision(1e-5); // // //minimize step 1 // // arglist[0] = 100; //number of functiona calls // // arglist[1] = 0.001; //tolerance // // min->ExecuteCommand("HESSE", arglist ,2); // //minimize step 2 arglist[0] = 1000; //number of functiona calls arglist[1] = 0.001; //tolerance min->ExecuteCommand("MIGRAD", arglist ,2); //if (minos) min->ExecuteCommand("MINOS",arglist,0); int nvpar,nparx; double amin,edm, errdef; min->GetStats(amin,edm,errdef,nvpar,nparx); if(fVerbose>1) min->PrintResults(1,amin); // gr->Draw("p0"); // get fit parameters and errors for (int i = 0; i <4; ++i){ fitpar[i] = min->GetParameter(i); fitparerr[i] = min->GetParError(i); } // return amin; Double_t chi2 = amin/(2.*Npoint-4); cout<<"Chi^2 = "<SetOptStat(0); //gStyle->SetOptFit(); //firstIt = true; Int_t Npoint = gr->GetN(); // cout<<"Npoint = "<SetObjectFit(gr); //min->SetFCN( *SumDistance2 ); min->SetFCN(*LocalFCN);//using local coordinate in FCN Double_t arglist[100]; arglist[0] = 1; min->ExecuteCommand("SET PRINT",arglist,1); double pStart[4] = {posSeed.X(),dirSeed.X(),posSeed.Y(),dirSeed.Y()}; // double pStartErr[4] = {4.5,0.004,4.5,0.004}; // double pStart[4] = {25,0.04,0,0}; double pStartErr[4] = {0.01,0.0001,0.01,0.0001}; // min->SetParameter(0,"x0",pStart[0],pStartErr[0],pStart[0]-15*pStartErr[0],pStart[0]+15*pStartErr[0]); // min->SetParameter(1,"Ax",pStart[1],pStartErr[1],pStart[1]-15*pStartErr[1],pStart[1]+15*pStartErr[1]); // min->SetParameter(2,"y0",pStart[2],pStartErr[2],pStart[2]-15*pStartErr[2],pStart[2]+15*pStartErr[2]); // min->SetParameter(3,"Ay",pStart[3],pStartErr[3],pStart[3]-15*pStartErr[3],pStart[3]+15*pStartErr[3]); min->SetParameter(0,"x0",pStart[0],pStartErr[0],0,0); min->SetParameter(1,"Ax",pStart[1],pStartErr[1],0,0); min->SetParameter(2,"y0",pStart[2],pStartErr[2],0,0); min->SetParameter(3,"Ay",pStart[3],pStartErr[3],0,0); // min->SetPrecision(1e-10); // min->SetPrecision(1e-5); // Now ready for minimization step arglist[0] = 1500; arglist[1] = 1.; min->ExecuteCommand("MINI", arglist,2); arglist[0] = 50; //arglist[0] = 1; min->ExecuteCommand("HESSE", arglist,2); // //minimize step 1 // arglist[0] = 100; //number of functiona calls // //arglist[0] = 1; //number of functiona calls // arglist[1] = 1e-5; //tolerance // min->ExecuteCommand("HESSE", arglist ,2); // //minimize step 2 // arglist[0] = 1000; //number of functiona calls // // arglist[0] = 10; //number of functiona calls // // arglist[0] = 1; //number of functiona calls // arglist[1] = 1e-5; //tolerance // min->ExecuteCommand("MIGRAD", arglist ,2); //if (minos) min->ExecuteCommand("MINOS",arglist,0); int nvpar,nparx; double amin,edm, errdef; min->GetStats(amin,edm,errdef,nvpar,nparx); if(fVerbose>1) min->PrintResults(1,amin); // gr->Draw("p0"); // get fit parameters and errors for (int i = 0; i <4; ++i){ fitpar[i] = min->GetParameter(i); fitparerr[i] = min->GetParError(i); } // return amin; Double_t chi2 = amin/(2.*Npoint-4); cout<<"Chi^2 = "<