From 2057c6e3c192fbae62f69f60dda9be4a758d4aa7 Mon Sep 17 00:00:00 2001 From: hallc-online <hallconline@gmail.com> Date: Mon, 19 Feb 2018 23:08:05 -0500 Subject: [PATCH] Add new Track Efficiency Test to THcHodoscope Moved the old track efficiency tests to OriginalTrackEffTest method and this is presently commented out. Eventually can be eliminated. The old track efficiency assumed that both planes had matching paddlle spacing which is not true for SHMS. Added new method TrackEffTest which calculates the number of clusters in each plane and the position for the cluster for scintillator paddle that had good times in both ends. Selects events with one cluster with size of 1 or 2 in either 4 of 4 planes or 3 of 4 planes. Also checks that the events are inside a given range of scintillator paddles. --- src/THcHodoscope.cxx | 162 ++++++++++++++++++++++++++++++++++++++----- src/THcHodoscope.h | 4 ++ 2 files changed, 149 insertions(+), 17 deletions(-) diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx index 18ec9f6..85c30c7 100644 --- a/src/THcHodoscope.cxx +++ b/src/THcHodoscope.cxx @@ -578,6 +578,8 @@ void THcHodoscope::ClearEvent() fdEdX.clear(); fNScinHit.clear(); fNClust.clear(); + fClustSize.clear(); + fClustPos.clear(); fThreeScin.clear(); fGoodScinHitsX.clear(); } @@ -1307,6 +1309,130 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) } // If condition for at least one track + //OriginalTrackEffTest(); + TrackEffTest(); + + + return 0; + +} +// +void THcHodoscope::TrackEffTest(void) +{ + Double_t PadLow[4]; + Double_t PadHigh[4]; + // assume X planes are 0,2 and Y planes are 1,3 + PadLow[0]=fxLoScin[0]; + PadLow[2]=fxLoScin[1]; + PadLow[1]=fyLoScin[0]; + PadLow[3]=fyLoScin[1]; + PadHigh[0]=fxHiScin[0]; + PadHigh[2]=fxHiScin[1]; + PadHigh[1]=fyHiScin[0]; + PadHigh[3]=fyHiScin[1]; + // + Double_t PadPosLo[4]; + Double_t PadPosHi[4]; + for (Int_t ip = 0; ip < fNumPlanesBetaCalc; ip++ ){ + Double_t lowtemp=fPlanes[ip]->GetPosCenter(PadLow[ip]-1)+ fPlanes[ip]->GetPosOffset(); + Double_t hitemp=fPlanes[ip]->GetPosCenter(PadHigh[ip]-1)+ fPlanes[ip]->GetPosOffset(); + if (lowtemp < hitemp) { + PadPosLo[ip]=lowtemp; + PadPosHi[ip]=hitemp; + } else { + PadPosLo[ip]=hitemp; + PadPosHi[ip]=lowtemp; + } + } + // + const Int_t MaxNClus=5; + std::vector<Int_t > iw(MaxNClus,0); + std::vector<Double_t > dw(MaxNClus,0); + for(Int_t ip = 0; ip < fNumPlanesBetaCalc; ip++ ) { + fNClust.push_back(0); + fClustSize.push_back(iw); + fClustPos.push_back(dw); + } + for (Int_t ip = 0; ip < fNumPlanesBetaCalc; ip++ ){ + TClonesArray* hodoHits = fPlanes[ip]->GetHits(); + Int_t prev_padnum=-100; + for (Int_t iphit = 0; iphit < fPlanes[ip]->GetNScinHits(); iphit++ ){ + THcHodoHit *hit = (THcHodoHit*)hodoHits->At(iphit); + Int_t padnum = hit->GetPaddleNumber(); + if ( hit->GetTwoGoodTimes() ) { + if ( padnum==prev_padnum+1 ) { + fClustSize[ip][fNClust[ip]-1]=fClustSize[ip][fNClust[ip]-1]+1; + fClustPos[ip][fNClust[ip]-1]=fClustPos[ip][fNClust[ip]-1]+fPlanes[ip]->GetPosCenter(padnum-1)+ fPlanes[ip]->GetPosOffset(); + // cout << "Add to cluster pl = " << ip+1 << " hit = " << iphit << " pad = " << padnum << " clus = " << fNClust[ip] << " cl size = " << fClustSize[ip][fNClust[ip]-1] << " pos " << fPlanes[ip]->GetPosCenter(padnum-1)+ fPlanes[ip]->GetPosOffset() << endl; + } else { + if (fNClust[ip]<MaxNClus) fNClust[ip]++; + fClustSize[ip][fNClust[ip]-1]=1; + fClustPos[ip][fNClust[ip]-1]=fPlanes[ip]->GetPosCenter(padnum-1)+ fPlanes[ip]->GetPosOffset(); + // cout << " New clus pl = " << ip+1 << " hit = " << iphit << " pad = " << padnum << " clus = " << fNClust[ip] << " cl size = " << fClustSize[ip][fNClust[ip]] << " pos " << fPlanes[ip]->GetPosCenter(padnum-1)+ fPlanes[ip]->GetPosOffset() << endl; + } + prev_padnum=padnum; + } + } + } + // + Bool_t inside_bound[4]={kFALSE,kFALSE,kFALSE,kFALSE}; + for(Int_t ip = 0; ip < fNumPlanesBetaCalc; ip++ ) { + for(Int_t ic = 0; ic <fNClust[ip] ; ic++ ) { + fClustPos[ip][ic]=fClustPos[ip][ic]/fClustSize[ip][ic]; + inside_bound[ip] = fClustPos[ip][ic]>=PadPosLo[ip] && fClustPos[ip][ic]<=PadPosHi[ip]; + //cout << "plane = " << ip+1 << " Cluster = " << ic+1 << " size = " << fClustSize[ip][ic]<< " pos = " << fClustPos[ip][ic] << " inside = " << inside_bound[ip] << " lo = " << PadPosLo[ip]<< " hi = " << PadPosHi[ip]<< endl; + } + } + // + Int_t good_for_track_test[4]={0,0,0,0}; + Int_t sum_good_track_test=0; + for(Int_t ip = 0; ip < fNumPlanesBetaCalc; ip++ ) { + if (fNClust[ip]==1 && inside_bound[ip] && fClustSize[ip][0]<=2) good_for_track_test[ip]=1; + //cout << " good for track = " << good_for_track_test[ip] << endl; + sum_good_track_test+=good_for_track_test[ip]; + } + // + Double_t trackeff_scint_ydiff_max= 10. ; + Double_t trackeff_scint_xdiff_max= 10. ; + Bool_t xdiffTest=kFALSE; + Bool_t ydiffTest=kFALSE; + fGoodScinHits = 0; + if (fTrackEffTestNScinPlanes == 4) { + if (fTrackEffTestNScinPlanes==sum_good_track_test) { + xdiffTest= TMath::Abs(fClustPos[0][0]-fClustPos[2][0])<trackeff_scint_xdiff_max; + ydiffTest= TMath::Abs(fClustPos[1][0]-fClustPos[3][0])<trackeff_scint_ydiff_max; + if (xdiffTest && ydiffTest) fGoodScinHits = 1; + } + } + // + if (fTrackEffTestNScinPlanes == 3) { + if (fTrackEffTestNScinPlanes==sum_good_track_test) { + if(good_for_track_test[0]==1&&good_for_track_test[2]==1) { + xdiffTest= TMath::Abs(fClustPos[0][0]-fClustPos[2][0])<trackeff_scint_xdiff_max; + ydiffTest=kTRUE; + } + if (good_for_track_test[1]==1&&good_for_track_test[3]==1) { + xdiffTest=kTRUE; + ydiffTest= TMath::Abs(fClustPos[1][0]-fClustPos[3][0])<trackeff_scint_ydiff_max; + } + if (xdiffTest && ydiffTest) fGoodScinHits = 1; + } + if (sum_good_track_test==4) { + xdiffTest= TMath::Abs(fClustPos[0][0]-fClustPos[2][0])<trackeff_scint_xdiff_max; + ydiffTest= TMath::Abs(fClustPos[1][0]-fClustPos[3][0])<trackeff_scint_ydiff_max; + if (xdiffTest && ydiffTest) fGoodScinHits = 1; + } + } + // + // cout << " good scin = " << fGoodScinHits << " " << sum_good_track_test << " " << xdiffTest << " " << ydiffTest<< endl; + //cout << " ************" << endl; + // +} +// +// +// +void THcHodoscope::OriginalTrackEffTest(void) +{ //----------------------------------------------------------------------- // // Trnslation of h_track_tests.f file for tracking efficiency @@ -1316,20 +1442,21 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) //************************now look at some hodoscope tests // *second, we move the scintillators. here we use scintillator cuts to see // *if a track should have been found. - + cout << " enter track eff" << fNumPlanesBetaCalc << endl; for(Int_t ip = 0; ip < fNumPlanesBetaCalc; ip++ ) { - if (!fPlanes[ip]) - return -1; + cout << " loop over planes " << ip+1 << endl; TClonesArray* hodoHits = fPlanes[ip]->GetHits(); // TClonesArray* scinPosTDC = fPlanes[ip]->GetPosTDC(); // TClonesArray* scinNegTDC = fPlanes[ip]->GetNegTDC(); fNScinHits[ip] = fPlanes[ip]->GetNScinHits(); + cout << " hits = " << fNScinHits[ip] << endl; for (Int_t iphit = 0; iphit < fNScinHits[ip]; iphit++ ){ Int_t paddle = ((THcHodoHit*)hodoHits->At(iphit))->GetPaddleNumber()-1; fScinHitPaddle[ip][paddle] = 1; + cout << " hit = " << iphit+1 << " " << paddle+1 << endl; } } @@ -1341,28 +1468,28 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) for(Int_t ip = 0; ip < fNumPlanesBetaCalc; ip++ ) { // Planes ip = 0 = 1X // Planes ip = 2 = 2X - if (!fPlanes[ip]) return -1; fNClust.push_back(0); fThreeScin.push_back(0); } // *look for clusters in x planes... (16 scins) !this assume both x planes have same // *number of scintillators. + cout << " looking for cluster in x planes" << endl; Int_t icount; for (Int_t ip = 0; ip < 3; ip +=2 ) { icount = 0; - if ( fScinHitPaddle[ip][0] == 1 ) - icount ++; + if ( fScinHitPaddle[ip][0] == 1 ) icount ++; + cout << "plane =" << ip << "check if paddle 1 hit " << icount << endl; for (Int_t ipaddle = 0; ipaddle < (Int_t) fNPaddle[ip] - 1; ipaddle++ ){ // !look for number of clusters of 1 or more hits - if ( ( fScinHitPaddle[ip][ipaddle] == 0 ) && ( fScinHitPaddle[ip][ipaddle + 1] == 1 ) ) icount ++; - + cout << " paddle = " << ipaddle+1 << " " << icount << endl; + } // Loop over paddles - + cout << "Two cluster in plane = " << ip+1 << " " << icount << endl; fNClust[ip] = icount; icount = 0; @@ -1374,6 +1501,7 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) ( fScinHitPaddle[ip][ipaddle + 2] == 1 ) ) icount ++; } // Second loop over paddles + cout << "Three clusters in plane = " << ip+1 << " " << icount << endl; if ( icount > 0 ) fThreeScin[ip] = 1; @@ -1382,15 +1510,15 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) // *look for clusters in y planes... (10 scins) !this assume both y planes have same // *number of scintillators. + cout << " looking for cluster in y planes" << endl; for (Int_t ip = 1; ip < fNumPlanesBetaCalc; ip +=2 ) { // Planes ip = 1 = 1Y // Planes ip = 3 = 2Y - if (!fPlanes[ip]) return -1; icount = 0; - if ( fScinHitPaddle[ip][0] == 1 ) - icount ++; + if ( fScinHitPaddle[ip][0] == 1 ) icount ++; + cout << "plane =" << ip << "check if paddle 1 hit " << icount << endl; for (Int_t ipaddle = 0; ipaddle < (Int_t) fNPaddle[ip] - 1; ipaddle++ ){ // !look for number of clusters of 1 or more hits @@ -1398,8 +1526,10 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) if ( ( fScinHitPaddle[ip][ipaddle] == 0 ) && ( fScinHitPaddle[ip][ipaddle + 1] == 1 ) ) icount ++; + cout << " paddle = " << ipaddle+1 << " " << icount << endl; } // Loop over Y paddles + cout << "Two cluster in plane = " << ip+1 << " " << icount << endl; fNClust[ip] = icount; icount = 0; @@ -1413,6 +1543,7 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) icount ++; } // Second loop over Y paddles + cout << "Three clusters in plane = " << ip+1 << " " << icount << endl; if ( icount > 0 ) fThreeScin[ip] = 1; @@ -1514,11 +1645,7 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) if ( TMath::Abs( fSweet1YScin - fSweet2YScin ) > 2 ) fGoodScinHits = 0; } - - - - return 0; - +// } //_____________________________________________________________________________ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) @@ -1593,6 +1720,7 @@ Int_t THcHodoscope::GetScinIndex( Int_t nSide, Int_t nPlane, Int_t nPaddle ) { Double_t THcHodoscope::GetPathLengthCentral() { return fPathLengthCentral; } + //_____________________________________________________________________________ Int_t THcHodoscope::End(THaRunBase* run) { diff --git a/src/THcHodoscope.h b/src/THcHodoscope.h index 7edfb57..b1e00ea 100644 --- a/src/THcHodoscope.h +++ b/src/THcHodoscope.h @@ -49,6 +49,8 @@ public: virtual Int_t End(THaRunBase* run=0); void EstimateFocalPlaneTime(void); + void OriginalTrackEffTest(void); + void TrackEffTest(void); virtual Int_t ApplyCorrections( void ); Double_t GetStartTime() const { return fStartTime; } Bool_t IsStartTimeGood() const {return fGoodStartTime;}; @@ -336,6 +338,8 @@ scin_pos_time(0.0), scin_neg_time(0.0) {} std::vector<Int_t > fNScinHit; // # scins hit for the track std::vector<std::vector<Int_t> > fScinHitPaddle; // Vector over hits in a plane # std::vector<Int_t > fNClust; // # scins clusters for the plane + std::vector<std::vector<Int_t> > fClustSize; // # scin cluster size + std::vector<std::vector<Double_t> > fClustPos; // # scin cluster position std::vector<Int_t > fThreeScin; // # scins three clusters for the plane std::vector<Int_t > fGoodScinHitsX; // # hits in fid x range // Could combine the above into a structure -- GitLab