44 NUMBER_OF_DATA_PRODUCERS=2,
45 DATA_RATE_SLOWDOWN_FACTOR = 1,
47 TRIGGER_RATE_HZ = 1.0,
48 DATA_FILE="./frames.bin",
54 trigger_interval_ticks = math.floor((1/TRIGGER_RATE_HZ) * CLOCK_SPEED_HZ/DATA_RATE_SLOWDOWN_FACTOR)
58 app.QueueSpec(inst=
"time_sync_q", kind=
'FollyMPMCQueue', capacity=100),
59 app.QueueSpec(inst=
"token_q", kind=
'FollySPSCQueue', capacity=20),
60 app.QueueSpec(inst=
"trigger_decision_q", kind=
'FollySPSCQueue', capacity=20),
61 app.QueueSpec(inst=
"trigger_decision_copy_for_bookkeeping", kind=
'FollySPSCQueue', capacity=20),
62 app.QueueSpec(inst=
"trigger_record_q", kind=
'FollySPSCQueue', capacity=20),
63 app.QueueSpec(inst=
"data_fragments_q", kind=
'FollyMPMCQueue', capacity=100),
65 app.QueueSpec(inst=f
"data_requests_{idx}", kind=
'FollySPSCQueue', capacity=20)
66 for idx
in range(NUMBER_OF_DATA_PRODUCERS)
71 queue_specs = app.QueueSpecs(sorted(queue_bare_specs, key=
lambda x: x.inst))
75 mspec(
"tde",
"TriggerDecisionEmulator", [
76 app.QueueInfo(name=
"time_sync_source", inst=
"time_sync_q", dir=
"input"),
77 app.QueueInfo(name=
"token_source", inst=
"token_q", dir=
"input"),
78 app.QueueInfo(name=
"trigger_decision_sink", inst=
"trigger_decision_q", dir=
"output"),
81 mspec(
"rqg",
"RequestGenerator", [
82 app.QueueInfo(name=
"trigger_decision_input_queue", inst=
"trigger_decision_q", dir=
"input"),
83 app.QueueInfo(name=
"trigger_decision_for_event_building", inst=
"trigger_decision_copy_for_bookkeeping", dir=
"output"),
85 app.QueueInfo(name=f
"data_request_{idx}_output_queue", inst=f
"data_requests_{idx}", dir=
"output")
86 for idx
in range(NUMBER_OF_DATA_PRODUCERS)
89 mspec(
"ffr",
"FragmentReceiver", [
90 app.QueueInfo(name=
"trigger_decision_input_queue", inst=
"trigger_decision_copy_for_bookkeeping", dir=
"input"),
91 app.QueueInfo(name=
"trigger_record_output_queue", inst=
"trigger_record_q", dir=
"output"),
92 app.QueueInfo(name=
"data_fragment_input_queue", inst=
"data_fragments_q", dir=
"input"),
95 mspec(
"datawriter",
"DataWriterModule", [
96 app.QueueInfo(name=
"trigger_record_input_queue", inst=
"trigger_record_q", dir=
"input"),
97 app.QueueInfo(name=
"token_output_queue", inst=
"token_q", dir=
"output"),
100 mspec(
"fake_timesync_source",
"FakeTimeSyncSource", [
101 app.QueueInfo(name=
"time_sync_sink", inst=
"time_sync_q", dir=
"output"),
106 mspec(f
"fakedataprod_{idx}",
"FakeDataProdModule", [
107 app.QueueInfo(name=
"data_request_input_queue", inst=f
"data_requests_{idx}", dir=
"input"),
108 app.QueueInfo(name=
"data_fragment_output_queue", inst=
"data_fragments_q", dir=
"output"),
109 ])
for idx
in range(NUMBER_OF_DATA_PRODUCERS)
112 init_specs = app.Init(queues=queue_specs, modules=mod_specs)
114 jstr = json.dumps(init_specs.pod(), indent=4, sort_keys=
True)
117 initcmd = rccmd.RCCommand(
118 id=basecmd.CmdId(
"init"),
120 exit_state=
"INITIAL",
125 confcmd = mrccmd(
"conf",
"INITIAL",
"CONFIGURED",[
126 (
"tde", tde.ConfParams(
127 links=[idx
for idx
in range(NUMBER_OF_DATA_PRODUCERS)],
128 min_links_in_request=NUMBER_OF_DATA_PRODUCERS,
129 max_links_in_request=NUMBER_OF_DATA_PRODUCERS,
130 min_readout_window_ticks=1200,
131 max_readout_window_ticks=1200,
132 trigger_window_offset=1000,
134 trigger_delay_ticks=math.floor( 2* CLOCK_SPEED_HZ/DATA_RATE_SLOWDOWN_FACTOR),
139 trigger_interval_ticks=trigger_interval_ticks,
140 clock_frequency_hz=CLOCK_SPEED_HZ/DATA_RATE_SLOWDOWN_FACTOR
142 (
"rqg", rqg.ConfParams(
143 map=rqg.mapgeoidqueue([
144 rqg.geoidinst(apa=0, link=idx, queueinstance=f
"data_requests_{idx}")
for idx
in range(NUMBER_OF_DATA_PRODUCERS)
147 (
"ffr", ffr.ConfParams(
148 general_queue_timeout=QUEUE_POP_WAIT_MS
150 (
"datawriter", dw.ConfParams(
151 initial_token_count=TOKEN_COUNT,
152 data_store_parameters=hdf5ds.ConfParams(
155 directory_path = OUTPUT_PATH,
157 max_file_size_bytes = 1073741834,
158 disable_unique_filename_suffix =
False,
159 filename_parameters = hdf5ds.HDF5DataStoreFileNameParams(
160 overall_prefix =
"fake_minidaqapp",
162 file_index_prefix =
"file"
164 file_layout_parameters = hdf5ds.HDF5DataStoreFileLayoutParams(
165 trigger_record_name_prefix=
"TriggerRecord",
166 digits_for_trigger_number = 5,
170 (
"fake_timesync_source", ftss.ConfParams(
171 sync_interval_ticks = (CLOCK_SPEED_HZ/DATA_RATE_SLOWDOWN_FACTOR),
172 clock_frequency_hz = (CLOCK_SPEED_HZ/DATA_RATE_SLOWDOWN_FACTOR),
175 (f
"fakedataprod_{idx}", fdp.ConfParams(
176 temporarily_hacked_link_number = idx
177 ))
for idx
in range(NUMBER_OF_DATA_PRODUCERS)
180 jstr = json.dumps(confcmd.pod(), indent=4, sort_keys=
True)
183 startpars = rccmd.StartParams(run=RUN_NUMBER, disable_data_storage=DISABLE_OUTPUT)
184 startcmd = mrccmd(
"start",
"CONFIGURED",
"RUNNING", [
185 (
"datawriter", startpars),
187 (
"fakedataprod_.*", startpars),
189 (
"fake_timesync_source", startpars),
193 jstr = json.dumps(startcmd.pod(), indent=4, sort_keys=
True)
194 print(
"="*80+
"\nStart\n\n", jstr)
196 stopcmd = mrccmd(
"stop",
"RUNNING",
"CONFIGURED", [
197 (
"fake_timesync_source",
None),
200 (
"fakedataprod_.*",
None),
202 (
"datawriter",
None),
205 jstr = json.dumps(stopcmd.pod(), indent=4, sort_keys=
True)
206 print(
"="*80+
"\nStop\n\n", jstr)
208 pausecmd = mrccmd(
"pause",
"RUNNING",
"RUNNING", [
212 jstr = json.dumps(pausecmd.pod(), indent=4, sort_keys=
True)
213 print(
"="*80+
"\nPause\n\n", jstr)
215 resumecmd = mrccmd(
"resume",
"RUNNING",
"RUNNING", [
216 (
"tde", tde.ResumeParams(
217 trigger_interval_ticks=trigger_interval_ticks
221 jstr = json.dumps(resumecmd.pod(), indent=4, sort_keys=
True)
222 print(
"="*80+
"\nResume\n\n", jstr)
224 scrapcmd = mcmd(
"scrap", [
228 jstr = json.dumps(scrapcmd.pod(), indent=4, sort_keys=
True)
229 print(
"="*80+
"\nScrap\n\n", jstr)
232 cmd_seq = [initcmd, confcmd, startcmd, stopcmd, pausecmd, resumecmd, scrapcmd]
235 jstr = json.dumps([c.pod()
for c
in cmd_seq], indent=4, sort_keys=
True)
254 def cli(number_of_data_producers, data_rate_slowdown_factor, run_number, trigger_rate_hz, data_file, output_path, token_count, disable_data_storage, json_file):
256 JSON_FILE: Input raw data file.
257 JSON_FILE: Output json configuration file.
260 with open(json_file,
'w')
as f:
262 NUMBER_OF_DATA_PRODUCERS = number_of_data_producers,
263 DATA_RATE_SLOWDOWN_FACTOR = data_rate_slowdown_factor,
264 RUN_NUMBER = run_number,
265 TRIGGER_RATE_HZ = trigger_rate_hz,
266 DATA_FILE = data_file,
267 OUTPUT_PATH = output_path,
268 DISABLE_OUTPUT = disable_data_storage,
269 TOKEN_COUNT = token_count
272 print(f
"'{json_file}' generation completed.")