From a5f2fd136db16baec42fa68abb58cc935ffa0109 Mon Sep 17 00:00:00 2001 From: "Stephen A. Wood" <saw@jlab.org> Date: Mon, 6 Apr 2015 17:11:32 -0400 Subject: [PATCH] Avoid repeated calculation of pulse height correction to time. Pulse height corrected times saved in THcHodoHit objects. PulseHeightCorrection method renamed to EstimateFocalPlaneTimes because the pulse height correction is now done in the ProcessHitsMethod. --- src/THcHodoHit.h | 8 ++++ src/THcHodoscope.cxx | 29 +++--------- src/THcScintillatorPlane.cxx | 87 +++++++++++------------------------- src/THcScintillatorPlane.h | 4 +- 4 files changed, 44 insertions(+), 84 deletions(-) diff --git a/src/THcHodoHit.h b/src/THcHodoHit.h index 03c538c..be94afc 100644 --- a/src/THcHodoHit.h +++ b/src/THcHodoHit.h @@ -28,8 +28,14 @@ public: Double_t GetNegADC() const { return fNegADC_Ped; } Int_t GetPosTDC() const { return fPosTDC; } Int_t GetNegTDC() const { return fNegTDC; } + Double_t GetPosCorrectedTime() const { return fPosCorrectedTime;} + Double_t GetNegCorrectedTime() const { return fNegCorrectedTime;} Int_t GetPaddleNumber() const { return fPaddleNumber; } + void SetCorrectedTimes(Double_t pos, Double_t neg) { + fPosCorrectedTime = pos; fNegCorrectedTime = neg; + } + protected: static const Double_t kBig; //! @@ -38,6 +44,8 @@ protected: Int_t fNegTDC; Double_t fPosADC_Ped; // Pedestal subtracted ADC Double_t fNegADC_Ped; // Pedestal subtracted ADC + Double_t fPosCorrectedTime; // Pulse height corrected time + Double_t fNegCorrectedTime; // Pulse height corrected time THcScintillatorPlane* fPlane; // Pointer to parent scintillator plane diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx index bb0e341..b3b2f61 100644 --- a/src/THcHodoscope.cxx +++ b/src/THcHodoscope.cxx @@ -690,7 +690,7 @@ Int_t THcHodoscope::Decode( const THaEvData& evdata ) // as per the Engine h_strip_scin.f nexthit = fPlanes[ip]->ProcessHits(fRawHitList,nexthit); if (fPlanes[ip]->GetNScinHits()>0) { - fPlanes[ip]->PulseHeightCorrection(); + fPlanes[ip]->EstimateFocalPlaneTimes(); // GN: allow for more than one fptime per plane!! for (Int_t i=0;i<fPlanes[ip]->GetNScinGoodHits();i++) { if (TMath::Abs(fPlanes[ip]->GetFpTime(i)-fStartTimeCenter)<=fStartTimeSlop) { @@ -853,16 +853,12 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) if ( TMath::Abs( scinCenter - scinTrnsCoord ) < ( fPlanes[ip]->GetSize() * 0.5 + fPlanes[ip]->GetHodoSlop() ) ){ // Line 293 - Double_t adcPhp = ((THcHodoHit*)hodoHits->At(iphit))->GetPosADC(); Double_t pathp = fPlanes[ip]->GetPosLeft() - scinLongCoord; - Double_t timep = ((THcHodoHit*)hodoHits->At(iphit))->GetPosTDC() * fScinTdcToTime; - timep = timep - fHodoPosPhcCoeff[fPIndex] * - TMath::Sqrt( TMath::Max( 0., ( ( adcPhp / fHodoPosMinPh[fPIndex] ) - 1 ) ) ); + Double_t timep = ((THcHodoHit*)hodoHits->At(iphit))->GetPosCorrectedTime(); timep = timep - ( pathp / fHodoVelLight[fPIndex] ) - ( fPlanes[ip]->GetZpos() + ( paddle % 2 ) * fPlanes[ip]->GetDzpos() ) / ( 29.979 * betaP ) * TMath::Sqrt( 1. + theTrack->GetTheta() * theTrack->GetTheta() + theTrack->GetPhi() * theTrack->GetPhi() ); - timep = timep - fHodoPosTimeOffset[fPIndex]; fTOFPInfo[iphit].time_pos = timep; for ( Int_t k = 0; k < 200; k++ ){ // Line 211 @@ -871,16 +867,12 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) timehist[k] ++; } - Double_t adcPhn = ((THcHodoHit*)hodoHits->At(iphit))->GetNegADC(); Double_t pathn = scinLongCoord - fPlanes[ip]->GetPosRight(); - Double_t timen = ((THcHodoHit*)hodoHits->At(iphit))->GetNegTDC() * fScinTdcToTime; - timen =timen - fHodoNegPhcCoeff[fPIndex] * - TMath::Sqrt( TMath::Max( 0., ( ( adcPhn / fHodoNegMinPh[fPIndex] ) - 1 ) ) ); + Double_t timen = ((THcHodoHit*)hodoHits->At(iphit))->GetNegCorrectedTime(); timen = timen - ( pathn / fHodoVelLight[fPIndex] ) - ( fPlanes[ip]->GetZpos() + ( paddle % 2 ) * fPlanes[ip]->GetDzpos() ) / ( 29.979 * betaP ) * TMath::Sqrt( 1. + theTrack->GetTheta() * theTrack->GetTheta() + theTrack->GetPhi() * theTrack->GetPhi() ); - timen = timen - fHodoNegTimeOffset[fPIndex]; fTOFPInfo[iphit].time_neg = timen; for ( Int_t k = 0; k < 200; k++ ){ // Line 230 @@ -966,16 +958,13 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) // ** Calculate time for each tube with a good tdc. 'pos' side first. fTOFCalc[ihhit].good_tdc_pos = kTRUE; - Double_t adcPh = ((THcHodoHit*)hodoHits->At(iphit))->GetPosADC(); Double_t path = fPlanes[ip]->GetPosLeft() - scinLongCoord; // * Convert TDC value to time, do pulse height correction, correction for // * propogation of light thru scintillator, and offset. - Double_t time = ((THcHodoHit*)hodoHits->At(iphit))->GetPosTDC() * fScinTdcToTime; - time = time - ( fHodoPosPhcCoeff[fPIndex] * TMath::Sqrt( TMath::Max( 0. , - ( ( adcPh / fHodoPosMinPh[fPIndex] ) - 1 ) ) ) ); + Double_t time = ((THcHodoHit*)hodoHits->At(iphit))->GetPosCorrectedTime(); time = time - ( path / fHodoVelLight[fPIndex] ); - fTOFPInfo[iphit].scin_pos_time = time - fHodoPosTimeOffset[fPIndex]; + fTOFPInfo[iphit].scin_pos_time = time; } // check for good pos TDC condition @@ -984,17 +973,13 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) // ** Calculate time for each tube with a good tdc. 'pos' side first. fTOFCalc[ihhit].good_tdc_neg = kTRUE; // fNtof ++; - Double_t adcPh = ((THcHodoHit*)hodoHits->At(iphit))->GetNegADC(); - // Double_t path = fPlanes[ip]->GetPosRight() - scinLongCoord; Double_t path = scinLongCoord - fPlanes[ip]->GetPosRight(); // * Convert TDC value to time, do pulse height correction, correction for // * propogation of light thru scintillator, and offset. - Double_t time = ((THcHodoHit*)hodoHits->At(iphit))->GetNegTDC() * fScinTdcToTime; - time = time - ( fHodoNegPhcCoeff[fPIndex] * - TMath::Sqrt( TMath::Max( 0. , ( ( adcPh / fHodoNegMinPh[fPIndex] ) - 1 ) ) ) ); + Double_t time = ((THcHodoHit*)hodoHits->At(iphit))->GetNegCorrectedTime(); time = time - ( path / fHodoVelLight[fPIndex] ); - fTOFPInfo[iphit].scin_neg_time = time - fHodoNegTimeOffset[fPIndex]; + fTOFPInfo[iphit].scin_neg_time = time; } // check for good neg TDC condition diff --git a/src/THcScintillatorPlane.cxx b/src/THcScintillatorPlane.cxx index 9556cbe..891f1f3 100644 --- a/src/THcScintillatorPlane.cxx +++ b/src/THcScintillatorPlane.cxx @@ -328,7 +328,17 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) ((hit->fTDC_neg >= fScinTdcMin) && (hit->fTDC_neg <= fScinTdcMax))) { // If TDC values are all good, transfer the raw hit to the HodoHit list - new( (*fHodoHits)[fNScinHits++]) THcHodoHit(hit, fPosPed[index], fNegPed[index], this); + new( (*fHodoHits)[fNScinHits]) THcHodoHit(hit, fPosPed[index], fNegPed[index], this); + + // Do the pulse height correction to the time. (Position dependent corrections later) + Double_t timec_pos = hit->fTDC_pos*fScinTdcToTime - fHodoPosPhcCoeff[index]* + TMath::Sqrt(TMath::Max(0.0,(hit->fADC_pos/fHodoPosMinPh[index]-1))) + - fHodoPosTimeOffset[index]; + Double_t timec_neg = hit->fTDC_neg*fScinTdcToTime - fHodoNegPhcCoeff[index]* + TMath::Sqrt(TMath::Max(0.0,(hit->fADC_neg/fHodoNegMinPh[index]-1))) + - fHodoNegTimeOffset[index]; + ((THcHodoHit*) fHodoHits->At(fNScinHits))->SetCorrectedTimes(timec_pos,timec_neg); + fNScinHits++; } else { } @@ -341,7 +351,7 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) } //________________________________________________________________________________ -Int_t THcScintillatorPlane::PulseHeightCorrection() +Int_t THcScintillatorPlane::EstimateFocalPlaneTimes() { // Perform pulse height correction of the TDC values as in the original h_trans_scin // see original comments below @@ -356,7 +366,7 @@ Int_t THcScintillatorPlane::PulseHeightCorrection() ! reference particle, need to make sure this is big enough ! to accomodate difference in TOF for other particles ! Default value in case user hasn't defined something reasonable */ - Double_t pos_ph[53],neg_ph[53],postime[53],negtime[53],scin_corrected_time[53]; // the 53 should go in a param file (was hmax_scin_hits originally) + Double_t scin_corrected_time[53]; // the 53 should go in a param file (was hmax_scin_hits originally) // Bool_t keep_pos[53],keep_neg[53]; // are these all really needed? Bool_t two_good_times[53]; Double_t dist_from_center,scint_center,hit_position,time_pos[100],time_neg[100]; @@ -372,41 +382,26 @@ Int_t THcScintillatorPlane::PulseHeightCorrection() for (Int_t i=0;i<200;i++) { timehist[i]=0; } - for (Int_t i=0;i<fMaxHits;i++) { - // keep_pos[i]=kFALSE; - // keep_neg[i]=kFALSE; - two_good_times[i]=kFALSE; - } fpTime=-1e5; for (Int_t i=0;i<fNScinHits;i++) { - // Perhaps these calculations should be done in the THcHodoHit class so - // that they don't get repeated Int_t index=((THcHodoHit*)fHodoHits->At(i))->GetPaddleNumber()-1; - pos_ph[i]=((THcHodoHit*) fHodoHits->At(i))->GetPosADC(); - postime[i]=((THcHodoHit*) fHodoHits->At(i))->GetPosTDC()*fScinTdcToTime; - postime[i]=postime[i]-fHodoPosPhcCoeff[index]* - TMath::Sqrt(TMath::Max(0.,(pos_ph[i]/fHodoPosMinPh[index]-1))); - postime[i]=postime[i]-fHodoPosTimeOffset[index]; - - neg_ph[i]=((THcHodoHit*) fHodoHits->At(i))->GetNegADC(); - negtime[i]=((THcHodoHit*) fHodoHits->At(i))->GetNegTDC()*fScinTdcToTime; - negtime[i]=negtime[i]-fHodoNegPhcCoeff[index]* - TMath::Sqrt(TMath::Max(0.,(neg_ph[i]/fHodoNegMinPh[index]-1))); - negtime[i]=negtime[i]-fHodoNegTimeOffset[index]; + Double_t postime=((THcHodoHit*) fHodoHits->At(i))->GetPosCorrectedTime(); + Double_t negtime=((THcHodoHit*) fHodoHits->At(i))->GetNegCorrectedTime(); // Find hit position. If postime larger, then hit was nearer negative side. - dist_from_center=0.5*(negtime[i]-postime[i])*fHodoVelLight[index]; + dist_from_center=0.5*(negtime-postime)*fHodoVelLight[index]; scint_center=0.5*(fPosLeft+fPosRight); hit_position=scint_center+dist_from_center; hit_position=TMath::Min(hit_position,fPosLeft); hit_position=TMath::Max(hit_position,fPosRight); - postime[i]=postime[i]-(fPosLeft-hit_position)/fHodoVelLight[index]; - negtime[i]=negtime[i]-(hit_position-fPosRight)/fHodoVelLight[index]; + postime=postime-(fPosLeft-hit_position)/fHodoVelLight[index]; + negtime=negtime-(hit_position-fPosRight)/fHodoVelLight[index]; + scin_corrected_time[i]=0.5*(postime+negtime); - time_pos[i]=postime[i]-(fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal); - time_neg[i]=negtime[i]-(fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal); + time_pos[i]=postime-(fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal); + time_neg[i]=negtime-(fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal); // nfound++; for (Int_t k=0;k<200;k++) { Double_t tmin=0.5*(k+1); @@ -434,42 +429,14 @@ Int_t THcScintillatorPlane::PulseHeightCorrection() for (Int_t i=0;i<fNScinHits;i++) { Double_t tmin = 0.5*jmax; if ((time_pos[i]>tmin) && (time_pos[i]<tmin+fTofTolerance) && - (time_neg[i]>tmin) && (time_neg[i]<tmin+fTofTolerance)) + (time_neg[i]>tmin) && (time_neg[i]<tmin+fTofTolerance)) { two_good_times[i]=kTRUE; - } // end of loop that finds tube setting time - for (Int_t i=0;i<fNScinHits;i++) { - if (two_good_times[i]) { // both tubes fired - // correct time for everything except veloc. correction in order - // to find hit location from difference in TDC. - // We are repeating some stuff here. Should save it all in the hit - // class so it doesn't have to be recalculated. (Avoid mistakes too) - Int_t index=((THcHodoHit*)fHodoHits->At(i))->GetPaddleNumber()-1; - pos_ph[i]=((THcHodoHit*) fHodoHits->At(i))->GetPosADC(); - postime[i]=((THcHodoHit*) fHodoHits->At(i))->GetPosTDC()*fScinTdcToTime; - postime[i]=postime[i]-fHodoPosPhcCoeff[index]* - TMath::Sqrt(TMath::Max(0.,(pos_ph[i]/fHodoPosMinPh[index]-1))); - postime[i]=postime[i]-fHodoPosTimeOffset[index]; - - neg_ph[i]=((THcHodoHit*) fHodoHits->At(i))->GetNegADC(); - negtime[i]=((THcHodoHit*) fHodoHits->At(i))->GetNegTDC()*fScinTdcToTime; - negtime[i]=negtime[i]-fHodoNegPhcCoeff[index]* - TMath::Sqrt(TMath::Max(0.,(neg_ph[i]/fHodoNegMinPh[index]-1))); - negtime[i]=negtime[i]-fHodoNegTimeOffset[index]; - - // find hit position. If postime larger, then hit was nearer negative side - dist_from_center=0.5*(negtime[i]-postime[i])*fHodoVelLight[index]; - scint_center=0.5*(fPosLeft+fPosRight); - hit_position=scint_center+dist_from_center; - hit_position=TMath::Min(hit_position,fPosLeft); - hit_position=TMath::Max(hit_position,fPosRight); - postime[i]=postime[i]-(fPosLeft-hit_position)/fHodoVelLight[index]; - negtime[i]=negtime[i]-(hit_position-fPosRight)/fHodoVelLight[index]; - scin_corrected_time[i]=0.5*(postime[i]+negtime[i]); - } else { // only one tube fired + } else { + two_good_times[i]=kFALSE; scin_corrected_time[i]=0.0; // not a very good "flag" but there is the logical two_good_hits... - // no fpTimes for U! } - } + } // end of loop that finds tube setting time + //start time calculation. assume xp=yp=0 radians. project all //time values to focal plane. use average for start time. @@ -488,7 +455,7 @@ Int_t THcScintillatorPlane::PulseHeightCorrection() } CalcFpTime(); return 0; -} + } //_____________________________________________________________________________ Int_t THcScintillatorPlane::AccumulatePedestals(TClonesArray* rawhits, Int_t nexthit) { diff --git a/src/THcScintillatorPlane.h b/src/THcScintillatorPlane.h index 70db898..0e45a50 100644 --- a/src/THcScintillatorPlane.h +++ b/src/THcScintillatorPlane.h @@ -35,7 +35,7 @@ class THcScintillatorPlane : public THaSubDetector { virtual Bool_t IsPid() { return kFALSE; } virtual Int_t ProcessHits(TClonesArray* rawhits, Int_t nexthit); - virtual Int_t PulseHeightCorrection(); + virtual Int_t EstimateFocalPlaneTimes(); virtual Int_t AccumulatePedestals(TClonesArray* rawhits, Int_t nexthit); virtual void CalculatePedestals( ); @@ -102,7 +102,7 @@ class THcScintillatorPlane : public THaSubDetector { Double_t *fHodoVelLight; Double_t *fHodoSigma; - Double_t fTolerance; /* need this for PulseHeightCorrection */ + Double_t fTolerance; /* need this for Focal Plane Time estimation */ /* Pedestal Quantities */ Int_t fNPedestalEvents; /* Number of pedestal events */ Int_t fMinPeds; /* Only analyze/update if num events > */ -- GitLab