From ab29dedb779083b760b530b51c6edf96aca97c79 Mon Sep 17 00:00:00 2001
From: Andreas Suter <andreas.suter@psi.ch>
Date: Wed, 16 Jun 2021 17:58:40 +0200
Subject: [PATCH] lift #forward == #backward restriction.

---
 src/classes/PRunAsymmetry.cpp     | 32 +++++++++++++++----------------
 src/classes/PRunAsymmetryBNMR.cpp | 29 ++++++++++++++++++++--------
 2 files changed, 37 insertions(+), 24 deletions(-)

diff --git a/src/classes/PRunAsymmetry.cpp b/src/classes/PRunAsymmetry.cpp
index 357672ae..2dfad30a 100644
--- a/src/classes/PRunAsymmetry.cpp
+++ b/src/classes/PRunAsymmetry.cpp
@@ -602,17 +602,7 @@ Bool_t PRunAsymmetry::PrepareData()
       return false;
     }
   }
-  if (forwardHistoNo.size() != backwardHistoNo.size()) {
-    std::cerr << std::endl << ">> PRunAsymmetry::PrepareData(): **PANIC ERROR**:";
-    std::cerr << std::endl << ">> # of forward histograms different from # of backward histograms.";
-    std::cerr << std::endl << ">> Will quit :-(";
-    std::cerr << std::endl;
-    // clean up
-    forwardHistoNo.clear();
-    backwardHistoNo.clear();
-    return false;
-  }
-
+  
   // keep the time resolution in (us)
   fTimeResolution = runData->GetTimeResolution()/1.0e3;
   std::cout.precision(10);
@@ -626,11 +616,13 @@ Bool_t PRunAsymmetry::PrepareData()
   // keep the histo of each group at this point (addruns handled below)
   std::vector<PDoubleVector> forward, backward;
   forward.resize(forwardHistoNo.size());   // resize to number of groups
-  backward.resize(backwardHistoNo.size()); // resize to numer of groups
   for (UInt_t i=0; i<forwardHistoNo.size(); i++) {
     forward[i].resize(runData->GetDataBin(forwardHistoNo[i])->size());
-    backward[i].resize(runData->GetDataBin(backwardHistoNo[i])->size());
     forward[i]  = *runData->GetDataBin(forwardHistoNo[i]);
+  }
+  backward.resize(backwardHistoNo.size()); // resize to number of groups
+  for (UInt_t i=0; i<backwardHistoNo.size(); i++) {
+    backward[i].resize(runData->GetDataBin(backwardHistoNo[i])->size());
     backward[i] = *runData->GetDataBin(backwardHistoNo[i]);
   }
 
@@ -676,9 +668,11 @@ Bool_t PRunAsymmetry::PrepareData()
 
   // set forward/backward histo data of the first group
   fForward.resize(forward[0].size());
-  fBackward.resize(backward[0].size());
   for (UInt_t i=0; i<fForward.size(); i++) {
     fForward[i]  = forward[0][i];
+  }
+  fBackward.resize(backward[0].size());
+  for (UInt_t i=0; i<fBackward.size(); i++) {
     fBackward[i] = backward[0][i];
   }
 
