diff --git a/src/THcHallCSpectrometer.cxx b/src/THcHallCSpectrometer.cxx index b17b5df7e4fc0dafcc82a6f2bbf8b65ae4e58912..da226d015e7c66a57108208cc0237146abff825f 100644 --- a/src/THcHallCSpectrometer.cxx +++ b/src/THcHallCSpectrometer.cxx @@ -357,44 +357,6 @@ Int_t THcHallCSpectrometer::FindVertices( TClonesArray& tracks ) } - - // ------------------ Moving it to TrackCalc -------------------- - - /* - // If enabled, sort the tracks by chi2/ndof - if( GetTrSorting() ) - fTracks->Sort(); - - // Find the "Golden Track". - if( GetNTracks() > 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; - - */ - // ------------------ Moving it to TrackCalc -------------------- - - return 0; -} - -//_____________________________________________________________________________ -Int_t THcHallCSpectrometer::TrackCalc() -{ - if ( ( fSelUsingScin == 0 ) && ( fSelUsingPrune == 0 ) ) { BestTrackSimple(); } else if (fSelUsingPrune !=0) { @@ -403,37 +365,44 @@ Int_t THcHallCSpectrometer::TrackCalc() BestTrackUsingScin(); } - return TrackTimes( fTracks ); + + return 0; } //_____________________________________________________________________________ -Int_t THcHallCSpectrometer::BestTrackSimple() +Int_t THcHallCSpectrometer::TrackCalc() { - 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) ); + Int_t hit_gold_track=0; // find track with index =0 which is best track + for (Int_t itrack = 0; itrack < fNtracks; itrack++ ){ + THaTrack* aTrack = static_cast<THaTrack*>( fTracks->At(itrack) ); + if (aTrack->GetIndex()==0) hit_gold_track=itrack; + } + + fGoldenTrack = static_cast<THaTrack*>( fTracks->At(hit_gold_track) ); fTrkIfo = *fGoldenTrack; fTrk = fGoldenTrack; } else fGoldenTrack = NULL; + + return TrackTimes( fTracks ); +} + +//_____________________________________________________________________________ +Int_t THcHallCSpectrometer::BestTrackSimple() +{ + + if( GetTrSorting() ) fTracks->Sort(); + + // Assign index=0 to the best track, + for (Int_t itrack = 0; itrack < fNtracks; itrack++ ){ + THaTrack* aTrack = static_cast<THaTrack*>( fTracks->At(itrack) ); + aTrack->SetIndex(1); + if (itrack==0) aTrack->SetIndex(0); + } + return(0); } @@ -571,18 +540,19 @@ Int_t THcHallCSpectrometer::BestTrackUsingScin() fGoodTrack = iitrack; chi2Min = chi2PerDeg; - fGoldenTrack = aTrack; - fTrkIfo = *fGoldenTrack; - fTrk = fGoldenTrack; - } } } // loop over trakcs - + // Set index for fGoodTrack = 0 + for (Int_t iitrack = 0; iitrack < fNtracks; iitrack++ ){ + THaTrack* aTrack = dynamic_cast<THaTrack*>( fTracks->At(iitrack) ); + aTrack->SetIndex(1); + if (iitrack==fGoodTrack) aTrack->SetIndex(0); + } + // } - } else // Condition for fNtrack > 0 - fGoldenTrack = NULL; + } return(0); } @@ -804,13 +774,16 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() chi2Min = chi2PerDeg; } } + // Set index=0 for fGoodTrack + for (Int_t iitrack = 0; iitrack < fNtracks; iitrack++ ){ + THaTrack* aTrack = dynamic_cast<THaTrack*>( fTracks->At(iitrack) ); + aTrack->SetIndex(1); + if (iitrack==fGoodTrack) aTrack->SetIndex(0); + } + // - fGoldenTrack = static_cast<THaTrack*>( fTracks->At(fGoodTrack) ); - fTrkIfo = *fGoldenTrack; - fTrk = fGoldenTrack; - } else // Condition for fNtrack > 0 - fGoldenTrack = NULL; + } return(0); } diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx index d82373e1734c389ac961dbdfe1e738e3026068b5..75074209319aa89d1024c4e55156e67d12120779 100644 --- a/src/THcHodoscope.cxx +++ b/src/THcHodoscope.cxx @@ -258,7 +258,6 @@ Int_t THcHodoscope::ReadDatabase( const TDatime& date ) // Int_t plen=strlen(parname); cout << " readdatabse hodo fnplanes = " << fNPlanes << endl; - fBetaP = 0.; fBetaNoTrk = 0.; fBetaNoTrkChiSq = 0.; @@ -467,7 +466,7 @@ Int_t THcHodoscope::DefineVariables( EMode mode ) RVarDef vars[] = { // Move these into THcHallCSpectrometer using track fTracks - {"betap", "betaP", "fBetaP"}, + {"beta", "Beta including track info", "fBeta"}, {"betanotrack", "Beta from scintillator hits", "fBetaNoTrk"}, {"betachisqnotrack", "Chi square of beta from scintillator hits", "fBetaNoTrkChiSq"}, {"fpHitsTime", "Time at focal plane from all hits", "fFPTimeAll"}, @@ -551,7 +550,7 @@ void THcHodoscope::ClearEvent() * */ - fBetaP = 0.; + fBeta = 0.0; fBetaNoTrk = 0.0; fBetaNoTrkChiSq = 0.0; fStartTime = 0.0; @@ -865,17 +864,9 @@ Double_t THcHodoscope::TimeWalkCorrection(const Int_t& paddle, return(0.0); } -//_____________________________________________________________________________ -Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) -{ - - ApplyCorrections(); - - return 0; -} //_____________________________________________________________________________ -Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) +Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) { Int_t ntracks = tracks.GetLast()+1; // Number of reconstructed tracks @@ -915,8 +906,6 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) // timeAtFP[itrack] = 0.; Double_t sumFPTime = 0.; // Line 138 fNScinHit.push_back(0); - Double_t p = theTrack->GetP(); // Line 142 - fBetaP = p/( TMath::Sqrt( p * p + fPartMass * fPartMass) ); //! Calculate all corrected hit times and histogram //! This uses a copy of code below. Results are save in time_pos,neg @@ -1000,7 +989,7 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) ( fPlanes[ip]->GetSize() * 0.5 + fPlanes[ip]->GetHodoSlop() ) ){ // Line 293 fTOFPInfo[ihhit].onTrack = kTRUE; - Double_t zcor = zposition/(29.979*fBetaP)* + Double_t zcor = zposition/(29.979*fBetaNominal)* TMath::Sqrt(1. + theTrack->GetTheta()*theTrack->GetTheta() + theTrack->GetPhi()*theTrack->GetPhi()); fTOFPInfo[ihhit].zcor = zcor; @@ -1625,6 +1614,19 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) } //_____________________________________________________________________________ +Int_t THcHodoscope::FineProcess( TClonesArray& tracks ) +{ + Int_t Ntracks = tracks.GetLast()+1; // Number of reconstructed tracks + for (Int_t itrk=0; itrk<Ntracks; itrk++) { + THaTrack* theTrack = static_cast<THaTrack*>( tracks[itrk] ); + if (theTrack->GetIndex()==0) { + fBeta=theTrack->GetBeta(); + } + } //over tracks + + return 0; +} +//_____________________________________________________________________________ Int_t THcHodoscope::GetScinIndex( Int_t nPlane, Int_t nPaddle ) { // GN: Return the index of a scintillator given the plane # and the paddle # // This assumes that both planes and diff --git a/src/THcHodoscope.h b/src/THcHodoscope.h index 4e3cd4e0d5367c01591c5ab143768b2d1bd65b1b..4f1453c761a2a20f003c3cee040585d94627a430 100644 --- a/src/THcHodoscope.h +++ b/src/THcHodoscope.h @@ -93,11 +93,8 @@ public: Int_t GetTdcOffset(Int_t ip) const { return fTdcOffset[ip];} - // Double_t GetBeta() const {return fBeta[];} + Double_t GetBeta() const {return fBeta;} - // Not used - //Double_t GetBeta(Int_t itrack) const {return fBeta[itrack];} // 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];} @@ -132,7 +129,7 @@ protected: Double_t fFPTimeAll; Int_t fNfptimes; - Double_t fBetaP; + Double_t fBeta; Double_t fBetaNoTrk; Double_t fBetaNoTrkChiSq;