Enable art processes which use the TransferInput source to begin monitoring in the middle of a DAQ run
Currently, art processes which read in events sent from the DAQ via a Transfer plugin using the Transfer input source have to be started after the initialize transition but before the start transition. The reason for this is that the init fragment needs to be received by the art thread in order for processing to proceed correctly; otherwise the art process exits immediately with an error. We should investigate ways to ensure that even in the middle of a run, it's possible to begin monitoring data passing through the DAQ.
#1 Updated by John Freeman about 4 years ago
- Status changed from New to Resolved
- % Done changed from 0 to 100
Commit e3e100c786018df6df09cf4dbc2203f017758c2c on the feature/dispatcher branch of artdaq contains code which implements this requirement. To obtain and run the code, on mu2edaq01, run quick-start.sh using commit c84a83b44f1f4ef1197b46d2d9b2c991147b1ade on the feature/dispatcher branch of artdaq-demo. If you do this, then, once you have the 2x2x2 demo running as usual, you can then open up another terminal on mu2edaq01 and, after setting up artdaq-demo so that you're in build_artdaq-demo, run "art -c fcl/TransferInput.fcl" - what you'll see is that a new set of WFViewer windows pop up. If you hit ctrl-C you'll end the program, and then you can restart it if you wish. It's completely decoupled from the main running of the 2x2x2 system.
Of developer interest: the way this was implemented was that I added a new XML-RPC function recognized by classes which derive from artdaq::Commandable, called "register_monitor"; when the art process is launched with the Transfer input source, the constructor of TransferWrapper (the class which templatizes the ArtdaqInput class to create the Transfer input source class) requests that the artdaq process on the host specified in the FHiCL document by "dispatcherHost" and port specified by "dispatcherPost" executes this function. "register_monitor" simply sets a boolean that the dispatcher's AggregatorCore's process_fragment loop checks, and when it sees it's true, it broadcasts out the Init fragment, which allows the art program to subsequently handle the data events broadcast to it.