From 659b4773d6b633e515d3dfa10ec3ea4ddcf14175 Mon Sep 17 00:00:00 2001
From: "Stephen A. Wood" <saw@jlab.org>
Date: Mon, 20 Oct 2014 15:39:05 -0400
Subject: [PATCH] Convert Reconstruction coefs/exps to vector of structures

---
 src/THcHallCSpectrometer.cxx | 38 +++++++++++++-----------------------
 src/THcHallCSpectrometer.h   | 20 ++++++++++++++-----
 2 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/src/THcHallCSpectrometer.cxx b/src/THcHallCSpectrometer.cxx
index 341e14d..33a7e9e 100644
--- a/src/THcHallCSpectrometer.cxx
+++ b/src/THcHallCSpectrometer.cxx
@@ -147,14 +147,7 @@ Bool_t THcHallCSpectrometer::GetTrSorting() const
 void THcHallCSpectrometer::InitializeReconstruction()
 {
   fNReconTerms = 0;
-  for(Int_t i=0;i<fMaxReconElements;i++) {
-    for(Int_t j=0;j<4;j++) {
-      fReconCoeff[i][j] = 0.0;
-    }
-    for(Int_t j=0;j<5;j++) {
-      fReconExponents[i][j] = 0;
-    }
-  }
+  fReconTerms.clear();
   fAngSlope_x = 0.0;
   fAngSlope_y = 0.0;
   fAngOffset_x = 0.0;
@@ -301,22 +294,19 @@ Int_t THcHallCSpectrometer::ReadDatabase( const TDatime& date )
   good = getline(ifile,line).good();
   //  cout << line << endl;
   fNReconTerms = 0;
+  fReconTerms.clear();
+  fReconTerms.reserve(500);
   //cout << "Reading matrix elements" << endl;
   while(good && line.compare(0,4," ---")!=0) {
-    if(fNReconTerms >= fMaxReconElements) {
-      Error(here, "too much data in reconstruction coefficient file %s",reconCoeffFilename.c_str());
-      return kInitError; // Is this the right return code?
-    }
+    fReconTerms.push_back(reconTerm());
     sscanf(line.c_str()," %le %le %le %le %1d%1d%1d%1d%1d"
-	   ,&fReconCoeff[fNReconTerms][0],&fReconCoeff[fNReconTerms][1]
-	   ,&fReconCoeff[fNReconTerms][2],&fReconCoeff[fNReconTerms][3]
-	   ,&fReconExponents[fNReconTerms][0]
-	   ,&fReconExponents[fNReconTerms][1]
-	   ,&fReconExponents[fNReconTerms][2]
-	   ,&fReconExponents[fNReconTerms][3]
-	   ,&fReconExponents[fNReconTerms][4]);
-    // Parse line into fReconCoeff[fNReconTerms][0 - 3] and
-    //                 fReconExponents[fNReconTerms][0 - 5]
+	   ,&fReconTerms[fNReconTerms].Coeff[0],&fReconTerms[fNReconTerms].Coeff[1]
+	   ,&fReconTerms[fNReconTerms].Coeff[2],&fReconTerms[fNReconTerms].Coeff[3]
+	   ,&fReconTerms[fNReconTerms].Exp[0]
+	   ,&fReconTerms[fNReconTerms].Exp[1]
+	   ,&fReconTerms[fNReconTerms].Exp[2]
+	   ,&fReconTerms[fNReconTerms].Exp[3]
+	   ,&fReconTerms[fNReconTerms].Exp[4]);
     fNReconTerms++;
     good = getline(ifile,line).good();    
   }
@@ -372,12 +362,12 @@ Int_t THcHallCSpectrometer::FindVertices( TClonesArray& tracks )
     for(Int_t iterm=0;iterm<fNReconTerms;iterm++) {
       Double_t term=1.0;
       for(Int_t j=0;j<5;j++) {
-	if(fReconExponents[iterm][j]!=0) {
-	  term *= pow(hut_rot[j],fReconExponents[iterm][j]);
+	if(fReconTerms[iterm].Exp[j]!=0) {
+	  term *= pow(hut_rot[j],fReconTerms[iterm].Exp[j]);
 	}
       }
       for(Int_t k=0;k<4;k++) {
-	sum[k] += term*fReconCoeff[iterm][k];
+	sum[k] += term*fReconTerms[iterm].Coeff[k];
       }
     }
     // Transfer results to track
diff --git a/src/THcHallCSpectrometer.h b/src/THcHallCSpectrometer.h
index f5c80ab..931ec23 100644
--- a/src/THcHallCSpectrometer.h
+++ b/src/THcHallCSpectrometer.h
@@ -94,12 +94,22 @@ protected:
   THcShower* fShower;
   THcHodoscope* fHodo;
 
-  // Should look at the ThaMatrixElement class in THaVDC.h for better way
-  // to store matrix element data
-#define fMaxReconElements 1000
   Int_t fNReconTerms;
-  Double_t fReconCoeff[fMaxReconElements][4];
-  Int_t fReconExponents[fMaxReconElements][5];
+  struct reconTerm {
+    Double_t Coeff[4];
+    Int_t Exp[5];
+    reconTerm() {
+      for(Int_t i=0;i<4;i++) {
+	Coeff[i] = 0.0;
+      }
+      for(Int_t i=0;i<5;i++) {
+	Exp[i] = 0;
+      }
+    }
+  };
+  std::vector<reconTerm> fReconTerms;
+  //  Double_t fReconCoeff[fMaxReconElements][4];
+  //  Int_t fReconExponents[fMaxReconElements][5];
   Double_t fAngSlope_x;
   Double_t fAngSlope_y;
   Double_t fAngOffset_x;
-- 
GitLab