18 kDCH,
kDRC,
kDSK,
kEMC,
kGEM,
kLUMI,
kMDT,
kMVD,
kRPC,
kSTT,
kTPC,
kTOF,
kFTS,
kHYPG,
kHYP};
22 gROOT->LoadMacro(
"$VMCWORKDIR/gconfig/rootlogon.C");
25 TDatabasePDG *pdg =
new TDatabasePDG();
30 TString simFileName =
"Sim_Dpm_500.root";
31 TString parFileName =
"Sim_Dpm_500_params.root";
32 TString digiFileName =
"Sim_Dpm_500_digi.root";
33 TString recoFileName =
"Sim_Dpm_500_reco.root";
34 TString outFileName =
"Sim_Dpm_500_streamdisplay.root";
35 TString histofilename =
"onlinetrkmccheck.root";
39 TFile filerecopixel(recoFileName.Data());
42 TTree *recotree = (TTree*)
filereco.Get(
"pndsim");
44 TFile simfile(simFileName.Data());
45 TTree* mctree = (TTree*) simfile.Get(
"pndsim");
46 TClonesArray* mcarray =
new TClonesArray(
"PndMCTrack");
47 mctree->SetBranchAddress(
"MCTrack", &mcarray);
49 FairRunAna *
fRun =
new FairRunAna();
50 fRun->SetInputFile(simFileName.Data());
51 fRun->AddFriend(recoFileName.Data());
52 fRun->AddFriend(digiFileName.Data());
53 fRun->SetOutputFile(outFileName.Data());
55 FairRuntimeDb*
rtdb = fRun->GetRuntimeDb();
57 PndOnlineGeometryManager *online_geometry =
new PndOnlineGeometryManager(rtdb, parFileName.Data());
59 PndOnlineManager *online =
new PndOnlineManager();
60 online->AddGeometryManager(online_geometry);
63 online->LoadStream(PndOnline::kMVDPixel,
"MVDHitsPixel",stthitlifetime);
64 online->LoadStream(PndOnline::kMVDStrip,
"MVDHitsStrip",stthitlifetime);
67 TClonesArray* tubearray = online_geometry->GetDetectorGeometry(
PndOnline::kSTT);
70 PndOnlineSttTripletFinder *triplet_finder =
new PndOnlineSttTripletFinder(online, tubearray);
71 online->AddTask((FairTask*)triplet_finder);
74 TCanvas*
c1 =
new TCanvas(
"c1");
75 c1->Range(-42,-42,42,42);
76 c1->SetCanvasSize(1200, 1200);
77 TText* mytext =
new TText();
84 int final_time = maximumTime;
86 online->SetHESRRevolutionDuration(delta_t);
90 TObjArray* online_fairhits_stt = 0;
91 TObjArray* online_tracks = 0;
92 TObjArray* online_tracks2 = 0;
93 TObjArray* online_fairhits_mvd = 0;
95 std::vector<double> mctracktime;
96 std::vector<double> mctrackpt;
97 std::vector<double> mctrackphi;
98 std::vector<int> mctrackstatus;
99 std::vector<double> recotracktime;
100 std::vector<double> recotrackpt;
101 std::vector<double> recotrackphi;
102 std::vector<int> recotrackstatus;
103 std::vector<int> recotrackmcid;
104 int goodrecotrack = 0;
105 int badrecotrack = 0;
106 int totalmctracks = 0;
107 int goodmctracks = 0;
108 int totalrecotracks = 0;
109 int goodrecotracks = 0;
110 int norecotracks = 0;
111 int deltaphifailed = 0;
112 int deltaptfailed = 0;
113 int deltabothfailed = 0;
115 int globalmaxmcid = 0;
116 int mctracknonprime = 0;
117 int mctracknonrecomomentum = 0;
119 int mctracknonhit = 0;
120 int mctrackgrandtotal = 0;
121 int mctrackrecoattempt = 0;
122 int foundrecotrackall = 0;
123 int foundrecotrack90 = 0;
124 int foundrecotrack80 = 0;
125 int foundrecotrackbad = 0;
126 int mctracknotrecoed = 0;
127 int lowbetagamma = 0;
128 int pdgcodetoolarge = 0;
130 PndMCBookkeeper foundmapall;
132 PndMCBookkeeper foundmap90;
134 PndMCBookkeeper foundmap80;
136 PndMCBookkeeper foundmapbad;
139 int mctracknullpointers = 0;
140 int recotracknullpointers = 0;
146 TH2D* hmcall =
new TH2D(
"hmcall",
"hmcall", 1500, -14, 16, 75, 0, 1.5);
147 TH2D* hmcprime =
new TH2D(
"hmcprime",
"hmcprime", 1500, -14, 16, 75, 0, 1.5);
148 TH2D* hmcrecoable =
new TH2D(
"hmcrecoable",
"hmcrecoable", 1500, -14, 16, 75, 0, 1.5);
149 TH2D* hdafuq =
new TH2D(
"hdafuq",
"hdafuq", 1500, -14, 16, 75, 0, 1.5);
150 TH2D* hmcrecoed =
new TH2D(
"hmcrecoed",
"hmcrecoed", 1500, -14, 16, 75, 0, 1.5);
151 TH2D* hmcnotrecoed =
new TH2D(
"hmcnotrecoed",
"hmcnotrecoed", 1500, -14, 16, 75, 0, 1.5);
153 TH1D* hphires =
new TH1D(
"hphires",
"hphires", 701, -3.505, 3.505);
154 TH2D* hptres =
new TH2D(
"hptres",
"hptres", 300, -1400, 1600, 200, -1, 1);
155 TH1D* hphiresmcall =
new TH1D(
"hphiresmcall",
"hphiresmcall", 701, -3.505, 3.505);
156 TH2D* hptresmcall =
new TH2D(
"hptresmcall",
"hptresmcall", 300, -1400, 1600, 200, -1, 1);
157 TH1D* hphiresmc90 =
new TH1D(
"hphiresmc90",
"hphiresmc90", 701, -3.505, 3.505);
158 TH2D* hptresmc90 =
new TH2D(
"hptresmc90",
"hptresmc90", 300, -1400, 1600, 200, -1, 1);
159 TH1D* hphiresmc80 =
new TH1D(
"hphiresmc80",
"hphiresmc80", 701, -3.505, 3.505);
160 TH2D* hptresmc80 =
new TH2D(
"hptresmc80",
"hptresmc80", 300, -1400, 1600, 200, -1, 1);
161 TH1D* hphiresmcbad =
new TH1D(
"hphiresmcbad",
"hphiresmcbad", 701, -3.505, 3.505);
162 TH2D* hptresmcbad =
new TH2D(
"hptresmcbad",
"hptresmcbad", 300, -1400, 1600, 200, -1, 1);
165 for (current_time = 0; current_time < final_time; current_time += delta_t) {
168 online->ClearTracks();
169 online->LoadHits( delta_t );
174 online_tracks = online->GetTrackObjectList();
178 if (online_tracks->GetEntriesFast() > 0) {
179 PndOnlineTrack* firstTrack = (PndOnlineTrack*) online_tracks->At(firsti);
180 while (firstTrack->DrawMode() != PndOnlineTrack::kVertexMomentumAsCircleHack) {
182 if (firsti > online_tracks->GetEntriesFast()) {
183 cout <<
"No drawable online Track in Array. We have a severe problem." << endl;
186 firstTrack = (PndOnlineTrack*) online_tracks->At(firsti);
188 maxmcid = firstTrack->MCEntryNumber();
189 minmcid = firstTrack->MCEntryNumber();
191 for (
int i = 0;
i < online_tracks->GetEntriesFast();
i++) {
192 PndOnlineTrack* myTrack = (PndOnlineTrack*) online_tracks->At(
i);
193 if (myTrack->DrawMode() != PndOnlineTrack::kVertexMomentumAsCircleHack) {
198 mctree->GetEntry(myTrack->MCEntryNumber());
202 cout <<
"MC Track NULL pointer in event " << myTrack->MCEntryNumber() <<
", track " << myTrack->MCTrackNumber() << endl;
203 cout <<
"Event Majority: " << myTrack->MCEntryMajority() <<
", Track Majority: " << myTrack->MCTrackMajority() << endl;
204 recotracknullpointers++;
211 TVector2 innerhit = TVector2(myTrack->Vertex().x(), myTrack->Vertex().y());
212 TVector2 outerhit = TVector2(myTrack->Momentum().x(), myTrack->Momentum().y());
227 TVector2 circleorigin = myTrack->CircleOrigin();
228 Double_t orfoundrecotrackallthophi = circleorigin.Phi();
229 Double_t circleradius = myTrack->CircleRadius();
230 Int_t clockwise = myTrack->CircleClockwise();
231 Double_t trackphi = myTrack->CirclePhi();
232 Double_t trackpt = circleradius * 2.0 * 2.99792458;
260 if (calcphimc < 0) calcphimc += 2*
TMath::Pi();
262 if (calcphireco < 0) calcphireco += 2*
TMath::Pi();
263 Double_t deltaphi = calcphireco - calcphimc;
271 Int_t chargesign = 1;
294 hphiresmcall->Fill(deltaphi*chargesign);
295 hptresmcall->Fill(mcpt, deltapt/mcpt);
296 int mceventid = myTrack->MCEntryNumber();
297 int mctrackid = myTrack->MCTrackNumber();
298 foundmapall.Add(mceventid, mctrackid);
299 if ( (myTrack->MCEntryMajority() > 0.9) && (myTrack->MCTrackMajority() > 0.9) ) {
301 foundmap90.Add(mceventid, mctrackid);
302 hphiresmc90->Fill(deltaphi*chargesign);
303 hptresmc90->Fill(mcpt, deltapt/mcpt);
305 if ( (myTrack->MCEntryMajority() > 0.8) && (myTrack->MCTrackMajority() > 0.8) ) {
307 foundmap80.Add(mceventid, mctrackid);
308 hphiresmc80->Fill(deltaphi*chargesign);
309 hptresmc80->Fill(mcpt, deltapt/mcpt);
312 foundmapbad.Add(mceventid, mctrackid);
313 hphiresmcbad->Fill(deltaphi*chargesign);
314 hptresmcbad->Fill(mcpt, deltapt/mcpt);
320 cout <<
"Low pt hit" << endl;
323 int mcentrynumber = myTrack->MCEntryNumber();
324 if (mcentrynumber > maxmcid) {
325 maxmcid = mcentrynumber;
327 if (mcentrynumber < minmcid) {
328 minmcid = mcentrynumber;
336 recotrackpt.push_back(trackpt);
337 recotrackphi.push_back(trackphi);
338 recotrackstatus.push_back(0);
339 recotrackmcid.push_back(mcentrynumber);
343 if (maxmcid > globalmaxmcid) {
344 globalmaxmcid = maxmcid;
346 cout <<
"MC ID Range: " << minmcid <<
", " << maxmcid << endl;
348 for (
int j = minmcid; j <= maxmcid; j++) {
349 cout <<
"MC outer loop: " << j << endl;
350 if (j > globalmaxmcid) {
354 cout <<
"MC Entry count: " << mcarray->GetEntriesFast() << endl;
356 for (
int k = 0; k < mcarray->GetEntriesFast(); k++) {
360 cout <<
"MC Track has NULL pointer. Oooops." << endl;
361 mctracknullpointers++;
366 cout <<
"PDG Code too large: " << mctrack->
GetPdgCode() << endl;
378 mctracknonrecomomentum++;
386 mctracknonrecomomentum++;
394 mctracknonrecomomentum++;
403 cout <<
"Low betagamma particle" << endl;
410 cout <<
"Didn't hit." << endl;
414 mctrackrecoattempt++;
418 if (foundmapall.Get(j, k) > 0) {
423 cout <<
"Did not find Event " << j <<
", Track " << k << endl;
427 if (foundmap90.Get(j, k) > 0) {
432 if (foundmap80.Get(j, k) > 0) {
437 if (foundmapbad.Get(j, k) > 0) {
566 for (
int s = 0;
s < mctrackstatus.size();
s++) {
567 if (mctrackstatus.at(
s) > 0) {
572 int recotrackstatusgoodcount = 0;
573 int recotrackstatusbadcount = 0;
575 for (
int s = 0;
s < recotrackstatus.size();
s++) {
576 if (recotrackmcid.at(
s) <= globalmaxmcid) {
577 if (recotrackstatus.at(
s) > 0) {
578 recotrackstatusgoodcount++;
580 recotrackstatusbadcount++;
589 cout <<
"Total reconstructed track count: " << totalrecotracks << endl;
590 cout <<
"Reached MC ID: " << globalmaxmcid << endl;
591 cout <<
"Reconstructable MC track count: " << goodmctracks << endl;
592 cout <<
"MC Tracks reconstructed: " << goodrecotracks << endl;
593 cout <<
"MC Tracks NOT reconstructed: " << norecotracks << endl;
594 cout <<
"Amount of reconstructed MC tracks: " << goodrecotrack << endl;
595 cout <<
"Amount of not reconstructed MC tracks: " << badrecotrack << endl;
596 cout <<
"Reco Status Good: " << recotrackstatusgoodcount << endl;
597 cout <<
"Reco Status Bad: " << recotrackstatusbadcount << endl;
598 cout <<
"Delta phi failed: " << deltaphifailed << endl;
599 cout <<
"Delta pt failed: " << deltaptfailed << endl;
600 cout <<
"Delta both failed: " << deltabothfailed << endl;
601 cout <<
"Secondary Tracks: " << secondaries << endl;
603 cout <<
"MC Track Grand Total: " << mctrackgrandtotal << endl;
604 cout <<
"MC Track PDG Code too large: " << pdgcodetoolarge << endl;
605 cout <<
"MC Track Non Prime: " << mctracknonprime << endl;
606 cout <<
"MC Track Low Momentum: " << mctracknonrecomomentum << endl;
607 cout <<
" MC Track Low Pt Hit: " << lowpthit << endl;
608 cout <<
"MC Track Low BetaGamma: " << lowbetagamma << endl;
609 cout <<
"MC Track missed STT: " << mctracknonhit << endl;
610 cout <<
"MC Track to be recoed: " << mctrackrecoattempt << endl;
611 cout <<
"MC Track recoed (all): " << foundrecotrackall << endl;
612 cout <<
"MC Track recoed (90): " << foundrecotrack90 << endl;
613 cout <<
"MC Track recoed (80): " << foundrecotrack80 << endl;
614 cout <<
"MC Track recoed (bad): " << foundrecotrackbad << endl;
615 cout <<
"MC Track not recoed: " << mctracknotrecoed << endl;
618 cout <<
"MC Match Good 90: " << mcidgood90 << endl;
619 cout <<
"MC Match Good 80: " << mcidgood80 << endl;
620 cout <<
"MC Match Bad: " << mcidbad << endl;
621 cout <<
"MC Tracks with NULL pointers in Reco: " << recotracknullpointers << endl;
622 cout <<
"MC Tracks with NULL pointers: " << mctracknullpointers << endl;
626 TFile outputstorage(histofilename,
"UPDATE");
649 cout << endl << endl;
650 cout <<
"Macro finished succesfully." << endl;
651 cout <<
"Real time " << rtime <<
" s, CPU time " << ctime <<
" s" << endl;
TFile filereco("MvdStt_Test_reco.root")
Int_t GetNPoints(DetectorId detId) const
TVector3 GetMomentum() const
TFile filedigi("testdigi.root")
Int_t GetMotherID() const
void SaveAndUpdateHisto(TH1 *currenthisto, TFile &storagefile)