Data Acquisition with EUDAQ
This page gives some details on test beam data acquisition using EUDAQ software.
See
EUDAQ official pages for more information and installation instructions. Online documentation is available
here.
Important Points for Running EUDAQ
Important points for running EUDAQ (as experienced by user).
Open ports
Ports must be opened for different parts of the software to communicate. Specifically port 44000 (Run Control)must be open in order to run the software (in addition ports 44001 (Data Collector) and 44002 (Log Collector) may be opened, see §3.1.2 of the manual for more info).
To open ports
on Macs with xterm (may be similar for Linux) use
ipfw
commands (see
man ipfw
fro more info.):
>sudo ipfw list
this lists all port commands
>sudo ipfw add 44000 allow tcp from any to any dst-port 44000
this opens port 44000
Port commands will need to be issued at each session.
Running EUDAQ
Make sure order is correct (kill all running eu programs)):
>cd /YOURPATH/eudaq/bin
this is the directory whee all executables should be opened
>./euRun.exe &
opens Run Control window (
NB ampersand)
>./euLog.exe &
opens Run Log window (
NB ampersand)
Now you can run Data Collector/Producer programs. E.g.
>./TestDataCollector &
this allows configuration
Device Configuration Data
Configuration information can be added as a header section to the dat files. This can then be retrieved later in analysis (using EUTelescope).
For example, when using the RCE system, the parameters from the EUDAQ config file are sent to
RceOfflineProducer.cc
where they are parsed in the
OnConfigure
function. The offline producer then configures the frontends.
The plugin (
APIX-CT-ConverterPlugin.cc
), used by EUTelescope, gets configured by the
RceOfflineProducer
in the
Initialize
function. The
BORE
function reads a bunch of tags and corresponding values on the first event and sets the configuration of the EUTelescope plugin accordingly.
The header data can be used to check event configuration as well as pass configuration settings to EUTelescope, e.g. device Nrows & Ncols.
Setting Configuration Data
Configuration files can be found in the
conf
EUDAQ directory i.e.
/YOURPATH/eudaq/conf/
.
File can be edited to contain information about the data in the header section of the data files.
Information has the form:
[tile]
tagname = value
Retrieving Configuration Data
Using the EUTelescope plugin (e.g.
$EUTELESCOPE/v00-09-02/external/eudaq/tags/v01-00-00/main/src/APIX-CT-ConverterPlugin.cc
) the information contended in the header of the data file can be retrieved.
void APIXCTConverterPlugin::Initialize(const Event & source, const Configuration & config) {
int nFrontends = from_string(source.GetTag("nFrontends"), 0); // get number of modules
m_nFrames = from_string(source.GetTag("consecutive_lvl1"), 1);
char tagname[128]; // used to hold tag name
m_feToSensorid.clear();
m_fepos.clear();
m_sensorids.clear();
m_nFeSensor.clear();
for(int i=0;i<nFrontends;i++){ // loop over modules
sprintf(tagname, "OutLink_%d", i); // set tagname
int link=from_string(source.GetTag(tagname), 0); // return value associated with tagname
...
To see all the header data add
config.Print()
to the
Initialize
function. If the function is not present in the
Configuration.cc
file then add a function to the file:
void Configuration::Print() const {
for (map_t::const_iterator i = m_config.begin(); i = m_config.end(); ++i) {
if (i->first = "") {
std::cout << "[" << i->first << "]\n";
}
for (section_t::const_iterator j = i->second.begin(); j = i->second.end(); ++j) {
std::cout << j->first << " = " << j->second << "\n";
}
std::cout << "\n" << std::endl;
}
}
This should give an output of all header data to the screen at the start of the
jobsub
convertor
step when running EUTelescope analysis. It will look like:
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] >>>KGW: config values...
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] GeoID = 262
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] Name = SLAC_2014_May_UK_167x125_500x25_3000e
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"]
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"]
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] [DataCollector]
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"]
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"]
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] [LogCollector]
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] PrintLevel = INFO
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] SaveLevel = EXTRA
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"]
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"]
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] [Producer.MimosaNI]
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] Det = MIMOSA26
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] FPGADownload = 0
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] IDOffset = 0
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] MimosaEn_1 = 1
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] MimosaEn_2 = 1
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] MimosaEn_3 = 1
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] MimosaEn_4 = 1
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] MimosaEn_5 = 1
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] MimosaEn_6 = 1
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] MimosaID_1 = 11
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] MimosaID_2 = 12
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] MimosaID_3 = 19
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] MimosaID_4 = 4
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] MimosaID_5 = 2
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] MimosaID_6 = 20
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] Mode = ZS2
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] NiIPaddr = 172.27.104.32
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] NiVersion = 1
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] NumBoards = 6
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] OneFrame = 0
10:20:32 jobsub.converter(INFO): [ VERBOSE "UNKOWN"] TriggerType = 1
...
--
Kenneth Wraight - 2014-07-31
Comments