9 #include "FairRootManager.h"
10 #include "FairRunAna.h"
11 #include "FairRuntimeDb.h"
12 #include "FairBaseParSet.h"
13 #include "FairTrackParam.h"
14 #include "FairRootManager.h"
24 #include "TClonesArray.h"
25 #include "TGeoManager.h"
26 #include "TMatrixFSym.h"
40 : FairTask(
"GEM Find Hits QA", 1)
48 ,fhTrueMatchDiXY (NULL)
49 ,fhTrueMatchDist (NULL)
50 ,fhTrueMatchValue (NULL)
51 ,fhTrueMatchDistValue (NULL)
53 ,fhTrueMatchNofPerHit (NULL)
54 ,fhTrueMatchNofPerPoint (NULL)
56 for ( Int_t istat = 0 ; istat < 4 ; istat++ ) {
57 for ( Int_t isens = 0 ; isens < 2 ; isens++ ) {
59 for ( Int_t iregx = 0 ; iregx < 4 ; iregx++ ) {
60 for ( Int_t iregy = 0 ; iregy < 4 ; iregy++ ) {
96 : FairTask(
"GEM Find Hits QA", iVerbose)
102 ,fHistPlaneDivs (0.0)
104 ,fhTrueMatchDiXY (NULL)
105 ,fhTrueMatchDist (NULL)
106 ,fhTrueMatchValue (NULL)
107 ,fhTrueMatchDistValue (NULL)
109 ,fhTrueMatchNofPerHit (NULL)
110 ,fhTrueMatchNofPerPoint (NULL)
112 for ( Int_t istat = 0 ; istat < 4 ; istat++ ) {
113 for ( Int_t isens = 0 ; isens < 2 ; isens++ ) {
115 for ( Int_t iregx = 0 ; iregx < 4 ; iregx++ ) {
116 for ( Int_t iregy = 0 ; iregy < 4 ; iregy++ ) {
155 FairRootManager* ioman = FairRootManager::Instance();
157 cout <<
"-E- "<< GetName() <<
"::Init: "
158 <<
"RootManager not instantised!" << endl;
163 FairRunAna* ana = FairRunAna::Instance();
165 cout <<
"-E- "<< GetName() <<
"::Init :"
166 <<
" no FairRunAna object!" << endl;
170 FairRuntimeDb*
rtdb = ana->GetRuntimeDb();
172 cout <<
"-E- "<< GetName() <<
"::Init :"
173 <<
" no runtime database!" << endl;
178 fMCPointArray = (TClonesArray*) ioman->GetObject(
"GEMPoint");
180 cout <<
"-E- "<< GetName() <<
"::Init: No MCPoint array!"
186 fGemHitArray = (TClonesArray*) ioman->GetObject(
"GEMHit");
188 cout <<
"-E- " << GetName() <<
"::Init: No PndGemHit array!" << endl;
195 cout <<
"-I- " << fName.Data() <<
"::Init(). There are " <<
fDigiPar->
GetNStations() <<
" GEM stations." << endl;
196 cout <<
"-I- " << fName.Data() <<
"::Init(). Initialization succesfull." << endl;
198 TList* branchNames = FairRootManager::Instance()->GetBranchNameList();
200 Int_t nofGemBranches = 0;
202 for (
int i = 0;
i < branchNames->GetEntries();
i++){
203 TObjString* branchName = (TObjString*)branchNames->At(
i);
204 if ( !branchName->GetString().BeginsWith(
"GEM") )
continue;
206 fGemData[nofGemBranches] = (TClonesArray*) ioman->GetObject(branchName->GetString().Data());
208 cout <<
"GEM Data [" << nofGemBranches <<
"] = " << branchName->GetString().Data() <<
" referred to as " <<
i << (
fGemPointNumber==
i?
" ***":
"") << endl;
229 FairRunAna*
run = FairRunAna::Instance();
230 if ( ! run ) Fatal(
"SetParContainers",
"No analysis run");
232 FairRuntimeDb* db = run->GetRuntimeDb();
233 if ( ! db ) Fatal(
"SetParContainers",
"No runtime database");
246 Bool_t printInfo = kFALSE;
259 cout <<
"GEM Point Array has " << nofGemPnts <<
" entries" << endl;
260 cout <<
"GEM Hit Array has " << nofGemHits <<
" entries" << endl;
263 for ( Int_t ipnt = 0 ; ipnt < nofGemPnts ; ipnt++ ) {
274 cout <<
"GEM Point at " << gemPnt->GetX() <<
" , " << gemPnt->GetY() <<
" , " << gemPnt->GetZ() << endl;
275 cout <<
"----> Will go to [ " << station <<
" ] [ " << sensor <<
" ] [ " << regX <<
" ] [ " << regY <<
" ]" << endl;
278 Int_t nofCloseHits = 0;
279 Double_t distToClosestHit = 100000.;
280 for ( Int_t ihit = 0 ; ihit < nofGemHits ; ihit++ ) {
285 pntY-gemHit->GetY());
288 cout <<
"**** " << pntX <<
" : " << gemHit->GetX() <<
" *** " << pntY <<
" : " << gemHit->GetY() <<
" ***" << endl;
291 Double_t p2hDistSq = (pntX-gemHit->GetX())*(pntX-gemHit->GetX())+(pntY-gemHit->GetY())*(pntY-gemHit->GetY());
292 if ( distToClosestHit > p2hDistSq )
293 distToClosestHit = p2hDistSq;
296 cout <<
"POINT " << ipnt <<
" AND HIT " << ihit <<
" ARE CLOSE!!!" << endl;
305 if ( nofCloseHits > 0 ) {
308 if ( nofCloseHits > 1 ) {
314 cout <<
"NO MATCHING POINT IN EVENT " <<
fNofEvents <<
" FOR POINT ( " << pntX <<
" , " << pntY <<
" , " << gemPnt->GetZ() <<
" ) " <<
"[" << gemPnt->GetX() <<
"X" << gemPnt->
GetXOut() <<
"] [" << gemPnt->GetY() <<
"Y" << gemPnt->
GetYOut() <<
"]" << endl;
319 for ( Int_t ihit = 0 ; ihit < nofGemHits ; ihit++ ) {
327 Bool_t hitHasMatchingPoint = kFALSE;
329 for ( Int_t ipnt = 0 ; ipnt < nofGemPnts ; ipnt++ ) {
341 hitHasMatchingPoint = kTRUE;
346 if ( !hitHasMatchingPoint ) {
352 std::vector<std::pair<Int_t,Int_t> > mcMatchPointHit;
354 Bool_t printMCMatching = kFALSE;
355 if (
fVerbose >= 1 ) printMCMatching = kTRUE;
357 for ( Int_t ihit = 0 ; ihit < nofGemHits ; ihit++ ) {
359 if ( printMCMatching ) {
360 cout <<
"---> hit " << ihit <<
" has " << gemHit->GetNLinks() <<
" links" << endl;
361 for ( Int_t ilink = 0 ; ilink < gemHit->GetNLinks() ; ilink++ ) {
362 cout <<
" " << ilink <<
" > " << gemHit->GetLink(ilink).GetType() <<
" . " << gemHit->GetLink(ilink).GetIndex() << endl;
366 Int_t quickPointIndex = -1;
367 for ( Int_t ilink = 0 ; ilink < gemHit->GetNLinks() ; ilink++) {
369 if ( quickPointIndex != -1 )
371 quickPointIndex = -2;
374 quickPointIndex = gemHit->GetLink(ilink).GetIndex();
377 if ( quickPointIndex >= 0 ) {
378 pair<Int_t, Int_t>
a (quickPointIndex,ihit);
379 mcMatchPointHit.push_back(a);
382 if ( quickPointIndex != -1 )
continue;
383 if ( gemHit->GetNLinks() == 2 ) {
384 Int_t maxPnt0 = -1, maxPnt1 = -1;
385 std::vector<Int_t> pointVector0;
386 std::vector<Int_t> pointVector1;
387 GetPointVector(gemHit->GetLink(0).GetType(),gemHit->GetLink(0).GetIndex(),pointVector0,printMCMatching);
388 GetPointVector(gemHit->GetLink(1).GetType(),gemHit->GetLink(1).GetIndex(),pointVector1,printMCMatching);
389 if ( printMCMatching )
390 cout <<
"VECT0: (" << gemHit->GetLink(0).GetIndex() <<
") " << flush;
391 for (
size_t ipnt = 0 ; ipnt < pointVector0.size() ; ipnt++ ) {
392 if ( printMCMatching )
393 cout << pointVector0[ipnt] <<
" . " << flush;
394 if ( maxPnt0 < pointVector0[ipnt] ) {
395 maxPnt0 = pointVector0[ipnt];
398 if ( printMCMatching )
399 cout <<
"\b\b" << endl;
400 if ( printMCMatching )
401 cout <<
"VECT1: (" << gemHit->GetLink(1).GetIndex() <<
") " << flush;
402 for (
size_t ipnt = 0 ; ipnt < pointVector1.size() ; ipnt++ ) {
403 if ( printMCMatching )
404 cout << pointVector1[ipnt] <<
" . " << flush;
405 if ( maxPnt1 < pointVector1[ipnt] ) {
406 maxPnt1 = pointVector1[ipnt];
409 if ( printMCMatching )
410 cout <<
"\b\b" << endl;
411 if ( printMCMatching )
412 cout <<
"highest points are " << maxPnt0 <<
" , " << maxPnt1 << endl;
413 std::vector<Int_t> countPointV0(maxPnt0+1,0);
414 std::vector<Int_t> countPointV1(maxPnt1+1,0);
415 for (
size_t ipnt = 0 ; ipnt < pointVector0.size() ; ipnt++ ) {
416 ++countPointV0[pointVector0[ipnt]];
418 for (
size_t ipnt = 0 ; ipnt < pointVector1.size() ; ipnt++ ) {
419 ++countPointV1[pointVector1[ipnt]];
421 if ( maxPnt0 > maxPnt1 )
423 for ( Int_t ipnt = 0 ; ipnt < maxPnt0+1 ; ipnt++ ) {
424 if ( printMCMatching )
425 cout << ipnt <<
" - " << countPointV0[ipnt] <<
" ? " << countPointV1[ipnt] << endl;
426 if ( countPointV0[ipnt] > 0 ) {
427 if ( countPointV1[ipnt] > 0 ) {
428 Double_t tempMatch = 100.*
Double_t(countPointV0[ipnt]*countPointV1[ipnt])/(
Double_t(pointVector0.size()*pointVector1.size()));
429 if ( printMCMatching )
430 cout <<
"HIT " << ihit <<
" IS " << countPointV0[ipnt]*countPointV1[ipnt] <<
" / " << pointVector0.size()*pointVector1.size()
431 <<
" ( " << tempMatch
432 <<
" % ) POINT " << ipnt << endl;
433 pair<Int_t, Int_t>
a (ipnt,ihit);
434 mcMatchPointHit.push_back(a);
441 std::vector<std::pair<Int_t,Int_t> >::iterator iter;
442 for ( iter = mcMatchPointHit.begin() ; iter != mcMatchPointHit.end() ; iter++ ) {
452 pntY-gemHit->GetY());
454 pntY-gemHit->GetY());
456 (pntY-gemHit->GetY())*(pntY-gemHit->GetY()));
457 if ( tempDist > 5. ) {
458 cout <<
"Event " <<
fNofEvents <<
": point " << iter->first
459 <<
" at ( " << gemPnt->GetX() <<
"," << gemPnt->GetY() <<
"," << gemPnt->GetZ() <<
" )"
460 <<
" to ( " << gemPnt->
GetXOut() <<
"," << gemPnt->
GetYOut() <<
"," << gemPnt->
GetZOut() <<
" )" << endl
461 <<
" hit " << iter->second <<
" at ( " << gemHit->GetX() <<
"," << gemHit->GetY() <<
"," << gemHit->GetZ() <<
" )" << endl
462 <<
" ---> dist " << tempDist << endl;
470 if ( printMCMatching )
471 cout <<
"True MC Matches betwen points and hits: " << mcMatchPointHit.size() << endl;
473 std::vector<Int_t> nofMatchesPerHit (nofGemHits,0);
474 std::vector<Int_t> nofMatchesPerPoint(nofGemPnts,0);
475 for ( iter = mcMatchPointHit.begin() ; iter != mcMatchPointHit.end() ; iter++ ) {
476 ++nofMatchesPerPoint[iter->first];
477 ++nofMatchesPerHit [iter->second];
479 for ( Int_t ihit = 0 ; ihit < nofGemHits ; ihit++ ) {
482 for ( Int_t ipnt = 0 ; ipnt < nofGemPnts ; ipnt++ ) {
485 if ( nofMatchesPerPoint[ipnt] > 0 ) {
525 for ( Int_t itemp = 0 ; itemp < 10 - arrayId ; itemp++ ) cout <<
" " << flush;
526 cout <<
"GetPointVector(" << arrayId <<
", " << entryId <<
")" << endl;
529 pointVector.push_back(entryId);
530 return pointVector.size();
532 if ( arrayId == 0 ) {
537 for ( Int_t ilink = 0 ; ilink < tempData->GetNLinks() ; ilink++ ) {
538 GetPointVector(tempData->GetLink(ilink).GetType(),tempData->GetLink(ilink).GetIndex(),pointVector,printInfo);
540 return pointVector.size();
553 for ( Int_t istat = 0 ; istat < nStations ; istat++ ) {
556 for ( Int_t isens = 0 ; isens < nSensors ; isens++ ) {
564 fhPointToHit[istat][isens][iregx][iregy] =
new TH2F(Form(
"fhPointToHit_s%d_s%d_x%d_y%d",istat,isens,iregx,iregy),
565 Form(
"Points vs hits, station %d, sensor %d at z=%.1fcm, %.1f<x<%.1f, %.1f<y<%.1f",
566 istat,isens,sensor->
GetZ0(),
567 histBeginX,histBeginX+
fHistWidth[istat][isens],
568 histBeginY,histBeginY+fHistWidth[istat][isens]),
571 histBeginY+=fHistWidth[istat][isens];
581 fhPointNof [istat][isens] =
new TH2F(Form(
"fhPointNof_s%d_s%d",istat,isens),
582 Form(
"Number of points, station %d, sensor %d",istat,isens),
583 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad),
584 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad));
585 fhPointReco [istat][isens] =
new TH2F(Form(
"fhPointReco_s%d_s%d",istat,isens),
586 Form(
"Number of reconstructed points (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
587 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad),
588 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad));
589 fhPointRecoEff [istat][isens] =
new TH2F(Form(
"fhPointRecoEff_s%d_s%d",istat,isens),
590 Form(
"Hit finding efficiency (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
591 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad),
592 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad));
593 fhPointRadNof [istat][isens] =
new TH1F(Form(
"fhPointRadNof_s%d_s%d",istat,isens),
594 Form(
"Number of points, station %d, sensor %d",istat,isens),
596 fhPointRadReco [istat][isens] =
new TH1F(Form(
"fhPointRadReco_s%d_s%d",istat,isens),
597 Form(
"Number of reconstructed points (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
599 fhPointRadRecoEff [istat][isens] =
new TH1F(Form(
"fhPointRadRecoEff_s%d_s%d",istat,isens),
600 Form(
"Hit finding efficiency (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
603 fhPointMatch [istat][isens] =
new TH2F(Form(
"fhPointMatch_s%d_s%d",istat,isens),
604 Form(
"Number of matched points (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
605 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad),
606 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad));
607 fhPointMatchEff [istat][isens] =
new TH2F(Form(
"fhPointMatchEff_s%d_s%d",istat,isens),
608 Form(
"Matched points efficiency (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
609 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad),
610 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad));
611 fhPointRadMatch [istat][isens] =
new TH1F(Form(
"fhPointRadMatch_s%d_s%d",istat,isens),
612 Form(
"Number of matched points (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
614 fhPointRadMatchEff [istat][isens] =
new TH1F(Form(
"fhPointRadMatchEff_s%d_s%d",istat,isens),
615 Form(
"Matched points efficiency (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
618 fhHitNof [istat][isens] =
new TH2F(Form(
"fhHitNof_s%d_s%d",istat,isens),
619 Form(
"Number of all hits (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
620 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad),
621 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad));
622 fhHitFake [istat][isens] =
new TH2F(Form(
"fhHitFake_s%d_s%d",istat,isens),
623 Form(
"Number of fake hits (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
624 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad),
625 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad));
626 fhHitFakeProb [istat][isens] =
new TH2F(Form(
"fhHitFakeProb_s%d_s%d",istat,isens),
627 Form(
"Hit fake probability (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
628 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad),
629 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad));
630 fhHitRadNof [istat][isens] =
new TH1F(Form(
"fhHitRadNof_s%d_s%d",istat,isens),
631 Form(
"Number of all hits (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
633 fhHitRadFake [istat][isens] =
new TH1F(Form(
"fhHitRadFake_s%d_s%d",istat,isens),
634 Form(
"Number of fake hits (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
636 fhHitRadFakeProb [istat][isens] =
new TH1F(Form(
"fhHitRadFakeProb_s%d_s%d",istat,isens),
637 Form(
"Hit fake probability (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
640 fhHitMultipleRate [istat][isens] =
new TH2F(Form(
"fhHitMultipleRate_s%d_s%d",istat,isens),
641 Form(
"Distance from point to closest hits (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
642 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad),
643 2*TMath::Ceil(sensOutRad),-TMath::Ceil(sensOutRad),TMath::Ceil(sensOutRad));
644 fhCloseHits [istat][isens] =
new TH1F(Form(
"fhCloseHits_s%d_s%d",istat,isens),
645 Form(
"Number of close hits per point (point-hit %.2f cm), station %d, sensor %d",
fPointEffDist,istat,isens),
648 Form(
"True matches: difference in XY between points and hits, station %d, sensor %d",istat,isens),
652 Form(
"True matches: distance between points and hits, station %d, sensor %d",istat,isens),
678 "True matches: difference in XY between points and hits",
682 "True matches: distance between points and hits",
685 "True matches: hit-point match value in pecent",
688 "True matches: hit-point match value vs distance",
693 "True matches: number of matched points per hit",
696 "True matches: number of matched hits per point",
713 hist3->Divide(hist1,hist2,1,1,
"B");
720 cout <<
"-------------------- PndGemFindHitsQA : Finish -------------------" << endl;
724 for ( Int_t istat = 0 ; istat < nStations ; istat++ ) {
725 for ( Int_t isens = 0 ; isens < 2 ; isens++ ) {
760 cout <<
" Events: " << setw(10) <<
fNofEvents << endl;
762 cout <<
"-------------------- PndGemFindHitsQA : Efficiency ---------------" << endl;
763 cout <<
" efficiency = number of points that have hit closer than " <<
fPointEffDist <<
" cm / number of points" << endl;
764 Int_t nofPointsAll = 0;
765 Int_t nofPointsReco = 0;
766 for ( Int_t istat = 0 ; istat < nStations ; istat++ ) {
769 for ( Int_t isens = 0 ; isens < nSensors ; isens++ ) {
772 cout <<
"Station " << istat <<
" sensor " << isens <<
", eff = "
779 cout <<
" OVERALL EFF = " << ((
Double_t)(nofPointsReco))/((
Double_t)(nofPointsAll))*100.
780 <<
"% (" << nofPointsReco
781 <<
" / " << nofPointsAll
783 cout <<
"o o o o o o o o o o o o o o o o o" << endl;
786 cout <<
" TRUE MATCH EFF = " << ((
Double_t)(pointsMCM))/((
Double_t)(pointsAll))*100. <<
"% (" << pointsMCM <<
" / " << pointsAll <<
")" << endl;
788 cout <<
"-----------------------------------------------------------------" << endl;
791 FairRootManager* ioman = FairRootManager::Instance();
792 gFile = ioman->GetOutFile();
793 gDirectory = (TDirectory*)gFile;
795 gDirectory->mkdir(
"GemFindHitsQA");
796 gDirectory->cd(
"GemFindHitsQA");
798 while ( TH1* histo = ((TH1*)
next()) ) histo->Write();
799 gDirectory->cd(
"..");
TH2F * fhTrueMatchDiXYPerSt[4][2]
Int_t fGemDataPointer[1000]
virtual InitStatus Init()
TH2F * fhHitMultipleRate[4][2]
TClonesArray * fGemData[10]
Int_t GetPointVector(Int_t arrayId, Int_t entryId, std::vector< Int_t > &pointVector, Bool_t printInfo=kFALSE)
TClonesArray * fMCPointArray
TH1F * fhTrueMatchDistPerSt[4][2]
TH2F * fhPointToHit[4][2][4][4]
TH1F * fhTrueMatchNofPerHit
Int_t fNofEvents
event counter
static T Sqrt(const T &x)
TClonesArray * fGemHitArray
virtual void SetParContainers()
Digitization Parameter Class for GEM part.
Int_t GetSensorNr(Int_t sensorId)
TH1F * fhTrueMatchNofPerPoint
PndGemSensor * GetSensor(Int_t iSensor)
TH1F * fhHitRadFake[4][2]
virtual void Exec(Option_t *opt)
Int_t GetSensorNr() const
TH2F * fhPointMatchEff[4][2]
TH1F * fhPointRadReco[4][2]
Int_t GetNSensors() const
Int_t GetSensorId() const
Double_t fHistWidth[4][2]
TH2F * fhHitFakeProb[4][2]
TH1F * fhPointRadNof[4][2]
virtual InitStatus ReInit()
TH2F * fhPointMatch[4][2]
TH1F * fhPointRadMatchEff[4][2]
TH1F * fhPointRadRecoEff[4][2]
track finding quality assesment task
Int_t GetStationNr() const
Int_t GetStationNr(Int_t sensorId)
TH2F * fhPointRecoEff[4][2]
void DivideHistos(TH1 *hist1, TH1 *hist2, TH1 *hist3)
cout<<"will loop over "<< t-> GetEntries()
TH2F * fhTrueMatchDistValue
Double_t GetOuterRadius() const
virtual ~PndGemFindHitsQA()
cout<<"the Event No is "<< i<< endl;{{if(hit_array->GetEntriesFast()!=mc_array->GetEntriesFast()) continue;PndSdsHit *hit=(PndSdsHit *) hit_array-> At(j)
TH1F * fhHitRadFakeProb[4][2]
PndGemStation * GetStation(Int_t iStation)
TH1F * fhPointRadMatch[4][2]