- Table of contents
- Migrating to artdaq v3_09_00
Migrating to artdaq v3_09_00¶
artdaq v3_09_00 adds a new plugin type "fragmentTypeHelper" to allow usage of the ArtdaqFragmentNamingService functionality outside of an art process. Updating a v3_08_00 FragmentNamingService is trivial, see artdaq-core-demo:source:artdaq-core-demo/Overlays/ArtdaqDemo_fragmentNameHelper.cc for an example.
You should then update your ArtdaqFragmentNamingServiceInterface configuration as follows: art.services.ArtdaqFragmentNamingServiceInterface: { service_provider: ArtdaqFragmentNamingService helper_plugin: YourExperiment }
Also, this version requires the configuration variable receive_requests: true
to be added to all pull-mode BoardReaders.
Example Configurations (BEFORE DAQInterface bookkeeping)¶
BoardReader¶
daq: { fragment_receiver: { # CommandableFragmentGenerator Configuration: fragment_ids: [] fragment_id: -99 # Please define only one of these sleep_on_stop_us: 0 # Possible values are: Ignored, Single, Buffer, Window request_mode: "Ignored" data_buffer_depth_fragments: 1000 data_buffer_depth_mb: 1000 receive_requests: true request_port: 3001 request_address: "227.128.12.26" # Multicast request address # Request message contains tzero. Window will be from tzero - # offset to tzero + width request_window_offset: 0 request_window_width: 0 # How long to wait before discarding request messages that are # outside the available data stale_request_timeout: "0xFFFFFFFF" # If request windows are unique, avoids a copy operation, but # the same data point cannot be used for two requests. If this # is not anticipated, leave set to "true" request_windows_are_unique: true # separate_data_thread MUST be true for requests to be # applied! If requests are not desired, but a separate readout # thread is, set this to true and request_mode to ignored. separate_data_thread: false # Whether a thread should be started which periodically calls # checkHWStatus_, a user-defined function which should be used # to check hardware status registers and report to MetricMan: separate_monitoring_thread: false # How often, in microseconds, checkHWStatus_() should be # called. 0 to disable: hardware_poll_interval_us: 0 generator: ToySimulator fragment_type: TOY1 fragment_id: 0 board_id: 0 starting_fragment_id: 0 random_seed: 8250 sleep_on_stop_us: 500000 nADCcounts: 40 max_fragment_size_bytes: 200 throttle_usecs: 100000 distribution_type: 2 timestamp_scale_factor: 1 destinations: { } routing_table_config: { use_routing_master: false } } metrics: { brFile: { metricPluginType: "file" level: 4 fileName: "boardreader/br_%UID%_metrics.log" absolute_file_path: false uniquify: true } } }
EventBuilder¶
daq: { event_builder: { expected_fragments_per_event: 0 # Will be set by DAQInterface init_fragment_count: 0 # Will be set by DAQInterface use_art: true print_event_store_stats: true buffer_count: 20 max_incomplete_events: 75 # Same as boardreader sync interval verbose: true send_requests: false routing_token_config: { use_routing_master: false } sources: { } } metrics: { evbFile: { metricPluginType: "file" level: 4 fileName: "eventbuilder/evb_%UID%_metrics.log" absolute_file_path: false uniquify: true } } } art: { services: { ArtdaqSharedMemoryServiceInterface: { service_provider: ArtdaqSharedMemoryService waiting_time: 2500000 resume_after_timeout: true } ArtdaqFragmentNamingServiceInterface: { service_provider: ArtdaqFragmentNamingService helper_plugin: "Demo" } } outputs: { rootNetOutput: { module_type: RootNetOutput #SelectEvents: { SelectEvents: [ pmod2,pmod3 ] } #broadcast_sends: true destinations: { } routing_table_config: { use_routing_master: false } } #normalOutput: { # module_type: RootDAQOut # fileName: "/tmp/artdaqdemo_eb00_r%06r_sr%02s_%to_%#.root" # #SelectEvents: { SelectEvents: [ pmod2,pmod3 ] } # fileProperties: { maxSubRuns: 1 maxRuns: 1 } # compressionLevel: 3 # fastCloning: false #} } physics: { analyzers: { toy1Integ: { module_type: CheckIntegrity raw_data_label: "daq" frag_type: "TOY1" } toy2Integ: { module_type: CheckIntegrity raw_data_label: "daq" frag_type: "TOY2" } } producers: { } filters: { prescaleMod2: { module_type: NthEvent nth: 2 } prescaleMod3: { module_type: NthEvent nth: 3 } } pmod2: [ prescaleMod2 ] pmod3: [ prescaleMod3 ] a1: [ toy1Integ, toy2Integ ] my_output_modules: [ rootNetOutput ] #my_output_modules: [ normalOutput ] } source: { module_type: ArtdaqInput } process_name: DAQ }
DataLogger¶
daq: { aggregator: { expected_events_per_bunch: 1 init_fragment_count: 0 # Will be set by DAQInterface print_event_store_stats: true event_queue_depth: 40 event_queue_wait_time: 5 buffer_count: 40 onmon_event_prescale: 1 is_data_logger: true auto_suppression_enabled: false routing_token_config: { use_routing_master: false } sources: { } } metrics: { aggFile: { metricPluginType: "file" level: 4 fileName: "aggregator/agg_%UID%_metrics.log" absolute_file_path: false uniquify: true } #ganglia: { # metricPluginType: "ganglia" # level: 4 # reporting_interval: 15.0 # configFile: "/etc/ganglia/gmond.conf" # group: "ARTDAQ" #} } } art: { services: { ArtdaqSharedMemoryServiceInterface: { service_provider: ArtdaqSharedMemoryService } } source: { module_type: ArtdaqInput register_fragment_types: false } outputs: { normalOutput: { module_type: RootDAQOut fileName: "/tmp/artdaqdemo_r%06r_sr%02s_%to_%#.root" fileProperties: { maxSubRuns: 1 maxRuns: 1 } fastCloning: false compressionLevel: 3 } rootNetOutput: { module_type: RootNetOutput #SelectEvents: { SelectEvents: [ pmod2,pmod3 ] } broadcast_sends: true nonblocking_sends: true destinations: { } } } physics: { analyzers: { checkintegrity: { module_type: CheckIntegrity raw_data_label: daq frag_type: TOY1 } checkintegrity2: { module_type: CheckIntegrity raw_data_label: daq frag_type: TOY2 } } producers: { BuildInfo: { module_type: ArtdaqDemoBuildInfo instance_name: ArtdaqDemo } } p2: [ BuildInfo ] a1: [ checkintegrity, checkintegrity2 ] my_output_modules: [ normalOutput ] my_mpi_output_modules: [rootNetOutput] } process_name: DAQDL }