ATLAS Offline Software
BunchCrossingAverageCondAlg.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 #include "CoolKernel/IObject.h"
7 #include "CoralBase/Blob.h"
10 #include <charconv>
11 #include <cstdint>
12 #include <bitset>
13 #include "CxxUtils/get_unaligned.h"
15 #include "CoralBase/AttributeListException.h"
16 
17 
18 namespace {
19  // helper to set timestamp based IOV with infinit range
20  EventIDBase infiniteIOVBegin() {
21  return EventIDBase( 0, // run,
22  EventIDBase::UNDEFEVT, // event
23  0, // seconds
24  0, // ns
25  0 // LB
26  );
27  }
28 
29  EventIDBase infiniteIOVEend() {
30  return EventIDBase( std::numeric_limits<int>::max() - 1, // run
31  EventIDBase::UNDEFEVT, // event
32  std::numeric_limits<int>::max() - 1, // seconds
35  );
36  }
37 
38 }
39 
41 
42 
46  return StatusCode::SUCCESS;
47 }
48 
49 
50 StatusCode BunchCrossingAverageCondAlg::execute (const EventContext& ctx) const {
52  if (writeHdl.isValid()) {
53 
54  ATH_MSG_DEBUG("Found valid write handle");
55  return StatusCode::SUCCESS;
56  }
57  // make sure that the output IOV has a valid timestamp, otherwise the conditions
58  // data cannot be added to the "mixed" conditions data container. A mixed container
59  // is needed when the conditions depends on e.g. the LuminosityCondData
60  EventIDRange infinite_range(infiniteIOVBegin(),infiniteIOVEend());
61  writeHdl.addDependency(infinite_range);
62 
63  //Output object & range:
64  auto bccd=std::make_unique<BunchCrossingAverageCondData>();
65 
66 
67  if (m_mode == 2) { // use trigger bunch groups
68  // To be filled
69  }
70 
71  if (m_mode == 3) { // use luminosity data
72  // To be filled
73  }
74 
75  if (m_mode == 0 || m_mode == 1) { // use FILLPARAMS (data) or /Digitization/Parameters (MC)
76 
77 
78 
80  writeHdl.addDependency(fillParamsHdl);
81 
82 
83  const CondAttrListCollection* attrList_link=*fillParamsHdl;
84  const coral::AttributeList& attrList = attrList_link->attributeList (m_BPTX);
85 
86 
87  if (attrList.size() == 0 || attrList["Valid"].isNull()) {
88  ATH_MSG_DEBUG ("Can't find information for channel " << m_BPTX);
89  return StatusCode::SUCCESS;
90  }
91 
92  const coral::AttributeList& attrList_fBCT = attrList_link->attributeList (m_fBCT);
93 
94  if (attrList_fBCT.size() == 0 || attrList_fBCT["Valid"].isNull()) {
95  ATH_MSG_DEBUG ("Can't find information for channel " << m_fBCT);
96  return StatusCode::SUCCESS;
97  }
98 
99  const coral::AttributeList& attrList_DCCT = attrList_link->attributeList (m_DCCT);
100 
101  if (attrList_DCCT.size() == 0 || attrList_DCCT["Valid"].isNull()) {
102  ATH_MSG_DEBUG ("Can't find information for channel " << m_DCCT);
103  return StatusCode::SUCCESS;
104  }
105 
106  const coral::AttributeList& attrList_DCCT24 = attrList_link->attributeList (m_DCCT24);
107 
108  if (attrList_DCCT24.size() == 0 || attrList_DCCT24["Valid"].isNull()) {
109  ATH_MSG_DEBUG ("Can't find information for channel " << m_DCCT24);
110  return StatusCode::SUCCESS;
111  }
112 
113  // const auto& thisevt = ctx.eventID();
114 
115  if (m_mode == 1) {
116  ATH_MSG_INFO("Assuming MC case");
117  ATH_MSG_INFO("Got AttributeList with size " << attrList.size());
118  ATH_MSG_INFO("Got AttributeList fBCT with size " << attrList_fBCT.size());
119  ATH_MSG_INFO("Got AttributeList DCCT with size " << attrList_DCCT.size());
120  ATH_MSG_INFO("Got AttributeList DCCT24 with size " << attrList_DCCT24.size());
121 
122  }
123  else { // mode == 0, Data-case
124 
125  float nb1 = attrList["Beam1Intensity"].data<cool::Float>();
126  float nb2 = attrList["Beam2Intensity"].data<cool::Float>();
127  float nb1_fBCT = attrList_fBCT["Beam1Intensity"].data<cool::Float>();
128  float nb2_fBCT = attrList_fBCT["Beam2Intensity"].data<cool::Float>();
129  float nb1_DCCT = attrList_DCCT["Beam1Intensity"].data<cool::Float>();
130  float nb2_DCCT = attrList_DCCT["Beam2Intensity"].data<cool::Float>();
131  float nb1_DCCT24 = attrList_DCCT24["Beam1Intensity"].data<cool::Float>();
132  float nb2_DCCT24 = attrList_DCCT24["Beam2Intensity"].data<cool::Float>();
133 
134  float nb1All = attrList["Beam1IntensityAll"].data<cool::Float>();
135  float nb2All = attrList["Beam2IntensityAll"].data<cool::Float>();
136  float nb1All_fBCT = attrList_fBCT["Beam1IntensityAll"].data<cool::Float>();
137  float nb2All_fBCT = attrList_fBCT["Beam2IntensityAll"].data<cool::Float>();
138  float nb1All_DCCT = attrList_DCCT["Beam1IntensityAll"].data<cool::Float>();
139  float nb2All_DCCT = attrList_DCCT["Beam2IntensityAll"].data<cool::Float>();
140  float nb1All_DCCT24 = attrList_DCCT24["Beam1IntensityAll"].data<cool::Float>();
141  float nb2All_DCCT24 = attrList_DCCT24["Beam2IntensityAll"].data<cool::Float>();
142 
143  float enb1 = attrList["Beam1IntensityStd"].data<cool::Float>();
144  float enb2 = attrList["Beam2IntensityStd"].data<cool::Float>();
145  float enb1_fBCT = attrList_fBCT["Beam1IntensityStd"].data<cool::Float>();
146  float enb2_fBCT = attrList_fBCT["Beam2IntensityStd"].data<cool::Float>();
147  float enb1_DCCT = attrList_DCCT["Beam1IntensityStd"].data<cool::Float>();
148  float enb2_DCCT = attrList_DCCT["Beam2IntensityStd"].data<cool::Float>();
149  float enb1_DCCT24 = attrList_DCCT24["Beam1IntensityStd"].data<cool::Float>();
150  float enb2_DCCT24 = attrList_DCCT24["Beam2IntensityStd"].data<cool::Float>();
151 
152  float enb1All = attrList["Beam1IntensityAllStd"].data<cool::Float>();
153  float enb2All = attrList["Beam2IntensityAllStd"].data<cool::Float>();
154  float enb1All_fBCT = attrList_fBCT["Beam1IntensityAllStd"].data<cool::Float>();
155  float enb2All_fBCT = attrList_fBCT["Beam2IntensityAllStd"].data<cool::Float>();
156  float enb1All_DCCT = attrList_DCCT["Beam1IntensityAllStd"].data<cool::Float>();
157  float enb2All_DCCT = attrList_DCCT["Beam2IntensityAllStd"].data<cool::Float>();
158  float enb1All_DCCT24 = attrList_DCCT24["Beam1IntensityAllStd"].data<cool::Float>();
159  float enb2All_DCCT24 = attrList_DCCT24["Beam2IntensityAllStd"].data<cool::Float>();
160 
161  unsigned long long RunLB = attrList["RunLB"].data<unsigned long long >();
162 
163  int run = RunLB>>32;
164  int lb = RunLB & 0xffffffff;
165 
166  ATH_MSG_DEBUG( "Beam1Intensity: " << nb1 );
167  ATH_MSG_DEBUG( "Beam2Intensity: " << nb2 );
168  ATH_MSG_DEBUG( "Beam1Intensity (fBCT): " << nb1_fBCT );
169  ATH_MSG_DEBUG( "Beam2Intensity (fBCT): " << nb2_fBCT );
170  ATH_MSG_DEBUG( "Beam1Intensity (DCCT): " << nb1_DCCT );
171  ATH_MSG_DEBUG( "Beam2Intensity (DCCT): " << nb2_DCCT );
172  ATH_MSG_DEBUG( "Beam1Intensity (DCCT24): " << nb1_DCCT24 );
173  ATH_MSG_DEBUG( "Beam2Intensity (DCCT24): " << nb2_DCCT24 );
174  ATH_MSG_DEBUG( "Run: " << run );
175  ATH_MSG_DEBUG( "LB: " << lb );
176 
177  if (m_isRun1) { //Assume run1 layout as explained at https://twiki.cern.ch/twiki/bin/view/AtlasComputing/CoolOnlineData
178  ATH_MSG_DEBUG("Assuming run 1 database");
179 
180  }
181  else {
182  bccd->SetRunLB(RunLB);
183 
184  bccd->SetBeam1Intensity(nb1,0);
185  bccd->SetBeam2Intensity(nb2,0);
186  bccd->SetBeam1Intensity(nb1_fBCT,1);
187  bccd->SetBeam2Intensity(nb2_fBCT,1);
188  bccd->SetBeam1Intensity(nb1_DCCT,2);
189  bccd->SetBeam2Intensity(nb2_DCCT,2);
190  bccd->SetBeam1Intensity(nb1_DCCT24,3);
191  bccd->SetBeam2Intensity(nb2_DCCT24,3);
192 
193  bccd->SetBeam1IntensityAll(nb1All,0);
194  bccd->SetBeam2IntensityAll(nb2All,0);
195  bccd->SetBeam1IntensityAll(nb1All_fBCT,1);
196  bccd->SetBeam2IntensityAll(nb2All_fBCT,1);
197  bccd->SetBeam1IntensityAll(nb1All_DCCT,2);
198  bccd->SetBeam2IntensityAll(nb2All_DCCT,2);
199  bccd->SetBeam1IntensityAll(nb1All_DCCT24,3);
200  bccd->SetBeam2IntensityAll(nb2All_DCCT24,3);
201 
202  bccd->SetBeam1IntensitySTD(enb1,0);
203  bccd->SetBeam2IntensitySTD(enb2,0);
204  bccd->SetBeam1IntensitySTD(enb1_fBCT,1);
205  bccd->SetBeam2IntensitySTD(enb2_fBCT,1);
206  bccd->SetBeam1IntensitySTD(enb1_DCCT,2);
207  bccd->SetBeam2IntensitySTD(enb2_DCCT,2);
208  bccd->SetBeam1IntensitySTD(enb1_DCCT24,3);
209  bccd->SetBeam2IntensitySTD(enb2_DCCT24,3);
210 
211  bccd->SetBeam1IntensityAllSTD(enb1All,0);
212  bccd->SetBeam2IntensityAllSTD(enb2All,0);
213  bccd->SetBeam1IntensityAllSTD(enb1All_fBCT,1);
214  bccd->SetBeam2IntensityAllSTD(enb2All_fBCT,1);
215  bccd->SetBeam1IntensityAllSTD(enb1All_DCCT,2);
216  bccd->SetBeam2IntensityAllSTD(enb2All_DCCT,2);
217  bccd->SetBeam1IntensityAllSTD(enb1All_DCCT24,3);
218  bccd->SetBeam2IntensityAllSTD(enb2All_DCCT24,3);
219 
220 
221 
222  }//end else run2
223  //Filled bcid-bitsets, now extract trains
224  // bccd->m_trains=findTrains(bccd->m_luminous, m_maxBunchSpacing,m_minBunchesPerTrain);
225  }//end else is data
226  }
227 
228  ATH_CHECK( writeHdl.record (std::move (bccd)) );
229  return StatusCode::SUCCESS;
230 }
231 
232 
241 std::vector<float> BunchCrossingAverageCondAlg::tokenize( const std::string& pattern ) const {
242  ATH_MSG_VERBOSE("Input to tokenize: " << pattern);
243 
244  std::vector< float > result;
245  const char* c= pattern.data();
246  const char* cEnd= c + pattern.size();
247  while(c<cEnd) {
248  //This loop swallows actually any string containing numbers
249  //separated by non-numbers
250  char* end;
251  float f=std::strtof(c,&end);
252  if (c==end) {//Can't convert, try next
253  c++;
254  }
255  else { //got a value
256  result.push_back(f);
257  c=end;
258  }
259  }//end while loop
260  return result;
261 }
BunchCrossingAverageCondAlg::m_outputKey
SG::WriteCondHandleKey< BunchCrossingAverageCondData > m_outputKey
Output conditions object.
Definition: BunchCrossingAverageCondAlg.h:54
mergePhysValFiles.pattern
pattern
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:26
get_generator_info.result
result
Definition: get_generator_info.py:21
CondAttrListCollection.h
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
BunchCrossingAverageCondAlg::tokenize
std::vector< float > tokenize(const std::string &pattern) const
internal methods:
Definition: BunchCrossingAverageCondAlg.cxx:241
BunchCrossingAverageCondAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Algorithm execute method.
Definition: BunchCrossingAverageCondAlg.cxx:50
python.PyKernel.AttributeList
AttributeList
Definition: PyKernel.py:36
BunchCrossingAverageCondAlg::m_DCCT
Gaudi::Property< unsigned long > m_DCCT
Definition: BunchCrossingAverageCondAlg.h:64
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::WriteCondHandle::record
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
Definition: WriteCondHandle.h:157
CondAttrListCollection
This class is a collection of AttributeLists where each one is associated with a channel number....
Definition: CondAttrListCollection.h:52
ReadCondHandle.h
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
BunchCrossingAverageCondAlg.h
Conditions algorithm to fill BunchCrossingAverageCondData.
python.BunchSpacingUtils.lb
lb
Definition: BunchSpacingUtils.py:88
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
BunchCrossingAverageCondAlg::m_mode
Gaudi::Property< int > m_mode
Definition: BunchCrossingAverageCondAlg.h:71
BunchCrossingAverageCondAlg::m_fillParamsFolderKey
SG::ReadCondHandleKey< CondAttrListCollection > m_fillParamsFolderKey
Input conditions object.
Definition: BunchCrossingAverageCondAlg.h:50
WriteCondHandle.h
BunchCrossingAverageCondAlg::m_lumiCondDataKey
SG::ReadCondHandleKey< LuminosityCondData > m_lumiCondDataKey
Definition: BunchCrossingAverageCondAlg.h:51
BunchCrossingAverageCondAlg::m_BPTX
Gaudi::Property< unsigned long > m_BPTX
Definition: BunchCrossingAverageCondAlg.h:62
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
hist_file_dump.f
f
Definition: hist_file_dump.py:135
run
Definition: run.py:1
CondAttrListCollection::attributeList
const AttributeList & attributeList(ChanNum chanNum) const
attribute list for a given channel number
Definition: CondAttrListCollection.h:401
get_unaligned.h
Read little-endian values through possibly unaligned pointers.
BunchCrossingAverageCondAlg::m_DCCT24
Gaudi::Property< unsigned long > m_DCCT24
Definition: BunchCrossingAverageCondAlg.h:65
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
BunchCrossingAverageCondAlg::m_fBCT
Gaudi::Property< unsigned long > m_fBCT
Definition: BunchCrossingAverageCondAlg.h:63
BunchCrossingAverageCondAlg::initialize
virtual StatusCode initialize() override
Gaudi initialize method.
Definition: BunchCrossingAverageCondAlg.cxx:40
BunchCrossingAverageCondAlg::m_isRun1
Gaudi::Property< bool > m_isRun1
Definition: BunchCrossingAverageCondAlg.h:70
AsgConfigHelper::strtof
bool strtof(const std::string &input, T &f)
Definition: AsgEGammaConfigHelper.cxx:47
SG::WriteCondHandle::isValid
bool isValid() const
Definition: WriteCondHandle.h:248
python.compressB64.c
def c
Definition: compressB64.py:93
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
SG::WriteCondHandle::addDependency
void addDependency(const EventIDRange &range)
Definition: WriteCondHandle.h:275