From f58a51e638fe6964737781dedeb1b02ffd742508 Mon Sep 17 00:00:00 2001
From: Pavol Strizenec <pavol.strizenec@cern.ch>
Date: Tue, 2 Feb 2021 23:22:18 +0100
Subject: [PATCH 1/2] fixing raw data reading algo

---
 .../python/LArRawDataReadingConfig.py         |  7 ++++++-
 .../src/LArRawDataReadingAlg.cxx              | 19 +++++++++++++++++--
 .../RecExCommon/share/BSRead_config.py        |  9 ++++++++-
 3 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/LArCalorimeter/LArCnv/LArByteStream/python/LArRawDataReadingConfig.py b/LArCalorimeter/LArCnv/LArByteStream/python/LArRawDataReadingConfig.py
index 66bfef96cada..4294ea67645c 100644
--- a/LArCalorimeter/LArCnv/LArByteStream/python/LArRawDataReadingConfig.py
+++ b/LArCalorimeter/LArCnv/LArByteStream/python/LArRawDataReadingConfig.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
@@ -16,6 +16,11 @@ def LArRawDataReadingCfg(configFlags, **kwargs):
         kwargs.setdefault("LArDigitKey", configFlags.Overlay.BkgPrefix + "FREE")
         kwargs.setdefault("LArRawChannelKey", "")
 
+    print('LArRawDataReadingCfg configFlags.LAr.RawChannelSource ',configFlags.LAr.RawChannelSource)
+
+    if configFlags.LAr.RawChannelSource=="calculated":
+        kwargs.setdefault("LArRawChannelKey", "")
+
     kwargs.setdefault("FailOnCorruption",False)
 
     acc.addEventAlgo(LArRawDataReadingAlg(**kwargs))
diff --git a/LArCalorimeter/LArCnv/LArByteStream/src/LArRawDataReadingAlg.cxx b/LArCalorimeter/LArCnv/LArByteStream/src/LArRawDataReadingAlg.cxx
index 7b93f2b3c1ac..5409b47dea09 100644
--- a/LArCalorimeter/LArCnv/LArByteStream/src/LArRawDataReadingAlg.cxx
+++ b/LArCalorimeter/LArCnv/LArByteStream/src/LArRawDataReadingAlg.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "LArRawDataReadingAlg.h"
@@ -11,6 +11,8 @@
 #include "eformat/Version.h"
 #include "eformat/index.h"
 
+#include "LArByteStream/LArRodBlockTransparentV0.h"
+#include "LArByteStream/LArRodBlockCalibrationV3.h"
 #include "LArByteStream/LArRodBlockStructure.h"
 #include "LArByteStream/LArRodBlockPhysicsV5.h"
 #include "LArByteStream/LArRodBlockPhysicsV6.h"
@@ -121,7 +123,20 @@ StatusCode LArRawDataReadingAlg::execute(const EventContext& ctx) const {
 	  return m_failOnCorruption ? StatusCode::FAILURE : StatusCode::SUCCESS;
 	}// end switch(rodMinorVersion)
       }//end of rodBlockType==4
