diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx index a2c401064566f04d9b2771af18d799d2f856e1c0..7fa88fa8149d920c6ee0c0fd1c59284adb56c31e 100644 --- a/src/THcHodoscope.cxx +++ b/src/THcHodoscope.cxx @@ -597,6 +597,9 @@ Int_t THcHodoscope::Decode( const THaEvData& evdata ) // Get the Hall C style hitlist (fRawHitList) for this event Int_t nhits = THcHitList::DecodeToHitList(evdata); + // + // GN: print event number so we can cross-check with engine + // if (evdata.GetEvNum()>1000) cout <<"hcana event no = "<<evdata.GetEvNum()<<endl; if(gHaCuts->Result("Pedestal_event")) { Int_t nexthit = 0; @@ -615,9 +618,9 @@ Int_t THcHodoscope::Decode( const THaEvData& evdata ) // Let each plane get its hits Int_t nexthit = 0; - Int_t nfptimes=0; fStartTime=0; + fNfptimes=0; for(Int_t ip=0;ip<fNPlanes;ip++) { // nexthit = fPlanes[ip]->ProcessHits(fRawHitList, nexthit); // GN: select only events that have reasonable TDC values to start with @@ -625,21 +628,27 @@ Int_t THcHodoscope::Decode( const THaEvData& evdata ) nexthit = fPlanes[ip]->ProcessHits(fRawHitList,nexthit); if (fPlanes[ip]->GetNScinHits()>0) { fPlanes[ip]->PulseHeightCorrection(); - if (TMath::Abs(fPlanes[ip]->GetFpTime()-fStartTimeCenter)<=fStartTimeSlop) { - fStartTime=fStartTime+fPlanes[ip]->GetFpTime(); - nfptimes++; + // 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) { + fStartTime=fStartTime+fPlanes[ip]->GetFpTime(i); + // GN write stuff out so I can compare with engine + /// cout<<"hcana event= "<<evdata.GetEvNum()<<" fNfptimes= "<<fNfptimes<<" fptime= "<<fPlanes[ip]->GetFpTime(i)<<endl; + fNfptimes++; + } } } } - if (nfptimes>0) { - fStartTime=fStartTime/nfptimes; + if (fNfptimes>0) { + fStartTime=fStartTime/fNfptimes; fGoodStartTime=kTRUE; } else { fGoodStartTime=kFALSE; fStartTime=fStartTimeCenter; } - fStartTime=32.; // mkj force to constant - // cout <<" stats = "<<fGoodStartTime<<" "<<nfptimes<<" fStartTime = "<<fStartTime<<endl; + +/// fStartTime=32.; // mkj force to constant +/// if (fGoodStartTime) cout <<"hcana event= "<<evdata.GetEvNum()<<" fNfptimes= "<<fNfptimes<<" fStartTime= "<<fStartTime<<endl<<endl; // fRawHitList is TClones array of THcHodoscopeHit objects #if 0 for(Int_t ihit = 0; ihit < fNRawHits ; ihit++) { @@ -650,7 +659,6 @@ Int_t THcHodoscope::Decode( const THaEvData& evdata ) } cout << endl; #endif - /// fStartTime = 500; // Drift Chamber will need this return nhits; @@ -720,4 +728,66 @@ Double_t THcHodoscope::GetPathLengthCentral() { return fPathLengthCentral; } ClassImp(THcHodoscope) +//_____________________________________________________________________________ +Double_t THcHodoscope::CalcBeta(Int_t trackno) { + // clone of Engine's h_tof_fit. Original comments follow: + /* +*------------------------------------------------------------------- +* author: John Arrington +* created: 2/22/94 +* +* h_tof_fit fits the velocity of the paritcle from the corrected +* times generated by h_tof. +* +* modifications: +* $Log: h_tof_fit.f,v $ +* Revision 1.10 1996/09/04 13:36:24 saw +* (JRA) Include actual beta in calculation of focal plane time. +* +* Revision 1.9 1995/05/22 19:39:29 cdaq +* (SAW) Split gen_data_data_structures into gen, hms, sos, and coin parts" +* +* Revision 1.8 1995/02/23 13:29:15 cdaq +* (SAW) Cosmetic Changes +* +* Revision 1.7 1995/02/10 18:49:57 cdaq +* (JRA) Add track index to hgood_scin_time +* +* Revision 1.6 1994/09/13 21:26:53 cdaq +* (JRA) fix chisq calculation +* +* Revision 1.5 1994/07/13 15:05:08 cdaq +* (SAW) Add abs around tmpdenom that I left out last update +* +* Revision 1.4 1994/07/11 18:34:35 cdaq +* (JRA) Increase comparison of tmpdenom from 1e-15 to 1e-10 +* +* Revision 1.3 1994/07/08 19:42:31 cdaq +* (JRA) Change fit from velocity to beta. Bad fits give beta=0 +* +* Revision 1.2 1994/06/14 04:53:41 cdaq +* (DFG) Protect against divide by 0 in beta calc +* +* Revision 1.1 1994/04/13 16:29:15 cdaq +* Initial revision +* +*------------------------------------------------------------------- + */ + + Double_t SumW, SumT, SumZ, SumZZ, SumTZ; + Double_t ScinWeight; + Double_t tmp, t0 ,tmpdenom; + Double_t PathNorm; + Double_t tmpbeta; + Int_t hit; + + SumW = 0.; + SumT = 0.; + SumZ = 0.; + SumZZ = 0.; + SumTZ = 0.; + // for (int i=0;i< + + return tmpbeta; +} //////////////////////////////////////////////////////////////////////////////// diff --git a/src/THcHodoscope.h b/src/THcHodoscope.h index 7d18bc8d808b8ea6cead145c8c615e79544b0504..11fe399e9d286bebfb58bf547a0fe640759133c3 100644 --- a/src/THcHodoscope.h +++ b/src/THcHodoscope.h @@ -32,6 +32,7 @@ public: virtual Int_t ApplyCorrections( void ); Double_t GetStartTime() const { return fStartTime; } Bool_t IsStartTimeGood() const {return fGoodStartTime;}; + Int_t GetNfptimes() const {return fNfptimes;}; Int_t GetScinIndex(Int_t nPlane, Int_t nPaddle); Int_t GetScinIndex(Int_t nSide, Int_t nPlane, Int_t nPaddle); Double_t GetPathLengthCentral(); @@ -47,6 +48,13 @@ public: Double_t GetHodoPosTimeOffset(Int_t iii) const {return fHodoPosTimeOffset[iii];} Double_t GetHodoNegTimeOffset(Int_t iii) const {return fHodoNegTimeOffset[iii];} Double_t GetHodoVelLight(Int_t iii) const {return fHodoVelLight[iii];} + Double_t GetStartTimeCenter() const {return fStartTimeCenter;} + Double_t GetStartTimeSlop() const {return fStartTimeSlop;} + Double_t GetBetaNotrk() const {return fBetaNotrk;} + Double_t GetBeta() const {return fBeta;} + Double_t GetHodoPosSigma(Int_t iii) const {return fHodoPosSigma[iii];} + Double_t GetHodoNegSigma(Int_t iii) const {return fHodoNegSigma[iii];} + Double_t CalcBeta(Int_t trackno); const TClonesArray* GetTrackHits() const { return fTrackProj; } @@ -61,8 +69,11 @@ protected: // Per-event data Bool_t fGoodStartTime; - Double_t fStartTime; - + Double_t fStartTime; + Int_t fNfptimes; + + Double_t fBetaNotrk; + Double_t fBeta; // Per-event data // Potential Hall C parameters. Mostly here for demonstration diff --git a/src/THcScintillatorPlane.cxx b/src/THcScintillatorPlane.cxx index c326fe0a179917e068f8cb951033a06e8d383211..b39ca7adb3c69750b323e86978db9fa2585ecddd 100644 --- a/src/THcScintillatorPlane.cxx +++ b/src/THcScintillatorPlane.cxx @@ -46,6 +46,10 @@ THcScintillatorPlane::THcScintillatorPlane( const char* name, // fMaxHits=53; fpTime = -1.e5; + fpTimes = new Double_t [fMaxHits]; + fScinTime = new Double_t [fMaxHits]; + fScinSigma = new Double_t [fMaxHits]; + fScinZpos = new Double_t [fMaxHits]; } //______________________________________________________________________________ THcScintillatorPlane::THcScintillatorPlane( const char* name, @@ -70,7 +74,10 @@ THcScintillatorPlane::THcScintillatorPlane( const char* name, // fMaxHits=53; fpTime = -1.e5; - + fpTimes = new Double_t [fMaxHits]; + fScinTime = new Double_t [fMaxHits]; + fScinSigma = new Double_t [fMaxHits]; + fScinZpos = new Double_t [fMaxHits]; } //______________________________________________________________________________ @@ -85,6 +92,10 @@ THcScintillatorPlane::~THcScintillatorPlane() delete frNegTDCHits; delete frPosADCHits; delete frNegADCHits; + delete fpTimes; + delete fScinTime; + delete fScinSigma; + delete fScinZpos; } //______________________________________________________________________________ @@ -508,14 +519,29 @@ Int_t THcScintillatorPlane::PulseHeightCorrection() postime[i]=postime[i]-(fPosLeft-hit_position)/((THcHodoscope *)GetParent())->GetHodoVelLight(index); negtime[i]=negtime[i]-(hit_position-fPosRight)/((THcHodoscope *)GetParent())->GetHodoVelLight(index); scin_corrected_time[i]=0.5*(postime[i]+negtime[i]); - fpTime=scin_corrected_time[i]-(fZpos+(j%2)*fDzpos)/(29.979*hbeta_pcent); } else { // only one tube fired scin_corrected_time[i]=0.0; // not a very good "flag" but there is the logical two_good_hits... + // no fpTimes for U! + } + } + //start time calculation. assume xp=yp=0 radians. project all + //time values to focal plane. use average for start time. + + fNScinGoodHits=0; + for (i=0;i<fNScinHits;i++) { + j=((THcSignalHit*)fNegTDCHits->At(i))->GetPaddleNumber()-1; + index=((THcHodoscope *)GetParent())->GetScinIndex(fPlaneNum-1,j); + if (two_good_times[i]) { // both tubes fired + fpTimes[fNScinGoodHits]=scin_corrected_time[i]-(fZpos+(j%2)*fDzpos)/(29.979*hbeta_pcent); + fScinTime[fNScinGoodHits]=scin_corrected_time[i]; + fScinSigma[fNScinGoodHits]=TMath::Sqrt(((THcHodoscope *)GetParent())->GetHodoPosSigma(index)*((THcHodoscope *)GetParent())->GetHodoPosSigma(index)+((THcHodoscope *)GetParent())->GetHodoNegSigma(index)*((THcHodoscope *)GetParent())->GetHodoNegSigma(index)); // not ideal by any stretch!!! + fScinZpos[fNScinGoodHits]=fZpos+(j%2)*fDzpos; // see comment above + // h_rfptime(hscin_plane_num(ihit))=fptime + fNScinGoodHits++; // increment the number of good hits } } - // Start time calculation, assume xp=yp=0 radians. project all - // time values to focal plane. use average for start time. + CalcFpTime(); return 0; } //_____________________________________________________________________________ @@ -616,7 +642,8 @@ void THcScintillatorPlane::InitializePedestals( ) Int_t THcScintillatorPlane::GetNelem() { return fNelem; -}//____________________________________________________________________________ +} +//____________________________________________________________________________ Int_t THcScintillatorPlane::GetNScinHits() { return fNScinHits; @@ -663,6 +690,24 @@ Double_t THcScintillatorPlane::GetPosCenter(Int_t PaddleNo) { return fPosCenter[PaddleNo]; } //____________________________________________________________________________ +Double_t THcScintillatorPlane::CalcFpTime() +{ + Double_t tmp=0; + Int_t i,counter=0; + for (i=0;i<fNScinHits;i++) { + if (TMath::Abs(fpTimes[i]-((THcHodoscope *)GetParent())->GetStartTimeCenter())<=((THcHodoscope *)GetParent())->GetStartTimeSlop()) { + tmp+=fpTimes[i]; + counter++; + } + } + if (counter>0) { + fpTime=tmp/counter; + } else { + fpTime=((THcHodoscope *)GetParent())->GetStartTimeCenter(); + } + return fpTime; +} +//____________________________________________________________________________ ClassImp(THcScintillatorPlane) //////////////////////////////////////////////////////////////////////////////// diff --git a/src/THcScintillatorPlane.h b/src/THcScintillatorPlane.h index cb832fa7dd0975bf1eb0d064e6e6cb91a2e60cfb..2a5cec516dfe899045b00539f5787fb571d12c8b 100644 --- a/src/THcScintillatorPlane.h +++ b/src/THcScintillatorPlane.h @@ -53,7 +53,13 @@ class THcScintillatorPlane : public THaSubDetector { Double_t GetPosRight(); Double_t GetPosOffset(); Double_t GetPosCenter(Int_t PaddleNo); // here we're counting from zero! - Double_t GetFpTime() { return fpTime;}; + Double_t CalcFpTime(); + Double_t GetFpTime() {return fpTime;}; + Double_t GetFpTime(Int_t index) { return fpTimes[index];}; + Double_t GetScinTime(Int_t index) { return fScinTime[index];}; + Double_t GetScinSigma(Int_t index) { return fScinSigma[index];}; + Double_t GetScinZpos(Int_t index) { return fScinZpos[index];}; + Int_t GetNScinGoodHits() const {return fNScinGoodHits;}; TClonesArray* fParentHitList; @@ -106,8 +112,12 @@ class THcScintillatorPlane : public THaSubDetector { Double_t *fNegThresh; // - Double_t fpTime; // the original code only has one fpTime per plane! - + Int_t fNScinGoodHits; // number of hits for which both ends of the paddle fired in time! + Double_t fpTime; // the original code only has one fpTime per plane! + Double_t *fpTimes; // ... but also allows for more than one hit per plane + Double_t *fScinTime; // array of scintillator times (only filled for goodhits) + Double_t *fScinSigma; // errors for the above + Double_t *fScinZpos; // zpositions for the above virtual Int_t ReadDatabase( const TDatime& date ); virtual Int_t DefineVariables( EMode mode = kDefine );