ATLAS Offline Software
Loading...
Searching...
No Matches
RegSelCondAlg_LAr.cxx
Go to the documentation of this file.
1
13
14
15#include "RegSelCondAlg_LAr.h"
16
17#include "GaudiKernel/EventIDRange.h"
19
21
25
26#include "eformat/SourceIdentifier.h"
28
29#include <iostream>
30#include <fstream>
31#include <string>
32
33
34RegSelCondAlg_LAr::RegSelCondAlg_LAr(const std::string& name, ISvcLocator* pSvcLocator):
35 AthCondAlgorithm( name, pSvcLocator ),
36 m_managerName(""),
37 m_printTable(false)
38{
39 ATH_MSG_DEBUG( "RegSelCondAlg_LAr::RegSelCondAlg_LAr() " << name );
40 declareProperty( "PrintTable", m_printTable=false );
41 declareProperty( "ManagerName", m_managerName );
42}
43
44
45
46
48 ATH_MSG_DEBUG("RegSelCondAlg_LAr::initialize() ");
49 ATH_CHECK(m_tableKey.initialize());
50 ATH_CHECK(m_roiMapKey.initialize());
51 ATH_CHECK(m_caloMgrKey.initialize());
52 ATH_MSG_INFO("RegSelCondAlg_LAr::initialize() " << m_tableKey );
53 return StatusCode::SUCCESS;
54}
55
56
57
58StatusCode RegSelCondAlg_LAr::execute(const EventContext& ctx) const {
59
60 ATH_MSG_INFO( "RegSelConfAlg_LAr:execute() " << name() );
61
63 ATH_MSG_DEBUG( "Creating region selector table " << m_tableKey );
64
66 if (lutCondData.isValid()) {
72 ATH_MSG_DEBUG("CondHandle " << lutCondData.fullKey() << " is already valid." );
73 return StatusCode::SUCCESS;
74 }
75
76
78 lutCondData.addDependency (roiMap);
79
80 EventIDRange range;
81 if( !roiMap.range( range ) ) {
82 ATH_MSG_ERROR("Failed to retrieve validity range for " << roiMap.key());
83 return StatusCode::FAILURE;
84 }
85 ATH_MSG_DEBUG( "RegSelCondAlg_LAr: " << name() << " found range: " << range );
86
87 ATH_MSG_INFO( "creating new LAr table" );
88
90
91 std::unique_ptr<IRegSelLUT> rd = createTable (**roiMap);
92
93 if ( !rd ) return StatusCode::FAILURE;
94
95 ATH_MSG_INFO( "Storing the new look up table " << m_tableKey );
96
98
99 IRegSelLUTCondData* rcd = new IRegSelLUTCondData( std::move(rd) );
100
101 try {
106 if( lutCondData.record( rcd ).isFailure() ) {
107 ATH_MSG_ERROR( "Could not record " << m_tableKey
108 << " " << lutCondData.key()
109 << " with range " << range );
110 return StatusCode::FAILURE;
111 }
112 ATH_MSG_INFO( "RegSelCondAlg LUT recorded: " << m_tableKey);
113 }
114 catch (...) {
115 ATH_MSG_ERROR("RegSelCondAlg_LAr::execute() failed to record table: " << m_tableKey);
116 return StatusCode::FAILURE;
117 }
118
119
120 ATH_MSG_DEBUG("RegSelCondAlg_LAr::execute() -- exit -- ");
121
122 return StatusCode::SUCCESS;
123}
124
125
126
127
128std::unique_ptr<RegSelectorHashMap> RegSelCondAlg_LAr::createTable (const LArRoIMap& roiMap) const {
129
130 std::unique_ptr<RegSelectorHashMap> lut(nullptr);
131
134
135 const CaloTTDescrManager* manager = nullptr;
136 const CaloLVL1_ID* helper = nullptr;
137
138 if ( detStore()->retrieve(manager).isFailure() ) {
139 ATH_MSG_ERROR( "CaloTTMgr Manager not found" );
140 return lut;
141 }
142
143 if ( detStore()->retrieve(helper).isFailure() ) {
144 ATH_MSG_ERROR( "CaloTTMgr id helper not found" );
145 return lut;
146 }
147
148 int lut_size = 0;
149
150 int sampling = 0;
151 int fcal_layer = 1;
152 bool fcal = false;
153
160
161 if ( m_managerName == "TTEM" ) {
162 lut_size = 12544;
163 sampling = 0;
164 fcal = false;
165 }
166 else if ( m_managerName == "TTHEC" ) {
167 lut_size = 5632;
168 sampling = 1;
169 fcal = false;
170 }
171 else if ( m_managerName == "FCALEM" ) {
172 lut_size = 128;
173 sampling = 0;
174 fcal_layer = 0;
175 fcal = true;
176 }
177 else if ( m_managerName == "FCALHAD" ) {
178 lut_size = 256;
179 sampling = 1;
180 fcal = true;
181 }
182 else {
183 ATH_MSG_ERROR( "Incorrect table type" );
184 return lut;
185 }
186
187
189
190 int ncount = 0;
191 int ncount1 = 0;
192
194 LArReadoutModuleService larReadoutModuleSvc;
195
196 std::unique_ptr<RegionSelectorLUT> lut_stuff = std::make_unique<RegionSelectorLUT>( lut_size );
197
198 CaloTTDescrManager::calo_region_const_iterator it2 = manager->calo_region_begin();
199 CaloTTDescrManager::calo_region_const_iterator it2_end = manager->calo_region_end();
200
201 for ( ; it2!=it2_end ; ++it2 ) {
202
203 const CaloTTDescrRegion* region = (*it2);
204
205 Identifier layer_id = region->identify();
206 int samp = helper->sampling(layer_id);
207 int layer = helper->layer(layer_id);
208 bool isFcal = helper->is_fcal(layer_id);
209
210 if ( isFcal != fcal ) continue;
211 if ( sampling==0 && samp!=0 ) continue;
212 if ( sampling!=0 && samp==0 ) continue;
213 if ( fcal_layer==0 && layer!=0 ) {
214 ATH_MSG_DEBUG( "Whoa! how did this happen ? should never be able to get here: " << samp << " " << layer << " " << isFcal );
215 continue;
216 }
217
218
219 float dEta = region->deta() ;
220 float dPhi = region->dphi() ;
221
222 float eta1 = region->eta()-dEta/2. ;
223 float eta2 = eta1+dEta;
224
225 float phi1 = region->phi()-dPhi/2. ;
226 float phi2 = phi1+dPhi;
227
228 IdentifierHash hashid;
229
230 IdContext IdCntx = helper->layer_context();
231
232 if (helper->get_hash(layer_id, hashid, &IdCntx ) != 0) {
233 ATH_MSG_ERROR ("Bad return from get_hash");
234 }
235
236 // quite special treatment for FCALHAD
237 if ( isFcal && ( samp != 0 ) ) {
238 if ( helper->pos_neg_z(layer_id)==1 ) {
239
244
245 eta1 = 3.6;
246 eta2 = 5.2;
247 }
248 else {
249 eta1 = -5.2;
250 eta2 = -3.6;
251 };
252
253 int pseudolayer = helper->eta(layer_id);
254
255 if ( layer == 0 ) {
256
257 layer = ( pseudolayer<2 ? 0 : 1 );
258
259 if ( layer == 0 ){
260 if ( helper->pos_neg_z(layer_id)==1 ) {
261 eta1 = 3.2;
262 eta2 = 3.6;
263 }
264 else {
265 eta1 = -3.6;
266 eta2 = -3.2;
267 };
268 }
269 } else {
270
271 layer = ( pseudolayer<2 ? 2 : 3 );
272
273 if ( layer == 2 ) {
274 if ( helper->pos_neg_z(layer_id)==1 ) {
275 eta1 = 3.2;
276 eta2 = 3.6;
277 }
278 else {
279 eta1 = -3.6;
280 eta2 = -3.2;
281 };
282 }
283 }
284 } // end of isFcal hadronic
285
286 // get the RODID for this TT
287 const std::vector<HWIdentifier>& vROBID = roiMap.collectionID((unsigned int)hashid);
288
289 // skip the TT that does not have readout, i.e., invalid.
290 if( !vROBID.empty() ) {
291
292 if( vROBID.size() > 1 ) {
293 ATH_MSG_DEBUG ( "More than 1 (" << vROBID.size()
294 << ") ROBID for this TT, sampling, layer, etamin, phimin= "
295 << helper->show_to_string(layer_id) << " "
296 << samp << " " << layer << " " << eta1 << " " << phi1
297 );
298 }
299 // *ttmap << helper->show_to_string(layer_id) << " " << hashid
300
301 std::vector<HWIdentifier>::const_iterator it = vROBID.begin();
302 std::vector<HWIdentifier>::const_iterator it_end = vROBID.end();
303
304 for ( ; it!=it_end ; ++it ) {
305
306 const HWIdentifier mId = (*it);
307
308 eformat::SubDetector detid = (eformat::SubDetector) larReadoutModuleSvc.subDet(mId);
309
310 uint16_t m = larReadoutModuleSvc.rodFragId(mId);
311
312 //EventFormat::SourceID sid = EventFormat::SourceID(detid,type,m);
313 eformat::helper::SourceIdentifier sid(detid,m);
314
315 uint32_t rod_id = sid.code();
316
317 lut_stuff->additem( (double)eta1, (double)eta2, (double)phi1, (double)phi2, samp, layer, (int)hashid, (int)rod_id );
318
319 ATH_MSG_DEBUG( ncount << " filled LUT with following info"
320 << " hashid,sampling, layer, etamin, phimin= "
321 << helper->show_to_string(layer_id) << " "
322 << hashid << " "
323 << samp << " " << layer << " " << eta1 << " " << phi1 );
324
325 ++ncount;
326 }
327
328 ++ncount1;
329
330 } else {
331
332 // no ROBID for this TT. not abnormal (not all layers exist in all TTs)
333 ATH_MSG_DEBUG ( "No ROBID for this TT, sign, sampling, layer, etamin, phimin= "
334 << helper->show_to_string(layer_id)
335 << " " << samp << " " << layer << " " << eta1 << " " << phi1 );
336
337 }
338
339 } // end loop on "regions"
340
341
347
348 lut = std::make_unique<RegSelectorHashMap>();
349 lut->addLut( lut_stuff.get());
350 lut->mountDataStruct();
351
352 ATH_MSG_DEBUG( " Total number of records = " << ncount );
353 ATH_MSG_DEBUG( " Total number of TTs = " << ncount1 );
354
355 return lut;
356}
357
#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)
RegSelCondData< IRegSelLUT > IRegSelLUTCondData
emacs: this is -*- c++ -*-
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
Base class for conditions algorithms.
Helper class for offline TT identifiers.
Definition CaloLVL1_ID.h:66
This class is used to build the CaloTTDescriptors and CaloTTDetDescrRegions carrying the geometry inf...
calo_region_vec::const_iterator calo_region_const_iterator
This class provides an interface to the geometrical description of the Calorimeter Trigger Towers.
double deta() const
return size in phi (unsigned)
double phi() const
return coordinateof the Det Descr Region: phi
double eta() const
return coordinateof the Det Descr Region: eta (signed)
virtual Identifier identify() const
double dphi() const
return size in eta (unsigned)
This class saves the "context" of an expanded identifier (ExpandedIdentifier) for compact or hash ver...
Definition IdContext.h:26
This is a "hash" representation of an Identifier.
Service for creating and interpreting LAr readout modules identifiers.
static int subDet(const HWIdentifier &id)
return sub-detector identifier
static int rodFragId(const HWIdentifier &id)
return ROD fragment identifier ( == ROL == ROB identifier )
Mapping between calorimeter trigger id to offline/online Identifier.
Definition LArRoIMap.h:31
const std::vector< COLL_ID > & collectionID(const TT_ID &id) const
Get list of robIds for a given trigger tower ID.
Definition LArRoIMap.cxx:59
SG::ReadCondHandleKey< LArRoIMap > m_roiMapKey
virtual StatusCode execute(const EventContext &ctx) const override
SG::WriteCondHandleKey< IRegSelLUTCondData > m_tableKey
Output conditions object.
std::unique_ptr< RegSelectorHashMap > createTable(const LArRoIMap &roiMap) const
std::string m_managerName
virtual StatusCode initialize() override
RegSelCondAlg_LAr(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
bool range(EventIDRange &r)
const std::string & key() const
const std::string & key() const
void addDependency(const EventIDRange &range)
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
const DataObjID & fullKey() const