From 81e935a9b2fe359259e2bd208bd41acb39134d9a Mon Sep 17 00:00:00 2001
From: Patrick Scholer <patrick.scholer@cern.ch>
Date: Fri, 11 Oct 2019 09:45:57 +0200
Subject: [PATCH] manual merge of the neighbor logic switch

---
 .../MM_ElectronicsResponseSimulation.h        | 19 ++++++-----
 .../src/MM_ElectronicsResponseSimulation.cxx  | 33 ++++++++++---------
 2 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_ElectronicsResponseSimulation.h b/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_ElectronicsResponseSimulation.h
index 7d7624c1e68..7eda715664c 100644
--- a/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_ElectronicsResponseSimulation.h
+++ b/MuonSpectrometer/MuonDigitization/MM_Digitization/MM_Digitization/MM_ElectronicsResponseSimulation.h
@@ -24,6 +24,7 @@
 */
 
 
+#include "GaudiKernel/AlgFactory.h"
 #include "GaudiKernel/IToolSvc.h"
 #include "GaudiKernel/Service.h"
 #include "AthenaKernel/MsgStreamMember.h"
@@ -79,8 +80,8 @@ public :
   void initialize();
 
   void clearValues ();
-  void vmmPeakResponseFunction(const vector <int> & numberofStrip, const vector<vector <float>> & qStrip, const vector<vector <float>> & tStrip);
-  void vmmThresholdResponseFunction(const vector <int> & numberofStrip, const vector<vector <float>> & qStrip, const vector<vector <float>> & tStrip);
+  void vmmPeakResponseFunction(const std::vector <int> & numberofStrip, const std::vector<std::vector <float>> & qStrip, const std::vector<std::vector <float>> & tStrip);
+  void vmmThresholdResponseFunction(const std::vector <int> & numberofStrip, const std::vector<std::vector <float>> & qStrip, const std::vector<std::vector <float>> & tStrip);
   MM_DigitToolOutput getPeakResponseFrom(const MM_ElectronicsToolInput & digiInput);
   MM_DigitToolOutput getThresholdResponseFrom(const MM_ElectronicsToolInput & digiInput);
 
@@ -102,6 +103,7 @@ public :
   inline void setStripResponseQThreshold    (float val) { m_stripResponseQThreshold    = val; };
   inline void setStripResponseDriftVelocity (float val) { m_stripResponseDriftVelocity = val; };
   inline void setStripResponseDriftGapWidth (float val) { m_stripResponseDriftGapWidth = val; };
+  inline void setNeighborLogic              (bool  val) { m_useNeighborLogic           = val; };
 
 
   float getPeakTime() const { return m_peakTime;};
@@ -113,9 +115,9 @@ public :
   float getARTdeadtime() const { return m_artDeadTime;};
 
 
-  vector <float>  getTStripElectronicsAbThr () const { return m_tStripElectronicsAbThr;};
-  vector <float>  getQStripElectronics      () const { return m_qStripElectronics;};
-  vector <int>    getNStripElectronics      () const { return m_nStripElectronics;};
+  std::vector <float>  getTStripElectronicsAbThr () const { return m_tStripElectronicsAbThr;};
+  std::vector <float>  getQStripElectronics      () const { return m_qStripElectronics;};
+  std::vector <int>    getNStripElectronics      () const { return m_nStripElectronics;};
 
 private:
 
@@ -130,12 +132,13 @@ private:
   float m_stripResponseQThreshold;
   float m_stripResponseDriftGapWidth;
   float m_stripResponseDriftVelocity;
+  bool  m_useNeighborLogic;
 
   int  m_decoupleShaperFunctionParamaters;
 
-  vector <float> m_tStripElectronicsAbThr;
-  vector <float> m_qStripElectronics;
-  vector <int>   m_nStripElectronics;
+  std::vector <float> m_tStripElectronicsAbThr;
+  std::vector <float> m_qStripElectronics;
+  std::vector <int>   m_nStripElectronics;
 
   TF1 *m_h_intFn;
 
diff --git a/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_ElectronicsResponseSimulation.cxx b/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_ElectronicsResponseSimulation.cxx
index 869b11dd17e..ec01ae082f2 100644
--- a/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_ElectronicsResponseSimulation.cxx
+++ b/MuonSpectrometer/MuonDigitization/MM_Digitization/src/MM_ElectronicsResponseSimulation.cxx
@@ -39,6 +39,7 @@ MM_ElectronicsResponseSimulation::MM_ElectronicsResponseSimulation():
 	m_stripResponseQThreshold(0),
 	m_stripResponseDriftGapWidth(0),
 	m_stripResponseDriftVelocity(0),
