Migrating to artdaq v3 09 00 - art-daq/artdaq GitHub Wiki

{{toc}}

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
}