ATLAS Offline Software
Loading...
Searching...
No Matches
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
26LArShapeFromStdNtuple::LArShapeFromStdNtuple (const std::string& name, ISvcLocator* pSvcLocator) : AthAlgorithm(name, pSvcLocator)
27{
28 declareProperty("SkipPoints", m_skipPoints = 0);
29 declareProperty("PrefixPoints", m_prefixPoints = 0);
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{
44 ATH_CHECK ( m_mcSymKey.initialize() );
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;
188 if ( m_skipPoints < m_prefixPoints ) limit = nsamples+m_skipPoints-m_prefixPoints;
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}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
static const Attributes_t empty
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
MsgStream & msg() const
int feedthrough(const HWIdentifier id) const
Return the feedthrough of a hardware cell identifier : feedthrough = [0,31] Barrel - A/C side or H/...
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...
int channel(const HWIdentifier id) const
Return the channel number of a hardware cell identifier channel = [0,127] in all FEB.
virtual ~LArShapeFromStdNtuple()
unsigned int m_skipPoints
the first m_skipPoints points of the waveform in the ntuple are skipped
unsigned int m_prefixPoints
make a Shape with the first m_prefixPoints as zeros
virtual StatusCode initialize() override
implements IAlgorithm::initialize()
virtual StatusCode stop() override
std::string m_groupingType
Grouping type.
LArShapeFromStdNtuple(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< std::string > m_root_file_names
list of input ntuple file names
std::string m_store_key
key of the LArShape collection in Storegate
std::string m_ntuple_name
ntuple name
SG::ReadCondHandleKey< LArMCSym > m_mcSymKey