ATLAS Offline Software
Loading...
Searching...
No Matches
LArCellCont.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5
8#include "GaudiKernel/IToolSvc.h"
13#include "GaudiKernel/EventContext.h"
16#include <iostream>
17
20
21StatusCode
23 const LArOnOffIdMapping& onOffMap,
24 const LArMCSym& mcsym,
25 const LArFebRodMapping& febrod,
26 const LArBadChannelCont& badchannel,
27 const CaloDetDescrManager& man) {
28
29#ifdef TRIGLARCELLDEBUG
30std::cout << "LArCellCont \t\t DEBUG \t in initialize" << std::endl;
31#endif
32
33 ServiceHandle<IToolSvc> toolSvc("ToolSvc", "LArCellCont");
34 CHECK_WITH_CONTEXT( toolSvc.retrieve(), "LArCellCont");
35
36 ServiceHandle<StoreGateSvc> detStore("DetectorStore", "LArCellCont");
37 CHECK_WITH_CONTEXT( detStore.retrieve(), "LArCellCont");
38
39 const LArOnlineID* onlineId = nullptr;
40 CHECK_WITH_CONTEXT( detStore->retrieve(onlineId,"LArOnlineID"), "LArCellCont" );
41
42 CHECK_WITH_CONTEXT( m_conv.initialize(febrod), "LArCellCont" );
43 m_hash.initialize(0, febrod.getLArRoModIDvec() );
44
45 HWIdentifier larrodid(0);
46 for(int i=0;i<m_hash.max();i++){
47#ifdef TRIGLARCELLDEBUG
48 std::cout << "LArCellCont\t\t DEBUG \t"
49 << i << " " << std::hex << m_hash.identifier(i) << std::dec
50 << std::endl;
51#endif
52 // A collection per ROD/ROB/HashId
53 LArCellCollection* mycoll = new LArCellCollection(larrodid);
54 mycoll->reserve(256);
55 this->push_back(mycoll);
56 m_second.push_back(HWIdentifier(0));
57 m_eventNumber.push_back(0xFFFFFFFF);
58 } // end of for id
59 // Not anymore necessary
60 //delete larrodid;
61
62std::vector<const CaloCellCorrection*> LArCellCorrTools;
63
64MakeLArCellFromRaw makeCell;
65makeCell.setThreshold(-100);
66makeCell.initialize( roiMap, onOffMap, man, &LArCellCorrTools, 0 );
67
68StatusCode sc = toolSvc->retrieveTool("LArBadFebMasker", m_badFebMasker);
69bool toolAvailable = sc.isSuccess();
70
71if(!toolAvailable) //not a critical error. LArCellCont can proceed as usual, without masking.
72 REPORT_MESSAGE_WITH_CONTEXT(MSG::INFO, "LArCellCont") <<
73 "Failed to retrieve LArBadFebMasker - no masking will be done." << endmsg;
74
75std::vector<uint32_t> RobsFromMissingFeb;
76
77int count = 0;
78std::vector<HWIdentifier>::const_iterator beg = onlineId->channel_begin();
79std::vector<HWIdentifier>::const_iterator end = onlineId->channel_end ();
80for( ; beg != end; ++beg ){
81 HWIdentifier hwid = mcsym.ZPhiSymOnl(*beg);
82 if ( m_indexset.try_emplace (hwid, count).second ) {
83 ++count;
84 }
85} // end of loop over online IDs
86int indexsetmax = m_indexset.size();
87// the extra indexsetmax is used for invalid cells
88m_corrBCID.resize(indexsetmax+1,0.0);
89
90for(unsigned int i=0; i< m_hashSym.size(); ++i) (m_hashSym[i]).clear();
91m_hashSym.clear();
92m_hashSym.resize(onlineId->febHashMax());
93 for (unsigned iFeb=0;iFeb<onlineId->febHashMax();++iFeb) {
94 const HWIdentifier& febid=onlineId->feb_Id(IdentifierHash(iFeb));
95 if( (toolAvailable && (m_badFebMasker->febMissing(febid)) ) || !toolAvailable ){
96 RobsFromMissingFeb.push_back( m_conv.getRobID( m_conv.getRodID( febrod, febid ) ) );
97 }
98 if( (toolAvailable && !(m_badFebMasker->febMissing(febid)) ) || !toolAvailable ){
99 // get RodID associated with the collection
100 const HWIdentifier& rodId = febrod.getReadoutModuleID(febid);
101 unsigned int rodId32 = m_conv.getRodIDFromROM(rodId);
102 // index in the collection vector
103 int idx = m_hash(rodId32);
104#ifdef TRIGLARCELLDEBUG
105 std::cout << "LArCellCont\t\t DEBUG \t"
106 << idx << " " << std::hex << m_hash.identifier(idx) << std::dec
107 << std::endl;
108#endif
109 // get all channels for a FEB
110 std::map<LArRoIMap::TT_ID,std::vector<LArCell* > > collMap;
111 if ( (*this)[idx]->size() != 0 ) { // This is the second FEB
112 m_second[idx] = febid;
113 }
114 std::vector<int>& hashTab = m_hashSym[idx];
115 hashTab.reserve(256);
116 unsigned int febidcomp = febid.get_identifier32().get_compact();
117 for(int ch=0;ch<128;ch++){
118 LArRoIMap::TT_ID ttId;
119 LArCell* larcell = makeCell.getLArCell(febidcomp,ch,0,0,0,ttId);
120 if ( larcell ) { // if it is a good cell
121 // Fixes default value
123 (*this)[idx]->push_back(larcell);
124 LArBadChannel bc = badchannel.offlineStatus(larcell->ID());
125 bool good(true);
126 if (! bc.good() ){
127 // cell has some specific problems
128 if ( bc.unstable() ) good=false;
129 if ( bc.highNoiseHG() ) good=false;
130 if ( bc.highNoiseMG() ) good=false;
131 if ( bc.highNoiseLG() ) good=false;
132 if ( bc.problematicForUnknownReason() ) good=false;
133 }
134 if ( good ) collMap[ttId].push_back(larcell); // cell masked if not know to be good
135 HWIdentifier hwsym = mcsym.ZPhiSymOnl(onlineId->channel_Id(febid,ch));
136 if ( m_indexset.find( hwsym ) != m_indexset.end() ){
137 int index = (m_indexset.find( hwsym ))->second;
138 hashTab.push_back( index );
139 } else hashTab.push_back(indexsetmax);
140#ifdef TRIGLARCELLDEBUG
141 std::cout << "Cell registered at Collection "
142 << std::hex << febid.get_identifier32().get_compact() << std::dec <<
143 " Channel " << ch << " TTId " << (unsigned int)ttId
144 << std::endl;
145#endif
146 }
147 else {// add a dummy cell
148#ifdef TRIGLARCELLDEBUG
149 std::cout << "Cell not existing" << std::endl;
150#endif
151 LArCell* larcell = new LArCell();
152 (*this)[idx]->push_back(larcell);
153 hashTab.push_back( indexsetmax);
154 } // end of if bad cell
155 } // end of for ch loop
156 for (const auto& [ttid, cells] : collMap) {
157 // Ones needs to dump the mapped vector to an allocated vector
159 vec->reserve(cells.size());
160 for(LArCell* c : cells)
161 {
162 // if(doCellMasking && m_masker->cellShouldBeMasked(c->ID()) )
163 vec->push_back(c);
164 }
165 (*this)[idx]->setTT(ttid,vec->begin(),vec->end());
166 m_vecs.push_back(vec);
167 }//End of loop over the map
168 } // End of check for missing FEB
169} // end of FEB for
170
171m_MissingROBs.clear();
172for(size_t i = 0 ; i < RobsFromMissingFeb.size() ; i++)
173for(size_t j = i+1 ; j < RobsFromMissingFeb.size() ; j++)
174if ( RobsFromMissingFeb[i] == RobsFromMissingFeb[j] )
175m_MissingROBs.push_back(RobsFromMissingFeb[i]);
176RobsFromMissingFeb.clear();
177
178return StatusCode::SUCCESS;
179}
180
182int number_of_col = m_hash.max();
183for(int i=0;i<number_of_col;i++){
184 int number_of_cell = ((*this)[i])->size();
185 for(int j=0;j<number_of_cell;j++)
186 delete ((*((*this)[i]))[j]);
187 if ((*this)[i] != NULL)
188 delete ((*this)[i]);
189} // End of for m_hash.max()
190// Destroy also the vector of vectors to TT maps.
191for(size_t i=0;i<m_vecs.size();i++){
192 delete m_vecs[i];
193}
194for(unsigned int i=0; i< m_hashSym.size(); ++i) (m_hashSym[i]).clear();
195m_hashSym.clear();
196return StatusCode::SUCCESS;
197} // end of finalize
198
199// This WILL NOT trigger BSCNV. This assumes BSCNV was done before
200const std::vector<LArCellCollection*>::const_iterator
201LArCellCont::find(const HWIdentifier& rodid) const{
202 int idx = m_hash(m_conv.getRodIDFromROM (rodid));
203 return (std::vector<LArCellCollection*>::const_iterator)((*this).begin()+idx);
204}
205
206// This WILL NOT trigger BSCNV. This assumes BSCNV was done before
207const std::vector<LArCellCollection*>::const_iterator
208LArCellCont::find(const unsigned int& rodid) {
209 int idx = m_hash(rodid);
210 if ( m_eventNumber[idx] != m_event ) { // Decoding a new event
211 m_eventNumber[idx] = m_event;
212 return (std::vector<LArCellCollection*>::const_iterator)((*this).begin()+idx);
213 // Keep track of last decoded number
214 } else { // Event already decoded. Return Null
215 return (std::vector<LArCellCollection*>::const_iterator)((*this).end());
216 }
217}
218
219void LArCellCont::applyBCIDCorrection(const unsigned int& rodid){
220 int idx = m_hash(rodid);
221 std::vector<LArCellCollection*>::const_iterator it = (std::vector<LArCellCollection*>::const_iterator)((*this).begin()+idx);
222 LArCellCollection* col = (*it);
223 unsigned int itsize = col->size();
224 std::vector<int>& hashTab = m_hashSym[idx];
225 for(unsigned int i=0; i< itsize; ++i){
226 float cor = m_corrBCID[ hashTab[i] ];
227 LArCell* cell = col->operator[](i);
228#ifdef TRIGLARCELLDEBUG
229 std::cout << "LArCellId= " << cell->ID() << " Ecorr= " << cor << " MeV " << std::endl;
230#endif
231 float cellenergy = cell->energy();
232 cell->setEnergyFast( cellenergy - cor );
233 }
234 return;
235}
236
238LArCellCont::findsec(const unsigned int& rodid) const{
239 int idx = m_hash(rodid);
240 return m_second[idx];
241}
242
243void LArCellCont::lumiBlock_BCID(const unsigned int lumi_block, const unsigned int BCID){
244 if ( m_bcid != BCID ) {
245#ifdef TRIGLARCELLDEBUG
246 std::cout << "Update : CURRENT lumi_block, BCID = " << lumi_block << ", " << BCID << " <--> PREVIOUS lumi_block = " << m_lumi_block << ", " << m_bcid << std::endl;
247#endif
248 m_lumi_block = lumi_block; m_bcid = BCID;
249 m_BCIDcache=false;
250 }
251}
252
254
255 std::map<HWIdentifier,int>::const_iterator end = m_indexset.end ();
256
257 std::map<HWIdentifier,int>::const_iterator beg = m_indexset.begin();
258 for( ; beg != end ; ++beg ) {
259 HWIdentifier hwid = (*beg).first;
260 int idx = (*beg).second;
261 if ( idx < (int)m_corrBCID.size() ){
262 Identifier id = onoff.cnvToIdentifier(hwid);
263 float corr = avg.average(id);
264 m_corrBCID[idx] = corr;
265 }
266 } // end of HWID
267 return;
268}
269
270bool LArCellCont::lumiBCIDCheck( const EventContext& context ) {
271 uint32_t bcid = context.eventID().bunch_crossing_id();
272 if ( bcid == m_bcid ) return false;
273 EventIDBase::event_number_t evN = context.eventID().event_number();
274 if ( evN == m_bcidEvt ) return false;
275 m_bcid = bcid;
276 m_bcidEvt = evN;
277 return true;
278}
#define endmsg
Definition of CaloDetDescrManager.
std::vector< size_t > vec
Helpers for checking error return status codes and reporting errors.
#define REPORT_MESSAGE_WITH_CONTEXT(LVL, CONTEXT_NAME)
Report a message, with an explicitly specified context name.
#define CHECK_WITH_CONTEXT(...)
Evaluate an expression and check for errors, with an explicitly specified context name.
LArBadXCont< LArBadChannel > LArBadChannelCont
static Double_t sc
Mapping between calorimeter trigger id to offline/online Identifier.
void setGain(CaloGain::CaloGain gain=CaloGain::INVALIDGAIN)
set gain
Definition CaloCell.h:497
Identifier ID() const
get ID (from cached data member) non-virtual and inline for fast access
Definition CaloCell.h:295
This class provides the client interface for accessing the detector description information common to...
Derived DataVector<T>.
Definition DataVector.h:795
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
size_type size() const noexcept
Returns the number of elements in the collection.
value_type get_compact() const
Get the compact id.
This is a "hash" representation of an Identifier.
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
bool highNoiseHG() const
bool problematicForUnknownReason() const
bool unstable() const
bool highNoiseMG() const
bool highNoiseLG() const
bool good() const
Returns true if no problems at all (all bits at zero)
LArBC_t offlineStatus(const Identifier id) const
Query the status of a particular channel by offline ID This is the main client access method.
Container Class for LArCell in a ROB used by EF.
Hid2RESrcID m_conv
Hardware to Source ID conversion.
std::vector< std::vector< int > > m_hashSym
hash references to BCID
std::vector< DataVector< LArCell > * > m_vecs
One needs to destroy the TT vectors.
std::vector< uint32_t > m_MissingROBs
List of Missing ROBs to be disabled at the RS.
StatusCode initialize(const LArRoIMap &roiMap, const LArOnOffIdMapping &onOffMap, const LArMCSym &mcsym, const LArFebRodMapping &febrod, const LArBadChannelCont &badchannel, const CaloDetDescrManager &ddm)
initialize method.
std::vector< float > m_corrBCID
corrections for a given BCID
unsigned int m_bcid
const ILArBadFebMasker * m_badFebMasker
A tool to help mask cells.
LArRodIdHash m_hash
Hash ID Identifier mapping to collection index.
Definition LArCellCont.h:99
bool m_BCIDcache
flag to only update cache when trying to apply corrections
const std::vector< LArCellCollection * >::const_iterator find(const HWIdentifier &id) const
Finds a collection by its LArReadoutModuleID.
void applyBCIDCorrection(const unsigned int &rodid)
method to apply correction based on the luminosity to the energy
float m_lumi_block
current lumi_block
void lumiBlock_BCID(const unsigned int lumi_block, const unsigned int BCID)
sets LumiBlock and BCID
std::map< HWIdentifier, int > m_indexset
index table
void updateBCID(const CaloBCIDAverage &, const LArOnOffIdMapping &)
update BCID dependent correction table for MT case
HWIdentifier findsec(const unsigned int &id) const
Each Collection contains data from 2 FEBs.
StatusCode finalize(void)
finalize method.
LArCellCont()
Constructor.
EventIDBase::event_number_t m_bcidEvt
unsigned int m_event
this event number
std::vector< unsigned int > m_eventNumber
eventNumber of a given Collection
bool lumiBCIDCheck(const EventContext &context)
std::vector< HWIdentifier > m_second
FEB Hardware Identifier for second FEBs in a Collection.
Data object for LAr calorimeter readout cell.
Definition LArCell.h:53
const std::vector< HWIdentifier > & getLArRoModIDvec() const
"iterator" on LArReadoutModuleIDs
HWIdentifier getReadoutModuleID(const HWIdentifier &id) const
Helper class to handle z-phi symmetry of calibration constants in MC.
Definition LArMCSym.h:19
HWIdentifier ZPhiSymOnl(const HWIdentifier notSymOnlId) const
Find the symmetric HWID for an online channel identifier.
Definition LArMCSym.h:91
Identifier cnvToIdentifier(const HWIdentifier &sid) const
create an Identifier from a HWIdentifier (inline)
HWIdentifier channel_Id(int barrel_ec, int pos_neg, int feedthrough, int slot, int channel) const
create channel identifier from fields
id_iterator channel_end() const
id_iterator channel_begin() const
Returns an iterator pointing to a channel identifier collection.
size_type febHashMax() const
define feb hash tables max size
HWIdentifier feb_Id(int barrel_ec, int pos_neg, int feedthrough, int slot) const
Create feb_Id from fields.
Mapping between calorimeter trigger id to offline/online Identifier.
Definition LArRoIMap.h:31
unsigned int TT_ID
Definition LArRoIMap.h:34
Building LArCell objects from LArRawChannel.
void initialize(const LArRoIMap &roiMap, const LArOnOffIdMapping &onOffMap, const CaloDetDescrManager &man, const std::vector< const CaloCellCorrection * > *pCorr, unsigned int poolMaxSize=190000)
initialize the internal map
LArCell * getLArCell(unsigned int feb, unsigned int chan, int e, int t, int q, CaloGain::CaloGain caloGain, unsigned int &ttId) const
access by Identifier
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146
@ LARHIGHGAIN
Definition CaloGain.h:18
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
Definition index.py:1