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 totalmctracks = 0;
105 int goodmctracks = 0;
106 int totalrecotracks = 0;
107 int goodrecotracks = 0;
108 int norecotracks = 0;
109 int deltaphifailed = 0;
110 int deltaptfailed = 0;
111 int deltabothfailed = 0;
113 int globalmaxmcid = 0;
120 int mctracknullpointers = 0;
121 int recotracknullpointers = 0;
127 TH2D* hmcall =
new TH2D(
"hmcall",
"hmcall", 1500, -14, 16, 75, 0, 1.5);
128 TH2D* hmcprime =
new TH2D(
"hmcprime",
"hmcprime", 1500, -14, 16, 75, 0, 1.5);
129 TH2D* hmcrecoable =
new TH2D(
"hmcrecoable",
"hmcrecoable", 1500, -14, 16, 75, 0, 1.5);
130 TH2D* hdafuq =
new TH2D(
"hdafuq",
"hdafuq", 1500, -14, 16, 75, 0, 1.5);
131 TH2D* hmcrecoed =
new TH2D(
"hmcrecoed",
"hmcrecoed", 1500, -14, 16, 75, 0, 1.5);
132 TH2D* hmcnotrecoed =
new TH2D(
"hmcnotrecoed",
"hmcnotrecoed", 1500, -14, 16, 75, 0, 1.5);
134 TH1D* hphires =
new TH1D(
"hphires",
"hphires", 701, -3.505, 3.505);
135 TH2D* hptres =
new TH2D(
"hptres",
"hptres", 300, -1400, 1600, 200, -1, 1);
136 TH1D* hphiresmc =
new TH1D(
"hphiresmc",
"hphiresmc", 701, -3.505, 3.505);
137 TH2D* hptresmc =
new TH2D(
"hptresmc",
"hptresmc", 300, -1400, 1600, 200, -1, 1);
138 TH1D* hphiresmc90 =
new TH1D(
"hphiresmc90",
"hphiresmc90", 701, -3.505, 3.505);
139 TH2D* hptresmc90 =
new TH2D(
"hptresmc90",
"hptresmc90", 300, -1400, 1600, 200, -1, 1);
140 TH1D* hphiresmc80 =
new TH1D(
"hphiresmc80",
"hphiresmc80", 701, -3.505, 3.505);
141 TH2D* hptresmc80 =
new TH2D(
"hptresmc80",
"hptresmc80", 300, -1400, 1600, 200, -1, 1);
142 TH1D* hphiresmcbad =
new TH1D(
"hphiresmcbad",
"hphiresmcbad", 701, -3.505, 3.505);
143 TH2D* hptresmcbad =
new TH2D(
"hptresmcbad",
"hptresmcbad", 300, -1400, 1600, 200, -1, 1);
146 for (current_time = 0; current_time < final_time; current_time += delta_t) {
149 online->ClearTracks();
150 online->LoadHits( delta_t );
155 online_tracks = online->GetTrackObjectList();
159 if (online_tracks->GetEntriesFast() > 0) {
160 PndOnlineTrack* firstTrack = (PndOnlineTrack*) online_tracks->At(firsti);
161 while (firstTrack->DrawMode() != PndOnlineTrack::kVertexMomentumAsCircleHack) {
163 if (firsti > online_tracks->GetEntriesFast()) {
164 cout <<
"No drawable online Track in Array. We have a severe problem." << endl;
167 firstTrack = (PndOnlineTrack*) online_tracks->At(firsti);
169 maxmcid = firstTrack->MCEntryNumber();
170 minmcid = firstTrack->MCEntryNumber();
172 for (
int i = 0;
i < online_tracks->GetEntriesFast();
i++) {
173 PndOnlineTrack* myTrack = (PndOnlineTrack*) online_tracks->At(
i);
174 if (myTrack->DrawMode() != PndOnlineTrack::kVertexMomentumAsCircleHack) {
179 mctree->GetEntry(myTrack->MCEntryNumber());
183 cout <<
"MC Track NULL pointer in event " << myTrack->MCEntryNumber() <<
", track " << myTrack->MCTrackNumber() << endl;
184 cout <<
"Event Majority: " << myTrack->MCEntryMajority() <<
", Track Majority: " << myTrack->MCTrackMajority() << endl;
185 recotracknullpointers++;
192 TVector2 innerhit = TVector2(myTrack->Vertex().x(), myTrack->Vertex().y());
193 TVector2 outerhit = TVector2(myTrack->Momentum().x(), myTrack->Momentum().y());
208 TVector2 circleorigin = myTrack->CircleOrigin();
209 Double_t orthophi = circleorigin.Phi();
210 Double_t circleradius = myTrack->CircleRadius();
211 Int_t clockwise = myTrack->CircleClockwise();
212 Double_t trackphi = myTrack->CirclePhi();
213 Double_t trackpt = circleradius * 2.0 * 2.99792458;
241 if (calcphimc < 0) calcphimc += 2*
TMath::Pi();
243 if (calcphireco < 0) calcphireco += 2*
TMath::Pi();
244 Double_t deltaphi = calcphireco - calcphimc;
252 Int_t chargesign = 1;
275 hphiresmc->Fill(deltaphi*chargesign);
276 hptresmc->Fill(mcpt, deltapt/mcpt);
277 int mceventid = myTrack->MCEntryNumber();
278 int mctrackid = myTrack->MCTrackNumber();
279 if ( (myTrack->MCEntryMajority() > 0.9) && (myTrack->MCTrackMajority() > 0.9) ) {
281 hphiresmc90->Fill(deltaphi*chargesign);
282 hptresmc90->Fill(mcpt, deltapt/mcpt);
284 if ( (myTrack->MCEntryMajority() > 0.8) && (myTrack->MCTrackMajority() > 0.8) ) {
286 hphiresmc80->Fill(deltaphi*chargesign);
287 hptresmc80->Fill(mcpt, deltapt/mcpt);
290 hphiresmcbad->Fill(deltaphi*chargesign);
291 hptresmcbad->Fill(mcpt, deltapt/mcpt);
297 cout <<
"Low pt hit" << endl;
300 int mcentrynumber = myTrack->MCEntryNumber();
301 if (mcentrynumber > maxmcid) {
302 maxmcid = mcentrynumber;
304 if (mcentrynumber < minmcid) {
305 minmcid = mcentrynumber;
313 recotrackpt.push_back(trackpt);
314 recotrackphi.push_back(trackphi);
315 recotrackstatus.push_back(0);
316 recotrackmcid.push_back(mcentrynumber);
320 if (maxmcid > globalmaxmcid) {
321 globalmaxmcid = maxmcid;
323 cout <<
"MC ID Range: " << minmcid <<
", " << maxmcid << endl;
324 for (
int j = minmcid; j <= maxmcid; j++) {
325 cout <<
"MC outer loop: " << j << endl;
326 if (j > globalmaxmcid) {
330 cout <<
"MC Entry count: " << mcarray->GetEntriesFast() << endl;
331 for (
int k = 0; k < mcarray->GetEntriesFast(); k++) {
334 cout <<
"MC Track has NULL pointer. Oooops." << endl;
335 mctracknullpointers++;
339 bool isrecoable =
false;
344 cout <<
"Critical Track at Event: " << j <<
" Track " << k <<
" Particle: " << mctrack->
GetPdgCode() << endl;
355 if (mctrack->
GetMomentum().Pt() < 0.052) isrecoable =
false;
357 cout <<
"Low pt hit" << endl;
363 if (pdg->GetParticle(mctrack->
GetPdgCode())->
Mass() > 1) isrecoable =
false;
366 cout <<
"Low betagamma particle" << endl;
370 cout <<
"Meh, reco possibility mismatch." << endl;
372 cout <<
"Dafuq at Event: " << j <<
" Track " << k <<
" Particle: " << mctrack->
GetPdgCode() <<
" Charge: " << pdg->GetParticle(mctrack->
GetPdgCode())->Charge() << endl;
389 for (
int r = 0;
r < recotrackmcid.size();
r++) {
390 if (recotrackmcid.at(
r) == j) {
393 if (calcphimc < 0) calcphimc += 2*
TMath::Pi();
394 Double_t calcphireco = recotrackphi.at(
r);
395 if (calcphireco < 0) calcphireco += 2*
TMath::Pi();
396 Double_t deltaphi = calcphireco - calcphimc;
403 Double_t deltapt = recotrackpt.at(
r) - mcpt;
405 Int_t chargesign = 1;
406 if (pdg->GetParticle(mctrack->
GetPdgCode())->Charge() < 0) {
410 hphires->Fill(deltaphi*chargesign);
411 hptres->Fill(mcpt, deltapt/mcpt);
413 if ( (deltapt/mcpt < -0.75) && (deltapt/mcpt > -0.8) && (mcpt > 300) && (mcpt < 650) ) {
414 cout <<
"Funny resolution at Event: " << j <<
" Track " << k <<
" Particle: " << mctrack->
GetPdgCode() <<
" Charge: " << pdg->GetParticle(mctrack->
GetPdgCode())->Charge() << endl;
416 cout <<
"MC pt: " << mcpt << endl;
417 cout <<
"Re pt: " << recotrackpt.at(
r) << endl;
420 bool phiok = (deltaphi < 0.1);
425 bool ptok = ( (deltapt < mcpt * 0.1) || ((mcpt > 450)&&(recotrackpt.at(
r) > 450)) );
428 recotrackstatus.at(
r) = 1;
433 if ((!phiok) && ptok) {
436 if (phiok && (!ptok)) {
439 if ((!phiok) && (!ptok)) {
445 if (trackstatus == 0) {
451 mctrackstatus.push_back(trackstatus);
461 for (
int s = 0;
s < mctrackstatus.size();
s++) {
462 if (mctrackstatus.at(
s) > 0) {
467 int recotrackstatusgoodcount = 0;
468 int recotrackstatusbadcount = 0;
470 for (
int s = 0;
s < recotrackstatus.size();
s++) {
471 if (recotrackmcid.at(
s) <= globalmaxmcid) {
472 if (recotrackstatus.at(
s) > 0) {
473 recotrackstatusgoodcount++;
475 recotrackstatusbadcount++;
484 cout <<
"Total reconstructed track count: " << totalrecotracks << endl;
485 cout <<
"Reached MC ID: " << globalmaxmcid << endl;
486 cout <<
"Reconstructable MC track count: " << goodmctracks << endl;
487 cout <<
"MC Tracks reconstructed: " << goodrecotracks << endl;
488 cout <<
"MC Tracks NOT reconstructed: " << norecotracks << endl;
489 cout <<
"Reco Status Good: " << recotrackstatusgoodcount << endl;
490 cout <<
"Reco Status Bad: " << recotrackstatusbadcount << endl;
491 cout <<
"Delta phi failed: " << deltaphifailed << endl;
492 cout <<
"Delta pt failed: " << deltaptfailed << endl;
493 cout <<
"Delta both failed: " << deltabothfailed << endl;
494 cout <<
"Secondary Tracks: " << secondaries << endl;
496 cout <<
"MC Match Good 90: " << mcidgood90 << endl;
497 cout <<
"MC Match Good 80: " << mcidgood80 << endl;
498 cout <<
"MC Match Bad: " << mcidbad << endl;
499 cout <<
"MC Tracks with NULL pointers in Reco: " << recotracknullpointers << endl;
500 cout <<
"MC Tracks with NULL pointers: " << mctracknullpointers << endl;
504 TFile outputstorage(histofilename,
"UPDATE");
527 cout << endl << endl;
528 cout <<
"Macro finished succesfully." << endl;
529 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")
TVector3 GetStartVertex() const
Int_t GetMotherID() const
void SaveAndUpdateHisto(TH1 *currenthisto, TFile &storagefile)