diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx index 370c85b59122b681d0d2cce49fb0734b7a64cff1..dc003fded0550b6cbd75f3d90f8e401c5fcfbcac 100644 --- a/src/THcHodoscope.cxx +++ b/src/THcHodoscope.cxx @@ -339,13 +339,17 @@ Int_t THcHodoscope::ReadDatabase( const TDatime& date ) {"hodo_slop", fHodoSlop, kDouble, (UInt_t) fNPlanes}, {"debugprintscinraw", &fdebugprintscinraw, kInt, 0,1}, {"hodo_tdc_offset", fTdcOffset, kInt, (UInt_t) fNPlanes, 1}, + {"dumptof", &fDumpTOF, kInt, 0, 1}, + {"dumptof_filename", &fTOFDumpFile, kString, 0, 1}, {0} }; // Defaults if not defined in parameter file fdebugprintscinraw=0; - fTofUsingInvAdc = 0; + fDumpTOF = 0; + fTOFDumpFile=""; + fTofUsingInvAdc = 1; fTofTolerance = 3.0; fNCerNPE = 2.0; fNormETot = 0.7; @@ -358,6 +362,17 @@ Int_t THcHodoscope::ReadDatabase( const TDatime& date ) gHcParms->LoadParmValues((DBRequest*)&list,prefix); + if(fDumpTOF) { + fDumpOut.open(fTOFDumpFile); + if(fDumpOut.is_open()) { + fDumpOut << "Hodoscope Time of Flight calibration data" << endl; + } else { + fDumpTOF = 0; + cout << "WARNING: Unable to open TOF Dump file " << fTOFDumpFile << endl; + cout << "Data for TOF calibration not being written." << endl; + } + } + cout << " x1 lo = " << fxLoScin[0] << " x2 lo = " << fxLoScin[1] << " x1 hi = " << fxHiScin[0] @@ -852,6 +867,15 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) Int_t timehist[200]; // ------------------------------------------------- + if(fDumpTOF) { + Int_t ntothits = 0; + for(Int_t ip = 0; ip < fNPlanes; ip++ ) { + ntothits += fPlanes[ip]->GetNScinHits(); + } + fDumpOut << "ntrk,tothits " << ntracks << " " << ntothits + << " " << fScinTdcToTime << endl; + } + if (tracks.GetLast()+1 > 0 ) { // **MAIN LOOP: Loop over all tracks and get corrected time, tof, beta... @@ -967,19 +991,23 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) fTOFPInfo[ihhit].onTrack = kTRUE; + Double_t zcor = zposition/(29.979*fBetaP)* + TMath::Sqrt(1. + theTrack->GetTheta()*theTrack->GetTheta() + + theTrack->GetPhi()*theTrack->GetPhi()); + fTOFPInfo[ihhit].zcor = zcor; + Double_t tdc_pos = hit->GetPosTDC(); if(tdc_pos >=fScinTdcMin && tdc_pos <= fScinTdcMax ) { Double_t adc_pos = hit->GetPosADC(); Double_t pathp = fPlanes[ip]->GetPosLeft() - scinLongCoord; + fTOFPInfo[ihhit].pathp = pathp; Double_t timep = tdc_pos*fScinTdcToTime - fHodoPosInvAdcOffset[fPIndex] - pathp/fHodoPosInvAdcLinear[fPIndex] - fHodoPosInvAdcAdc[fPIndex] /TMath::Sqrt(TMath::Max(20.0,adc_pos)); fTOFPInfo[ihhit].scin_pos_time = timep; - timep -= zposition/(29.979*fBetaP)* - TMath::Sqrt(1. + theTrack->GetTheta()*theTrack->GetTheta() - + theTrack->GetPhi()*theTrack->GetPhi()); + timep -= zcor; fTOFPInfo[ihhit].time_pos = timep; for ( Int_t k = 0; k < 200; k++ ){ // Line 211 @@ -993,15 +1021,14 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) if(tdc_neg >=fScinTdcMin && tdc_neg <= fScinTdcMax ) { Double_t adc_neg = hit->GetNegADC(); Double_t pathn = scinLongCoord - fPlanes[ip]->GetPosRight(); + fTOFPInfo[ihhit].pathn = pathn; Double_t timen = tdc_neg*fScinTdcToTime - fHodoNegInvAdcOffset[fPIndex] - pathn/fHodoNegInvAdcLinear[fPIndex] - fHodoNegInvAdcAdc[fPIndex] /TMath::Sqrt(TMath::Max(20.0,adc_neg)); fTOFPInfo[ihhit].scin_neg_time = timen; - timen -= zposition/(29.979*fBetaP)* - TMath::Sqrt( 1. + theTrack->GetTheta()*theTrack->GetTheta() - + theTrack->GetPhi()*theTrack->GetPhi()); + timen -= zcor; fTOFPInfo[ihhit].time_neg = timen; for ( Int_t k = 0; k < 200; k++ ){ // Line 230 @@ -1030,6 +1057,13 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) } } + if(fDumpTOF) { + fDumpOut << "trk=" << itrack << " " << jmax << " " << + theTrack->GetX() << " " << theTrack->GetY() << " " << + theTrack->GetTheta() << " " << theTrack->GetPhi() << " " << + theTrack->GetP() << endl; + } + if(jmax > 0) { Double_t tmin = 0.5 * jmax; @@ -1081,10 +1115,22 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) if ( fTOFPInfo[ihhit].keep_pos ) { // 301 fTOFCalc[ihhit].good_tdc_pos = kTRUE; fGoodFlags[itrack][ip][iphit].goodTdcPos = kTRUE; + if(fDumpTOF) { + fDumpOut << "1 " << ip+1 << " " << paddle+1 << " " << + hit->GetPosTDC()*fScinTdcToTime << " " << fTOFPInfo[ihhit].pathp << + " " << fTOFPInfo[ihhit].zcor << " " << fTOFPInfo[ihhit].time_pos << + " " << hit->GetPosADC() << endl; + } } if ( fTOFPInfo[ihhit].keep_neg ) { // fTOFCalc[ihhit].good_tdc_neg = kTRUE; fGoodFlags[itrack][ip][iphit].goodTdcNeg = kTRUE; + if(fDumpTOF) { + fDumpOut << "2 " << ip+1 << " " << paddle+1 << " " << + hit->GetNegTDC()*fScinTdcToTime << " " << fTOFPInfo[ihhit].pathn << + " " << fTOFPInfo[ihhit].zcor << " " << fTOFPInfo[ihhit].time_neg << + " " << hit->GetNegADC() << endl; + } } // ** Calculate ave time for scin and error. diff --git a/src/THcHodoscope.h b/src/THcHodoscope.h index c646453aa76910d70e8aab18b96fdfd9568a273d..028125052ffbcd8cf7798643101bfdaf92c625d6 100644 --- a/src/THcHodoscope.h +++ b/src/THcHodoscope.h @@ -209,6 +209,11 @@ protected: Int_t* fyHiScin; Int_t fNHodoscopes; + Int_t fDumpTOF; + ofstream fDumpOut; + string fTOFDumpFile; + + Int_t fHitSweet1X; Int_t fHitSweet1Y; Int_t fHitSweet2X; @@ -276,9 +281,9 @@ protected: Double_t time_neg; // flight time Double_t scin_pos_time; // Times corrected for position on Double_t scin_neg_time; // the bar - // Double_t adcPh; - // Double_t path; - // Double_t time; + Double_t pathp; + Double_t pathn; + Double_t zcor; Double_t scinTrnsCoord; Double_t scinLongCoord; Int_t planeIndex;