ATLAS Offline Software
Loading...
Searching...
No Matches
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>
15#include "CoralBase/AttributeListException.h"
16
17
18namespace {
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
33 std::numeric_limits<int>::max() - 1, // ns
34 std::numeric_limits<int>::max() - 1 // LB
35 );
36 }
37
38}
39
41
42
43 ATH_CHECK( m_fillParamsFolderKey.initialize( m_mode == 0 || m_mode == 1 ) );
44 ATH_CHECK( m_lumiCondDataKey.initialize( m_mode == 3 ) );
45 ATH_CHECK( m_outputKey.initialize() );
46 return StatusCode::SUCCESS;
47}
48
49
50StatusCode 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
241std::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}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
Conditions algorithm to fill BunchCrossingAverageCondData.
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
Gaudi::Property< unsigned long > m_fBCT
std::vector< float > tokenize(const std::string &pattern) const
internal methods:
SG::ReadCondHandleKey< LuminosityCondData > m_lumiCondDataKey
SG::ReadCondHandleKey< CondAttrListCollection > m_fillParamsFolderKey
Input conditions object.
virtual StatusCode execute(const EventContext &ctx) const override
Algorithm execute method.
Gaudi::Property< unsigned long > m_DCCT24
Gaudi::Property< unsigned long > m_DCCT
Gaudi::Property< unsigned long > m_BPTX
SG::WriteCondHandleKey< BunchCrossingAverageCondData > m_outputKey
Output conditions object.
virtual StatusCode initialize() override
Gaudi initialize method.
This class is a collection of AttributeLists where each one is associated with a channel number.
const AttributeList & attributeList(ChanNum chanNum) const
attribute list for a given channel number
void addDependency(const EventIDRange &range)
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
Read little-endian values through possibly unaligned pointers.
int lb
Definition globals.cxx:23
Definition run.py:1