@@ -1677,7 +1671,7 @@ Bool_t PRunAsymmetry::PrepareRRFViewData(PRawRunData* runData, UInt_t histoNo[2]
 //--------------------------------------------------------------------------
 /**
  * <p>Get the proper t0 for the single histogram run.
- * -# the t0 vector size = number of detectors (grouping) for forward.
+ * -# the t0 vector size = number of detectors (grouping) for forward + backward.
  * -# initialize t0's with -1
  * -# fill t0's from RUN block
  * -# if t0's are missing (i.e. t0 == -1), try to fill from the GLOBAL block.
@@ -1698,7 +1692,11 @@ Bool_t PRunAsymmetry::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalB
   // feed all T0's
   // first init T0's, T0's are stored as (forward T0, backward T0, etc.)
   fT0s.clear();
-  fT0s.resize(2*forwardHistoNo.size());
+  // this strange fT0 size estimate is needed in case #forw histos != #back histos
+  size_t size = 2*forwardHistoNo.size();
+  if (backwardHistoNo.size() > forwardHistoNo.size())
+    size = 2*backwardHistoNo.size();
+  fT0s.resize(size);
   for (UInt_t i=0; i<fT0s.size(); i++) {
     fT0s[i] = -1.0;
   }
@@ -1765,6 +1763,8 @@ Bool_t PRunAsymmetry::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *globalB
       std::cerr << std::endl;
       return false;
     }
+  }
+  for (UInt_t i=0; i<backwardHistoNo.size(); i++) {
     if ((fT0s[2*i+1] < 0) || (fT0s[2*i+1] > static_cast<Int_t>(runData->GetDataBin(backwardHistoNo[i])->size()))) {
       std::cerr << std::endl << ">> PRunAsymmetry::PrepareData(): **ERROR** t0 data bin (" << fT0s[2*i+1] << ") doesn't make any sense!";
       std::cerr << std::endl << ">> backwardHistoNo " << backwardHistoNo[i];
diff --git a/src/classes/PRunAsymmetryBNMR.cpp b/src/classes/PRunAsymmetryBNMR.cpp
index 7d533e6d..7946717e 100644
--- a/src/classes/PRunAsymmetryBNMR.cpp
+++ b/src/classes/PRunAsymmetryBNMR.cpp
@@ -640,6 +640,7 @@ Bool_t PRunAsymmetryBNMR::PrepareData()
       return false;
     }
   }
+/* //as35
   if (forwardHistoNo.size() != backwardHistoNo.size()) {
     std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareData(): **PANIC ERROR**:";
     std::cerr << std::endl << ">> # of forward histograms different from # of backward histograms.";
@@ -650,7 +651,8 @@ Bool_t PRunAsymmetryBNMR::PrepareData()
     backwardHistoNo.clear();
     return false;
   }
-
+*/ //as35
+  
   // keep the time resolution in (s)
   fTimeResolution = runData->GetTimeResolution()/1.0e3;
   std::cout.precision(10);
@@ -664,11 +666,13 @@ Bool_t PRunAsymmetryBNMR::PrepareData()
   // keep the histo of each group at this point (addruns handled below)
   std::vector<PDoubleVector> forward, backward;
   forward.resize(forwardHistoNo.size());   // resize to number of groups
-  backward.resize(backwardHistoNo.size()); // resize to numer of groups
   for (UInt_t i=0; i<forwardHistoNo.size(); i++) {
     forward[i].resize(runData->GetDataBin(forwardHistoNo[i])->size());
-    backward[i].resize(runData->GetDataBin(backwardHistoNo[i])->size());
     forward[i]  = *runData->GetDataBin(forwardHistoNo[i]);
+  }
+  backward.resize(backwardHistoNo.size()); // resize to number of groups
+  for (UInt_t i=0; i<backwardHistoNo.size(); i++) {
+    backward[i].resize(runData->GetDataBin(backwardHistoNo[i])->size());
     backward[i] = *runData->GetDataBin(backwardHistoNo[i]);
   }
 
@@ -712,15 +716,18 @@ Bool_t PRunAsymmetryBNMR::PrepareData()
     }
   }
 
-  // set forward/backward histo data of the first group
+  // set forward histo data of the first group
   fForwardp.resize(forward[0].size());
-  fBackwardp.resize(backward[0].size());
   fForwardm.resize(forward[0].size());
-  fBackwardm.resize(backward[0].size());
   for (UInt_t i=0; i<fForwardp.size(); i++) {
     fForwardp[i]  = forward[0][i];
-    fBackwardp[i] = backward[0][i];
     fForwardm[i]  = forward[1][i];
+  }
+  // set backward histo data of the first group
+  fBackwardp.resize(backward[0].size());
+  fBackwardm.resize(backward[0].size());
+  for (UInt_t i=0; i<fBackwardp.size(); i++) {
+    fBackwardp[i] = backward[0][i];
     fBackwardm[i] = backward[1][i];
   }
 
@@ -1529,7 +1536,11 @@ Bool_t PRunAsymmetryBNMR::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glo
   // feed all T0's
   // first init T0's, T0's are stored as (forward T0, backward T0, etc.)
   fT0s.clear();
-  fT0s.resize(2*forwardHistoNo.size());
+  // this strange fT0 size estimate is needed in case #forw histos != #back histos
+  size_t size = 2*forwardHistoNo.size();
+  if (backwardHistoNo.size() > forwardHistoNo.size())
+    size = 2*backwardHistoNo.size();
+  fT0s.resize(size);
   for (UInt_t i=0; i<fT0s.size(); i++) {
     fT0s[i] = -1.0;
   }
@@ -1596,6 +1607,8 @@ Bool_t PRunAsymmetryBNMR::GetProperT0(PRawRunData* runData, PMsrGlobalBlock *glo
       std::cerr << std::endl;
       return false;
     }
+  }
+  for (UInt_t i=0; i<backwardHistoNo.size(); i++) {
     if ((fT0s[2*i+1] < 0) || (fT0s[2*i+1] > static_cast<Int_t>(runData->GetDataBin(backwardHistoNo[i])->size()))) {
       std::cerr << std::endl << ">> PRunAsymmetryBNMR::PrepareData(): **ERROR** t0 data bin (" << fT0s[2*i+1] << ") doesn't make any sense!";
       std::cerr << std::endl << ">> backwardHistoNo " << backwardHistoNo[i];