adding missing argument in printf statement
[u/mrichter/AliRoot.git] / HLT / exa / extract-ddlraw.C
1 // $Id$
2 /**
3  * @file extract-ddlraw.C
4  * @brief Tool to extract DDL raw data.
5  *
6  * Usage:
7  * <pre>
8  *   aliroot -b -q 'extract-ddlraw.C("raw.root", 768, 769)' | tee extract-ddlraw.log
9  * </pre>
10  *
11  * This macro is an example for the AliHLTRawReaderPublisherComponent.
12  * It extracts the DDL payload from an AliRawReader in a given equipment
13  * range. Input can be either a root file or the path to the directory
14  * containing the 'rawx' sub folders.
15  *
16  * A light-weight AliReconstruction-like setup creates the appropriate
17  * RawReader for the specified input and uses the standard AliHLTReconstructor
18  * to run a small HLT chain. The chain utilizes the AliRawReaderPublisher
19  * to extract the payload of the equipments and writes this to files.
20  *
21  * @note In this example the AliHLTRawReaderPublisherComponent does not set any data
22  * type nor specification for the published data blocks. Please remember
23  * to provide appropriate arguments via '-datatype' and '-dataspec'
24  * arguments (see AliHLTRawReaderPublisherComponent).
25  *
26  * @author Matthias.Richter@ift.uib.no
27  * @ingroup alihlt_tutorial
28  */
29 void extract_ddlraw(const char* input, int iMinDDLno, int iMaxDDLno, int nofEvents=-1)
30 {
31   /////////////////////////////////////////////////////////////////////////
32   /////////////////////////////////////////////////////////////////////////
33   //
34   // some defaults
35   const char* baseName="RAW.ddl";
36
37   /////////////////////////////////////////////////////////////////////////
38   /////////////////////////////////////////////////////////////////////////
39   //
40   // setup of the RawReader
41   if (!input) {
42     cerr << "invalid path" << endl;
43     cerr << "usage: aliroot -b -q 'extract-ddlraw.C(\"raw.root\", 768, 769)'" << endl;
44     return;
45   }
46
47   TString strfile=input;
48   if (strfile.Contains("://") && !strfile.Contains("local://")) {
49     TGrid::Connect("alien");
50   }
51
52   AliRawReader* pRawReader=AliRawReader::Create(input);
53   if (!pRawReader) {
54     cout << "can not open RawReader for file " << input << endl;
55     return;
56   }
57
58   if (!pRawReader->NextEvent()) {
59     cerr << "no events available" << endl;
60     return;
61   }
62
63   /////////////////////////////////////////////////////////////////////////
64   /////////////////////////////////////////////////////////////////////////
65   //
66   // setup of the HLT system
67   AliHLTSystem* pHLT=AliHLTPluginBase::GetInstance();
68   if (!pHLT) {
69     cerr << "fatal error: can not get HLT instance" << endl;
70   }
71
72   /////////////////////////////////////////////////////////////////////////
73   /////////////////////////////////////////////////////////////////////////
74   //
75   // the configuration chain
76   // we show two possible configurations:
77   //  1. having one publisher for each ddl, the configurations are created
78   //     in a loop
79   //  2. all in one publisher
80   // can be easily switched with the following
81   bool bAllInOne=true;
82
83   TString writerInput;
84   TString arg;
85
86   if (!bAllInOne) {
87     // create one publisher for each ddl
88     for (int ddlno=iMinDDLno; ddlno<=iMaxDDLno; ddlno++) {
89       TString arg, publisher;
90
91       // raw data publisher components
92       arg.Form("-minid %d -skipempty -verbose", ddlno);
93       publisher.Form("DP_%d", ddlno);
94       // see AliHLTRawReaderPublisherComponent
95       AliHLTConfiguration pubconf(publisher.Data(), "AliRawReaderPublisher", NULL , arg.Data());
96
97       if (!writerInput.IsNull()) writerInput+=" ";
98       writerInput+=publisher;
99     }
100   } else {
101     // publish all ddls by the same component, this is much more
102     // effective as it avoids repeated parsing through the data
103     arg.Form("-minid %d -maxid %d -skipempty -verbose", iMinDDLno, iMaxDDLno);
104     // see AliHLTRawReaderPublisherComponent
105     AliHLTConfiguration pubconf("publisher", "AliRawReaderPublisher", NULL , arg.Data());
106     if (!writerInput.IsNull()) writerInput+=" ";
107     writerInput+="publisher";
108   }
109
110   // the writer configuration is the same for both
111   arg.Form("-specfmt=_%%d -subdir=raw%%d -blcknofmt= -idfmt= -datafile %s", baseName);
112   // see AliHLTFileWriter
113   AliHLTConfiguration fwconf("sink1", "FileWriter"   , writerInput.Data(), arg.Data());
114
115
116   /////////////////////////////////////////////////////////////////////////
117   /////////////////////////////////////////////////////////////////////////
118   //
119   // the reconstructor setup
120   AliHLTReconstructor hltRec;
121   hltRec.SetOption("libAliHLTUtil.so loglevel=0x7c chains=sink1 ignore-hltout ignore-ctp");
122   if (hltRec.Init()<0) {
123     cerr << "initialization of reconstructor failed" << endl;
124     return;
125   }
126
127   // this is just a dummy ESD to provide valid parameters to the
128   // reconstructor
129   AliESDEvent* pESD = new AliESDEvent;
130   pESD->CreateStdContent();
131
132   /////////////////////////////////////////////////////////////////////////
133   /////////////////////////////////////////////////////////////////////////
134   //
135   // the reconstruction loop
136   Int_t event=0;
137   UChar_t* pData=NULL;
138   pRawReader->RewindEvents();
139   while (pRawReader->NextEvent() &&
140          (nofEvents<0 || event<nofEvents)) {
141     cout << "=======================================================" << endl;
142     cout << "event " << event << endl;
143     cout << "-------------------------------------------------------" << endl;
144     pRawReader->Reset();
145     hltRec.Reconstruct(pRawReader, NULL);
146     event++;
147   }
148
149   delete pESD;
150 }
151
152 void extract_ddlraw()
153 {
154   cerr << "===============================================================" << endl;
155   cerr << "usage: aliroot -b -q 'extract-ddlraw.C(\"raw.root\", 768, 769)'" << endl << endl;
156   cerr << "please provide input, min and max equipment id" << endl;
157   cerr << "===============================================================" << endl;
158 }