#include "TString.h" #include "TStopwatch.h" #include "TChain.h" #include "TClonesArray.h" #include "TFile.h" using namespace std; void GhostTrksStudies(const int nEvents=2, const int startEvent=0, TString storePath="tmpOutput", const int verboseLevel=1, const int particle=-2212, const double mom=15, const int simTrk=5, TString algo="CA") { // ---- Load libraries ------------------------------------------------- gROOT->Macro("$VMCWORKDIR/gconfig/rootlogon.C"); gSystem->Load("libLmdTrk"); // gROOT->LoadMacro("line3Dfit.C"); // ------------------------------------------------------------------------ // ----- Timer -------------------------------------------------------- TStopwatch timer; timer.Start(); // ------------------------------------------------------------------------ // ---- Input files -------------------------------------------------------- TString simMC=storePath+"/Lumi_MC_"; simMC += startEvent; simMC += ".root"; TChain tMC("cbmsim"); tMC.Add(simMC); TString DigiFile = storePath+"/Lumi_digi_"; DigiFile += startEvent; DigiFile += ".root"; TChain tdigiHits("cbmsim"); tdigiHits.Add(DigiFile); TString recHit=storePath+"/Lumi_reco_"; recHit += startEvent; recHit += ".root"; TChain tHits("cbmsim"); tHits.Add(recHit); TString trkCand = storePath+"/Lumi_TCand_"; trkCand += startEvent; trkCand += ".root"; TChain tTrkCand("cbmsim"); tTrkCand.Add(trkCand); TString recTrack = storePath+"/Lumi_Track_"; recTrack += startEvent; recTrack += ".root"; TChain tTrkRec("cbmsim"); tTrkRec.Add(recTrack); TString geaneFile = storePath+"/Lumi_Geane_"; geaneFile += startEvent; geaneFile += ".root"; TChain tgeane("cbmsim"); tgeane.Add(geaneFile); // --------------------------------------------------------------------------------- // ---- Output file ---------------------------------------------------------------- TString out=storePath+"/Ghost_trks_"; out += startEvent; out +="_Mom_"; out +=mom; out +="_NsimTrks_"; out +=simTrk; out +="_algo_"; out +=algo; out += ".root"; TFile *f = new TFile(out,"RECREATE"); // --------------------------------------------------------------------------------- //--- MC info ----------------------------------------------------------------- TClonesArray* true_tracks=new TClonesArray("PndMCTrack"); tMC.SetBranchAddress("MCTrack",&true_tracks); //True Track to compare TClonesArray* true_points=new TClonesArray("PndSdsMCPoint"); tMC.SetBranchAddress("LMDPoint",&true_points); //True Points to compare //---------------------------------------------------------------------------------- //--- Digitization info ------------------------------------------------------------ TClonesArray* fStripClusterArray = new TClonesArray("PndSdsClusterStrip"); tHits.SetBranchAddress("LMDStripClusterCand",&fStripClusterArray); TClonesArray* fStripDigiArray = new TClonesArray("PndSdsDigiStrip"); tdigiHits.SetBranchAddress("LMDStripDigis",&fStripDigiArray); //---------------------------------------------------------------------------------- //--- Real Hits -------------------------------------------------------------------- TClonesArray* rechit_array=new TClonesArray("PndSdsHit"); tHits.SetBranchAddress("LMDHitsStrip",&rechit_array); //Points for Tracks //---------------------------------------------------------------------------------- //--- Track Candidate --------------------------------------------------------------- TClonesArray* trkcand_array=new TClonesArray("PndTrackCand"); tTrkCand.SetBranchAddress("LMDTrackCand",&trkcand_array); //Points for Track Canidates //----------------------------------------------------------------------------------- //--- Real tracks ------------------------------------------------------------------- TClonesArray* rec_trk=new TClonesArray("PndLinTrack"); tTrkRec.SetBranchAddress("LMDTrack",&rec_trk); //Tracks //---------------------------------------------------------------------------------- //--- Geane info ------------------------------------------------------------------ TClonesArray* geaneArray =new TClonesArray("FairTrackParH"); tgeane.SetBranchAddress("GeaneTrackFinal",&geaneArray); //Tracks with parabolic parametrisation TH2 *hMCntrkRECntrk = new TH2I("hMCntrkRECntrk","; number of MC trks; number of rec. trks",100,0,100,100,0,100); TH1 *hmissMC = new TH1I("hmissMC"," Number of missed MC trks; Number of trks; ", 25,0,25); TH1 *hghostRec = new TH1I("hghostRec"," Number of ghost trks; Number of trks; ", 100,0,100); TH1 *hThetaMissMC = new TH1F("hThetaMissMC","#theta for miss MC trks;#theta_{MC}, rad;",1e2,0,0.01); TH1 *hPhiMissMC = new TH1F("hPhiMissMC","#phi for missed MC trks ;#phi_{MC}, rad;",1e2,-3.15,3.15); TH1 *hThetaGhostRec = new TH1F("hThetaGhostRec","#theta for ghost REC trks;#theta_{REC}, rad;",1e2,0,0.01); TH1 *hPhiGhostRec = new TH1F("hPhiGhostRec","#phi for ghost REC trks ;#phi_{REC}, rad;",1e2,-3.15,3.15); TH1 *hdThetaGhostRec = new TH1F("hdThetaGhostRec","#delta#theta for ghost REC trks;#delta#theta_{REC}/#sigma;",1e3,0,1e2); TH1 *hdPhiGhostRec = new TH1F("hdPhiGhostRec","#delta#phi for ghost REC trks ;#delta#phi_{REC}/#sigma;",1e3,-2.,1e2); TH2 *hdPhidThetaGhostRec = new TH2F("hdPhidThetaGhostRec","#delta#phi vs. #delta#theta for ghost REC trks; #delta#theta_{REC}/#sigma; #delta#phi_{REC}/#sigma;",1e3,0,1e2,1e3,0,1e2); int MCevents = 0; // int RECevents[100]; //RECevents[0] - less trks in REC then in MC //RECevents[1] - number of REC trks = MC trks //RECevents[2] number REC trks = (MC trks + 1) etc. int goodRec=0, totmissMC=0, totghostRec=0; for (Int_t j=0; j0) cout<<"Event #"<GetEntriesFast(); const int nParticles = true_tracks->GetEntriesFast(); const int numTrk = rec_trk->GetEntriesFast(); const int numHits = rechit_array->GetEntriesFast(); if(numHits<3) continue; if(verboseLevel>0) cout<<"number of MC trks = "<1e-3) break; // cout<<"Event#"< HitMCids; for(int iu=0;iuAt(iH)); ///Top cluster PndSdsClusterStrip* myCluster = (PndSdsClusterStrip*)(fStripClusterArray->At(myHit->GetClusterIndex())); PndSdsDigiStrip* astripdigi = (PndSdsDigiStrip*)(fStripDigiArray->At(myCluster->GetDigiIndex(0))); if (astripdigi->GetIndex(0) == -1) continue; // sort out noise PndSdsMCPoint* MCPoint = (PndSdsMCPoint*)(true_points->At(astripdigi->GetIndex(0))); int MCidTOP = MCPoint->GetTrackID(); HitMCids[MCidTOP]++; ///Bottom cluster Int_t botIndex = myHit->GetBotIndex(); PndSdsClusterStrip* myClusterBot = (PndSdsClusterStrip*)(fStripClusterArray->At(botIndex)); PndSdsDigiStrip* astripdigiBot = (PndSdsDigiStrip*)(fStripDigiArray->At(myClusterBot->GetDigiIndex(0))); if (astripdigiBot->GetIndex(0) == -1) continue; // sort out noise PndSdsMCPoint* MCPointBot = (PndSdsMCPoint*)(true_points->At(astripdigiBot->GetIndex(0))); int MCidBOT = MCPointBot->GetTrackID(); HitMCids[MCidBOT]++; } bool hitsok=true; for(int iu=0;iu=0) continue; totmissMC++; missthis++; hPhiMissMC->Fill(MCphi[imc]); hThetaMissMC->Fill(MCtheta[imc]); if(verboseLevel>0){ cout<<"MCphi[imc] = "<0){ hmissMC->Fill(missthis); if(verboseLevel>0) cout<<"Number of missed MC trks="<=0) continue; totghostRec++; ghostthis++; hThetaGhostRec->Fill(RECtheta[irec]); hPhiGhostRec->Fill(RECphi[irec]); for(int imc=0;imcFill(deltaTheta); hdPhiGhostRec->Fill(deltaPhi); hdPhidThetaGhostRec->Fill(deltaTheta,deltaPhi); // if(verboseLevel>0) //cout<<" RECphi[irec] = "<0){ hghostRec->Fill(ghostthis); if(verboseLevel>0) cout<<"Number of ghost trks="<GetEntries() = "<GetEntries()<GetEntries(); int allMissedMC = totmissMC; if(allMissedMC!=0){ int missMCbin = ((hmissMC->GetXaxis()->GetXmax()) - (hmissMC->GetXaxis()->GetXmin()))/(hmissMC->GetXaxis()->GetNbins()); int valMostMissMC = missMCbin*hmissMC->GetMaximumBin() - 1; int numMostMissMC = hmissMC->GetBinContent(hmissMC->GetMaximumBin()); cout<<"missed MC = "<GetXaxis()->GetNbins());imiss++){ double currval = 100.*(hmissMC->GetBinContent(imiss))/hmissMC->GetEntries(); // cout<<"currval = "<1){ cout<<(imiss*missMCbin-1)<<" MC trks are missed in "<GetEntries(); int allGhostREC = totghostRec; if(allGhostREC!=0){ int ghostRECbin = ((hghostRec->GetXaxis()->GetXmax()) - (hghostRec->GetXaxis()->GetXmin()))/(hghostRec->GetXaxis()->GetNbins()); int valMostGhostREC = ghostRECbin*hghostRec->GetMaximumBin() - 1; int numMostGhostREC = hghostRec->GetBinContent(hghostRec->GetMaximumBin()); cout<<"ghost REC = "<GetXaxis()->GetNbins());ighost++){ double currval = 100.*(hghostRec->GetBinContent(ighost))/hghostRec->GetEntries(); if(currval>1){ cout<<(ighost*ghostRECbin-1)<<" REC trks are ghost "<ProjectionY(); // cout<<"hRecN->GetEntries()="<GetEntries()<GetXaxis()->GetNbins());irec++){ int coef = irec-simTrk; int Nrecbin = hRecN->GetBinContent(irec); // cout<<"coef = "<Write(); hmissMC->Write(); hghostRec->Write(); hThetaMissMC->Write(); hPhiMissMC->Write(); hThetaGhostRec->Write(); hPhiGhostRec->Write(); hdThetaGhostRec->Write(); hdPhiGhostRec->Write(); hdPhidThetaGhostRec->Write(); TCanvas *c1 = new TCanvas("angular_distr","angular distributions",800,800); c1->Divide(2,2); c1->cd(1); hThetaMissMC->Draw(); c1->cd(2); hPhiMissMC->Draw(); c1->cd(3); hThetaGhostRec->Draw(); c1->cd(4); hPhiGhostRec->Draw(); c1->Write(); c1->Close(); f->Close(); if(verboseLevel>0) cout<<"Macro succsefully finished!"<