ATLAS Offline Software
BunchCrossingCondAlg.cxx
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration.
3  */
4 
5 #include "BunchCrossingCondAlg.h"
6 #include "CoolKernel/IObject.h"
7 #include "CoralBase/Blob.h"
10 #include <charconv>
11 #include <cstdint>
12 
13 #include "CoralBase/AttributeListException.h"
14 
15 namespace {
16  // helper to set timestamp based IOV with infinite range
17  EventIDBase infiniteIOVBegin() {
18  return EventIDBase( 0, // run,
19  EventIDBase::UNDEFEVT, // event
20  0, // seconds
21  0, // ns
22  0 // LB
23  );
24  }
25 
26  EventIDBase infiniteIOVEnd() {
27  return EventIDBase( std::numeric_limits<int>::max() - 1, // run
28  EventIDBase::UNDEFEVT, // event
29  std::numeric_limits<int>::max() - 1, // seconds
32  );
33  }
34 
35 }
36 
38  if (m_mode == 2) {
39  ATH_CHECK( m_trigConfigSvc.retrieve() );
40  }
45  return StatusCode::SUCCESS;
46 }
47 
48 
49 StatusCode BunchCrossingCondAlg::execute (const EventContext& ctx) const {
50 
52  if (writeHdl.isValid()) {
53  ATH_MSG_DEBUG("Found valid write handle");
54  return StatusCode::SUCCESS;
55  }
56  // make sure that the output IOV has a valid timestamp, otherwise the conditions
57  // data cannot be added to the "mixed" conditions data container. A mixed container
58  // is needed when the conditions depends on e.g. the LuminosityCondData
59  EventIDRange infinite_range(infiniteIOVBegin(),infiniteIOVEnd());
60  writeHdl.addDependency(infinite_range);
61 
62  //Output object & range:
63  auto bccd=std::make_unique<BunchCrossingCondData>();
64 
65  if (m_mode == 2) { // use trigger bunch groups
66  const TrigConf::L1BunchGroupSet* bgs{nullptr};
69  if (! bgsh.isValid()) {
70  ATH_MSG_ERROR("Unable to retrieve L1BunchGroupSet object " << m_bunchGroupCondDataKey);
71  return StatusCode::FAILURE;
72  }
73  bgs = *bgsh;
74  } else {
75  bgs = &(m_trigConfigSvc->l1BunchGroupSet(ctx));
76  }
77  // bunch group 1 = paired
78  if (bgs->size() >= 2) {
79  ATH_MSG_DEBUG("from BunchGroupCondData: BG1 bunches " << bgs->getBunchGroup(1)->bunches() );
80  for (const auto& pos : bgs->getBunchGroup(1)->bunches() ) {
81  bccd->m_beam1.set(pos);
82  bccd->m_beam2.set(pos);
83  bccd->m_luminous.set(pos);
84  }
85  }
86  else {
87  ATH_MSG_ERROR("missing bunch group data");
88  }
89  // in Run 1 we don't have bunch group information to determine beam 1 or beam 2 unpaired
90  // so test if we have at least 15 bunch groups, then assume BG13/14 are the unpaired bunches
91  if (bgs->size() >= 15) {
92  for (const auto& pos : bgs->getBunchGroup(13)->bunches() ) {
93  bccd->m_beam1.set(pos);
94  }
95  for (const auto& pos : bgs->getBunchGroup(14)->bunches() ) {
96  bccd->m_beam2.set(pos);
97  }
98  }
99  // find trains
100  bccd->m_trains=findTrains(bccd->m_luminous, m_maxBunchSpacing,m_minBunchesPerTrain);
101  // we will only trust the validity for 1 LB but that's OK
102  const auto& thisevt = ctx.eventID();
103  EventIDRange range = EventIDRange(EventIDBase(thisevt.run_number(), EventIDBase::UNDEFEVT,
104  EventIDBase::UNDEFNUM, 0, thisevt.lumi_block()),
105  EventIDBase(thisevt.run_number(), EventIDBase::UNDEFEVT,
106  EventIDBase::UNDEFNUM, 0, thisevt.lumi_block()+1));
107  writeHdl.addDependency(range);
108  }
109 
110  if (m_mode == 3) { // use luminosity data
112  writeHdl.addDependency(prefLumiHdl);
113 
114  // consider BCID filled if mu < 1000*average mu
115  float avMu = prefLumiHdl->lbAverageInteractionsPerCrossing();
116  const auto& lumiVec = prefLumiHdl->lbLuminosityPerBCIDVector();
117  float cutLumi = avMu/1000.f*prefLumiHdl->muToLumi();
118 
119  for (size_t bcid = 0; bcid < LuminosityCondData::TOTAL_LHC_BCIDS; ++bcid ) {
120  if (lumiVec[bcid] > cutLumi) {
121  bccd->m_beam1.set(bcid);
122  bccd->m_beam2.set(bcid);
123  bccd->m_luminous.set(bcid);
124  }
125  }
126  // find trains
127  bccd->m_trains=findTrains(bccd->m_luminous, m_maxBunchSpacing,m_minBunchesPerTrain);
128  }
129 
130  if (m_mode == 0 || m_mode == 1) { // use FILLPARAMS (data) or /Digitization/Parameters (MC)
131 
133  writeHdl.addDependency(fillParamsHdl);
134 
135  const AthenaAttributeList* attrList=*fillParamsHdl;
136 
137 
138  if (m_mode == 1) {
139  ATH_MSG_INFO("Assuming MC case");
140  ATH_MSG_INFO("Got AttributeList with size " << attrList->size());
141  std::string sbunches;
142  try {
143  const coral::Attribute& attr=(*attrList)[std::string("BeamIntensityPattern")];
144  if (attr.isNull()) {
145  ATH_MSG_ERROR("Got NULL attribute for BeamIntensityPattern");
146  return StatusCode::FAILURE;
147  }
148  sbunches = attr.data< std::string >();
149  } catch (coral::AttributeListException& e) {
150  ATH_MSG_ERROR(e.what());
151  ATH_MSG_ERROR("Failed to get Attribute 'BeamIntensityPattern' from AttributeList in " << m_fillParamsFolderKey);
152  return StatusCode::FAILURE;
153  }
154 
155  const float minBunchIntensity=0.001;
156  std::vector<float> bunches=tokenize(sbunches);
157  if (!bunches.empty()) {
158  // Check if the pattern "fits into" the LHC:
159  if( BunchCrossingCondData::m_MAX_BCID % bunches.size() ) {
160 
161  ATH_MSG_INFO( "Bunch pattern doesn't \"fit into\" " << BunchCrossingCondData::m_MAX_BCID );
162  // The loop doesn't go all the way up to MAX_BCID/2 in order not to produce "weird"
163  // patterns half way. This should be pretty safe to do, because the MC BCIDs will
164  // only be in the range defined by the pattern from the metadata.
165  for( int i = 0; i < ( BunchCrossingCondData::m_MAX_BCID / 2 - 20 ); ++i ) {
166  const int pos1 = i % bunches.size();
167  const int pos2 = bunches.size() - 1 - ( i % bunches.size() );
168  if( bunches[ pos1 ] > minBunchIntensity) {
169  bccd->m_beam1.set(i);
170  bccd->m_beam2.set(i);
171  bccd->m_luminous.set(i);
172  }
173  if( bunches[ pos2 ] > minBunchIntensity) {
174  bccd->m_beam1.set(BunchCrossingCondData::m_MAX_BCID - 1 -i);
175  bccd->m_beam2.set(BunchCrossingCondData::m_MAX_BCID - 1 -i);
176  bccd->m_luminous.set(BunchCrossingCondData::m_MAX_BCID - 1 -i);
177  }
178  }
179 
180  } else {
181  // If the sample size fits into the number of available bunches, the algorithm
182  // is pretty simple:
183  ATH_MSG_INFO( "Bunch pattern \"fits into\" " << BunchCrossingCondData::m_MAX_BCID );
184  for( int i = 0; i < BunchCrossingCondData::m_MAX_BCID; ++i ) {
185  const int pos = i % bunches.size();
186  if( bunches[ pos ] > minBunchIntensity) {
187  bccd->m_beam1.set(i);
188  bccd->m_beam2.set(i);
189  bccd->m_luminous.set(i);
190  }
191  }
192  }
193  //Filled bcid-bitsets, now extract trains:
194  bccd->m_trains=findTrains(bccd->m_luminous, m_maxBunchSpacing,m_minBunchesPerTrain);
195  }
196  else {//got no bunches from metadata
197  ATH_MSG_INFO("Bunch structure information not found in metadata");
198  ATH_MSG_INFO("Will consider all BCIDs as single filled bunches (no trains)");
199  bccd->m_beam1.set();
200  bccd->m_beam2.set();
201  bccd->m_luminous.set();
202  }
203  }
204  else { // mode == 0, Data-case
205  if ((*attrList)["BCIDmasks"].isNull()) {
206  ATH_MSG_ERROR( "BunchCode is NULL in " << m_fillParamsFolderKey.key() << "!" );
207  return StatusCode::FAILURE;
208  }
209 
210 
211  // Do everything here for now, but should copy this to a vanilla object based on attrList
212  cool::UInt32 nb1 = (*attrList)["Beam1Bunches"].data<cool::UInt32>();
213  cool::UInt32 nb2 = (*attrList)["Beam2Bunches"].data<cool::UInt32>();
214  cool::UInt32 ncol = (*attrList)["LuminousBunches"].data<cool::UInt32>();
215 
216  ATH_MSG_DEBUG( "Beam1Bunches: " << nb1 );
217  ATH_MSG_DEBUG( "Beam2Bunches: " << nb2 );
218  ATH_MSG_DEBUG( "LuminousBunches: " << ncol );
219 
220  const coral::Blob& blob = (*attrList)["BCIDmasks"].data<coral::Blob>();
221 
222  if (m_isRun1) { //Assume run1 layout as explained at https://twiki.cern.ch/twiki/bin/view/AtlasComputing/CoolOnlineData
223  ATH_MSG_DEBUG("Assuming run 1 database");
224  // Verify length
225  if ( static_cast<cool::UInt32>( blob.size() ) != 2 * (nb1 + nb2 + ncol)) {
226  ATH_MSG_WARNING( "BCIDmasks length " << blob.size() << " != 2 * " << (nb1+nb2+ncol) );
227  return StatusCode::SUCCESS;
228  }
229  const uint16_t* blobAddr=static_cast<const uint16_t*>(blob.startingAddress());
230  //Decode beam1 filling:
231  for (size_t idx=0;idx<nb1;++idx) {
232  const uint32_t bcid=blobAddr[idx];
233  bccd->m_beam1.set(bcid);
234  }
235 
236  //Decode beam2 filling:
237  for (size_t idx=nb1;idx<nb2;++idx) {
238  const uint32_t bcid=blobAddr[idx];
239  bccd->m_beam2.set(bcid);
240  }
241 
242  //Decode colliding:
243  for (size_t idx=nb2;idx<ncol;++idx) {
244  const uint32_t bcid=blobAddr[idx];
245  bccd->m_luminous.set(bcid);
246  }
247  }
248  else {
249  ATH_MSG_DEBUG("Assuming run 2/3 database");
250  //Assume run2 layout as explained at https://twiki.cern.ch/twiki/bin/view/AtlasComputing/CoolOnlineData
251  //Verify length
253  ATH_MSG_ERROR("Found blob with unexpected length " << blob.size() << "(expect " << BunchCrossingCondData::m_MAX_BCID <<") in folder " << m_fillParamsFolderKey.key());
254  return StatusCode::FAILURE;
255  }
256  const uint8_t* blobAddr=static_cast<const uint8_t*>(blob.startingAddress());
258  if (blobAddr[bcid] & 0x1) {
259  bccd->m_beam1.set(bcid);
260  }
261  if (blobAddr[bcid] & 0x2) {
262  bccd->m_beam2.set(bcid);
263  }
264  if ((blobAddr[bcid] & 0x3) == 0x3) {
265  bccd->m_luminous.set(bcid);
266  }
267  }
268 
269  //Consistency checks:
270  if (bccd->m_beam1.count()!= nb1) {
271  ATH_MSG_WARNING("Found " << bccd->m_beam1.count() << " bunches in beam1, expected " << nb1);
272  }
273 
274  if (bccd->m_beam2.count()!= nb2) {
275  ATH_MSG_WARNING("Found " << bccd->m_beam2.count() << " bunches in beam2, expected " << nb2);
276  }
277 
278  if (bccd->m_luminous.count()!= ncol) {
279  ATH_MSG_WARNING("Found " << bccd->m_luminous.count() << " colliding bunches, expected " << ncol);
280  }
281  }//end else run2
282  //Filled bcid-bitsets, now extract trains
283  bccd->m_trains=findTrains(bccd->m_luminous, m_maxBunchSpacing,m_minBunchesPerTrain);
284  }//end else is data
285  }
286 
287  ATH_CHECK( writeHdl.record (std::move (bccd)) );
288  return StatusCode::SUCCESS;
289 }
290 
291 
292 std::vector<BunchCrossingCondData::bunchTrain_t> BunchCrossingCondAlg::findTrains(const std::bitset< BunchCrossingCondData::m_MAX_BCID>& collidingBCIDs, const int maxSpacingInTrain, const unsigned minBunchesPerTrain) const {
293 
294  const int MAX_BCID=collidingBCIDs.size();
295  std::vector<bunchTrain_t> result;
296 
297  std::vector<std::pair<int,int> > holes;
298  int start=0;
299  int stop=0;
300 
301  while (stop<MAX_BCID) { //Outer loop, over holes
302  for (start=stop;stop<MAX_BCID && !collidingBCIDs.test(stop); ++stop) {};//Count consecutive holes
303  //stop points now to the next filled bcid (or MAX)
304  if ((stop-start)>maxSpacingInTrain) {
305  holes.emplace_back(start,stop);
306  }//end if >maxSpacingInTrain
307  ++stop;
308  }//end outer loop
309 
310 
311  ATH_MSG_DEBUG("Found " << holes.size() << " gaps larger than " << maxSpacingInTrain << " in the bunch structure");
312  if (msgLvl(MSG::VERBOSE)) {
313  for (auto& h : holes) {
314  msg(MSG::VERBOSE) << "Hole: " << h.first << " - " << h.second << endmsg;
315  }
316  }
317 
318 
319  if (holes.empty()) {
320  ATH_MSG_ERROR("Looks like we have bunch train spanning the entire ring w/o any gap. Really?");
321  return result;
322  }
323 
324 
325  if (holes.size()>1) {
326  //generic case of having at least 2 gaps int the bunch structure
327  for (unsigned i=0;i<holes.size()-1;++i) {
328  //Count colliding bunches in this train:
329  unsigned ncoll=0;
330  for (int idx=holes[i].second;idx<holes[i+1].first-1;++idx) {
331  if (collidingBCIDs.test(idx)) {
332  ++ncoll;
333  }
334  }
335  result.emplace_back(holes[i].second,holes[i+1].first-1,ncoll);
336  }
337  }
338 
339  if (holes.size()==1 || (holes.front().first!=0 && holes.back().second!=MAX_BCID-1)) {
340  //Special case of only one hole and/or first/last BCIDs populated (train across the wrap-around)
341 
342  //To simplify the distanceToFront and distanceToTail methods we duplicate this train
343  //Once as first train wiht a starting point in the negative range, and
344  //once as last train with a ending point beyond MAX_BCID
345 
346  //Count the number of collisions in this train:
347  unsigned ncoll=0;
348  for (int idx=0;idx<holes.front().first;++idx) {
349  if (collidingBCIDs.test(idx)) {
350  ++ncoll;
351  }
352  }
353  for (int idx=holes.back().second;idx<MAX_BCID;++idx) {
354  if (collidingBCIDs.test(idx)) {
355  ++ncoll;
356  }
357  }
358 
359  BunchCrossingCondData::bunchTrain_t firsttrain(holes.back().second-MAX_BCID, holes.front().first-1,ncoll);
360  BunchCrossingCondData::bunchTrain_t lasttrain(holes.back().second,MAX_BCID+holes.front().first-1,ncoll);
361  result.insert(result.begin(),firsttrain);
362  result.push_back(lasttrain);
363  }//end if wrap-around populated
364 
365 
366  ATH_MSG_DEBUG("Found " << result.size() << " Bunch trains separated by gaps of at least " << maxSpacingInTrain << " bcids ");
367 
368  //copy the vector, cleaning out trains with too few colliding bunches
369  std::vector<bunchTrain_t> result1;
370  result1.reserve(result.size());
371  for (const bunchTrain_t& train: result) {
372  if (train.m_nColl >= minBunchesPerTrain) {
373  result1.emplace_back(train);
374  }
375  }
376 
377  ATH_MSG_INFO("Found " << result1.size() << " Bunch trains having at least " << minBunchesPerTrain << " colliding bunches and separated by at least " << maxSpacingInTrain << " bcids");
378 
379 
380  if (msgLvl(MSG::VERBOSE)) {
381  for (auto& r : result1) {
382  msg(MSG::VERBOSE) << "Train " << r.m_first << " - " << r.m_last << ", " << r.m_nColl << " colliding bcids" << endmsg;
383  }
384  }
385 
386  return result1;
387 }
388 
389 
398 std::vector<float> BunchCrossingCondAlg::tokenize( const std::string& pattern ) const {
399  ATH_MSG_VERBOSE("Input to tokenize: " << pattern);
400 
401  std::vector< float > result;
402  const char* c= pattern.data();
403  const char* cEnd= c + pattern.size();
404  while(c<cEnd) {
405  //This loop swallows actually any string containing numbers
406  //separated by non-numbers
407  char* end;
408  float f=std::strtof(c,&end);
409  if (c==end) {//Can't convert, try next
410  c++;
411  }
412  else { //got a value
413  result.push_back(f);
414  c=end;
415  }
416  }//end while loop
417  return result;
418 }
mergePhysValFiles.pattern
pattern
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:26
beamspotman.r
def r
Definition: beamspotman.py:676
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:216
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
BunchCrossingCondAlg::tokenize
std::vector< float > tokenize(const std::string &pattern) const
This helper function is used to convert a string of type "[0.0, 0.0, 1.0, 1.0, 1.0]" into a vector of...
Definition: BunchCrossingCondAlg.cxx:398
get_generator_info.result
result
Definition: get_generator_info.py:21
max
#define max(a, b)
Definition: cfImp.cxx:41
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:575
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
BunchCrossingCondAlg::m_trigConfigSvc
const ServiceHandle< TrigConf::ILVL1ConfigSvc > m_trigConfigSvc
Definition: BunchCrossingCondAlg.h:56
BunchCrossingCondAlg::m_minBunchesPerTrain
Gaudi::Property< unsigned > m_minBunchesPerTrain
Definition: BunchCrossingCondAlg.h:64
InDetDD::holes
@ holes
Definition: InDetDD_Defs.h:17
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:14
plotBeamSpotCompare.x2
x2
Definition: plotBeamSpotCompare.py:218
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:205
AthCommonMsg< Gaudi::Algorithm >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
python.subdetectors.tile.Blob
Blob
Definition: tile.py:17
PixelModuleFeMask_create_db.stop
int stop
Definition: PixelModuleFeMask_create_db.py:76
LuminosityCondData::TOTAL_LHC_BCIDS
static constexpr unsigned int TOTAL_LHC_BCIDS
Definition: LuminosityCondData.h:27
BunchCrossingCondAlg::m_bunchGroupCondDataKey
SG::ReadCondHandleKey< TrigConf::L1BunchGroupSet > m_bunchGroupCondDataKey
Definition: BunchCrossingCondAlg.h:51
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
SG::WriteCondHandle::record
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
Definition: WriteCondHandle.h:157
ReadCondHandle.h
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
BunchCrossingCondAlg::m_isRun1
Gaudi::Property< bool > m_isRun1
Definition: BunchCrossingCondAlg.h:65
BunchCrossingCondData::m_MAX_BCID
static constexpr int m_MAX_BCID
Definition: BunchCrossingCondData.h:28
BunchCrossingCondAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Algorithm execute method.
Definition: BunchCrossingCondAlg.cxx:49
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
BunchCrossingCondAlg::findTrains
std::vector< bunchTrain_t > findTrains(const std::bitset< BunchCrossingCondData::m_MAX_BCID > &pairsToConsume, const int maxSpacingInTrain, const unsigned minBunchesPerTrain) const
internal methods:
Definition: BunchCrossingCondAlg.cxx:292
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
lumiFormat.i
int i
Definition: lumiFormat.py:92
BunchCrossingCondAlg::m_outputKey
SG::WriteCondHandleKey< BunchCrossingCondData > m_outputKey
Output conditions object.
Definition: BunchCrossingCondAlg.h:53
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
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
WriteCondHandle.h
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
BunchCrossingCondAlg::initialize
virtual StatusCode initialize() override
Gaudi initialize method.
Definition: BunchCrossingCondAlg.cxx:37
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AthenaAttributeList
An AttributeList represents a logical row of attributes in a metadata table. The name and type of eac...
Definition: PersistentDataModel/PersistentDataModel/AthenaAttributeList.h:45
TrigConf::L1BunchGroupSet
L1 board configuration.
Definition: L1BunchGroupSet.h:71
BunchCrossingCondAlg::m_fillParamsFolderKey
SG::ReadCondHandleKey< AthenaAttributeList > m_fillParamsFolderKey
Input conditions object.
Definition: BunchCrossingCondAlg.h:49
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
xAOD::bcid
setEventNumber setTimeStamp bcid
Definition: EventInfo_v1.cxx:133
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
BunchCrossingCondAlg::m_lumiCondDataKey
SG::ReadCondHandleKey< LuminosityCondData > m_lumiCondDataKey
Definition: BunchCrossingCondAlg.h:50
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
BunchCrossingCondAlg.h
Conditions algorithm to fill BunchCrossingCondData.
h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
AsgConfigHelper::strtof
bool strtof(const std::string &input, T &f)
Definition: AsgEGammaConfigHelper.cxx:47
DeMoScan.first
bool first
Definition: DeMoScan.py:534
AthCommonMsg< Gaudi::Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
xAOD::collidingBCIDs
collidingBCIDs
Definition: BunchConf_v1.cxx:28
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
SG::WriteCondHandle::isValid
bool isValid() const
Definition: WriteCondHandle.h:248
BunchCrossingCondAlg::m_maxBunchSpacing
Gaudi::Property< unsigned > m_maxBunchSpacing
Definition: BunchCrossingCondAlg.h:63
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
BunchCrossingCondAlg::m_mode
Gaudi::Property< int > m_mode
Definition: BunchCrossingCondAlg.h:66
python.compressB64.c
def c
Definition: compressB64.py:93
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
CaloCondBlobAlgs_fillNoiseFromASCII.blob
blob
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:96
SG::WriteCondHandle::addDependency
void addDependency(const EventIDRange &range)
Definition: WriteCondHandle.h:275
BunchCrossingCondData::bunchTrain_t
Definition: BunchCrossingCondData.h:315