diff --git a/setup.csh b/setup.csh index d7df18c89cf06ac4bea58b32ff02b2cd2fbf27d2..8bbc4063544bafc591e3e7ca94f5b2d0b065eaf1 100644 --- a/setup.csh +++ b/setup.csh @@ -2,17 +2,29 @@ set called=($_) if ("$called" != "") then - set scriptdir=$called[2] - set MYDIR=`dirname $scriptdir` - set MYDIR=`cd $MYDIR && pwd` # ensure absolute path +set scriptdir=$called[2] + echo $scriptdir +# set MYDIR=`dirname $scriptdir` +# set MYDIR=`cd $MYDIR && pwd` # ensure absolute path + + set MYDIR=`pwd` # ensure absolute path + +# echo $MYDIR +# echo "Are we here" else - set scriptdir=$1 +set scriptdir=$1 set MYDIR=$scriptdir endif + + setenv ANALYZER $MYDIR/podd setenv HCANALYZER $MYDIR + # Check if LD_LIBRARY_PATH is defined if ( ! ($?LD_LIBRARY_PATH) ) then - setenv LD_LIBRARY_PATH "" +setenv LD_LIBRARY_PATH "" endif setenv LD_LIBRARY_PATH "${LD_LIBRARY_PATH}:${ANALYZER}:${HCANALYZER}" + +echo $ANALYZER +echo $HCANALYZER diff --git a/src/THcHallCSpectrometer.cxx b/src/THcHallCSpectrometer.cxx index 7ce0bfcdf91041a520451b440999af641ca948c3..073c516d6966a093bbf46166d667e1b0c23ed972 100644 --- a/src/THcHallCSpectrometer.cxx +++ b/src/THcHallCSpectrometer.cxx @@ -40,6 +40,19 @@ // 'reference distance', corresponding to the pathlength correction // matrix. // +// +// Golden track using scin. Zafar Ahmed. August 19 2014 +// Goldent track is moved to THcHallCSpectrometer::TrackCalc() +// if fSelUsingScin == 0 then golden track is calculated just +// like podd. i.e. it is the first track with minimum chi2/ndf +// with sorting ON +// +// if fSelUsingScin == 1 then golden track is calculetd just like +// engine/HTRACKING/h_select_best_track_using_scin.h. This method +// gives the best track with minimum value of chi2/ndf but with +// additional cuts on the tracks. These cuts are on dedx, beta +// and on energy. +// ////////////////////////////////////////////////////////////////////////// #include "THcHallCSpectrometer.h" @@ -51,11 +64,21 @@ #include "THaTriggerTime.h" #include "TMath.h" #include "TList.h" + +#include "THcRawShowerHit.h" +#include "THcSignalHit.h" #include "THcShower.h" +#include "THcHitList.h" +#include "THcHodoscope.h" +#include <vector> +#include <cstring> +#include <cstdio> +#include <cstdlib> #include <iostream> #include <fstream> +using std::vector; using namespace std; //_____________________________________________________________________________ @@ -74,6 +97,13 @@ THcHallCSpectrometer::THcHallCSpectrometer( const char* name, const char* descri THcHallCSpectrometer::~THcHallCSpectrometer() { // Destructor + + delete [] fX2D; fX2D = NULL; // Ahmed + delete [] fY2D; fY2D = NULL; // Ahmed + + delete [] f2XHits; f2XHits = NULL; // Ahmed + delete [] f2YHits; f2YHits = NULL; // Ahmed + } //_____________________________________________________________________________ @@ -123,6 +153,33 @@ Int_t THcHallCSpectrometer::ReadDatabase( const TDatime& date ) cout << "In THcHallCSpectrometer::ReadDatabase()" << endl; #endif + MAXHODHITS = 53; + + fX2D = new Double_t [MAXHODHITS]; + fY2D = new Double_t [MAXHODHITS]; + + f2XHits = new Int_t [16]; + f2YHits = new Int_t [16]; + + // --------------- To get energy from THcShower ---------------------- + + const char* detector_name = "hod"; + //THaApparatus* app = GetDetector(); + THaDetector* det = GetDetector("hod"); + // THaDetector* det = app->GetDetector( shower_detector_name ); + + if( !dynamic_cast<THcHodoscope*>(det) ) { + Error("THcHallCSpectrometer", "Cannot find hodoscope detector %s", + detector_name ); + return fStatus = kInitError; + } + + fHodo = static_cast<THcHodoscope*>(det); // fHodo is a membervariable + // fShower = static_cast<THcShower*>(det); // fShower is a membervariable + + // --------------- To get energy from THcShower ---------------------- + + // Get the matrix element filename from the variable store // Read in the matrix @@ -137,19 +194,34 @@ Int_t THcHallCSpectrometer::ReadDatabase( const TDatime& date ) string reconCoeffFilename; DBRequest list[]={ - {"_recon_coeff_filename",&reconCoeffFilename,kString}, - {"theta_offset",&fThetaOffset,kDouble}, - {"phi_offset",&fPhiOffset,kDouble}, - {"delta_offset",&fDeltaOffset,kDouble}, - {"thetacentral_offset",&fThetaCentralOffset,kDouble}, - {"_oopcentral_offset",&fOopCentralOffset,kDouble}, - {"pcentral_offset",&fPCentralOffset,kDouble}, - {"pcentral",&fPCentral,kDouble}, - {"theta_lab",&fTheta_lab,kDouble}, + {"_recon_coeff_filename", &reconCoeffFilename, kString }, + {"theta_offset", &fThetaOffset, kDouble }, + {"phi_offset", &fPhiOffset, kDouble }, + {"delta_offset", &fDeltaOffset, kDouble }, + {"thetacentral_offset", &fThetaCentralOffset, kDouble }, + {"_oopcentral_offset", &fOopCentralOffset, kDouble }, + {"pcentral_offset", &fPCentralOffset, kDouble }, + {"pcentral", &fPCentral, kDouble }, + {"theta_lab", &fTheta_lab, kDouble }, + {"sel_using_scin", &fSelUsingScin, kInt, 0, 1}, + {"sel_ndegreesmin", &fSelNDegreesMin, kDouble, 0, 1}, + {"sel_dedx1min", &fSeldEdX1Min, kDouble, 0, 1}, + {"sel_dedx1max", &fSeldEdX1Max, kDouble, 0, 1}, + {"sel_betamin", &fSelBetaMin, kDouble, 0, 1}, + {"sel_betamax", &fSelBetaMax, kDouble, 0, 1}, + {"sel_etmin", &fSelEtMin, kDouble, 0, 1}, + {"sel_etmax", &fSelEtMax, kDouble, 0, 1}, + {"hodo_num_planes", &fNPlanes, kInt }, + {"scin_2x_zpos", &fScin2XZpos, kDouble, 0, 1}, + {"scin_2x_dzpos", &fScin2XdZpos, kDouble, 0, 1}, + {"scin_2y_zpos", &fScin2YZpos, kDouble, 0, 1}, + {"scin_2y_dzpos", &fScin2YdZpos, kDouble, 0, 1}, {0} }; gHcParms->LoadParmValues((DBRequest*)&list,prefix); // + + cout << "\n\n\nhodo planes = " << fNPlanes << endl; cout << " fPcentral = " << fPCentral << " " <<fPCentralOffset << endl; cout << " fThate_lab = " << fTheta_lab << " " <<fThetaCentralOffset << endl; fPCentral= fPCentral*(1.+fPCentralOffset/100.); @@ -228,6 +300,8 @@ Int_t THcHallCSpectrometer::FindVertices( TClonesArray& tracks ) // In Hall C, we do the target traceback here since the traceback should // not depend on which tracking detectors are used. + fNtracks = tracks.GetLast()+1; + for (Int_t it=0;it<tracks.GetLast()+1;it++) { THaTrack* track = static_cast<THaTrack*>( tracks[it] ); @@ -281,6 +355,10 @@ Int_t THcHallCSpectrometer::FindVertices( TClonesArray& tracks ) track->SetMomentum(fPCentral*(1+track->GetDp()/100.0)); } + + // ------------------ Moving it to TrackCalc -------------------- + + /* // If enabled, sort the tracks by chi2/ndof if( GetTrSorting() ) fTracks->Sort(); @@ -305,14 +383,215 @@ Int_t THcHallCSpectrometer::FindVertices( TClonesArray& tracks ) } else fGoldenTrack = NULL; + */ + // ------------------ Moving it to TrackCalc -------------------- + return 0; } //_____________________________________________________________________________ Int_t THcHallCSpectrometer::TrackCalc() { - // Additioal track calculations. At present, we only calculate beta here. + if ( fSelUsingScin == 0 ) { + + if( GetTrSorting() ) + fTracks->Sort(); + + // Find the "Golden Track". + // if( GetNTracks() > 0 ) { + if( fNtracks > 0 ) { + // Select first track in the array. If there is more than one track + // and track sorting is enabled, then this is the best fit track + // (smallest chi2/ndof). Otherwise, it is the track with the best + // geometrical match (smallest residuals) between the U/V clusters + // in the upper and lower VDCs (old behavior). + // + // Chi2/dof is a well-defined quantity, and the track selected in this + // way is immediately physically meaningful. The geometrical match + // criterion is mathematically less well defined and not usually used + // in track reconstruction. Hence, chi2 sortiing is preferable, albeit + // obviously slower. + + fGoldenTrack = static_cast<THaTrack*>( fTracks->At(0) ); + fTrkIfo = *fGoldenTrack; + fTrk = fGoldenTrack; + } else + fGoldenTrack = NULL; + } + + if ( fSelUsingScin == 1 ){ + if( fNtracks > 0 ) { + + Double_t fY2Dmin, fX2Dmin, fZap, ft, fChi2PerDeg; //, fShowerEnergy; + Double_t fHitPos4, fHitPos3, fHitDist3, fHitDist4; //, fChi2Min; + Int_t i, j, itrack, ip, ihit; //, fGoodTimeIndex = -1; + Int_t fHitCnt4, fHitCnt3, fRawIndex, fGoodRawPad; + + fChi2Min = 10000000000.0; fGoodTrack = -1; fY2Dmin = 100.; + fX2Dmin = 100.; fZap = 0.; + + fRawIndex = -1; + for ( itrack = 0; itrack < fNtracks; itrack++ ){ + + THaTrack* goodTrack = static_cast<THaTrack*>( fTracks->At(itrack) ); + if (!goodTrack) return -1; + + if ( goodTrack->GetNDoF() > fSelNDegreesMin ){ + fChi2PerDeg = goodTrack->GetChi2() / goodTrack->GetNDoF(); + + if( ( goodTrack->GetDedx() > fSeldEdX1Min ) && + ( goodTrack->GetDedx() < fSeldEdX1Max ) && + ( goodTrack->GetBeta() > fSelBetaMin ) && + ( goodTrack->GetBeta() < fSelBetaMax ) && + ( goodTrack->GetEnergy() > fSelEtMin ) && + ( goodTrack->GetEnergy() < fSelEtMax ) ) + { + + for ( j = 0; j < 16; j++ ){ + f2XHits[j] = -1; + f2YHits[j] = -1; + } + + for ( ip = 0; ip < fNPlanes; ip++ ){ + for ( ihit = 0; ihit < fHodo->GetNScinHits(ip); ihit++ ){ + fRawIndex ++; + + // fGoodRawPad = fHodo->GetGoodRawPad(fRawIndex)-1; + fGoodRawPad = fHodo->GetGoodRawPad(fRawIndex); + + if ( ip == 2 ){ + f2XHits[fGoodRawPad] = 0; + } + + if ( ip == 3 ){ + f2YHits[fGoodRawPad] = 0; + + } + + } // loop over hits of a plane + } // loop over planes + + fHitPos4 = goodTrack->GetY() + goodTrack->GetPhi() * ( fScin2YZpos + 0.5 * fScin2YdZpos ); + fHitCnt4 = TMath::Nint( ( fHodo->GetHodoCenter4() - fHitPos4 ) / fHodo->GetScin2YSpacing() ) + 1; + fHitCnt4 = TMath::Max( TMath::Min(fHitCnt4,TMath::Nint(10) ) , 1); // scin_2y_nr = 10 + fHitDist4 = fHitPos4 - ( fHodo->GetHodoCenter4() - fHodo->GetScin2YSpacing() * ( fHitCnt4 - 1 ) ); + + //---------------------------------------------------------------- + + if ( fNtracks > 1 ){ // Plane 4 + fZap = 0.; + ft = 0; + + for ( i = 0; i < 10; i++ ){ + if ( f2YHits[i] == 0 ) { + fY2D[itrack] = TMath::Abs(fHitCnt4-i-1); + ft ++; + + if ( ft == 1 ) fZap = fY2D[itrack]; + if ( ( ft == 2 ) && ( fY2D[itrack] < fZap ) ) fZap = fY2D[itrack]; + if ( ( ft == 3 ) && ( fY2D[itrack] < fZap ) ) fZap = fY2D[itrack]; + if ( ( ft == 4 ) && ( fY2D[itrack] < fZap ) ) fZap = fY2D[itrack]; + if ( ( ft == 5 ) && ( fY2D[itrack] < fZap ) ) fZap = fY2D[itrack]; + if ( ( ft == 6 ) && ( fY2D[itrack] < fZap ) ) fZap = fY2D[itrack]; + + } // condition for fHodScinHit[4][i] + } // loop over 10 + fY2D[itrack] = fZap; + } // condition for track. Plane 4 + + if ( fNtracks == 1 ) fY2D[itrack] = 0.; + + fHitPos3 = goodTrack->GetX() + goodTrack->GetTheta() * ( fScin2XZpos + 0.5 * fScin2XdZpos ); + fHitCnt3 = TMath::Nint( ( fHitPos3 - fHodo->GetHodoCenter3() ) / fHodo->GetScin2XSpacing() ) + 1; + fHitCnt3 = TMath::Max( TMath::Min(fHitCnt3,TMath::Nint(16) ) , 1); // scin_2x_nr = 16 + fHitDist3 = fHitPos3 - ( fHodo->GetScin2XSpacing() * ( fHitCnt3 - 1 ) + fHodo->GetHodoCenter3() ); + + //---------------------------------------------------------------- + + if ( fNtracks > 1 ){ // Plane 3 (2X) + fZap = 0.; + ft = 0; + for ( i = 0; i < 16; i++ ){ + if ( f2XHits[i] == 0 ) { + fX2D[itrack] = TMath::Abs(fHitCnt3-i-1); + + ft ++; + if ( ft == 1 ) fZap = fX2D[itrack]; + if ( ( ft == 2 ) && ( fX2D[itrack] < fZap ) ) fZap = fX2D[itrack]; + if ( ( ft == 3 ) && ( fX2D[itrack] < fZap ) ) fZap = fX2D[itrack]; + if ( ( ft == 4 ) && ( fX2D[itrack] < fZap ) ) fZap = fX2D[itrack]; + if ( ( ft == 5 ) && ( fX2D[itrack] < fZap ) ) fZap = fX2D[itrack]; + if ( ( ft == 6 ) && ( fX2D[itrack] < fZap ) ) fZap = fX2D[itrack]; + + } // condition for fHodScinHit[4][i] + } // loop over 16 + fX2D[itrack] = fZap; + } // condition for track. Plane 3 + + //---------------------------------------------------------------- + + if ( fNtracks == 1 ) + fX2D[itrack] = 0.; + + if ( fY2D[itrack] <= fY2Dmin ) { + if ( fY2D[itrack] < fY2Dmin ) { + fX2Dmin = 100.; + fChi2Min = 10000000000.; + } // fY2D min + + if ( fX2D[itrack] <= fX2Dmin ){ + if ( fX2D[itrack] < fX2Dmin ){ + fChi2Min = 10000000000.0; + } // condition fX2D + if ( fChi2PerDeg < fChi2Min ){ + + fGoodTrack = itrack; // fGoodTrack = itrack + fY2Dmin = fY2D[itrack]; + fX2Dmin = fX2D[itrack]; + fChi2Min = fChi2PerDeg; + + fGoldenTrack = static_cast<THaTrack*>( fTracks->At( fGoodTrack ) ); + fTrkIfo = *fGoldenTrack; + fTrk = fGoldenTrack; + } + } // condition fX2D + } // condition fY2D + } // conditions for dedx, beta and trac energy + } // confition for fNFreeFP greater than fSelNDegreesMin + } // loop over tracks + + if ( fGoodTrack == -1 ){ + + fChi2Min = 10000000000.0; + for (Int_t iitrack = 0; iitrack < fNtracks; iitrack++ ){ + THaTrack* aTrack = dynamic_cast<THaTrack*>( fTracks->At(iitrack) ); + if (!aTrack) return -1; + + if ( aTrack->GetNDoF() > fSelNDegreesMin ){ + fChi2PerDeg = aTrack->GetChi2() / aTrack->GetNDoF(); + + if ( fChi2PerDeg < fChi2Min ){ + + fGoodTrack = iitrack; + fChi2Min = fChi2PerDeg; + + fGoldenTrack = static_cast<THaTrack*>( fTracks->At(fGoodTrack) ); + fTrkIfo = *fGoldenTrack; + fTrk = fGoldenTrack; + + } + } + } // loop over trakcs + + } // Condition for fNtrack > 0 + + } else // condtion fSelUsingScin == 1 + fGoldenTrack = NULL; + + } + + return TrackTimes( fTracks ); } @@ -323,6 +602,7 @@ Int_t THcHallCSpectrometer::TrackTimes( TClonesArray* Tracks ) { // // To be useful, a meaningful timing resolution should be assigned // to each Scintillator object (part of the database). + return 0; } diff --git a/src/THcHallCSpectrometer.h b/src/THcHallCSpectrometer.h index f906546ec9c187e94ec3f607d90b2089420ae0ad..0bbb5229ec79bac0fcb47e11798e7e8f36f5e1d1 100644 --- a/src/THcHallCSpectrometer.h +++ b/src/THcHallCSpectrometer.h @@ -9,6 +9,29 @@ #include "THaSpectrometer.h" +#include <vector> + +#include "TClonesArray.h" +#include "THaNonTrackingDetector.h" +#include "THcHitList.h" +#include "THcHodoscopeHit.h" +#include "THcScintillatorPlane.h" +#include "THcShower.h" + +//#include "THaTrackingDetector.h" +//#include "THcHitList.h" +#include "THcRawDCHit.h" +#include "THcSpacePoint.h" +#include "THcDriftChamberPlane.h" +#include "THcDriftChamber.h" +#include "TMath.h" + +#include "THaSubDetector.h" +#include "TClonesArray.h" +#include <iostream> +#include <fstream> + + //class THaScintillator; class THcHallCSpectrometer : public THaSpectrometer { @@ -30,6 +53,40 @@ public: protected: void InitializeReconstruction(); + Int_t MAXHODHITS; + + Int_t fGoodTrack; + Int_t fSelUsingScin; + Int_t fNPlanes; + Int_t fNtracks; + + Int_t* f2XHits; + Int_t* f2YHits; + + Double_t* fX2D; + Double_t* fY2D; + + Double_t fChi2Min; + Double_t fSelNDegreesMin; + Double_t fSeldEdX1Min; + Double_t fSeldEdX1Max; + Double_t fSelBetaMin; + Double_t fSelBetaMax; + Double_t fSelEtMin; + Double_t fSelEtMax; + Double_t fScin2XZpos; + Double_t fScin2XdZpos; + Double_t fScin2YZpos; + Double_t fScin2YdZpos; + + Double_t fHodoCenter4, fHodoCenter3; + Double_t fScin2YSpacing, fScin2XSpacing; + + // Int_t** fHodScinHit; // [4] Array + + THcShower* fShower; + THcHodoscope* fHodo; + // Should look at the ThaMatrixElement class in THaVDC.h for better way // to store matrix element data #define fMaxReconElements 1000 diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx index e9a8b1d032a92e1c64f717e576395b2b6a00dbb0..e0e3933900c16fe7a6bd57007b60b4d7e80e6b41 100644 --- a/src/THcHodoscope.cxx +++ b/src/THcHodoscope.cxx @@ -15,6 +15,13 @@ /////////////////////////////////////////////////////////////////////////////// #include "THcSignalHit.h" +#include "THcShower.h" + +#include "THcHitList.h" +#include "THcRawShowerHit.h" +#include "TClass.h" +#include "math.h" +#include "THaSubDetector.h" #include "THcHodoscope.h" #include "THaEvData.h" @@ -104,6 +111,9 @@ void THcHodoscope::Setup(const char* name, const char* description) fPlaneNames[i] = new char[plane_names[i].length()]; strcpy(fPlaneNames[i], plane_names[i].c_str()); } + + //myShower = new THcShower("cal", "Shower" ); + /* fPlaneNames = new char* [fNPlanes]; for(Int_t i=0;i<fNPlanes;i++) {fPlaneNames[i] = new char[3];} // Should get the plane names from parameters. @@ -136,6 +146,23 @@ THaAnalysisObject::EStatus THcHodoscope::Init( const TDatime& date ) // But it needs to happen before the sub detectors are initialized // so that they can get the pointer to the hitlist. + // --------------- To get energy from THcShower ---------------------- + + const char* shower_detector_name = "cal"; + THaApparatus* app = GetApparatus(); + THaDetector* det = app->GetDetector( shower_detector_name ); + + if( !dynamic_cast<THcShower*>(det) ) { + Error("THcHodoscope", "Cannot find shower detector %s", + shower_detector_name ); + return fStatus = kInitError; + } + + fShower = static_cast<THcShower*>(det); // fShower is a membervariable + + // --------------- To get energy from THcShower ---------------------- + + InitHitList(fDetMap, "THcHodoscopeHit", 100); EStatus status; @@ -165,6 +192,50 @@ THaAnalysisObject::EStatus THcHodoscope::Init( const TDatime& date ) return kInitError; } + fKeepPos = new Bool_t [MAXHODHITS]; + fKeepNeg = new Bool_t [MAXHODHITS]; + fGoodTDCPos = new Bool_t [MAXHODHITS]; + fGoodTDCNeg = new Bool_t [MAXHODHITS]; + + fGoodRawPad = new Int_t [MAXHODHITS]; + fHitPaddle = new Int_t [MAXHODHITS]; + fNScinHit = new Int_t [MAXHODHITS]; + fNPmtHit = new Int_t [MAXHODHITS]; + fTimeHist = new Int_t [200]; + + fTimeAtFP = new Double_t [MAXHODHITS]; + fScinSigma = new Double_t [MAXHODHITS]; + fGoodScinTime = new Double_t [MAXHODHITS]; + fScinTime = new Double_t [MAXHODHITS]; + fTime = new Double_t [MAXHODHITS]; + adcPh = new Double_t [MAXHODHITS]; + fPath = new Double_t [MAXHODHITS]; + fTimePos = new Double_t [MAXHODHITS]; + fTimeNeg = new Double_t [MAXHODHITS]; + fScinTimefp = new Double_t [MAXHODHITS]; + fScinPosTime = new Double_t [MAXHODHITS]; + fScinNegTime = new Double_t [MAXHODHITS]; + + fNScinHits = new Int_t [fNPlanes]; + fGoodPlaneTime = new Bool_t [fNPlanes]; + fNPlaneTime = new Int_t [fNPlanes]; + fSumPlaneTime = new Double_t [fNPlanes]; + + // Double_t fHitCnt4 = 0., fHitCnt3 = 0.; + + Int_t m = 0; + + fdEdX = new Double_t*[MAXHODHITS]; + for ( m = 0; m < MAXHODHITS; m++ ){ + fdEdX[m] = new Double_t[MAXHODHITS]; + } + + fScinHit = new Double_t*[fNPlanes]; + for ( m = 0; m < fNPlanes; m++ ){ + fScinHit[m] = new Double_t[fNPaddle[0]]; + } + + return fStatus = kOK; } //_____________________________________________________________________________ @@ -369,32 +440,58 @@ Int_t THcHodoscope::ReadDatabase( const TDatime& date ) fHodoPosInvAdcAdc=new Double_t [fMaxHodoScin]; fHodoNegInvAdcAdc=new Double_t [fMaxHodoScin]; + + prefix[1]='\0'; DBRequest list[]={ - {"start_time_center", &fStartTimeCenter, kDouble}, - {"start_time_slop", &fStartTimeSlop, kDouble}, - {"scin_tdc_to_time", &fScinTdcToTime, kDouble}, - {"scin_tdc_min", &fScinTdcMin, kDouble}, - {"scin_tdc_max", &fScinTdcMax, kDouble}, - {"tof_tolerance", &fTofTolerance, kDouble,0,1}, - {"pathlength_central", &fPathLengthCentral, kDouble}, - {"hodo_vel_light",&fHodoVelLight[0],kDouble,fMaxHodoScin}, - {"hodo_pos_sigma",&fHodoPosSigma[0],kDouble,fMaxHodoScin}, - {"hodo_neg_sigma",&fHodoNegSigma[0],kDouble,fMaxHodoScin}, - {"hodo_pos_minph",&fHodoPosMinPh[0],kDouble,fMaxHodoScin}, - {"hodo_neg_minph",&fHodoNegMinPh[0],kDouble,fMaxHodoScin}, - {"hodo_pos_phc_coeff",&fHodoPosPhcCoeff[0],kDouble,fMaxHodoScin}, - {"hodo_neg_phc_coeff",&fHodoNegPhcCoeff[0],kDouble,fMaxHodoScin}, - {"hodo_pos_time_offset",&fHodoPosTimeOffset[0],kDouble,fMaxHodoScin}, - {"hodo_neg_time_offset",&fHodoNegTimeOffset[0],kDouble,fMaxHodoScin}, - {"hodo_pos_ped_limit",&fHodoPosPedLimit[0],kInt,fMaxHodoScin}, - {"hodo_neg_ped_limit",&fHodoNegPedLimit[0],kInt,fMaxHodoScin}, - {"tofusinginvadc",&fTofUsingInvAdc,kInt,0,1}, + // {"scin_2x_zpos", &fScin2XZpos, kDouble, 0, 1}, + // {"scin_2x_dzpos", &fScin2XdZpos, kDouble, 0, 1}, + // {"scin_2y_zpos", &fScin2YZpos, kDouble, 0, 1}, + // {"scin_2y_dzpos", &fScin2YdZpos, kDouble, 0, 1}, + // {"sel_betamin", &fSelBetaMin, kDouble, 0, 1}, + // {"sel_dedx1min", &fSeldEdX1Min, kDouble, 0, 1}, + // {"sel_dedx1max", &fSeldEdX1Max, kDouble, 0, 1}, + // {"sel_using_scin", &fSelUsingScin, kInt, 0, 1}, + // {"sel_ndegreesmin", &fSelNDegreesMin, kDouble, 0, 1}, + {"start_time_center", &fStartTimeCenter, kDouble}, + {"start_time_slop", &fStartTimeSlop, kDouble}, + {"scin_tdc_to_time", &fScinTdcToTime, kDouble}, + {"scin_tdc_min", &fScinTdcMin, kDouble}, + {"scin_tdc_max", &fScinTdcMax, kDouble}, + {"tof_tolerance", &fTofTolerance, kDouble, 0, 1}, + {"pathlength_central", &fPathLengthCentral, kDouble}, + {"hodo_vel_light", &fHodoVelLight[0], kDouble, fMaxHodoScin}, + {"hodo_pos_sigma", &fHodoPosSigma[0], kDouble, fMaxHodoScin}, + {"hodo_neg_sigma", &fHodoNegSigma[0], kDouble, fMaxHodoScin}, + {"hodo_pos_minph", &fHodoPosMinPh[0], kDouble, fMaxHodoScin}, + {"hodo_neg_minph", &fHodoNegMinPh[0], kDouble, fMaxHodoScin}, + {"hodo_pos_phc_coeff", &fHodoPosPhcCoeff[0], kDouble, fMaxHodoScin}, + {"hodo_neg_phc_coeff", &fHodoNegPhcCoeff[0], kDouble, fMaxHodoScin}, + {"hodo_pos_time_offset", &fHodoPosTimeOffset[0], kDouble, fMaxHodoScin}, + {"hodo_neg_time_offset", &fHodoNegTimeOffset[0], kDouble, fMaxHodoScin}, + {"hodo_pos_ped_limit", &fHodoPosPedLimit[0], kInt, fMaxHodoScin}, + {"hodo_neg_ped_limit", &fHodoNegPedLimit[0], kInt, fMaxHodoScin}, + {"tofusinginvadc", &fTofUsingInvAdc, kInt, 0, 1}, {0} }; fTofUsingInvAdc = 0; // Default if not defined fTofTolerance = 3.0; // Default if not defined gHcParms->LoadParmValues((DBRequest*)&list,prefix); + + + cout << "\n\n\n\n\n\nPaddles1x = " << fNPaddle[0] + << "\nscin_2y_zpos = " << fScin2YZpos + << "\nscin_2y_dzpos = " << fScin2YdZpos + << endl; + // << "\ndedx max = " << fSeldEdX1Max + // << "\nbeta min = " << fSelBetaMin + // << "\nbeta max = " << fSelBetaMax + // << "\net min = " << fSelEtMin + // << "\net max = " << fSelEtMax + + // << endl; + + if (fTofUsingInvAdc) { DBRequest list2[]={ {"hodo_pos_invadc_offset",&fHodoPosInvAdcOffset[0],kDouble,fMaxHodoScin}, @@ -480,7 +577,7 @@ Int_t THcHodoscope::DefineVariables( EMode mode ) // { "y_adc", "y-position from amplitudes (m)", "fYa" }, // { "time", "Time of hit at plane (s)", "fTime" }, // { "dtime", "Est. uncertainty of time (s)", "fdTime" }, - // { "dedx", "dEdX-like deposited in paddle", "fAmpl" }, + { "dedx", "dEdX-like deposited in paddle", "fdEdX" }, // { "troff", "Trigger offset for paddles", "fTrigOff"}, // { "trn", "Number of tracks for hits", "GetNTracks()" }, // { "trx", "x-position of track in det plane", "fTrackProj.THaTrackProj.fX" }, @@ -517,7 +614,17 @@ THcHodoscope::~THcHodoscope() void THcHodoscope::DeleteArrays() { // Delete member arrays. Used by destructor. - + Int_t k; + for( k = 0; k < MAXHODHITS; k++){ + delete [] fdEdX[k]; + } + delete [] fdEdX; + + for( k = 0; k < fNPlanes; k++){ + delete [] fScinHit[k]; + } + delete [] fScinHit; + delete [] fNPaddle; fNPaddle = NULL; delete [] fHodoVelLight; fHodoVelLight = NULL; delete [] fHodoPosSigma; fHodoPosSigma = NULL; @@ -536,12 +643,14 @@ void THcHodoscope::DeleteArrays() delete [] fHodoNegInvAdcLinear; fHodoNegInvAdcLinear = NULL; delete [] fHodoPosInvAdcAdc; fHodoPosInvAdcAdc = NULL; + delete [] fGoodRawPad; fGoodRawPad = NULL; // Ahmed delete [] fHitPaddle; fHitPaddle = NULL; // Ahmed delete [] fNScinHit; fNScinHit = NULL; // Ahmed delete [] fNPmtHit; fNPmtHit = NULL; // Ahmed delete [] fTimeHist; fTimeHist = NULL; // Ahmed delete [] fTimeAtFP; fTimeAtFP = NULL; // Ahmed + delete [] fScinSigma; fScinSigma = NULL; // Ahmed delete [] fGoodScinTime; fGoodScinTime = NULL; // Ahmed delete [] fScinTime; fScinTime = NULL; // Ahmed @@ -561,6 +670,8 @@ void THcHodoscope::DeleteArrays() delete [] fNPlaneTime; fNPlaneTime = NULL; // Ahmed delete [] fSumPlaneTime; fSumPlaneTime = NULL; // Ahmed + delete [] fNScinHits; fNScinHits = NULL; // Ahmed + // delete [] fSpacing; fSpacing = NULL; //delete [] fCenter; fCenter = NULL; // This 2D. What is correct way to delete? @@ -616,8 +727,10 @@ Int_t THcHodoscope::Decode( const THaEvData& evdata ) // // GN: print event number so we can cross-check with engine // if (evdata.GetEvNum()>1000) - // cout <<"\nhcana event = " << evdata.GetEvNum()<<endl; + // cout <<"\nhcana_event " << evdata.GetEvNum()<<endl; + fCheckEvent = evdata.GetEvNum(); + if(gHaCuts->Result("Pedestal_event")) { Int_t nexthit = 0; for(Int_t ip=0;ip<fNPlanes;ip++) { @@ -648,6 +761,15 @@ Int_t THcHodoscope::Decode( const THaEvData& evdata ) fNfptimes=0; for(Int_t ip=0;ip<fNPlanes;ip++) { + if ( ip == 2 ){ + fHodoCenter3 = fPlanes[ip]->GetPosCenter(0) + fPlanes[ip]->GetPosOffset(); + fScin2XSpacing = fPlanes[ip]->GetSpacing(); + } + if ( ip == 3 ){ + fHodoCenter4 = fPlanes[ip]->GetPosCenter(0) + fPlanes[ip]->GetPosOffset(); + fScin2YSpacing = fPlanes[ip]->GetSpacing(); + } + // if ( !fPlanes[ip] ) // Ahmed // return -1; // Ahmed @@ -703,47 +825,34 @@ Double_t THcHodoscope::TimeWalkCorrection(const Int_t& paddle, //_____________________________________________________________________________ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) +{ + + ApplyCorrections(); + + return 0; +} + +//_____________________________________________________________________________ +Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) { Int_t Ntracks = tracks.GetLast()+1; // Number of reconstructed tracks - Int_t fPaddle = 0, fIndex, k, fJMax, fMaxHit, ip, ihit; - Int_t fNfpTime, fSumfpTime, fNScinHits; + Int_t fPaddle = 0, fIndex, k, fJMax, fMaxHit, ip, ihit, itrack; + Int_t fNfpTime, fSumfpTime, fRawIndex = -1; //, fNScinHits[fNPlanes]; Double_t fScinTrnsCoord, fScinLongCoord, fScinCenter; Double_t fP, fBetaP, fXcoord, fYcoord, fTMin; - // Int_t fNtof, fNtofPairs; - // ------------------------------------------------- - - fKeepPos = new Bool_t [MAXHODHITS]; - fKeepNeg = new Bool_t [MAXHODHITS]; - fGoodTDCPos = new Bool_t [MAXHODHITS]; - fGoodTDCNeg = new Bool_t [MAXHODHITS]; - - fHitPaddle = new Int_t [MAXHODHITS]; - fNScinHit = new Int_t [MAXHODHITS]; - fNPmtHit = new Int_t [MAXHODHITS]; - fTimeHist = new Int_t [MAXHODHITS]; - fTimeAtFP = new Double_t [MAXHODHITS]; - - fScinSigma = new Double_t [MAXHODHITS]; - fGoodScinTime = new Double_t [MAXHODHITS]; - fScinTime = new Double_t [MAXHODHITS]; - fTime = new Double_t [MAXHODHITS]; - adcPh = new Double_t [MAXHODHITS]; - - fPath = new Double_t [MAXHODHITS]; - fTimePos = new Double_t [MAXHODHITS]; - fTimeNeg = new Double_t [MAXHODHITS]; - fScinTimefp = new Double_t [MAXHODHITS]; - - fTimeHist = new Int_t [200]; - // ------------------------------------------------- Double_t hpartmass=0.00051099; // Fix it for ( Int_t m = 0; m < MAXHODHITS; m++ ){ + + for(k = 0; k < MAXHODHITS; k++){ + fdEdX[m][k] = 0.; + } + fGoodRawPad[m] = 0; fScinSigma[m] = 0.; fHitPaddle[m] = 0.; fScinTime[m] = 0.; @@ -764,24 +873,25 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) } - if (tracks.GetLast()+1 > 0 ) { // **MAIN LOOP: Loop over all tracks and get corrected time, tof, beta... - for ( Int_t itrack = 0; itrack < Ntracks; itrack++ ) { // Line 133 + for ( itrack = 0; itrack < Ntracks; itrack++ ) { // Line 133 THaTrack* theTrack = dynamic_cast<THaTrack*>( tracks.At(itrack) ); if (!theTrack) return -1; - fGoodPlaneTime = new Bool_t[4]; - for ( ip = 0; ip < fNPlanes; ip++ ){ fGoodPlaneTime[ip] = kFALSE; } - + for ( ip = 0; ip < fNPlanes; ip++ ){ + fGoodPlaneTime[ip] = kFALSE; + fNScinHits[ip] = 0; + } + fNfpTime = 0; fBetaChisq[itrack] = -3; fTimeAtFP[itrack] = 0.; fSumfpTime = 0.; // Line 138 fNScinHit[itrack] = 0; // Line 140 - fP = theTrack->GetP(); // Line 142 Fix it + fP = theTrack->GetP(); // Line 142 fBetaP = fP/( TMath::Sqrt( fP * fP + hpartmass * hpartmass) ); //! Calculate all corrected hit times and histogram @@ -799,12 +909,20 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) for (Int_t j=0; j<200; j++) { fTimeHist[j]=0; } // Line 176 - fNPlaneTime = new Int_t [4]; - fSumPlaneTime = new Double_t [4]; + // fNPlaneTime = new Int_t [4]; + // fSumPlaneTime = new Double_t [4]; for ( ip = 0; ip < fNPlanes; ip++ ){ fNPlaneTime[ip] = 0; fSumPlaneTime[ip] = 0.; + // if ( ip == 2 ){ + // fHodoCenter3 = fPlanes[ip]->GetPosCenter(0) + fPlanes[ip]->GetPosOffset(); + // fScin2XSpacing = fPlanes[ip]->GetSpacing(); + // } + // if ( ip == 3 ){ + // fHodoCenter4 = fPlanes[ip]->GetPosCenter(0) + fPlanes[ip]->GetPosOffset(); + // fScin2YSpacing = fPlanes[ip]->GetSpacing(); + // } } // Loop over scintillator planes. // In ENGINE, its loop over good scintillator hits. @@ -812,10 +930,10 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) fGoodTimeIndex = -1; for( ip = 0; ip < fNPlanes; ip++ ) { - fNScinHits = fPlanes[ip]->GetNScinHits(); + fNScinHits[ip] = fPlanes[ip]->GetNScinHits(); // first loop over hits with in a single plane - for ( ihit = 0; ihit < fNScinHits; ihit++ ){ + for ( ihit = 0; ihit < fNScinHits[ip]; ihit++ ){ fTimePos[ihit] = -99.; fTimeNeg[ihit] = -99.; @@ -917,7 +1035,7 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) if ( fJMax >= 0 ){ // Line 248. Here I followed the code of THcSCintilaltorPlane::PulseHeightCorrection fTMin = 0.5 * fJMax; - for( ihit = 0; ihit < fNScinHits; ihit++) { // Loop over sinc. hits. in plane + for( ihit = 0; ihit < fNScinHits[ip]; ihit++) { // Loop over sinc. hits. in plane if ( ( fTimePos[ihit] > fTMin ) && ( fTimePos[ihit] < ( fTMin + fTofTolerance ) ) ) { fKeepPos[ihit]=kTRUE; } @@ -927,8 +1045,8 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) } } // fJMax > 0 condition - fScinPosTime = new Double_t [MAXHODHITS]; - fScinNegTime = new Double_t [MAXHODHITS]; + // fScinPosTime = new Double_t [MAXHODHITS]; + // fScinNegTime = new Double_t [MAXHODHITS]; for ( k = 0; k < MAXHODHITS; k++ ){ fScinPosTime[k] = 0; @@ -939,12 +1057,15 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) // ---------------------- Scond loop over scint. hits in a plane ------------------------------ //--------------------------------------------------------------------------------------------- - for ( ihit = 0; ihit < fNScinHits; ihit++ ){ + for ( ihit = 0; ihit < fNScinHits[ip]; ihit++ ){ fGoodTimeIndex ++; + fRawIndex ++; fPaddle = ((THcSignalHit*)scinPosTDC->At(ihit))->GetPaddleNumber()-1; - fHitPaddle[fGoodTimeIndex] = fPaddle; + fHitPaddle[fGoodTimeIndex] = fPaddle; + + fGoodRawPad[fRawIndex] = fPaddle; fXcoord = theTrack->GetX() + theTrack->GetTheta() * ( fPlanes[ip]->GetZpos() + ( fPaddle % 2 ) * fPlanes[ip]->GetDzpos() ); // Line 277 @@ -1069,7 +1190,6 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) // scinHit[itrack][fNScinHit[itrack]] = ihit; // scinfFPTime[itrack][fNScinHit[itrack]] = fScinTimefp[ihit]; - // --------------------------------------------------------------------------- // Date: July 8 2014 // This counts the pmt hits. Right now we don't need it so it is commentd off @@ -1083,29 +1203,34 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) // --------------------------------------------------------------------------- + // fdEdX[itrack][ihit] = 5.0; + + // -------------------------------------------------------------------------------------------- // Date: July 8 201 May be we need this, not sure. // - // if ( fGoodTDCPos[itrack][ihit] ){ - // if ( fGoodTDCNeg[itrack][ihit] ){ - // dedX[itrack][fNScinHit[itrack]] = - // TMath::Sqrt( TMath::Max( 0., ((THcSignalHit*)scinPosADC->At(ihit))->GetData() * - // ((THcSignalHit*)scinNegADC->At(ihit))->GetData() ) ); - // } - // else{ - // dedX[itrack][fNScinHit[itrack]] = - // TMath::Max( 0., ((THcSignalHit*)scinPosADC->At(ihit))->GetData() ); - // } - // } - // else{ - // if ( fGoodTDCNeg[itrack][ihit] ){ - // dedX[itrack][fNScinHit[itrack]] = - // TMath::Max( 0., ((THcSignalHit*)scinNegADC->At(ihit))->GetData() ); - // } - // else{ - // dedX[itrack][fNScinHit[itrack]] = 0.; - // } - // } + + if ( fGoodTDCPos[fGoodTimeIndex] ){ + if ( fGoodTDCNeg[fGoodTimeIndex] ){ + + fdEdX[itrack][fNScinHit[itrack]-1] = + TMath::Sqrt( TMath::Max( 0., ((THcSignalHit*)scinPosADC->At(ihit))->GetData() * + ((THcSignalHit*)scinNegADC->At(ihit))->GetData() ) ); + } + else{ + fdEdX[itrack][fNScinHit[itrack]-1] = + TMath::Max( 0., ((THcSignalHit*)scinPosADC->At(ihit))->GetData() ); + } + } + else{ + if ( fGoodTDCNeg[fGoodTimeIndex] ){ + fdEdX[itrack][fNScinHit[itrack]-1] = + TMath::Max( 0., ((THcSignalHit*)scinNegADC->At(ihit))->GetData() ); + } + else{ + fdEdX[itrack][fNScinHit[itrack]-1] = 0.; + } + } // -------------------------------------------------------------------------------------------- @@ -1144,8 +1269,8 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) if (!fPlanes[ip]) return -1; - fNScinHits = fPlanes[ip]->GetNScinHits(); - for (ihit = 0; ihit < fNScinHits; ihit++ ){ + fNScinHits[ip] = fPlanes[ip]->GetNScinHits(); + for (ihit = 0; ihit < fNScinHits[ip]; ihit++ ){ fGoodTimeIndex ++; if ( fGoodScinTime[fGoodTimeIndex] ) { @@ -1178,8 +1303,8 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) if (!fPlanes[ip]) return -1; - fNScinHits = fPlanes[ip]->GetNScinHits(); - for (ihit = 0; ihit < fNScinHits; ihit++ ){ // Loop over hits of a plane + fNScinHits[ip] = fPlanes[ip]->GetNScinHits(); + for (ihit = 0; ihit < fNScinHits[ip]; ihit++ ){ // Loop over hits of a plane fGoodTimeIndex ++; if ( fGoodScinTime[fGoodTimeIndex] ){ @@ -1246,19 +1371,20 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) } } - } // Main loop over tracks ends here. - } // If condition for at least one track - ApplyCorrections(); - - return 0; -} + // fBetaChisq[itrack] + // fFPTime[ind] + + theTrack->SetDedx(fdEdX[itrack][0]); + theTrack->SetBeta(fBeta[itrack]); + theTrack->SetBetaChi2( fBetaChisq[itrack] ); + + } // Main loop over tracks ends here. + + } // If condition for at least one track -//_____________________________________________________________________________ -Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) -{ - return 0; + } //_____________________________________________________________________________ Int_t THcHodoscope::GetScinIndex( Int_t nPlane, Int_t nPaddle ) { diff --git a/src/THcHodoscope.h b/src/THcHodoscope.h index aba78e9c642d193539fdcfe77065d91e17734103..5ed3f59230ebe7e595a696c17325044cac36910d 100644 --- a/src/THcHodoscope.h +++ b/src/THcHodoscope.h @@ -14,6 +14,21 @@ #include "THcHitList.h" #include "THcHodoscopeHit.h" #include "THcScintillatorPlane.h" +#include "THcShower.h" + +#include "THaTrackingDetector.h" +#include "THcHitList.h" +#include "THcRawDCHit.h" +#include "THcSpacePoint.h" +#include "THcDriftChamberPlane.h" +#include "THcDriftChamber.h" +#include "TMath.h" + +#include "THaSubDetector.h" +#include "TClonesArray.h" +#include <iostream> +#include <fstream> + class THaScCalib; @@ -54,13 +69,22 @@ public: Double_t GetStartTimeSlop() const {return fStartTimeSlop;} Double_t GetBetaNotrk() const {return fBetaNotrk;} + Int_t GetGoodRawPad(Int_t iii){return fGoodRawPad[iii];} + Double_t GetNScinHits(Int_t iii){return fNScinHits[iii];} + Double_t GetHodoCenter3() { return fHodoCenter3;} + Double_t GetHodoCenter4() { return fHodoCenter4;} + Double_t GetScin2XSpacing() { return fScin2XSpacing;} + Double_t GetScin2YSpacing() { return fScin2YSpacing;} + // Double_t GetBeta() const {return fBeta[];} Double_t GetBeta(Int_t iii) const {return fBeta[iii];} // Ahmed + // Int_t GetEvent(){ return fCheckEvent;} Double_t GetHodoPosSigma(Int_t iii) const {return fHodoPosSigma[iii];} Double_t GetHodoNegSigma(Int_t iii) const {return fHodoNegSigma[iii];} + const TClonesArray* GetTrackHits() const { return fTrackProj; } friend class THaScCalib; @@ -79,7 +103,7 @@ protected: Double_t fStartTime; Int_t fNfptimes; - Double_t fdEdX; + // Double_t fdEdX; Double_t fBetaNotrk; // Double_t fBeta; @@ -121,19 +145,43 @@ protected: //-------------------------- Ahmed ----------------------------- - Int_t MAXHODHITS; - - Double_t* fTestArr; // [MAXHODHITS] Array + THcShower* fShower; + + Int_t fCheckEvent; + + Int_t fGoodTrack; + Int_t MAXHODHITS; + // Int_t fSelUsingScin; + Int_t fSelNDegreesMin; + Double_t fSeldEdX1Min; + Double_t fSeldEdX1Max; + Double_t fSelBetaMin; + Double_t fSelBetaMax; + Double_t fSelEtMin; + Double_t fSelEtMax; + Double_t fScin2XZpos; + Double_t fScin2XdZpos; + Double_t fScin2YZpos; + Double_t fScin2YdZpos; + + Double_t fChi2Min; + Double_t fHodoCenter4, fHodoCenter3; + Double_t fScin2YSpacing, fScin2XSpacing; + + Double_t** fdEdX; // [MAXHODHITS] Array + Double_t** fScinHit; // [fNPlanes] Array + Int_t* fGoodRawPad; Double_t* fBeta; // [MAXHODHITS] Array Double_t* fBetaChisq; // [MAXHODHITS] Array Double_t* fFPTime; // [fNPlanes] Array + Double_t* fScinSigma; Double_t* fGoodScinTime; Double_t* fScinTime; Double_t* fTime; - Double_t* adcPh; + Double_t* adcPh; // Correct it Double_t* fTimeAtFP; Double_t* fPath; Double_t* fTimePos; @@ -145,6 +193,7 @@ protected: Int_t* fHitPaddle; Int_t* fNScinHit; + Int_t* fNScinHits; Int_t* fNPmtHit; Int_t* fTimeHist; Int_t* fNPlaneTime; @@ -163,6 +212,10 @@ protected: TClonesArray* scinPosTDC; TClonesArray* scinNegTDC; + //test array + Double_t test_arr[53]; + Double_t test_arr1[2]; + //---------------------------------------------------------------- // Useful derived quantities diff --git a/src/THcScintillatorPlane.cxx b/src/THcScintillatorPlane.cxx index e945e5105a40c10248255df7f7163b072740ff23..e6a8073c6efd392837e2fbb4cbcf5f7add9f999c 100644 --- a/src/THcScintillatorPlane.cxx +++ b/src/THcScintillatorPlane.cxx @@ -45,6 +45,7 @@ THcScintillatorPlane::THcScintillatorPlane( const char* name, fNScinHits = 0; // fMaxHits=53; + fpTimes = new Double_t [fMaxHits]; fScinTime = new Double_t [fMaxHits]; fScinSigma = new Double_t [fMaxHits]; @@ -72,6 +73,7 @@ THcScintillatorPlane::THcScintillatorPlane( const char* name, fNScinHits = 0; // fMaxHits=53; + fpTimes = new Double_t [fMaxHits]; fScinTime = new Double_t [fMaxHits]; fScinSigma = new Double_t [fMaxHits]; @@ -94,6 +96,7 @@ THcScintillatorPlane::~THcScintillatorPlane() delete fScinTime; delete fScinSigma; delete fScinZpos; + } //______________________________________________________________________________ @@ -303,20 +306,29 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) mintdc=((THcHodoscope *)GetParent())->GetTdcMin(); maxtdc=((THcHodoscope *)GetParent())->GetTdcMax(); Int_t ihit = nexthit; + + // cout << "THcScintillatorPlane: raw htis = " << nrawhits << endl; + while(ihit < nrawhits) { THcHodoscopeHit* hit = (THcHodoscopeHit *) rawhits->At(ihit); if(hit->fPlane > fPlaneNum) { break; } Int_t padnum=hit->fCounter; + Int_t index=padnum-1; - if (hit->fTDC_pos > 0) ((THcSignalHit*) frPosTDCHits->ConstructedAt(nrPosTDCHits++))->Set(padnum, hit->fTDC_pos); - if (hit->fTDC_neg > 0) ((THcSignalHit*) frNegTDCHits->ConstructedAt(nrNegTDCHits++))->Set(padnum, hit->fTDC_neg); - if ((hit->fADC_pos-fPosPed[index]) >= 50) ((THcSignalHit*) frPosADCHits->ConstructedAt(nrPosADCHits++))->Set(padnum, hit->fADC_pos-fPosPed[index]); - if ((hit->fADC_neg-fNegPed[index]) >= 50) ((THcSignalHit*) frNegADCHits->ConstructedAt(nrNegADCHits++))->Set(padnum, hit->fADC_neg-fNegPed[index]); + if (hit->fTDC_pos > 0) + ((THcSignalHit*) frPosTDCHits->ConstructedAt(nrPosTDCHits++))->Set(padnum, hit->fTDC_pos); + if (hit->fTDC_neg > 0) + ((THcSignalHit*) frNegTDCHits->ConstructedAt(nrNegTDCHits++))->Set(padnum, hit->fTDC_neg); + if ((hit->fADC_pos-fPosPed[index]) >= 50) + ((THcSignalHit*) frPosADCHits->ConstructedAt(nrPosADCHits++))->Set(padnum, hit->fADC_pos-fPosPed[index]); + if ((hit->fADC_neg-fNegPed[index]) >= 50) + ((THcSignalHit*) frNegADCHits->ConstructedAt(nrNegADCHits++))->Set(padnum, hit->fADC_neg-fNegPed[index]); // 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(padnum, hit->fTDC_pos); @@ -332,13 +344,12 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit) fNScinHits++; } 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"; } ihit++; } + // cout << "THcScintillatorPlane: ihit = " << ihit << endl; + return(ihit); } //________________________________________________________________________________ diff --git a/src/THcScintillatorPlane.h b/src/THcScintillatorPlane.h index 959038f6f3c926e468ee8e8f832d13e2fdc82076..fce7cd336ea326a95fee1114a023f66640700d33 100644 --- a/src/THcScintillatorPlane.h +++ b/src/THcScintillatorPlane.h @@ -63,12 +63,10 @@ class THcScintillatorPlane : public THaSubDetector { TClonesArray* fParentHitList; - TClonesArray* GetPosADC() { return fPosADCHits;}; // Ahmed - TClonesArray* GetNegADC() { return fNegADCHits;}; // Ahmed - TClonesArray* GetPosTDC() { return fPosTDCHits;}; // Ahmed - TClonesArray* GetNegTDC() { return fNegTDCHits;}; // Ahmed - - + TClonesArray* GetPosADC() { return fPosADCHits;}; // Ahmed + TClonesArray* GetNegADC() { return fNegADCHits;}; // Ahmed + TClonesArray* GetPosTDC() { return fPosTDCHits;}; // Ahmed + TClonesArray* GetNegTDC() { return fNegTDCHits;}; // Ahmed protected: diff --git a/src/THcShower.cxx b/src/THcShower.cxx index 060d120c909fa87747d47ed9f4464ebd1350ba35..b2f328be0eeaad2a049cace869ccb51ffde3fd98 100644 --- a/src/THcShower.cxx +++ b/src/THcShower.cxx @@ -522,6 +522,8 @@ Int_t THcShower::Decode( const THaEvData& evdata ) // Get the Hall C style hitlist (fRawHitList) for this event Int_t nhits = DecodeToHitList(evdata); + fEvent = evdata.GetEvNum(); + if(gHaCuts->Result("Pedestal_event")) { Int_t nexthit = 0; for(Int_t ip=0;ip<fNLayers;ip++) { @@ -1014,6 +1016,11 @@ Int_t THcShower::FineProcess( TClonesArray& tracks ) Float_t energy = GetShEnergy(theTrack); theTrack->SetEnergy(energy); + // if ( fEvent == 13252 ) + // cout << "THcShower: track = " << itrk + 1 + // << " energy = " << energy << endl; + + if (fdbg_tracks_cal) { cout << "THcShower::FineProcess, Track " << itrk << ": " << " X = " << theTrack->GetX() diff --git a/src/THcShower.h b/src/THcShower.h index 04d351dfd28b55b8969390a3188663f55b88dcdc..01de29c182d43ecb8eccc08bdd46ca98080530b6 100644 --- a/src/THcShower.h +++ b/src/THcShower.h @@ -118,6 +118,8 @@ public: protected: + Int_t fEvent; + Int_t fAnalyzePedestals; // Flag for pedestal analysis. Int_t* fShPosPedLimit; // [fNtotBlocks] ADC limits for pedestal calc.-s.