312 def _do_peeking(self, peek_evt_data=False):
313 """ the real function doing all the work of peeking at the input file
314 @return a dict of peeked-at data
315 """
316 peeked_data = {}
317 import AthenaPython.PyAthena as PyAthena
318 _info = self.msg.info
319 _error= self.msg.error
320
321 def _get_detdescr_tags(evt_type):
322 ddt = evt_type.get_detdescr_tags().
split()
323
324
325 ddt = dict(zip(ddt[0::2],
326 ddt[1::2]))
327 return ddt
328
329
331 store = self.inputStore
332 esi_keys = store.keys('EventStreamInfo')
333 nentries = None
334 ddt = None
335 if len(esi_keys) >= 1:
336 sg_key = esi_keys[-1]
337 nentries = 0
338 stream_names = esi_keys[:]
339 for sg_key in esi_keys:
340 esi = store.retrieve('EventStreamInfo', sg_key)
341 _info('=== [EventStreamInfo#%s] ===', sg_key)
342 nentries += esi.getNumberOfEvents()
343
344 evt_types = PyAthena.EventStreamInfo.evt_types(esi)
345 if len(evt_types) > 0:
346 evt_type = evt_types[0]
347 peeked_data['evt_type'] = evt_type.bit_mask
348 ddt = _get_detdescr_tags(evt_type)
349 peeked_data['det_descr_tags'] = ddt
350 from past.builtins import long
351 peeked_data['mc_channel_number'] = [long(evt_type.mc_channel_number())]
352
353 def _make_item_list(item):
354 sgkey= item[1]
355 clid = item[0]
356 _typename = store._pyclidsvc.typename
357 return (_typename(clid) or str(clid),
358 sgkey)
359 item_list = esi.item_list()
360 item_list = list(
map(_make_item_list, item_list))
361 peeked_data['eventdata_items'] = item_list
362
363 peeked_data['lumi_block'] = esi.lumi_blocks()
364 peeked_data['run_number'] = esi.run_numbers()
365
366 peeked_data['stream_names'] = esi.processing_tags()
367
368 if not peeked_data['stream_names']:
369 stream_names = [sg_versioned_key(s).key for s in stream_names]
370 peeked_data[
'stream_names'] = list(
set(stream_names))
371 pass
372
373
374 if len(esi.run_numbers()) == 0:
375 bsmd_keys = store.keys("ByteStreamMetadataContainer")
376 if len(bsmd_keys) == 1:
377 bsmd = store[bsmd_keys[0]][0]
378 peeked_data['lumi_block'] = [bsmd.getLumiBlock()]
379 peeked_data['run_number'] = [bsmd.getRunNumber()]
380 bs_metadata = {}
381 for md in bsmd.getFreeMetaDataStrings():
382 if md.startswith('Event type:'):
383 k = 'evt_type'
384 v = []
385 if 'is sim' in md: v.append('IS_SIMULATION')
386 else: v.append('IS_DATA')
387 if 'is atlas' in md: v.append('IS_ATLAS')
388 else: v.append('IS_TESTBEAM')
389 if 'is physics' in md: v.append('IS_PHYSICS')
390 else: v.append('IS_CALIBRATION')
391 bs_metadata[k] = tuple(v)
392 elif md.startswith('GeoAtlas:'):
393 k = 'geometry'
394 v = md.split(
'GeoAtlas:')[1].
strip()
395 bs_metadata[k] = v
396 elif md.startswith('IOVDbGlobalTag:'):
397 k = 'conditions_tag'
398 v = md.split(
'IOVDbGlobalTag:')[1].
strip()
399 bs_metadata[k] = v
400 elif '=' in md:
401 k,v = md.split('=')
402 bs_metadata[k] = v
403 pass
404 peeked_data['evt_type'] = bs_metadata.get('evt_type', [])
405 peeked_data['geometry'] = bs_metadata.get('geometry', None)
406 peeked_data['conditions_tag'] = bs_metadata.get('conditions_tag', None)
407 peeked_data['bs_metadata'] = bs_metadata
408 pass
409 pass
410
411
412
413 if nentries is None:
414 ROOT = _import_ROOT()
415 root_files = list(ROOT.gROOT.GetListOfFiles())
416 root_files = [root_file for root_file in root_files
417 if root_file.GetName().
count(self.infname)]
418 if len(root_files)==1:
419 root_file = root_files[0]
420 data_hdr = root_file.Get("POOLContainer")
421 if not data_hdr:
422 data_hdr = root_file.Get("POOLContainer_DataHeader")
423 nentries = data_hdr.GetEntriesFast() if bool(data_hdr) \
424 else None
425 else:
426 _info('could not find correct ROOT file (looking for [%s])',
427 self.infname)
428 nentries = None
429 del root_files
430 del data_hdr
431 peeked_data['nentries'] = nentries
432
433
434 def _get_guid():
435 guid = None
436 ROOT = _import_ROOT()
437 root_files = list(ROOT.gROOT.GetListOfFiles())
438 root_files = [root_file for root_file in root_files
439 if root_file.GetName().
count(self.infname)]
440 if len(root_files)==0:
441 _info('could not find correct ROOT file (looking for [%s])',
442 self.infname)
443 return
444
445 root_file = root_files[0]
446 pool = root_file.Get("##Params")
447 import re
448
449
450 pool_token = re.compile(r'[\[]NAME=(?P<name>.*?)[\]]'
451 r'[\[]VALUE=(?P<value>.*?)[\]]').match
452 params = []
453 for i in range(pool.GetEntries()):
454 if pool.GetEntry(i)>0:
455 match = pool_token(pool.db_string)
456 if not match:
457 continue
458 d = match.groupdict()
459 params.append((d['name'], d['value']))
460 if d['name'].lower() == 'fid':
461 guid = d['value']
462 return guid
463 guid = _get_guid()
464 if guid:
465 peeked_data['file_guid'] = guid
466
467
468 metadata_items = [(self.inputStore._pyclidsvc.typename(p.clID()),
469 p.name())
470 for p in self.inputStore.proxies()]
471 peeked_data['metadata_items'] = metadata_items
472 metadata = {}
473 def maybe_get(o, idx, default=None):
474 try:
475 return o[idx]
476 except IndexError:
477 return default
478 def maybe_float(o):
479 try:
480 return float(o)
481 except ValueError:
482 return o
483
484 def mergeMultipleDict(inDicts):
485 outDict={}
486 for d in inDicts:
487 for k,o in d.items():
488 if k not in outDict:
489 outDict[k]=o
490 if len(outDict)==0:
491 return None
492 else:
493 return outDict
494
495
496
497 for k in self.inputStore.keys('IOVMetaDataContainer'):
498 v = self.process_metadata(self.inputStore, k)
499 metadata[k] = maybe_get(v, -1)
500 peeked_data['metadata'] = metadata
501
502
503 taginfo = {}
504 if self.metaStore.
contains(
'IOVMetaDataContainer',
'/TagInfo'):
505 v = self.process_metadata(self.metaStore, '/TagInfo')
506 taginfo = mergeMultipleDict(v)
507 else:
508 if '/TagInfo' in metadata:
509 taginfo = metadata['/TagInfo'].copy()
510 else:
511 self._old_file_flag = True
512
513
514 if ddt:
515 peeked_data['det_descr_tags'] = ddt
516 peeked_data['geometry'] = ddt.get('GeoAtlas', None)
517 peeked_data['conditions_tag'] = ddt.get('IOVDbGlobalTag', None)
518 peeked_data['tag_info'] = taginfo
519 if taginfo:
520 peeked_data['det_descr_tags'] = taginfo
521 peeked_data['geometry'] = taginfo.get('GeoAtlas', None)
522 peeked_data['conditions_tag'] = taginfo.get('IOVDbGlobalTag', None)
523 peeked_data['beam_type'] = [taginfo.get('beam_type','N/A')]
524 peeked_data['beam_energy']= [maybe_float(taginfo.get('beam_energy',
525 'N/A'))]
526
527 if 'geometry' not in peeked_data:
528 peeked_data['geometry'] = None
529 if 'conditions_tag' not in peeked_data:
530 peeked_data['conditions_tag'] = None
531 if 'det_descr_tags' not in peeked_data:
532 peeked_data['det_descr_tags'] = {}
533
534
535 if not self._begin_run_flag:
536 if taginfo and taginfo.get('project_name',None) == 'IS_SIMULATION':
537 peeked_data['evt_type'] = ('IS_SIMULATION', 'IS_ATLAS', 'IS_PHYSICS')
538 if '/Simulation/Parameters' in metadata:
539 peeked_data[
'run_number'] = [metadata.get(
'/Simulation/Parameters').
get(
'RunNumber',
None)]
540
542 if peek_evt_data is False:
543 return peeked_data
544
545
546
547
548 store = self.evtStore
549 evt_info_keys = store.keys('EventInfo')
550 if len(evt_info_keys) != 1:
551 _info('more than one EventInfo: %s', evt_info_keys)
552 _info(' ==> we\'ll use [%s]', evt_info_keys[0])
553 sg_key = evt_info_keys[0]
554 ei = store.retrieve('EventInfo', sg_key)
555 _info('=== [EventInfo#%s] ===', sg_key)
556 eid = ei.event_ID()
557
558 dh_keys = [k for k in store.keys('DataHeader')
559
560 if not k.startswith('[DB=')]
561 if len(dh_keys) != 1:
562 _error('more than 1 DataHeader key after filtering: %s', dh_keys)
563 _error('content of store: %s', store.keys('DataHeader'))
564 raise RuntimeError('more than one DataHeader key')
565
566 sg_key = dh_keys[0]
567 _info('=== [DataHeader#%s] ===', sg_key)
568 dh = store.retrieve('DataHeader', sg_key)
569
570 def _make_item_list(dhe):
571 sgkey= dhe.getKey()
572 clid = dhe.getPrimaryClassID()
573 _typename = store._pyclidsvc.typename
574 return (_typename(clid) or str(clid),
575 sgkey)
576 dhes = []
577 if hasattr(dh, 'at'):
578
579 for ii in range(len(dh)):
580 dhes.append(dh.at(ii))
581 pass
582 else:
583 dhes = list(dh.elements())
584
585 item_list = []
586 for i,dhe in enumerate(dhes):
587 sgkey = dhe.getKey()
588 clid = dhe.getPrimaryClassID()
589 _typename = store._pyclidsvc.typename
590 try:
591 clid_name = _typename(clid)
592 if clid_name:
593 clid = clid_name
594 except Exception as err:
595 self.msg.info("no typename for clid [%s] (%s)", clid, err)
596 item_list.append((str(clid), sgkey))
597
598
599 evt_type = ei.event_type()
600 det_descr_tags = _get_detdescr_tags(evt_type)
601
602 peeked_data.update({
603 'run_number': [eid.run_number()],
604 'evt_number': [eid.event_number()],
605 'run_type': ['N/A'],
606 'evt_type': evt_type.bit_mask,
607 'det_descr_tags': det_descr_tags,
608 'geometry': det_descr_tags.get('GeoAtlas', None),
609 'conditions_tag': det_descr_tags.get('IOVDbGlobalTag', None),
610 'lumi_block': [eid.lumi_block()],
611 'stream_names': [dh.getProcessTag()],
612 'eventdata_items': item_list,
613 'beam_type': [det_descr_tags.get('beam_type','N/A')],
614 'beam_energy': [maybe_float(det_descr_tags.get('beam_energy',
615 'N/A'))],
616 })
617
618 trigger_info= ei.trigger_info()
619 stream_tags = trigger_info.streamTags() if trigger_info else []
620 stags = []
621 for st in stream_tags:
622 st_type = st.type()
623 st_name = st.name()
624 obeys_lbk=bool(st.obeysLumiblock())
625 stags.append(dict(stream_type=st_type,
626 stream_name=st_name,
627 obeys_lbk=obeys_lbk))
628 peeked_data['stream_tags'] = stags
629
630
631 if self._old_file_flag or 1:
632
633
634 metadata_items = [(self.inputStore._pyclidsvc.typename(p.clID()),
635 p.name())
636 for p in self.inputStore.proxies()]
637 peeked_data['metadata_items'] = metadata_items
638 metadata = {}
639 for k in self.inputStore.keys('IOVMetaDataContainer'):
640 v = self.process_metadata(self.inputStore, k)
641 metadata[k] = maybe_get(v, -1)
642 peeked_data['metadata'] = metadata
643
644
645 taginfo = {}
646 if self.metaStore.
contains(
'IOVMetaDataContainer',
'/TagInfo'):
647 v = self.process_metadata(self.metaStore, '/TagInfo')
648 taginfo = mergeMultipleDict(v)
649 if taginfo:
650
651 atlas_release = metadata.get('/TagInfo', taginfo)
652 atlas_release = atlas_release.get('AtlasRelease',
653 taginfo['AtlasRelease'])
654 taginfo['AtlasRelease'] = atlas_release
655 peeked_data['det_descr_tags'] = taginfo
656 peeked_data['tag_info'] = taginfo
657
658
660 ddt = peeked_data['det_descr_tags']
661 peeked_data['geometry'] = ddt.get('GeoAtlas', None)
662 peeked_data['conditions_tag'] = ddt.get('IOVDbGlobalTag', None)
663
664
665 peeked_data['beam_type']= [ddt.get('beam_type','N/A')]
666 beam_ene = maybe_float(ddt.get('beam_energy','N/A'))
667 peeked_data['beam_energy']=[beam_ene]
668
669 pass
670
671 return peeked_data
672
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
bool contains(const std::string &s, const std::string ®x)
does a string contain the substring
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
std::vector< std::string > split(const std::string &s, const std::string &t=":")