CMS 3D CMS Logo

generateFlavCfromFlavB.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 from __future__ import print_function
4 from __future__ import absolute_import
5 import os
6 import sys
7 import itertools
8 from . import dataLoader
9 from . import checkBTagCalibrationConsistency as checker
10 
11 import six
12 
13 def generate_flav_c(loaded_data):
14  flav_b_data = [e for e in loaded_data.entries if e.params.jetFlavor == 0]
15  flav_b_data = sorted(flav_b_data, key=lambda e: e.params.operatingPoint)
16  flav_b_data = sorted(flav_b_data, key=lambda e: e.params.measurementType)
17  flav_b_data = sorted(flav_b_data, key=lambda e: e.params.etaMin)
18  flav_b_data = sorted(flav_b_data, key=lambda e: e.params.ptMin)
19  flav_b_data = sorted(flav_b_data, key=lambda e: e.params.discrMin)
20  sys_groups = itertools.groupby(
21  flav_b_data,
22  key=lambda e: '%d, %s, %.02f, %.02f, %.02f' % (
23  e.params.operatingPoint,
24  e.params.measurementType,
25  e.params.etaMin,
26  e.params.ptMin,
27  e.params.discrMin
28  )
29  )
30 
31  def gen_entry_dict(groups):
32  for _, grp in groups:
33  grp = list(grp)
34  entries_by_sys = dict((e.params.sysType, e) for e in grp)
35  assert len(grp) == len(entries_by_sys) # every sysType is unique
36  yield entries_by_sys
37  sys_dicts = gen_entry_dict(sys_groups)
38 
39  def gen_flavb_csv_line(dicts):
40  for d in dicts:
41  central = d.pop('central')
42  central.params.jetFlavor = 1
43  yield central.makeCSVLine()
44  for e in six.itervalues(d):
45  e.params.jetFlavor = 1
46  e.formula = '2*(%s)-(%s)' % (e.formula, central.formula)
47  yield e.makeCSVLine()
48  csv_lines = gen_flavb_csv_line(sys_dicts)
49 
50  return list(l for l in csv_lines)
51 
52 
53 def main():
54  if len(sys.argv) < 3:
55  print('Need input/output filenames as first/second arguments. Exit.')
56  exit(-1)
57  if os.path.exists(sys.argv[2]):
58  print('Output file exists. Exit.')
59  exit(-1)
60 
61  print('\nChecking input file consistency...')
62  loaders = dataLoader.get_data(sys.argv[1])
63  checks = checker.run_check_data(loaders, True, True, False)
64  for data in loaders:
65  typ = data.meas_type
66  if 1 in data.flavs:
67  print('FLAV_C already present in input file for %s. Exit.' % typ)
68  exit(-1)
69  if not any(0 in data.flavs for data in loaders):
70  print('FLAV_B not found in input file. Exit.')
71  exit(-1)
72 
73 
74  print('\nGenerating new csv content...')
75  new_csv_data = list(itertools.chain.from_iterable(
76  l
77  for d in loaders
78  for l in generate_flav_c(d)
79  ))
80 
81  with open(sys.argv[1]) as f:
82  old_csv_data = f.readlines()
83 
84  with open(sys.argv[2], 'w') as f:
85  f.writelines(old_csv_data)
86  f.write('\n')
87  f.writelines(new_csv_data)
88 
89  print('Done.')
90 
91 
92 if __name__ == '__main__':
93  main()
dataLoader.get_data
def get_data(filename)
Definition: dataLoader.py:191
generateFlavCfromFlavB.generate_flav_c
def generate_flav_c(loaded_data)
Definition: generateFlavCfromFlavB.py:13
any
bool any(const std::vector< T > &v, const T &what)
Definition: ECalSD.cc:38
generateFlavCfromFlavB.main
def main()
Definition: generateFlavCfromFlavB.py:53
print
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:46
main
Definition: main.py:1
beamvalidation.exit
def exit(msg="")
Definition: beamvalidation.py:53