-      else {
+      else if (rodBlockType==2) { //Transparent mode
+	switch(rodMinorVersion) {
+           case 4:  
+	     rodBlock.reset(new LArRodBlockTransparentV0<LArRodBlockHeaderTransparentV0>);
+             break;
+           case 12:
+             rodBlock.reset(new LArRodBlockCalibrationV3);
+             break;
+           default:  
+	     ATH_MSG_ERROR("Found unsupported ROD Block version " << rodMinorVersion 
+			<< " of ROD block type " << rodBlockType);
+	     return m_failOnCorruption ? StatusCode::FAILURE : StatusCode::SUCCESS;
+        }
+      } else {
         if(rob.rod_source_id()& 0x1000 ){
                ATH_MSG_DEBUG(" skip Latome fragment with source ID "<< std::hex << rob.rod_source_id());
                rodBlock=nullptr;
diff --git a/Reconstruction/RecExample/RecExCommon/share/BSRead_config.py b/Reconstruction/RecExample/RecExCommon/share/BSRead_config.py
index 46d1e16359f3..6b73216da19f 100644
--- a/Reconstruction/RecExample/RecExCommon/share/BSRead_config.py
+++ b/Reconstruction/RecExample/RecExCommon/share/BSRead_config.py
@@ -33,7 +33,14 @@ if rec.doMuon():
 
 if DetFlags.readRDOBS.LAr_on():
     from LArByteStream.LArByteStreamConf import LArRawDataReadingAlg 
-    topSequence+=LArRawDataReadingAlg(FailOnCorruption=False) 
+    from LArConditionsCommon.LArRunFormat import getLArFormatForRun
+    from RecExConfig.AutoConfiguration import GetRunNumber
+    runNum = GetRunNumber()
+    lri=getLArFormatForRun(runNum)
+    if lri.runType()==0:
+       topSequence+=LArRawDataReadingAlg(FailOnCorruption=True,LArRawChannelKey="",OutputLevel=DEBUG) 
+    else:   
+       topSequence+=LArRawDataReadingAlg(FailOnCorruption=False) 
         
 if DetFlags.readRDOBS.Tile_on():
     svcMgr.ByteStreamAddressProviderSvc.TypeNames += [
-- 
GitLab


From 365e42cf80aca5f4e3cf9f272f15382a4a29737e Mon Sep 17 00:00:00 2001
From: Pavol Strizenec <pavol.strizenec@cern.ch>
Date: Wed, 3 Feb 2021 13:09:55 +0100
Subject: [PATCH 2/2] fix in LArRawChannelBuilderAlg to run over splash events

---
 .../LArROD/src/LArRawChannelBuilderAlg.cxx    | 34 +++++++++++--------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/LArCalorimeter/LArROD/src/LArRawChannelBuilderAlg.cxx b/LArCalorimeter/LArROD/src/LArRawChannelBuilderAlg.cxx
index 929fd976e6f4..c134bbf4dce3 100644
--- a/LArCalorimeter/LArROD/src/LArRawChannelBuilderAlg.cxx
+++ b/LArCalorimeter/LArROD/src/LArRawChannelBuilderAlg.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "LArROD/LArRawChannelBuilderAlg.h" 
@@ -109,11 +109,14 @@ StatusCode LArRawChannelBuilderAlg::execute(const EventContext& ctx) const {
     const auto& adc2mev=adc2MeVs->ADC2MEV(id,gain);
     
     //Sanity check on input conditions data:
-    if(ATH_UNLIKELY(ofca.size()!=nSamples)) {
+    // FIXME: fix to get splash test running, should implement the iterations later
+    size_t len=nSamples;
+    if(ATH_UNLIKELY(ofca.size()<nSamples)) {
       if (!connected) continue; //No conditions for disconencted channel, who cares?
-      ATH_MSG_ERROR("Number of OFC a's doesn't match number of samples for conencted channel " << m_onlineId->channel_name(id) 
+      ATH_MSG_DEBUG("Number of OFC a's doesn't match number of samples for conencted channel " << m_onlineId->channel_name(id) 
 		    << " gain " << gain << ". OFC size=" << ofca.size() << ", nbr ADC samples=" << nSamples);
-      return StatusCode::FAILURE;
+      //return StatusCode::FAILURE;
+      len=ofca.size();
     }
     
     if (ATH_UNLIKELY(p==ILArPedestal::ERRORCODE)) {
@@ -134,7 +137,7 @@ StatusCode LArRawChannelBuilderAlg::execute(const EventContext& ctx) const {
     //Apply OFCs to get amplitude
     float A=0;
     bool saturated=false;
-    for (size_t i=0;i<nSamples;++i) {
+    for (size_t i=0;i<len;++i) {
       A+=(samples[i]-p)*ofca[i];
       if (samples[i]==4096 || samples[i]==0) saturated=true;
     }
@@ -173,7 +176,7 @@ StatusCode LArRawChannelBuilderAlg::execute(const EventContext& ctx) const {
       //Get time by applying OFC-b coefficients:
       const auto& ofcb=ofcs->OFC_b(id,gain);
       float At=0;
-      for (size_t i=0;i<nSamples;++i) {
+      for (size_t i=0;i<len;++i) {
 	At+=(samples[i]-p)*ofcb[i];
       }
       //Divide A*t/A to get time
@@ -189,12 +192,15 @@ StatusCode LArRawChannelBuilderAlg::execute(const EventContext& ctx) const {
 	}
       }
 
+      // FIXME: fix to get splash test running, should implement the iterations later
+      len=nSamples;
       if (ATH_UNLIKELY(fullShape.size()<nSamples+firstSample)) {
 	if (!connected) continue; //No conditions for disconnected channel, who cares?
-	ATH_MSG_ERROR("No valid shape for channel " <<  m_onlineId->channel_name(id) 
+	ATH_MSG_DEBUG("No valid shape for channel " <<  m_onlineId->channel_name(id) 
 		      << " gain " << gain);
-	ATH_MSG_ERROR("Got size " << fullShape.size() << ", expected at least " << nSamples+firstSample);
-	return StatusCode::FAILURE;
+	ATH_MSG_DEBUG("Got size " << fullShape.size() << ", expected at least " << nSamples+firstSample);
+	//return StatusCode::FAILURE;
+        len=fullShape.size()-firstSample;
       }
 
       const float* shape=&*fullShape.begin()+firstSample;
@@ -203,20 +209,20 @@ StatusCode LArRawChannelBuilderAlg::execute(const EventContext& ctx) const {
       if (m_useShapeDer) {
 	const auto& fullshapeDer=shapes->ShapeDer(id,gain);
 	if (ATH_UNLIKELY(fullshapeDer.size()<nSamples+firstSample)) {
-	  ATH_MSG_ERROR("No valid shape derivative for channel " <<  m_onlineId->channel_name(id) 
+	  ATH_MSG_DEBUG("No valid shape derivative for channel " <<  m_onlineId->channel_name(id) 
 			<< " gain " << gain);
-	  ATH_MSG_ERROR("Got size " << fullshapeDer.size() << ", expected at least " << nSamples+firstSample);
-	  return StatusCode::FAILURE;
+	  ATH_MSG_DEBUG("Got size " << fullshapeDer.size() << ", expected at least " << nSamples+firstSample);
+	  //return StatusCode::FAILURE;
 	}
 
 	const float* shapeDer=&*fullshapeDer.begin()+firstSample;
-	for (size_t i=0;i<nSamples;++i) {
+	for (size_t i=0;i<len;++i) {
 	  q += std::pow((A*(shape[i]-tau*shapeDer[i])-(samples[i]-p)),2);
 	}
       }//end if useShapeDer
       else {
 	//Q-factor w/o shape derivative
-	for (size_t i=0;i<nSamples;++i) {
+	for (size_t i=0;i<len;++i) {
 	  q += std::pow((A*shape[i]-(samples[i]-p)),2);
 	}
       }
-- 
GitLab