+	m_useNeighborLogic(true),
 	m_decoupleShaperFunctionParamaters(false)
 {
 }
@@ -100,8 +101,7 @@ MM_DigitToolOutput MM_ElectronicsResponseSimulation::getThresholdResponseFrom(co
 	return tmp;
 }
 /*******************************************************************************/
-void MM_ElectronicsResponseSimulation::vmmPeakResponseFunction(const vector <int> & numberofStrip, const vector<vector <float>> & qStrip, const vector<vector <float>> & tStrip){
-
+void MM_ElectronicsResponseSimulation::vmmPeakResponseFunction(const std::vector <int> & numberofStrip, const std::vector<std::vector <float>> & qStrip, const std::vector<std::vector <float>> & tStrip){
 	for (unsigned int ii = 0; ii < numberofStrip.size(); ii++) {
 
 		//find min and max times for each strip:
@@ -110,26 +110,29 @@ void MM_ElectronicsResponseSimulation::vmmPeakResponseFunction(const vector <int
 		double maxChargeRightNeighbor = 0;
 
 		// find the maximum charge:
-		if ( ii > 0 ) {
-			shaperInputTime = tStrip.at(ii-1);
-			shaperInputCharge = qStrip.at(ii-1);
-			maxChargeLeftNeighbor = m_h_intFn->GetMaximum(m_timeWindowLowerOffset,m_timeWindowUpperOffset);
-		}
+		if(m_useNeighborLogic){// only check neighbor strips if VMM neighbor logic is enabled
+			if ( ii > 0 ) {
+				shaperInputTime = tStrip.at(ii-1);
+				shaperInputCharge = qStrip.at(ii-1);
+				maxChargeLeftNeighbor = m_h_intFn->GetMaximum(m_timeWindowLowerOffset,m_timeWindowUpperOffset);
+			}
 
-		if ( ii+1 < numberofStrip.size() ) {
-			shaperInputTime = tStrip.at(ii+1);
-			shaperInputCharge = qStrip.at(ii+1);
-			maxChargeRightNeighbor = m_h_intFn->GetMaximum(m_timeWindowLowerOffset,m_timeWindowUpperOffset);
+			if ( ii+1 < numberofStrip.size() ) {
+				shaperInputTime = tStrip.at(ii+1);
+				shaperInputCharge = qStrip.at(ii+1);
+				maxChargeRightNeighbor = m_h_intFn->GetMaximum(m_timeWindowLowerOffset,m_timeWindowUpperOffset);
+			}
 		}
-
 		shaperInputTime = tStrip.at(ii);
 		shaperInputCharge = qStrip.at(ii);
 		maxChargeThisStrip = m_h_intFn->GetMaximum(m_timeWindowLowerOffset,m_timeWindowUpperOffset);
 
 
+		//check if neighbor strip was above threshold
+		bool neighborFired = maxChargeLeftNeighbor > m_electronicsThreshold || maxChargeRightNeighbor > m_electronicsThreshold;
 
-		// Look at strip if it or its neighbor was above threshold:
-		if ( maxChargeLeftNeighbor > m_electronicsThreshold || maxChargeRightNeighbor > m_electronicsThreshold || maxChargeThisStrip > m_electronicsThreshold ) {
+		// Look at strip if it or its neighbor was above threshold  and if neighbor logic of the VMM is enabled:
+		if (maxChargeThisStrip > m_electronicsThreshold || (m_useNeighborLogic && neighborFired) ) {
 			shaperInputTime = tStrip.at(ii);
 			shaperInputCharge = qStrip.at(ii);
 			// float localPeak = 0;
@@ -165,7 +168,7 @@ void MM_ElectronicsResponseSimulation::vmmPeakResponseFunction(const vector <int
 
 
 
-void MM_ElectronicsResponseSimulation::vmmThresholdResponseFunction(const vector <int> & numberofStrip, const vector<vector <float>> & qStrip, const vector<vector <float>> & tStrip){
+void MM_ElectronicsResponseSimulation::vmmThresholdResponseFunction(const std::vector <int> & numberofStrip, const std::vector<std::vector <float>> & qStrip, const std::vector<std::vector <float>> & tStrip){
 
 
 	for (unsigned int ii = 0; ii < numberofStrip.size(); ii++) {
-- 
GitLab