From c6445aae60d0eff05db747b3acdf95f0d129934d Mon Sep 17 00:00:00 2001
From: Vardan Tadevosyan <tadevosn@jlab.org>
Date: Mon, 9 Sep 2013 16:02:39 -0400
Subject: [PATCH] Added cluster-to track association (w/o fid. volume)

---
 src/THcShower.cxx | 75 ++++++++++++++++++++++++++++++++++++++++-------
 src/THcShower.h   |  3 +-
 2 files changed, 66 insertions(+), 12 deletions(-)

diff --git a/src/THcShower.cxx b/src/THcShower.cxx
index f9dec93..1d10da9 100644
--- a/src/THcShower.cxx
+++ b/src/THcShower.cxx
@@ -693,7 +693,7 @@ Int_t THcShower::CoarseProcess( TClonesArray& tracks)
     //	 << "  Phi = " << theTrack->GetPhi()
     //	 << endl;
 
-    MatchCluster(theTrack);
+    MatchCluster(theTrack, ClusterList);
   }
 
   if (fdbg_clusters_cal)
@@ -704,7 +704,8 @@ Int_t THcShower::CoarseProcess( TClonesArray& tracks)
 
 //-----------------------------------------------------------------------------
 
-void THcShower::MatchCluster(THaTrack* Track)
+Int_t THcShower::MatchCluster(THaTrack* Track,
+			      THcShowerClusterList* ClusterList)
 {
   // Match a cluster to a given track.
 
@@ -715,21 +716,73 @@ void THcShower::MatchCluster(THaTrack* Track)
        << "  Phi = " << Track->GetPhi()
        << endl;
 
-  Double_t xc = 1.e8;
-  Double_t yc = 1.e8;
-  Double_t pathl = 1.e8;
+  Double_t xtrk = kBig;
+  Double_t ytrk = kBig;
+  Double_t pathl = kBig;
 
-  CalcTrackIntercept(Track, pathl, xc, yc);
+  // Track interception with face of the calorimeter. The coordinates are
+  // in the calorimeter's local system.
 
-  //  Double_t dx = 0.;
-  //  Int_t pad = -1;
-  //  new ( (*fTrackProj)[0]) THaTrackProj(xc,yc,pathl,dx,pad,this);
+  CalcTrackIntercept(Track, pathl, xtrk, ytrk);
+
+  // Transform coordiantes to the spectrometer's coordinate system.
+
+  xtrk += GetOrigin().X();
+  ytrk += GetOrigin().Y();
 
   cout << "Track at Calorimeter:"
-       << "  X = " << xc
-       << "  Y = " << yc
+       << "  X = " << xtrk
+       << "  Y = " << ytrk
        << "  Pathl = " << pathl
        << endl;
+
+  // Match a cluster to the track.
+
+  Int_t mclust = -1;    // The match cluster #, initialize with a bogus value.
+  Double_t deltaX = kBig;   // Track to cluster distance
+
+  //      hcal_zmin= hcal_1pr_zpos
+  //      hcal_zmax= hcal_4ta_zpos
+  //      hcal_fv_xmin=hcal_xmin+5.
+  //      hcal_fv_xmax=hcal_xmax-5.
+  //      hcal_fv_ymin=hcal_ymin+5.
+  //      hcal_fv_ymax=hcal_ymax-5.
+  //      hcal_fv_zmin=hcal_zmin
+  //      hcal_fv_zmax=hcal_zmax
+
+  //        dz_f=hcal_zmin-hz_fp(nt)
+  //        dz_b=hcal_zmax-hz_fp(nt)
+
+  //        xf=hx_fp(nt)+hxp_fp(nt)*dz_f
+  //        xb=hx_fp(nt)+hxp_fp(nt)*dz_b
+
+  //        yf=hy_fp(nt)+hyp_fp(nt)*dz_f
+  //        yb=hy_fp(nt)+hyp_fp(nt)*dz_b
+
+  //        track_in_fv = (xf.le.hcal_fv_xmax  .and.  xf.ge.hcal_fv_xmin  .and.
+  //     &                 xb.le.hcal_fv_xmax  .and.  xb.ge.hcal_fv_xmin  .and.
+  //     &                 yf.le.hcal_fv_ymax  .and.  yf.ge.hcal_fv_ymin  .and.
+  //     &                 yb.le.hcal_fv_ymax  .and.  yb.ge.hcal_fv_ymin)
+
+  for (Int_t i=0; i<fNclust; i++) {
+
+    THcShowerCluster* cluster = (*ClusterList).ListedCluster(i);
+
+    Double_t dx = TMath::Abs( (*cluster).clX() - xtrk );
+
+    if (dx <= (0.5*BlockThick[0] + fSlop)) {
+
+      if (dx <= deltaX) {
+	mclust = i;
+	deltaX = dx;
+      }
+    }
+
+  }
+
+  cout << "MatchCluster: mclust= " << mclust << "  delatX= " << deltaX << endl;
+
+  return mclust;
 }
 
 
diff --git a/src/THcShower.h b/src/THcShower.h
index f5cde69..1cde602 100644
--- a/src/THcShower.h
+++ b/src/THcShower.h
@@ -11,6 +11,7 @@
 #include "THaNonTrackingDetector.h"
 #include "THcHitList.h"
 #include "THcShowerPlane.h"
+#include "THcShowerCluster.h"
 
 class THaScCalib;
 
@@ -123,7 +124,7 @@ public:
 
   void Setup(const char* name, const char* description);
 
-  void MatchCluster(THaTrack*);
+  Int_t MatchCluster(THaTrack*, THcShowerClusterList*);
 
   ClassDef(THcShower,0)         // Generic class
 };
-- 
GitLab