From edf7b8deecbd41bf80e3795f18242afcd8e8787f Mon Sep 17 00:00:00 2001
From: "Stephen A. Wood" <saw@jlab.org>
Date: Wed, 15 Jul 2015 09:33:01 -0400
Subject: [PATCH] Add methods to support THcHodoEff module   Method for number
 of planes   Method for list of plane objects   Method to return "good" flags
 for given track, plane and counter

---
 src/THcHodoscope.cxx | 16 ++++++++++++++++
 src/THcHodoscope.h   | 18 ++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx
index 6f82178..5be33ec 100644
--- a/src/THcHodoscope.cxx
+++ b/src/THcHodoscope.cxx
@@ -815,6 +815,8 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks )
       }
       std::vector<Double_t> dedx_temp;
       fdEdX.push_back(dedx_temp); // Create array of dedx per hit
+      std::vector<std::vector<GoodFlags> > goodflagstmp1;
+      fGoodFlags.push_back(goodflagstmp1);
       
       Int_t nFPTime = 0;
       Double_t betaChiSq = -3;
@@ -847,6 +849,9 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks )
       Int_t ihhit = 0;		// Hit # overall
       for(Int_t ip = 0; ip < fNPlanes; ip++ ) {
 	
+	std::vector<GoodFlags> goodflagstmp2;
+	fGoodFlags[itrack].push_back(goodflagstmp2);
+
 	fNScinHits[ip] = fPlanes[ip]->GetNScinHits();
 	TClonesArray* hodoHits = fPlanes[ip]->GetHits();
 
@@ -955,6 +960,12 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks )
 	//---------------------------------------------------------------------------------------------
 
 	for (Int_t iphit = 0; iphit < fNScinHits[ip]; iphit++ ){
+	  GoodFlags flags;
+	  fGoodFlags[itrack][ip].push_back(flags);
+	  fGoodFlags[itrack][ip][iphit].onTrack = kFALSE;
+	  fGoodFlags[itrack][ip][iphit].goodScinTime = kFALSE;
+	  fGoodFlags[itrack][ip][iphit].goodTdcNeg = kFALSE;
+	  fGoodFlags[itrack][ip][iphit].goodTdcPos = kFALSE;
 	  
 	  fTOFCalc.push_back(TOFCalc());
 	  // Do we set back to false for each track, or just once per event?
@@ -1000,6 +1011,7 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks )
 	      
 	      // ** Calculate time for each tube with a good tdc. 'pos' side first.
 	      fTOFCalc[ihhit].good_tdc_pos = kTRUE;
+	      fGoodFlags[itrack][ip][iphit].goodTdcPos = kTRUE;
 	      Double_t path = fPlanes[ip]->GetPosLeft() - scinLongCoord;
 	      
 	      // * Convert TDC value to time, do pulse height correction, correction for
@@ -1014,6 +1026,7 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks )
 	      
 	      // ** Calculate time for each tube with a good tdc. 'pos' side first.
 	      fTOFCalc[ihhit].good_tdc_neg = kTRUE;
+	      fGoodFlags[itrack][ip][iphit].goodTdcNeg = kTRUE;
 	      //	      fNtof ++;
 	      Double_t path = scinLongCoord - fPlanes[ip]->GetPosRight();
 	      
@@ -1033,11 +1046,13 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks )
 		fTOFCalc[ihhit].scin_sigma = TMath::Sqrt( fHodoPosSigma[fPIndex] * fHodoPosSigma[fPIndex] + 
 							  fHodoNegSigma[fPIndex] * fHodoNegSigma[fPIndex] )/2.;
 		fTOFCalc[ihhit].good_scin_time = kTRUE;
+		fGoodFlags[itrack][ip][iphit].goodScinTime = kTRUE;
 	      }
 	      else{
 		fTOFCalc[ihhit].scin_time = fTOFPInfo[iphit].scin_pos_time;
 		fTOFCalc[ihhit].scin_sigma = fHodoPosSigma[fPIndex];
 		fTOFCalc[ihhit].good_scin_time = kTRUE;
+		fGoodFlags[itrack][ip][iphit].goodScinTime = kTRUE;
 	      }
 	    }
 	    else {
@@ -1045,6 +1060,7 @@ Int_t THcHodoscope::FineProcess( TClonesArray& tracks )
 		fTOFCalc[ihhit].scin_time = fTOFPInfo[iphit].scin_neg_time;
 		fTOFCalc[ihhit].scin_sigma = fHodoNegSigma[fPIndex];
 		fTOFCalc[ihhit].good_scin_time = kTRUE;
+		fGoodFlags[itrack][ip][iphit].goodScinTime = kTRUE;
 	      }
 	    } // In h_tof.f this includes the following if condition for time at focal plane
 	    // // because it is written in FORTRAN code
diff --git a/src/THcHodoscope.h b/src/THcHodoscope.h
index d113af1..42d4599 100644
--- a/src/THcHodoscope.h
+++ b/src/THcHodoscope.h
@@ -76,6 +76,8 @@ public:
   Int_t GetNScinHits(Int_t iii){return fNScinHits[iii];}
   Int_t GetTotHits(){return fTOFCalc.size();}
 
+  Int_t GetNPlanes() { return fNPlanes;}
+  THcScintillatorPlane* GetPlane(Int_t ip) { return fPlanes[ip];}
   UInt_t GetNPaddles(Int_t iii) { return fNPaddle[iii];}
   Double_t GetHodoSlop(Int_t iii) { return fHodoSlop[iii];}
   Double_t GetPlaneCenter(Int_t iii) { return fPlaneCenter[iii];}
@@ -90,6 +92,15 @@ public:
   Double_t GetHodoPosSigma(Int_t iii) const {return fHodoPosSigma[iii];}
   Double_t GetHodoNegSigma(Int_t iii) const {return fHodoNegSigma[iii];}
 
+  Bool_t GetFlags(Int_t itrack, Int_t iplane, Int_t ihit,
+		  Bool_t& onTrack, Bool_t& goodScinTime,
+		  Bool_t& goodTdcNeg, Bool_t& goodTdcPos) const {
+    onTrack = fGoodFlags[itrack][iplane][ihit].onTrack;
+    goodScinTime = fGoodFlags[itrack][iplane][ihit].goodScinTime;
+    goodTdcNeg = fGoodFlags[itrack][iplane][ihit].goodTdcNeg;
+    goodTdcPos = fGoodFlags[itrack][iplane][ihit].goodTdcPos;
+    return(kTRUE);
+  }
 
   const TClonesArray* GetTrackHits() const { return fTrackProj; }
 
@@ -285,6 +296,13 @@ protected:
   std::vector<Int_t > fGoodScinHitsX;                   // # hits in fid x range
   // Could combine the above into a structure
 
+  struct GoodFlags {
+    Bool_t onTrack;
+    Bool_t goodScinTime;
+    Bool_t goodTdcNeg;
+    Bool_t goodTdcPos;
+  };
+  std::vector<std::vector<std::vector<GoodFlags> > > fGoodFlags;
   //
     
   void           ClearEvent();
-- 
GitLab