5 from datetime
import datetime
7 ns_conversion = {
'ns':1,
12 parser = argparse.ArgumentParser(description=
'KinConverter: convert kin files that have multiple vertices into a single event (or multiple overlapping events)')
13 parser.add_argument(
'--input-filename',
'-i',required=
True,type=str,help=
'Input .kin filename. Output filename(s) will be the same as the input filename & path, with [0-9].merge suffix(es) added')
14 parser.add_argument(
'--input-time-unit',required=
True,choices=ns_conversion.keys(),help=
'The time unit of the input file')
15 parser.add_argument(
'--dark-noise-start', type=int,required=
True,help=
'When to start the simulation (in ns)')
16 parser.add_argument(
'--dark-noise-end',type=int,required=
True,help=
'When to end the simulation (in ns)')
17 parser.add_argument(
'--event-overlap',type=int,required=
True,help=
'How long (in ns) to overlap')
18 parser.add_argument(
'--verbose',
'--v',type=int,default=0,help=
'Verbosity level')
20 parser.add_argument(
'--fixed-duration',type=int,default=
None,help=
'A fixed duration (in ns) for each event')
23 args = parser.parse_args()
25 ToNS = ns_conversion[args.input_time_unit]
28 for x
in [
'ns',
'us',
'ms',
's']:
30 return "%f %s" % (time, x)
33 DummyVertex =
"""$ nuance 0
35 $ track -12 0.00000 0.00000 0.00000 1.00000 -1
36 $ track 2212 938.27231 0.00000 0.00000 1.00000 -1
38 $ track -11 0.511 0 0 0 0
45 if isinstance(line, bytes):
47 if line.startswith(group_by):
51 if line.strip()
in exclude:
62 return float(line.split()[-1]) * ToNS
66 with open(filename,
'r') as fin:
67 for i, vertex
in enumerate(
GetVertex(fin,
"$ begin")):
69 if vertex[0].startswith(
'#'):
73 except UnboundLocalError:
74 last_time = float(
GetTime(vertex))
75 this_time = float(
GetTime(vertex))
76 if this_time < last_time:
79 print(
"Is time ordered")
84 outfilename = args.input_filename +
'.temp'
85 with open(filename,
'r') as fin, open(outfilename, 'w') as fout:
86 print(
'TODO SortByTime() not yet implemented')
91 with open(filename,
'r') as fin:
94 if vertex[0].startswith(
"$ begin"):
97 header =
''.join(vertex) +
''\
98 '# Split by kin_converter ' + str(datetime.now()) +
'\n'\
99 '# --fixed-duration ' + str(args.fixed_duration) +
'\n'\
100 '# --event-overlap ' + str(args.event_overlap) +
'\n'
113 event_start = args.dark_noise_start
114 last_event_end = args.dark_noise_end
117 while event_start < last_event_end:
118 event_end = event_start + args.fixed_duration
119 next_event_start = event_start + args.fixed_duration - args.event_overlap
120 print(
"Event", ievent,
"corresponds to range",
PrintNS(event_start),
PrintNS(event_end))
121 with open(args.input_filename,
'rb')
as fin, open(args.input_filename +
'.%09d' % ievent,
'w')
as fout:
125 fout.write(
'# Event ' + str(ievent) +
'\n')
126 fout.write(
'# /DarkRate/SetDarkLow ' + str(event_start) +
'\n')
127 fout.write(
'# /DarkRate/SetDarkHigh ' + str(event_end) +
'\n')
129 fout.write(
'$ begin\n')
133 print(
'Skipping to position in file', file_position)
134 fin.seek(file_position)
136 for i, vertex
in enumerate(
GetVertex(fin,
"$ begin", [
"$ begin",
"$ end"])):
138 if not vertex[0].startswith(
'$ nuance'):
145 print(
"Vertex #{}".format(i))
146 print(
"".join(vertex))
149 if time >= event_start:
150 fout.write(
''.join(vertex))
154 if time < next_event_start:
155 file_position = fin.tell()
158 fout.write(DummyVertex)
160 fout.write(
'$ end\n')
161 fout.write(
'$ stop\n')
162 print(
'contains', nvertices,
'vertices')
164 event_start = next_event_start