diff --git a/src/THcDriftChamberPlane.cxx b/src/THcDriftChamberPlane.cxx index 5408b4fa6b18612f704bf8be454e63b552032c0a..f836582ce22e81fbc21117a9923e256b2b16741a 100644 --- a/src/THcDriftChamberPlane.cxx +++ b/src/THcDriftChamberPlane.cxx @@ -15,6 +15,7 @@ #include "THcParmList.h" #include "THcHitList.h" #include "THcDriftChamber.h" +#include "THcHodoscope.h" #include "TClass.h" #include <cstring> @@ -115,6 +116,14 @@ Int_t THcDriftChamberPlane::ReadDatabase( const TDatime& date ) //if( something < 0 ) wire->SetFlag(1); } + THaApparatus* app = GetApparatus(); + const char* nm = "hod"; + if( !app || + !(fglHod = dynamic_cast<THcHodoscope*>(app->GetDetector(nm))) ) { + Warning(Here(here),"Hodoscope \"%s\" not found. " + "Event-by-event time offsets will NOT be used!!",nm); + } + return kOK; } //_____________________________________________________________________________ @@ -175,6 +184,12 @@ Int_t THcDriftChamberPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) // Assumes that the hit list is sorted by plane, so we stop when the // plane doesn't agree and return the index for the next hit. + Double_t StartTime = 0.0; + // Would be nice to have a way to determine that the hodoscope decode was + // actually called for this event. + if( fglHod ) StartTime = fglHod->GetStartTime(); + cout << "Start time " << StartTime << endl; + //Int_t nTDCHits=0; fHits->Clear(); @@ -206,7 +221,7 @@ Int_t THcDriftChamberPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) // Are we choose the same hit that ENGINE chooses? // cout << "Extra hit " << fPlaneNum << " " << wireNum << " " << rawtdc << endl; } else { - Double_t time = // -hstart_time (comes from h_trans_scin + Double_t time = -StartTime // (comes from h_trans_scin - rawtdc*fNSperChan + fPlaneTimeZero; // How do we get this start time from the hodoscope to here // (or at least have it ready by coarse process) diff --git a/src/THcDriftChamberPlane.h b/src/THcDriftChamberPlane.h index 152796d2dc4b0c4ab8717219df98d9e17def3b05..7307a4acf649f75679223878d27d2607747c3798 100644 --- a/src/THcDriftChamberPlane.h +++ b/src/THcDriftChamberPlane.h @@ -20,6 +20,7 @@ class THaEvData; class THcDCWire; class THcDCHit; class THcDCTimeToDistConv; +class THcHodoscope; /*class THaSignalHit;*/ @@ -73,6 +74,8 @@ class THcDriftChamberPlane : public THaSubDetector { THcDCTimeToDistConv* fTTDConv; // Time-to-distance converter for this plane's wires + THcHodoscope* fglHod; // Hodoscope to get start time + ClassDef(THcDriftChamberPlane,0) }; #endif diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx index 2fc58e45b99d7f7ee835a3965a21d7d3abff700c..c5c1fd68cf1dbcafd2865f64cec9f09046af7977 100644 --- a/src/THcHodoscope.cxx +++ b/src/THcHodoscope.cxx @@ -352,26 +352,25 @@ Int_t THcHodoscope::ReadDatabase( const TDatime& date ) // need this for "padded arrays" i.e. 4x16 lists of parameters (GN) fMaxHodoScin=fMaxScinPerPlane*fNPlanes; if (fDebug>=1) cout <<"fMaxScinPerPlane = "<<fMaxScinPerPlane<<" fMaxHodoScin = "<<fMaxHodoScin<<endl; - - Double_t fHodoVelLight[fMaxHodoScin]; - Double_t fHodoPosSigma[fMaxHodoScin]; - Double_t fHodoNegSigma[fMaxHodoScin]; - Double_t fHodoPosMinPh[fMaxHodoScin]; - Double_t fHodoNegMinPh[fMaxHodoScin]; - Double_t fHodoPosPhcCoeff[fMaxHodoScin]; - Double_t fHodoNegPhcCoeff[fMaxHodoScin]; - Double_t fHodoPosTimeOffset[fMaxHodoScin]; - Double_t fHodoNegTimeOffset[fMaxHodoScin]; - Int_t fHodoPosPedLimit[fMaxHodoScin]; - Int_t fHodoNegPedLimit[fMaxHodoScin]; - Int_t fTofUsingInvAdc; - Double_t fHodoPosInvAdcOffset[fMaxHodoScin]; - Double_t fHodoNegInvAdcOffset[fMaxHodoScin]; - Double_t fHodoPosInvAdcLinear[fMaxHodoScin]; - Double_t fHodoNegInvAdcLinear[fMaxHodoScin]; - Double_t fHodoPosInvAdcAdc[fMaxHodoScin]; - Double_t fHodoNegInvAdcAdc[fMaxHodoScin]; - + + fHodoVelLight=new Double_t [fMaxHodoScin]; + fHodoPosSigma=new Double_t [fMaxHodoScin]; + fHodoNegSigma=new Double_t [fMaxHodoScin]; + fHodoPosMinPh=new Double_t [fMaxHodoScin]; + fHodoNegMinPh=new Double_t [fMaxHodoScin]; + fHodoPosPhcCoeff=new Double_t [fMaxHodoScin]; + fHodoNegPhcCoeff=new Double_t [fMaxHodoScin]; + fHodoPosTimeOffset=new Double_t [fMaxHodoScin]; + fHodoNegTimeOffset=new Double_t [fMaxHodoScin]; + fHodoPosPedLimit=new Int_t [fMaxHodoScin]; + fHodoNegPedLimit=new Int_t [fMaxHodoScin]; + fHodoPosInvAdcOffset=new Double_t [fMaxHodoScin]; + fHodoNegInvAdcOffset=new Double_t [fMaxHodoScin]; + fHodoPosInvAdcLinear=new Double_t [fMaxHodoScin]; + fHodoNegInvAdcLinear=new Double_t [fMaxHodoScin]; + fHodoPosInvAdcAdc=new Double_t [fMaxHodoScin]; + fHodoNegInvAdcAdc=new Double_t [fMaxHodoScin]; + prefix[1]='\0'; DBRequest list[]={ {"start_time_center", &fStartTimeCenter, kDouble}, @@ -410,7 +409,7 @@ Int_t THcHodoscope::ReadDatabase( const TDatime& date ) cout <<"TdcMin = "<<fScinTdcMin<<" TdcMax = "<<fScinTdcMax<<endl; cout <<"TofTolerance = "<<fTofTolerance<<endl; cout <<"*** VelLight ***\n"; - for (int i1=1;i1<=fNPlanes;i1++) { + for (int i1=0;i1<fNPlanes;i1++) { cout<<"Plane "<<i1<<endl; for (int i2=0;i2<fMaxScinPerPlane;i2++) { cout<<fHodoVelLight[GetScinIndex(i1,i2)]<<" "; @@ -419,6 +418,22 @@ Int_t THcHodoscope::ReadDatabase( const TDatime& date ) } cout <<endl<<endl; + // check fHodoPosPhcCoeff + /* + cout <<"fHodoPosPhcCoeff = "; + for (int i1=0;i1<fMaxHodoScin;i1++) { + cout<<this->GetHodoPosPhcCoeff(i1)<<" "; + } + cout<<endl; + */ + } + // + if ((fTofTolerance > 0.5) && (fTofTolerance < 10000.)) { + cout << "USING "<<fTofTolerance<<" NSEC WINDOW FOR FP NO_TRACK CALCULATIONS.\n"; + } + else { + fTofTolerance= 3.0; + cout << "*** USING DEFAULT 3 NSEC WINDOW FOR FP NO_TRACK CALCULATIONS!! ***\n"; } fIsInit = true; return kOK; @@ -495,7 +510,24 @@ void THcHodoscope::DeleteArrays() { // Delete member arrays. Used by destructor. - delete [] fNPaddle; fNPaddle = NULL; + delete [] fNPaddle; fNPaddle = NULL; + delete [] fHodoVelLight; fHodoVelLight = NULL; + delete [] fHodoPosSigma; fHodoPosSigma = NULL; + delete [] fHodoNegSigma; fHodoNegSigma = NULL; + delete [] fHodoPosMinPh; fHodoPosMinPh = NULL; + delete [] fHodoNegMinPh; fHodoNegMinPh = NULL; + delete [] fHodoPosPhcCoeff; fHodoPosPhcCoeff = NULL; + delete [] fHodoNegPhcCoeff; fHodoNegPhcCoeff = NULL; + delete [] fHodoPosTimeOffset; fHodoPosTimeOffset = NULL; + delete [] fHodoNegTimeOffset; fHodoNegTimeOffset = NULL; + delete [] fHodoPosPedLimit; fHodoPosPedLimit = NULL; + delete [] fHodoNegPedLimit; fHodoNegPedLimit = NULL; + delete [] fHodoPosInvAdcOffset; fHodoPosInvAdcOffset = NULL; + delete [] fHodoNegInvAdcOffset; fHodoNegInvAdcOffset = NULL; + delete [] fHodoPosInvAdcLinear; fHodoPosInvAdcLinear = NULL; + delete [] fHodoNegInvAdcLinear; fHodoNegInvAdcLinear = NULL; + delete [] fHodoPosInvAdcAdc; fHodoPosInvAdcAdc = NULL; + delete [] fHodoNegInvAdcAdc; fHodoNegInvAdcAdc = NULL; // delete [] fSpacing; fSpacing = NULL; //delete [] fCenter; fCenter = NULL; // This 2D. What is correct way to delete? @@ -561,7 +593,13 @@ Int_t THcHodoscope::Decode( const THaEvData& evdata ) // Let each plane get its hits Int_t nexthit = 0; for(Int_t ip=0;ip<fNPlanes;ip++) { - nexthit = fPlanes[ip]->ProcessHits(fRawHitList, nexthit); + // nexthit = fPlanes[ip]->ProcessHits(fRawHitList, nexthit); + // GN: select only events that have reasonable TDC values to start with + // as per the Engine h_strip_scin.f + nexthit = fPlanes[ip]->ProcessHits(fRawHitList,nexthit); + if (fPlanes[ip]->GetNScinHits()>0) { + fPlanes[ip]->PulseHeightCorrection(); + } } // fRawHitList is TClones array of THcHodoscopeHit objects @@ -575,6 +613,8 @@ Int_t THcHodoscope::Decode( const THaEvData& evdata ) cout << endl; #endif + fStartTime = 500; // Drift Chamber will need this + return nhits; } @@ -583,7 +623,6 @@ Int_t THcHodoscope::ApplyCorrections( void ) { return(0); } - //_____________________________________________________________________________ Double_t THcHodoscope::TimeWalkCorrection(const Int_t& paddle, const ESide side) @@ -592,7 +631,7 @@ Double_t THcHodoscope::TimeWalkCorrection(const Int_t& paddle, } //_____________________________________________________________________________ -Int_t THcHodoscope::CoarseProcess( TClonesArray& /* tracks */ ) +Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) { // Calculation of coordinates of particle track cross point with scint // plane in the detector coordinate system. For this, parameters of track @@ -601,7 +640,12 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& /* tracks */ ) // Apply corrections and reconstruct the complete hits. // // static const Double_t sqrt2 = TMath::Sqrt(2.); - + // cout <<"**** in THcHodoscope CoarseProcess ********\n"; + /* + for(Int_t i=0;i<fNPlanes;i++) { + cout<<i<<" "; + fPlanes[i]->CoarseProcess(tracks); + }*/ ApplyCorrections(); return 0; @@ -623,10 +667,11 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) } //_____________________________________________________________________________ Int_t THcHodoscope::GetScinIndex( Int_t nPlane, Int_t nPaddle ) { - // Return the index of a scintillator given the plane # and the paddle # - // This assumes that planes start counting from 1 - // and paddles start counting from 0! (not ideal but that's what I have for now) - return fNPlanes*nPaddle+nPlane-1; + // GN: Return the index of a scintillator given the plane # and the paddle # + // This assumes that both planes and + // paddles start counting from 0! + // Result also counts from 0. + return fNPlanes*nPaddle+nPlane; } //_____________________________________________________________________________ Int_t THcHodoscope::GetScinIndex( Int_t nSide, Int_t nPlane, Int_t nPaddle ) { diff --git a/src/THcHodoscope.h b/src/THcHodoscope.h index 609b8ed853bd035f5b8ce14aef5728f7ea6265e8..e17cef190cd85459f30fe3d2f4e02c9b04f3dc85 100644 --- a/src/THcHodoscope.h +++ b/src/THcHodoscope.h @@ -30,13 +30,24 @@ public: virtual Int_t FineProcess( TClonesArray& tracks ); virtual Int_t ApplyCorrections( void ); - // Int_t GetNHits() const { return fNhit; } + Double_t GetStartTime() const { return fStartTime; } Int_t GetScinIndex(Int_t nPlane, Int_t nPaddle); Int_t GetScinIndex(Int_t nSide, Int_t nPlane, Int_t nPaddle); Double_t GetPathLengthCentral(); - Int_t GetNTracks() const { return fTrackProj->GetLast()+1; } + Double_t GetTdcMin() const {return fScinTdcMin;} + Double_t GetTdcMax() const {return fScinTdcMax;} + Double_t GetTofTolerance() const {return fTofTolerance;} + Double_t GetTdcToTime() const {return fScinTdcToTime;} + Double_t GetHodoPosPhcCoeff(Int_t iii) const {return fHodoPosPhcCoeff[iii];} + Double_t GetHodoNegPhcCoeff(Int_t iii) const {return fHodoNegPhcCoeff[iii];} + Double_t GetHodoPosMinPh(Int_t iii) const {return fHodoPosMinPh[iii];} + Double_t GetHodoNegMinPh(Int_t iii) const {return fHodoNegMinPh[iii];} + 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];} + const TClonesArray* GetTrackHits() const { return fTrackProj; } friend class THaScCalib; @@ -50,6 +61,9 @@ protected: // Per-event data + Double_t fStartTime; + + // Per-event data // Potential Hall C parameters. Mostly here for demonstration Int_t fNPlanes,fMaxScinPerPlane,fMaxHodoScin; // number of planes; max number of scin/plane; product of the first two diff --git a/src/THcScintillatorPlane.cxx b/src/THcScintillatorPlane.cxx index 774f8d34ad6cea7f1235e46ded6ab19866769644..b5fe6e3c851022b949553c89d03a6c36ed4428fd 100644 --- a/src/THcScintillatorPlane.cxx +++ b/src/THcScintillatorPlane.cxx @@ -5,7 +5,7 @@ // THcScintillatorPlane // ////////////////////////////////////////////////////////////////////////// - +#include "TMath.h" #include "THcScintillatorPlane.h" #include "TClonesArray.h" #include "THcSignalHit.h" @@ -38,6 +38,7 @@ THcScintillatorPlane::THcScintillatorPlane( const char* name, fNegADCHits = new TClonesArray("THcSignalHit",16); fPlaneNum = planenum; fTotPlanes = planenum; + fNScinHits = 0; } //______________________________________________________________________________ THcScintillatorPlane::THcScintillatorPlane( const char* name, @@ -54,6 +55,7 @@ THcScintillatorPlane::THcScintillatorPlane( const char* name, fNegADCHits = new TClonesArray("THcSignalHit",16); fPlaneNum = planenum; fTotPlanes = totplanes; + fNScinHits = 0; } //______________________________________________________________________________ @@ -129,14 +131,16 @@ Int_t THcScintillatorPlane::ReadDatabase( const TDatime& date ) strcat(parname,"_nr"); fNelem = *(Int_t *)gHcParms->Find(parname)->GetValuePointer(); // + // Based on the signs of these quantities in the .pos file the correspondence + // should be bot=>left and top=>right when comparing x and y-type scintillators char *tmpleft, *tmpright; if (fPlaneNum==1 || fPlaneNum==3) { tmpleft="left"; tmpright="right"; } else { - tmpleft="top"; - tmpright="bot"; + tmpleft="bot"; + tmpright="top"; } Double_t tmpdouble[fTotPlanes]; @@ -168,25 +172,6 @@ Int_t THcScintillatorPlane::ReadDatabase( const TDatime& date ) cout <<"PosOffset = "<<fPosOffset<<endl; cout <<"PosCenter[0] = "<<fPosCenter[0]<<endl; - - /* for(Int_t i=0;i<fNPlanes;i++) { - fCenter[i] = new Double_t[fNPaddle[i]]; - DBRequest list[]={ - {Form("scin_%s_spacing",fPlaneNames[i]), &fSpacing[i], kDouble}, - {Form("scin_%s_center",fPlaneNames[i]), fCenter[i], kDouble, fNPaddle[i]}, - {0} - }; - gHcParms->LoadParmValues((DBRequest*)&list,prefix); - } - */ - /// Int_t tmpint = new Int_t [GetParent()->GetNPlanes()]; - /// cout<<"Nplanes in scintplane!! = "<<fTotPlanes <<endl; - - // First letter of GetParent()->GetPrefix() tells us what prefix to - // use on parameter names. - - // Find the number of elements - // Think we will make special methods to pass most // How generic do we want to make this class? // The way we get parameter data is going to be pretty specific to @@ -250,6 +235,9 @@ Int_t THcScintillatorPlane::Decode( const THaEvData& evdata ) Int_t THcScintillatorPlane::CoarseProcess( TClonesArray& tracks ) { + cout <<"*******************************\n"; + cout <<"NOW IN THcScintilatorPlane::CoarseProcess!!!!\n"; + cout <<"*******************************\n"; // HitCount(); return 0; @@ -260,18 +248,23 @@ Int_t THcScintillatorPlane::FineProcess( TClonesArray& tracks ) { return 0; } - //_____________________________________________________________________________ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) { // Extract the data for this plane from hit list // Assumes that the hit list is sorted by plane, so we stop when the // plane doesn't agree and return the index for the next hit. + // GN: Select only events that have at least one of their TDC signals in the + // right range. + // Also subtract the pedestals from the adc signal (as per the ENGINE) we're not checking here + // if the actual ADC is larger than the pedestal value we subtract!! + Double_t mintdc, maxtdc; Int_t nPosTDCHits=0; Int_t nNegTDCHits=0; Int_t nPosADCHits=0; Int_t nNegADCHits=0; + fNScinHits=0; fPosTDCHits->Clear(); fNegTDCHits->Clear(); fPosADCHits->Clear(); @@ -279,7 +272,8 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) Int_t nrawhits = rawhits->GetLast()+1; // cout << "THcScintillatorPlane::ProcessHits " << fPlaneNum << " " << nexthit << "/" << nrawhits << endl; - + mintdc=((THcHodoscope *)GetParent())->GetTdcMin(); + maxtdc=((THcHodoscope *)GetParent())->GetTdcMax(); Int_t ihit = nexthit; while(ihit < nrawhits) { THcHodoscopeHit* hit = (THcHodoscopeHit *) rawhits->At(ihit); @@ -287,37 +281,114 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) break; } - // TDC positive hit - if(hit->fTDC_pos > 0) { + // check TDC values + if (((hit->fTDC_pos >= mintdc) && (hit->fTDC_pos <= maxtdc)) || + ((hit->fTDC_neg >= mintdc) && (hit->fTDC_neg <= maxtdc))) { + + //TDC positive hit THcSignalHit *sighit = (THcSignalHit*) fPosTDCHits->ConstructedAt(nPosTDCHits++); sighit->Set(hit->fCounter, hit->fTDC_pos); + // TDC negative hit + THcSignalHit *sighit2 = (THcSignalHit*) fNegTDCHits->ConstructedAt(nNegTDCHits++); + sighit2->Set(hit->fCounter, hit->fTDC_neg); + // ADC positive hit + /// if(hit->fADC_pos > 0) { + THcSignalHit *sighit3 = (THcSignalHit*) fPosADCHits->ConstructedAt(nPosADCHits++); + sighit3->Set(hit->fCounter, hit->fADC_pos-fPosPed[ihit]); + ///} else { + /// cout<<"Skipping ADC_pos "<<hit->fADC_pos<<endl; + /// } + // ADC negative hit + /// if(hit->fADC_neg > 0) { + // cout <<"adc neg hit!!\n"; + THcSignalHit *sighit4 = (THcSignalHit*) fNegADCHits->ConstructedAt(nNegADCHits++); + sighit4->Set(hit->fCounter, hit->fADC_neg-fNegPed[ihit]); + ///} else { + ///cout<<"Skipping ADC_neg "<<hit->fADC_neg<<endl; + ///} + // cout <<"test "<<fNHits<<endl; + fNScinHits=fNScinHits++; } - - // TDC negative hit - if(hit->fTDC_neg > 0) { - THcSignalHit *sighit = (THcSignalHit*) fNegTDCHits->ConstructedAt(nNegTDCHits++); - sighit->Set(hit->fCounter, hit->fTDC_neg); + else { + //cout <<"pos TDC "<<hit->fTDC_pos<<" "<<mintdc<<" "<<maxtdc<<endl; + //cout <<"neg TDC "<<hit->fTDC_neg<<" "<<mintdc<<" "<<maxtdc<<endl; + //cout <<"skipping BAD tdc event\n"; } - - // ADC positive hit - if(hit->fADC_pos > 0) { - // cout <<"adc pos hit!!\n"; - THcSignalHit *sighit = (THcSignalHit*) fPosADCHits->ConstructedAt(nPosADCHits++); - sighit->Set(hit->fCounter, hit->fADC_pos); - } - - // ADC negative hit - if(hit->fADC_neg > 0) { - // cout <<"adc neg hit!!\n"; - THcSignalHit *sighit = (THcSignalHit*) fNegADCHits->ConstructedAt(nNegADCHits++); - sighit->Set(hit->fCounter, hit->fADC_neg); - } - ihit++; } + return(ihit); } +//________________________________________________________________________________ +Int_t THcScintillatorPlane::PulseHeightCorrection() +{ + // Perform pulse height correction of the TDC values as in the original h_trans_scin + // see original comments below + /*! Calculate all corrected hit times and histogram + ! This uses a copy of code below. Results are save in time_pos,neg + ! including the z-pos. correction assuming nominal value of betap + ! Code is currently hard-wired to look for a peak in the + ! range of 0 to 100 nsec, with a group of times that all + ! agree withing a time_tolerance of time_tolerance nsec. The normal + ! peak position appears to be around 35 nsec (SOS0 or 31 nsec (HMS) + ! NOTE: if want to find particles with beta different than + ! 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 */ + Int_t i,j,index,nfound=0; + Double_t mintdc, maxtdc,tdctotime; + Double_t pos_ph[53],neg_ph[53],postime[53],negtime[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? + Double_t dist_from_center,scint_center,hit_position,time_pos[100],time_neg[100],hbeta_pcent; + + mintdc=((THcHodoscope *)GetParent())->GetTdcMin(); + maxtdc=((THcHodoscope *)GetParent())->GetTdcMax(); + // hbeta_pcent=(TH((THcHodoscope *)GetParent())->GetParent() + // Horrible hack until I find out where to get the central beta from momentum!! GN + hbeta_pcent=0.99776; + tdctotime=((THcHodoscope *)GetParent())->GetTdcToTime(); + for (i=0;i<fNScinHits;i++) { + if ((((THcSignalHit*) fPosTDCHits->At(i))->GetData()>=mintdc) && + (((THcSignalHit*) fPosTDCHits->At(i))->GetData()<=maxtdc) && + (((THcSignalHit*) fNegTDCHits->At(i))->GetData()>=mintdc) && + (((THcSignalHit*) fNegTDCHits->At(i))->GetData()<=maxtdc)) { + pos_ph[i]=((THcSignalHit*) fPosADCHits->At(i))->GetData(); + postime[i]=((THcSignalHit*) fPosTDCHits->At(i))->GetData()*tdctotime; + j=((THcSignalHit*)fPosTDCHits->At(i))->GetPaddleNumber(); + index=((THcHodoscope *)GetParent())->GetScinIndex(fPlaneNum-1,j); + postime[i]=postime[i]-((THcHodoscope *)GetParent())->GetHodoPosPhcCoeff(index)* + TMath::Sqrt(TMath::Max(0.,(pos_ph[i]/((THcHodoscope *)GetParent())->GetHodoPosMinPh(index)-1))); + postime[i]=postime[i]-((THcHodoscope *)GetParent())->GetHodoPosTimeOffset(index); + // cout <<postime[i]<<endl; + neg_ph[i]=((THcSignalHit*) fNegADCHits->At(i))->GetData(); + negtime[i]=((THcSignalHit*) fNegTDCHits->At(i))->GetData()*tdctotime; + j=((THcSignalHit*)fNegTDCHits->At(i))->GetPaddleNumber(); + index=((THcHodoscope *)GetParent())->GetScinIndex(fPlaneNum-1,j); + negtime[i]=negtime[i]-((THcHodoscope *)GetParent())->GetHodoNegPhcCoeff(index)* + TMath::Sqrt(TMath::Max(0.,(neg_ph[i]/((THcHodoscope *)GetParent())->GetHodoNegMinPh(index)-1))); + negtime[i]=negtime[i]-((THcHodoscope *)GetParent())->GetHodoNegTimeOffset(index); + // cout <<"postime = "<<postime[i]<<" negtime = "<<negtime[i]<<endl; + // Find hit position. If postime larger, then hit was nearer negative side. + dist_from_center=0.5*(negtime[i]-postime[i])*((THcHodoscope *)GetParent())->GetHodoVelLight(index); + scint_center=0.5*(fPosLeft+fPosRight); + hit_position=scint_center+dist_from_center; + // cout <<fPosLeft<<" "<<fPosRight<<" hit position = "<<hit_position<<" "; + hit_position=TMath::Min(hit_position,fPosLeft); + // cout<<hit_position<<" "; + hit_position=TMath::Max(hit_position,fPosRight); + //cout<<hit_position<<endl; + postime[i]=postime[i]-(fPosLeft-hit_position)/((THcHodoscope *)GetParent())->GetHodoVelLight(index); + negtime[i]=negtime[i]-(hit_position-fPosRight)/((THcHodoscope *)GetParent())->GetHodoVelLight(index); + time_pos[i]=postime[i]-(fZpos+(j%2)*fDzpos)/(29.979*hbeta_pcent); + time_neg[i]=negtime[i]-(fZpos+(j%2)*fDzpos)/(29.979*hbeta_pcent); + nfound++; + cout <<"time pos/neg = "<<time_pos[i]<<" "<<time_neg[i]<<endl; + // for (int k=0;k<200;k++) { + } + } + return 0; +} //_____________________________________________________________________________ Int_t THcScintillatorPlane::AccumulatePedestals(TClonesArray* rawhits, Int_t nexthit) { @@ -416,6 +487,10 @@ void THcScintillatorPlane::InitializePedestals( ) Int_t THcScintillatorPlane::GetNelem() { return fNelem; +}//____________________________________________________________________________ +Int_t THcScintillatorPlane::GetNScinHits() +{ + return fNScinHits; } //____________________________________________________________________________ Double_t THcScintillatorPlane::GetSpacing() diff --git a/src/THcScintillatorPlane.h b/src/THcScintillatorPlane.h index 7cb205c2fe91f51a2eafdf4cae4b174e414a6df2..e3c5f4d5ca4e4d16972f396ed1f50c4ccf92f24f 100644 --- a/src/THcScintillatorPlane.h +++ b/src/THcScintillatorPlane.h @@ -37,10 +37,13 @@ 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 AccumulatePedestals(TClonesArray* rawhits, Int_t nexthit); virtual void CalculatePedestals( ); Int_t GetNelem(); // return number of paddles in this plane + Int_t GetNScinHits(); // return the number of hits in this plane (that pass min/max TDC cuts) Double_t GetSpacing(); // return the spacing of paddles Double_t GetSize(); // return paddle size Double_t GetHodoSlop(); // return the hodo slop @@ -61,12 +64,13 @@ class THcScintillatorPlane : public THaSubDetector { TClonesArray* fNegADCHits; Int_t fPlaneNum; /* Which plane am I 1-4 */ - Int_t fTotPlanes; /* so we can read variables that are not indexed by plane id */ + Int_t fTotPlanes; /* so we can read variables that are not indexed by plane id */ Int_t fNelem; /* Need since we don't inherit from detector base class */ + Int_t fNScinHits; /* Number of hits in this plane */ Double_t fSpacing; /* paddle spacing */ Double_t fSize; /* paddle size */ - Double_t fZpos; /* z position */ + Double_t fZpos; /* z position */ Double_t fDzpos; Double_t fHodoSlop; /* max allowed slop for this plane */ Double_t fPosLeft; /* NOTE: "left" = "top" for a Y scintillator */ @@ -74,6 +78,8 @@ class THcScintillatorPlane : public THaSubDetector { Double_t fPosOffset; Double_t fPosCenter[16]; /* array with centers for all scintillators in the plane */ + + Double_t fTolerance; /* need this for PulseHeightCorrection */ /* Pedestal Quantities */ Int_t fNPedestalEvents; /* Number of pedestal events */ Int_t fMinPeds; /* Only analyze/update if num events > */