67 {
68
69
71
72 auto start = std::chrono::system_clock::now();
73 std::unique_ptr<TFile> tf(TFile::Open(filename));
74 if (!tf || tf->IsZombie()) {
75 std::cerr <<
"Failed to open file " <<
filename << std::endl;
76 return;
77 }
78 auto stop = std::chrono::system_clock::now();
79
80 if (vbs) std::cout << "Time to open input file: " << std::chrono::duration_cast<std::chrono::milliseconds>(stop-start).count() << " msec" << std::endl;
81
82
83 TTree* md=(TTree*)tf->Get("MetaData");
84
85 if (!md) return;
86
87 std::pair<bool,EventStreamInfo_p3*> esi{false,nullptr};
88 std::pair<bool,EventStreamInfo_p2*> esi2{false,nullptr};
89 std::pair<bool,IOVMetaDataContainer_p1*> taginfo{false,nullptr};
90 std::pair<bool,IOVMetaDataContainer_p1*> genparam{false,nullptr};
91 std::pair<bool,IOVMetaDataContainer_p1*> simparam{false,nullptr};
92 std::pair<bool,IOVMetaDataContainer_p1*> digiparam{false,nullptr};
93#ifndef SIMULATIONBASE
94 std::pair<bool,ByteStreamMetadataContainer_p1*> bmdc{false,nullptr};
95#endif
96 TObjArray* mdBranches=md->GetListOfBranches();
97 const size_t mdnBranches=mdBranches->GetEntriesFast();
98 for (
size_t i=0;
i<mdnBranches;++
i) {
99 TBranch*
br=(TBranch*)mdBranches->At(i);
100 if (vbs) std::cout <<
"Branch "<<
br->GetName() <<
" of type " <<
br->GetClassName() << std::endl;
101#ifndef SIMULATIONBASE
102 if (
findBranch(br,
"ByteStreamMetadata",
"ByteStreamMetadataContainer_p1",bmdc))
continue;
103#endif
104 if (
findBranch(br,
"_TagInfo",
"IOVMetaDataContainer_p1",taginfo))
continue;
105 if (
findBranch(br,
"_Generation_Parameters",
"IOVMetaDataContainer_p1",genparam))
continue;
106 if (
findBranch(br,
"_Simulation_Parameters",
"IOVMetaDataContainer_p1",simparam))
continue;
107 if (
findBranch(br,
"_Digitization_Parameters",
"IOVMetaDataContainer_p1",digiparam))
continue;
108 if (
findBranch(br,
"Stream",
"EventStreamInfo_p3",esi))
continue;
109 if (
findBranch(br,
"Stream",
"EventStreamInfo_p2",esi2))
continue;
110 }
111
112
113
114 md->GetEntry(0);
115
117
118 if (genparam.first) {
119 if (vbs) std::cout << " Got IOVMetaDataContainer for /Generation/Parameters " << std::endl;
120 for (const auto& idx : genparam.second->m_payload.m_attrIndexes) {
121 const unsigned short nameIdx=
idx.nameIndex();
123 const unsigned short iObj=
idx.objIndex();
124 const std::string objKey=genparam.second->m_payload.m_attrName[nameIdx];
125 const std::string objValue=genparam.second->m_payload.m_string[iObj];
126 if (vbs) std::cout << "Genparam: " << objKey << " : " << objValue << std::endl;
127
128 }
129 }
130 delete genparam.second;
131 genparam.second=nullptr;
132 }
133
134 if (simparam.first) {
135 if (vbs) std::cout << " Got IOVMetaDataContainer for /Simulation/Parameters " << std::endl;
136 for (const auto& idx : simparam.second->m_payload.m_attrIndexes) {
137 const unsigned short nameIdx=
idx.nameIndex();
139 const unsigned short iObj=
idx.objIndex();
140 const std::string objKey=simparam.second->m_payload.m_attrName[nameIdx];
141 const std::string objValue=simparam.second->m_payload.m_string[iObj];
142 if (vbs) std::cout << "Simparam: " << objKey << " : " << objValue << std::endl;
143 if (objKey=="TRTRangeCut") {
144 std::string::size_type
sz;
145 m_fmd.m_trtRangeCut=std::stod(objValue,&
sz);
146 }
147 if (objKey=="beamType") {
148 m_fmd.m_beamType=std::move(objValue);
149 }
150
151 }
152 }
153 delete simparam.second;
154 simparam.second=nullptr;
155 }
156
157 if (digiparam.first) {
158 if (vbs) std::cout << " Got IOVMetaDataContainer for /Digitization/Parameters " << std::endl;
159 for (const auto& idx : digiparam.second->m_payload.m_attrIndexes) {
160 const unsigned short nameIdx=
idx.nameIndex();
162 const unsigned short iObj=
idx.objIndex();
163 const std::string objKey=digiparam.second->m_payload.m_attrName[nameIdx];
164 const std::string objValue=digiparam.second->m_payload.m_string[iObj];
165 if (vbs) std::cout << "Digiparam: " << objKey << " : " << objValue << std::endl;
166 if (objKey=="IOVDbGlobalTag") {
167 m_fmd.m_condTag=objValue;
168 }
169 if (objKey=="DetDescrVersion") {
170 m_fmd.m_geoTag=objValue;
171 }
172 if (objKey=="beamType") {
173 m_fmd.m_beamType=std::move(objValue);
174 }
175
176 }
177 }
178 delete digiparam.second;
179 digiparam.second=nullptr;
180 }
181
182 if (taginfo.first) {
183 if (vbs) std::cout << " Got IOVMetaDataContainer for TagInfo " << std::endl;
184 for (const auto& idx : taginfo.second->m_payload.m_attrIndexes) {
185
186 const unsigned short nameIdx=
idx.nameIndex();
188 const unsigned short iObj=
idx.objIndex();
189 const std::string objKey=taginfo.second->m_payload.m_attrName[nameIdx];
190 const std::string objValue=taginfo.second->m_payload.m_string[iObj];
191 if (vbs) std::cout << "Taginfo: " << objKey << " : " << objValue << std::endl;
192 if (objKey=="IOVDbGlobalTag") {
193 m_fmd.m_condTag=objValue;
194 }
195 if (objKey=="GeoAtlas") {
196 m_fmd.m_geoTag=objValue;
197 }
198 if (objKey=="beam_energy") {
199 m_fmd.m_beamEnergy=
atoi(objValue.c_str());
200 }
201 if (objKey=="beam_type") {
202 m_fmd.m_beamType=std::move(objValue);
203 }
204
205 }
206 }
207 delete taginfo.second;
208 taginfo.second=nullptr;
209 }
210
211 if (esi.first) {
212 if (vbs) std::cout << " Got EventStreamInfo_p3" << std::endl;
213 m_fmd.m_runNumbers.insert(esi.second->m_runNumbers.begin(),
214 esi.second->m_runNumbers.end());
215 m_fmd.m_lbNumbers.insert(esi.second->m_lumiBlockNumbers.begin(),
216 esi.second->m_lumiBlockNumbers.end());
217
218
219
220 const std::vector<std::pair<unsigned int, std::string> >&
itemList=esi.second->m_itemList;
221 for (const auto& kw : itemList) {
222 m_fmd.m_sgKeys.push_back(kw.second);
223 }
224
225 delete esi.second;
226 esi.second=nullptr;
227
228 }
229 else if (esi2.first) {
231 if (vbs) std::cout << " Got legacy EventStreamInfo_p2" << std::endl;
232 m_fmd.m_runNumbers.insert(esi2.second->m_runNumbers.begin(),
233 esi2.second->m_runNumbers.end());
234 m_fmd.m_lbNumbers.insert(esi.second->m_lumiBlockNumbers.begin(),
235 esi2.second->m_lumiBlockNumbers.end());
236 delete esi2.second;
237 esi2.second=nullptr;
238 }
239
240
241 std::set<unsigned> bmc_runNumbers;
242#ifndef SIMULATIONBASE
243 if (bmdc.first) {
244 if (vbs) std::cout << " Got ByteStreamMetadataContainer" << std::endl;
246 for (const auto& bmd : *bmdc.second) {
247 bmc_runNumbers.insert(bmd.m_runNumber);
248 if (
m_fmd.m_stream.size()==0) {
249 m_fmd.m_stream=bmd.m_stream;
250 }
251 else if (
m_fmd.m_stream!=bmd.m_stream) {
252 std::cerr << "Conflicting stream names in file! Got " <<
253 m_fmd.m_stream <<
" and " << bmd.m_stream << std::endl;
255 }
256 if (
m_fmd.m_project.size()==0) {
257 m_fmd.m_project=bmd.m_project;
258 }
259 else if (
m_fmd.m_project!=bmd.m_project) {
260 std::cerr << "Conflicting project names in file! Got " <<
261 m_fmd.m_project <<
" and " << bmd.m_project << std::endl;
263 }
264
265 const std::vector<std::string>& freeMDs=bmd.m_freeMetaDataStrings;
266 for (const std::string& freeMD : freeMDs) {
267 if (freeMD.compare(0,11,"Event type:")==0 && freeMD.find("is sim")!=std::string::npos) {
269 break;
270 }
271 }
272 }
273 delete bmdc.second;
274 bmdc.second=nullptr;
275 }
276#endif
277
278
279
280 if (
m_fmd.m_runNumbers.size()==0 && bmc_runNumbers.size()) {
281
282 m_fmd.m_runNumbers=std::move(bmc_runNumbers);
283 }
284 else if (
m_fmd.m_runNumbers.size() && bmc_runNumbers.size()) {
285
286 if (
m_fmd.m_runNumbers != bmc_runNumbers) {
287 std::cerr << "Mismatching run numbers in file metadata!" << std::endl;
288 std::cerr << "EventStreamInfo: ";
289 std::copy(
m_fmd.m_runNumbers.begin(),
m_fmd.m_runNumbers.end(),std::ostream_iterator<unsigned>(std::cerr,
" "));
290 std::cerr << std::endl;
291 std::cerr << "ByteStreamEventInfo: ";
292 std::copy(bmc_runNumbers.begin(),bmc_runNumbers.end(),std::ostream_iterator<unsigned>(std::cerr, " "));
293 std::cerr << std::endl;
295 }
296 }
297
298
299 TTree*
params=(TTree*)tf->Get(
"##Params");
300 const unsigned nParamsEntries=
params->GetEntries();
301
302 char dbStr[1024];
303 params->SetBranchAddress(
"db_string",&dbStr);
304
305 const std::string starter("[NAME=FID][VALUE=");
306 for (
unsigned i=0;
i<nParamsEntries;++
i) {
308
309 const std::string
field(dbStr);
310
311 if (
field.compare(starter)) {
312 m_fmd.m_guid=
field.substr(starter.size(),
field.size()-starter.size()-1);
313 break;
314 }
315 }
316
317
318 TTree*
tt=(TTree*)tf->Get(
"CollectionTree");
319 if (!tt) {
320 std::cerr << "Failed to read collectionTree" << std::endl;
322 }
323 else {
324 m_fmd.m_nEvents=
tt->GetEntries();
325 }
326
327 return;
328}
bool findBranch(TBranch *br, const std::string &nametag, const std::string &type, std::pair< bool, T * > &destination) const
int atoi(std::string_view str)
Helper functions to unpack numbers decoded in string into integers and doubles The strings are requir...