//----------------------------------------------------------- // // Description: // 3D Straight Line fitter // // Author List: // Mathias Michel // //----------------------------------------------------------- // This Class' Header ------------------ #include "PndDmlLinFitTask.h" // C/C++ Headers ---------------------- #include // Collaborating Class Headers -------- #include "FairRootManager.h" #include "TClonesArray.h" #include "PndLinTrack.h" #include "TrackData/PndTrackCand.h" #include "PndMvdHit.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 using namespace ROOT::Math; PndDmlLinFitTask::PndDmlLinFitTask() : FairTask("Kalman Filter") { fTCandBranchName = "DMLTrackCand"; fRecoBranchName = "SSDHitsStrip"; } PndDmlLinFitTask::~PndDmlLinFitTask() { } InitStatus PndDmlLinFitTask::Init() { //Get ROOT Manager FairRootManager* ioman= FairRootManager::Instance(); if(ioman==0) { Error("PndDmlLinFitTask::Init","RootManager not instantiated!"); return kERROR; } // Get input collection fTCandArray=(TClonesArray*) ioman->GetObject(fTCandBranchName); if(fTCandArray==0) { Error("PndDmlLinFitTask::Init","trackcand-array not found!"); return kERROR; } fRecoArray=(TClonesArray*) ioman->GetObject(fRecoBranchName); if(fRecoArray==0) { Error("PndDmlLinFitTask::Init","reco-array not found!"); return kERROR; } fTrackArray = new TClonesArray("PndLinTrack"); ioman->Register("DMLTrack", "DML", fTrackArray, kTRUE); std::cout << "-I- PndDmlLinFitTask: Initialisation successfull" << std::endl; return kSUCCESS; } void PndDmlLinFitTask::Exec(Option_t* opt) { std::cout<<"PndDmlLinFitTask::Exec"<Delete(); Int_t ntcand=fTCandArray->GetEntriesFast(); // Detailed output if(fVerbose>1)std::cout<<" -I- PndDmlLinFitTask: 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- PndDmlLinFitTask: 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 <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 accuracy = line3Dfit(numPts, &fitme, parFit); PndLinTrack* trackfit = new PndLinTrack("Lumi", parFit[0], parFit[1], parFit[2], parFit[3], accuracy, firstHit, lastHit, track); new((*fTrackArray)[track]) PndLinTrack(*(trackfit)); //save Track }// end of TCand's // Done-------------------------------------------------------------------------------------- std::cout<<"Fitting done"<( (TVirtualFitter::GetFitter())->GetObjectFit() ); assert(gr != 0); double * x = gr->GetX(); double * y = gr->GetY(); double * z = gr->GetZ(); int npoints = gr->GetN(); sum = 0; for (int i = 0; i < npoints; ++i) { double d = distance2(x[i],y[i],z[i],par); sum += d; } //if (firstIt && fVerbose>1) // std::cout << "Total sum2 = " << sum << std::endl; //firstIt = false; } double PndDmlLinFitTask::line3Dfit(Int_t nd, TGraph2DErrors* gr, Double_t* fitpar) { //gStyle->SetOptStat(0); //gStyle->SetOptFit(); //firstIt = true; TVirtualFitter *min = TVirtualFitter::Fitter(0,4); min->SetObjectFit(gr); min->SetFCN( *SumDistance2 ); Double_t arglist[10]; arglist[0] = 1; min->ExecuteCommand("SET PRINT",arglist,1); double pStart[4] = {0.001,0.001,0.001,0.001}; min->SetParameter(0,"x0",pStart[0],0.00001,0,0); min->SetParameter(1,"Ax",pStart[1],0.00001,0,0); min->SetParameter(2,"y0",pStart[2],0.00001,0,0); min->SetParameter(3,"Ay",pStart[3],0.00001,0,0); min->SetPrecision(1e-8); arglist[0] = 1000; // number of function calls arglist[1] = 1e-8; // 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 for (int i = 0; i <4; ++i) fitpar[i] = min->GetParameter(i); return amin; } ClassImp(PndDmlLinFitTask);