ATLAS Offline Software
Loading...
Searching...
No Matches
PoolFilePeeker.cxx
Go to the documentation of this file.
1//Dear emacs, this is -*-c++-*-
2/*
3 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
4*/
5
6#include "TFile.h"
7#include "TTree.h"
8
9#include <iostream>
10#include <vector>
11#include <string>
12#include <chrono>
13#include <set>
14#include <algorithm>
15#include <unistd.h>
16
20#ifndef SIMULATIONBASE
22#endif // not SIMULATIONBASE
23#include "FileMetaData.h"
25
26
27
28
30
31public:
32 PoolFilePeeker(const char* tf, const bool vbs=false);
33
34 const FileMetaData& get() const {return m_fmd;}
35
36private:
37 template<typename T>
38 bool findBranch(TBranch* br, const std::string& nametag, const std::string& type,
39 std::pair<bool,T*>& destination) const;
40
42};
43
44
45
46
47template<typename T>
48bool PoolFilePeeker::findBranch(TBranch* br, const std::string& nametag, const std::string& type,
49 std::pair<bool,T*>& destination) const {
50 const std::string brName(br->GetName());
51 const std::string brType(br->GetClassName());
52 if (brName.find(nametag)!=std::string::npos && brType==type) {
53 if (destination.first) {
54 std::cerr << "WARNING: Found more than one " << type << " labelled '" << nametag << "'. Ignoring " << brName << std::endl;
55 }
56 else {
57 destination.first=true;
58 br->SetAddress(&destination.second);
59 }
60 return true;
61 }
62 else
63 return false;
64}
65
66
67PoolFilePeeker::PoolFilePeeker(const char* filename, const bool vbs) {
68
69
70 m_fmd.m_fileName=filename;
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 // not SIMULATIONBASE
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 // not SIMULATIONBASE
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 }//end loop over branches
111
112
113 //Get the event!
114 md->GetEntry(0);
115
116 m_fmd.m_valid=true;
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();
122 if (idx.typeIndex()==IOVPayloadContainer_p1::ATTR_STRING) {
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 }//end loop over genparam
130 delete genparam.second;
131 genparam.second=nullptr;
132 }//end if have genparam
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();
138 if (idx.typeIndex()==IOVPayloadContainer_p1::ATTR_STRING) {
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; // alias of size_t
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 }//end loop over simparam
153 delete simparam.second;
154 simparam.second=nullptr;
155 }//end if have simparam
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();
161 if (idx.typeIndex()==IOVPayloadContainer_p1::ATTR_STRING) {
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 }//end loop over digiparam
178 delete digiparam.second;
179 digiparam.second=nullptr;
180 }//end if have digiparam
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 //const unsigned short typeIdx=idx.typeIndex();
186 const unsigned short nameIdx=idx.nameIndex();
187 if (idx.typeIndex()==IOVPayloadContainer_p1::ATTR_STRING) {
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 }//end loop over taginfo
207 delete taginfo.second;
208 taginfo.second=nullptr;
209 }//end if have taginfo
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) { //Have legacy version of EventStreamInfo
230 m_fmd.m_valid=true;
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;
245 m_fmd.m_isMC=false; //The presence of a ByteStreamMetaDataContainer indicates real data
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;
254 m_fmd.m_valid=false;
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;
262 m_fmd.m_valid=false;
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) {
268 m_fmd.m_isMC=true; //This is made of a simulated bytestream file
269 break;
270 }
271 }
272 }
273 delete bmdc.second;
274 bmdc.second=nullptr;
275 }//end if have ByteStream Meta Data
276#endif // not SIMULATIONBASE
277
278 //We may have gotten run-numbers twice (once form ByteStream MD and once form EventStreamInfo)
279 //Cross-check:
280 if (m_fmd.m_runNumbers.size()==0 && bmc_runNumbers.size()) {
281 //Unlikly case, run-number only via ByteStream metadata
282 m_fmd.m_runNumbers=std::move(bmc_runNumbers);
283 }
284 else if (m_fmd.m_runNumbers.size() && bmc_runNumbers.size()) {
285 //Both filled - cross-check!
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;
294 m_fmd.m_valid=false;
295 }
296 }
297
298 //Get the GUID:
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) {
307 params->GetEntry(i);
308 //Model: [NAME=FID][VALUE=41DB894B-C39C-BF47-81E9-C52658B117BF]
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 }//end loop over params-entries
316
317 //Get number of events for CollectionTree
318 TTree* tt=(TTree*)tf->Get("CollectionTree");
319 if (!tt) {
320 std::cerr << "Failed to read collectionTree" << std::endl;
321 m_fmd.m_valid=false;
322 }
323 else {
324 m_fmd.m_nEvents=tt->GetEntries();
325 }
326
327 return;
328}
329
330int main ATLAS_NOT_THREAD_SAFE (int argc, char** argv) {
331
332 bool verbose=false;
333 bool kvDump=false;
334 int c;
335
336 while ((c = getopt (argc, argv, "vk")) != -1) {
337 switch (c) {
338 case 'v':
339 verbose=true;
340 break;
341 case 'k':
342 kvDump=true;
343 break;
344 default:
345 std::cerr << "Unkown command line option" << std::endl;
346 return -1;
347 }
348 }
349
350 const int nfiles=argc-optind;
351 if (nfiles<=0) {
352 std::cerr << "Expected at least one file name as parameter" << std::endl;
353 return -1;
354 }
355
356
357 std::vector<FileMetaData> output;
358
359 for (int iFile=optind;iFile<argc;++iFile) {
360 const char* filename=argv[iFile];
361 if (verbose) std::cout << "Checking file " << filename << std::endl;
362
363 PoolFilePeeker pfp(filename,verbose);
364
365 output.push_back(pfp.get());
366 }//end loop over input file names
367
368
369
370 if (kvDump) {
371 for (const auto& o : output) o.keyValueDump();
372 }
373 else {
374 for (const auto& o : output) o.dump();
375 }
376
377 return 0;
378}
This file contains the class definition for the ByteStreamMetadata_p1 class.
int main(int, char **)
Main class for all the CppUnit test classes.
This file contains the class definition for the EventStreamInfo_p2 class.
This file contains the class definition for the EventStreamInfo_p3 class.
This class is a container for conditions data.
static Double_t sz
Define macros for attributes used to control the static checker.
#define ATLAS_NOT_THREAD_SAFE
getNoisyStrip() Find noisy strips from hitmaps and write out into xml/db formats
bool findBranch(TBranch *br, const std::string &nametag, const std::string &type, std::pair< bool, T * > &destination) const
PoolFilePeeker(const char *tf, const bool vbs=false)
FileMetaData m_fmd
const FileMetaData & get() const
bool verbose
Definition hcg.cxx:73