ATLAS Offline Software
LArShapeFromStdNtuple.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
12 #include "GaudiKernel/ThreadLocalContext.h"
13 
14 #include "TFile.h"
15 #include "TBranch.h"
16 #include "TTree.h"
17 #include "TChain.h"
18 
19 #include <cmath>
20 #include <fstream>
21 #include <iostream>
22 #include <string>
23 #include <vector>
24 
25 
26 LArShapeFromStdNtuple::LArShapeFromStdNtuple (const std::string& name, ISvcLocator* pSvcLocator) : AthAlgorithm(name, pSvcLocator)
27 {
28  declareProperty("SkipPoints", m_skipPoints = 0);
29  declareProperty("PrefixPoints", m_prefixPoints = 0);
30  declareProperty("FileNames", m_root_file_names);
31  declareProperty("NtupleName", m_ntuple_name="SHAPE");
32  declareProperty("StoreKey", m_store_key="FromStdNtuple");
33  declareProperty("GroupingType", m_groupingType="ExtendedSubDetector");
34  declareProperty("isComplete", m_isComplete=false);
35 
36  m_done=false;
37 }
38 
40 = default;
41 
43 {
45  return StatusCode::SUCCESS ;
46 }
47 
48 
50 {
51  if(m_done) return StatusCode::SUCCESS;
52 
53  ATH_MSG_INFO ( "... in stop()" );
54 
55  const EventContext& ctx = Gaudi::Hive::currentContext();
57 
58  // get LArOnlineID helper
59  const LArOnlineID* onlineHelper = nullptr;
60  ATH_CHECK( detStore()->retrieve(onlineHelper, "LArOnlineID") );
61 
62  TChain* outfit = new TChain(m_ntuple_name.c_str());
63  for (const std::string& s : m_root_file_names) {
64  outfit->Add(s.c_str());
65  }
66 
67 
68  Int_t phase=0;
69  Int_t det=0;
70  Float_t phaseTime=0;
71  Float_t timeOffset=0;
72  Int_t channelId=0;
73  Int_t FT=0, slot=0, channel=0;
74 
75  Float_t Shape[2000]; // The function
76  Float_t ShapeDer[2000]; // The function
77  Int_t gain = 0; // LARHIGHGAIN = 0, LARMEDIUMGAIN = 1, LARLOWGAIN = 2,
78  Int_t nsamples=0;
79 
80  outfit->SetBranchAddress("channelId", &channelId);
81  outfit->SetBranchAddress("FT", &FT);
82  outfit->SetBranchAddress("slot", &slot);
83  outfit->SetBranchAddress("channel", &channel);
84  outfit->SetBranchAddress("detector", &det);
85  if(m_isComplete) {
86  outfit->SetBranchAddress("PhaseTime", &phaseTime);
87  outfit->SetBranchAddress("Phase", &phase);
88  outfit->SetBranchAddress("timeOffset", &timeOffset);
89  }
90  outfit->SetBranchAddress("nSamples", &nsamples);
91  outfit->SetBranchAddress("Gain", &gain);
92  outfit->SetBranchAddress("Shape", Shape);
93  outfit->SetBranchAddress("ShapeDer", ShapeDer);
94 
95  Float_t timeBinWidth=-1, prevTime=-1, timeOff=-1;
96  Int_t prevPhase=-1;
97 
98  // Create new LArShapeContainer
99  std::unique_ptr<LArShapeComplete> larShapeComplete;
100  std::unique_ptr<LArShape32MC> larShapeMC;
101 
102  if(m_isComplete) {
103  larShapeComplete = std::make_unique<LArShapeComplete>();
104  ATH_CHECK( larShapeComplete->setGroupingType(m_groupingType, msg()) );
105  ATH_CHECK( larShapeComplete->initialize() );
106  } else {
107  larShapeMC = std::make_unique<LArShape32MC>();
108  ATH_CHECK( larShapeMC->setGroupingType(m_groupingType, msg()) );
109  ATH_CHECK( larShapeMC->initialize() );
110  }
111 
112  std::vector<float> shapemc;
113  std::vector<float> shape_dermc;
114  typedef std::vector<std::vector<float> > wave2d;
115  std::map<std::pair<unsigned int,int>, wave2d> shape;
116  std::map<std::pair<unsigned int,int>, wave2d> shape_der;
117  unsigned int hwid;
118  // loop over entries in the Tuple, one entry = one channel
119  Long64_t nentries = outfit->GetEntries();
120  for ( Long64_t iev = 0; iev < nentries; ++iev )
121  {
122  outfit->GetEvent(iev);
123  ATH_MSG_INFO ( " Chan " << std::hex << channelId << " det. "<< det << std::dec );
124 
125  hwid = channelId;
126  //if (det != 4) hwid = (channelId<<4);
127  HWIdentifier id(hwid);
128 
129  /*
130  if(FT != onlineHelper->feedthrough(id) || slot != onlineHelper->slot(id) || channel != onlineHelper->channel(id)) {
131  ATH_MSG_ERROR ( "Inconsistency in decoding HWID !!!!" );
132  ATH_MSG_INFO ( "Trying to fix..." );
133  hwid = (channelId<<4);
134  id=HWIdentifier(hwid);
135  */
136  if(FT != onlineHelper->feedthrough(id) || slot != onlineHelper->slot(id) || channel != onlineHelper->channel(id)) {
137  ATH_MSG_ERROR ( "Inconsistency in decoding HWID !!!!" );
138  ATH_MSG_ERROR ( FT << " - " << onlineHelper->feedthrough(id) );
139  ATH_MSG_ERROR ( slot << " - " << onlineHelper->slot(id) );
140  ATH_MSG_ERROR ( channel << " - " << onlineHelper->channel(id) );
141  //if(det == 4) {
142  // ATH_MSG_ERROR ( "Ignoring for sFcal" );
143  //} else {
144  // ATH_MSG_ERROR ( "Not creating Shape !!!!" );
145  // continue;
146  // }
147  continue;
148  /* }
149  ATH_MSG_INFO ( "Fixed....." );
150  */
151  }
152 
153  // Catch potential array index out of range error.
154  if ( nsamples >= 2000 ) {
155  ATH_MSG_ERROR ( " Too many points specified vs the expected content of the ntuple ! " );
156  ATH_MSG_ERROR ( "Not creating Shape !!!!" );
157  continue;
158  } else {
159  ATH_MSG_DEBUG ( "Working with " << nsamples << " samples" );
160  }
161  if(timeBinWidth < 0) {
162  if(prevTime < 0) {
163  prevTime=phaseTime;
164  prevPhase=phase;
165  } else {
166  if(abs(phase-prevPhase) == 1) {
167  timeBinWidth=std::fabs(phaseTime - prevTime);
168  }
169  }
170  }
171 
172  if(timeOff < 0) timeOff=timeOffset;
173 
174  if(m_isComplete) {
175  if(shape[std::make_pair(hwid,gain)].empty()) shape[std::make_pair(hwid,gain)].reserve(50);
176  if(shape_der[std::make_pair(hwid,gain)].empty()) shape_der[std::make_pair(hwid,gain)].reserve(50);
177  shape[std::make_pair(hwid,gain)][phase].reserve(nsamples);
178  shape_der[std::make_pair(hwid,gain)][phase].reserve(nsamples);
179  for(int i=0;i<nsamples; ++i) {shape[std::make_pair(hwid,gain)][phase][i]=0.;
180  shape_der[std::make_pair(hwid,gain)][phase][i]=0.;}
181  } else {
182  shapemc.resize(nsamples);
183  shape_dermc.resize(nsamples);
184  for(int i=0;i<nsamples; ++i) {shapemc[i]=0.; shape_dermc[i]=0.;}
185  }
186  unsigned int skipped = 0;
187  unsigned int limit = nsamples;
189  for ( unsigned int i = 0; i < limit; i++ ) {
190  if ( skipped >= m_skipPoints ) {
191  if(m_isComplete) { // accumulate into map
192  shape[std::make_pair(hwid,gain)][phase][i-m_skipPoints+m_prefixPoints]=Shape[i];
193  shape_der[std::make_pair(hwid,gain)][phase][i-m_skipPoints+m_prefixPoints]=ShapeDer[i];
194 
195  } else {
196  shapemc[i-m_skipPoints+m_prefixPoints]=Shape[i];
197  shape_dermc[i-m_skipPoints+m_prefixPoints]=ShapeDer[i];
198  }
199  } else skipped++;
200  }
201 
202  if(!m_isComplete) {
203  if (id != mcsym->ZPhiSymOnl(id) ) {
204  ATH_MSG_INFO( "Symmetrized, not stored" );
205  } else {
206 
207  ATH_MSG_INFO( "Storing shape with length: " << shapemc.size() );
208 
209  //LArShapeP1 t(shapemc,shape_dermc);
210 
211  //larShapeMC->setPdata(id, LArShapeP1(shapemc,shape_dermc),gain);
212  larShapeMC->set(id, gain, shapemc, shape_dermc);
213  ATH_MSG_INFO( larShapeMC->Shape(id,gain).size() << " " << larShapeMC->ShapeDer(id,gain).size() );
214  ATH_MSG_INFO( "Shape[2] =" << larShapeMC->Shape(id,gain)[2] << "shapemc[2] =" << shapemc[2] );
215  }
216  }
217 
218  }
219  // for complete, could fill only now
220  if(m_isComplete){
221  std::map<std::pair<unsigned int,int>, wave2d>::iterator ibeg = shape.begin();
222  std::map<std::pair<unsigned int,int>, wave2d>::iterator iend = shape.end();
223  for(;ibeg != iend; ++ibeg) {
224  larShapeComplete->set(HWIdentifier((ibeg->first).first),(ibeg->first).second,
225  ibeg->second, shape_der[std::make_pair((ibeg->first).first, (ibeg->first).second)],
226  timeOff,timeBinWidth);
227  }
228  }
229 
230  if(m_isComplete) {
231  ATH_CHECK( detStore()->record(std::move(larShapeComplete),m_store_key) );
232  } else {
233  ATH_CHECK( detStore()->record(std::move(larShapeMC),m_store_key) );
234  }
235  return StatusCode::SUCCESS;
236 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
LArShapeFromStdNtuple::m_mcSymKey
SG::ReadCondHandleKey< LArMCSym > m_mcSymKey
Definition: LArShapeFromStdNtuple.h:58
ReadOfcFromCool.phase
phase
Definition: ReadOfcFromCool.py:127
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
LArShapeFromStdNtuple::m_ntuple_name
std::string m_ntuple_name
ntuple name
Definition: LArShapeFromStdNtuple.h:47
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:28
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
LArShapeFromStdNtuple::LArShapeFromStdNtuple
LArShapeFromStdNtuple(const std::string &name, ISvcLocator *pSvcLocator)
Definition: LArShapeFromStdNtuple.cxx:26
LArShapeFromStdNtuple::~LArShapeFromStdNtuple
virtual ~LArShapeFromStdNtuple()
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
LArShapeFromStdNtuple.h
CaloCondBlobAlgs_fillNoiseFromASCII.gain
gain
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:110
LArOnlineID_Base::slot
int slot(const HWIdentifier id) const
Return the slot number of a hardware cell identifier: slot = [1,15] Slot-ID in top part of the crat...
Definition: LArOnlineID_Base.cxx:1961
LArShapeFromStdNtuple::stop
virtual StatusCode stop() override
Definition: LArShapeFromStdNtuple.cxx:49
LArShapeFromStdNtuple::m_prefixPoints
unsigned int m_prefixPoints
make a Shape with the first m_prefixPoints as zeros
Definition: LArShapeFromStdNtuple.h:43
LArShapeComplete.h
LArShapeFromStdNtuple::m_root_file_names
std::vector< std::string > m_root_file_names
list of input ntuple file names
Definition: LArShapeFromStdNtuple.h:45
HWIdentifier
Definition: HWIdentifier.h:13
empty
bool empty(TH1 *h)
Definition: computils.cxx:294
ReadCondHandle.h
AthCommonDataStore< AthCommonMsg< Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
LArShapeFromStdNtuple::m_skipPoints
unsigned int m_skipPoints
the first m_skipPoints points of the waveform in the ntuple are skipped
Definition: LArShapeFromStdNtuple.h:41
PlotCalibFromCool.nentries
nentries
Definition: PlotCalibFromCool.py:798
LArOnlineID_Base::channel
int channel(const HWIdentifier id) const
Return the channel number of a hardware cell identifier channel = [0,127] in all FEB.
Definition: LArOnlineID_Base.cxx:1967
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
LArShapeFromStdNtuple::initialize
virtual StatusCode initialize() override
implements IAlgorithm::initialize()
Definition: LArShapeFromStdNtuple.cxx:42
LArShape32MC::initialize
virtual StatusCode initialize()
Initialization done after creation or read back - derived classes may augment the functionality.
Definition: LArShape32MC.cxx:11
lumiFormat.i
int i
Definition: lumiFormat.py:92
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
WritePulseShapeToCool.det
det
Definition: WritePulseShapeToCool.py:204
LArMCSym::ZPhiSymOnl
HWIdentifier ZPhiSymOnl(const HWIdentifier notSymOnlId) const
Find the symmetric HWID for an online channel identifier.
Definition: LArMCSym.h:91
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
LArShapeFromStdNtuple::m_groupingType
std::string m_groupingType
Grouping type.
Definition: LArShapeFromStdNtuple.h:51
LArShapeFromStdNtuple::m_isComplete
bool m_isComplete
Shape type.
Definition: LArShapeFromStdNtuple.h:53
CaloCondBlobAlgs_fillNoiseFromASCII.channelId
channelId
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:122
AthAlgorithm
Definition: AthAlgorithm.h:47
LArShape32MC::set
void set(const HWIdentifier &CellID, int gain, const std::vector< float > &vShape, const std::vector< float > &vShapeDer)
Definition: LArShape32MC.cxx:21
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:194
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
LArShapeComplete::set
void set(const HWIdentifier &CellID, int gain, const std::vector< std::vector< float > > &vShape, const std::vector< std::vector< float > > &vShapeDer, float timeOffset=0, float timeBinWidth=25./24.)
Definition: LArShapeComplete.cxx:17
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
LArOnlineID
Definition: LArOnlineID.h:20
ReadOfcFromCool.nsamples
nsamples
Definition: ReadOfcFromCool.py:115
LArShapeFromStdNtuple::m_store_key
std::string m_store_key
key of the LArShape collection in Storegate
Definition: LArShapeFromStdNtuple.h:49
LArNewCalib_Delay_OFC_Cali.FT
FT
Definition: LArNewCalib_Delay_OFC_Cali.py:120
LArOnlineID_Base::feedthrough
int feedthrough(const HWIdentifier id) const
Return the feedthrough of a hardware cell identifier : feedthrough = [0,31] Barrel - A/C side or H/...
Definition: LArOnlineID_Base.cxx:1948
LArConditionsContainer::initialize
virtual StatusCode initialize()
Initialization done after creation or read back - derived classes may augment the functionality.
LArShape32MC.h
LArShape32MC::ShapeDer
virtual ShapeRef_t ShapeDer(const HWIdentifier &CellID, int gain, int tbin=0, int mode=0) const
Definition: LArShape32MC.cxx:44
AthCommonMsg< Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
CaloGain.h
LArShape32MC::Shape
virtual ShapeRef_t Shape(const HWIdentifier &CellID, int gain, int tbin=0, int mode=0) const
Definition: LArShape32MC.cxx:33
updateCoolNtuple.limit
int limit
Definition: updateCoolNtuple.py:45
LArShapeFromStdNtuple::m_done
bool m_done
Definition: LArShapeFromStdNtuple.h:55
LArOnlineID.h