Avoid linking with Pythia
[u/mrichter/AliRoot.git] / RAW / alimdc_main.cxx
CommitLineData
5ea08be4 1// @(#)alimdc:$Name$:$Id$
2// Author: Fons Rademakers 26/11/99
3
4//////////////////////////////////////////////////////////////////////////
5// //
6// alimdc //
7// //
8// Main program used to create application that reads a data stream //
9// from the DATE DAQ system and that creates a ROOT database. //
10// //
11// Written by: Fons Rademakers, 1/4/99. //
12// //
13//////////////////////////////////////////////////////////////////////////
14
15#include <sys/types.h>
16#include <sys/stat.h>
17#include <unistd.h>
18#include <stdlib.h>
19#include <fcntl.h>
20#include <errno.h>
21
22#include <TROOT.h>
23#include <TSystem.h>
24#include <TError.h>
25
e10815f1 26#include <AliLog.h>
27
5ea08be4 28#ifdef USE_SMI
29extern "C" {
30 #include <smirtl.h>
31}
32#endif
33
a197a4ce 34#include "AliMDC.h"
5ea08be4 35
bf4fbefe 36#ifdef __APPLE__
37// avoid loading pythia and pdf
38#include <Hepevt.h>
39HEPEVT_DEF HEPEVT;
40#endif
41
24df3da7 42//______________________________________________________________________________
43static void AliMDCErrorHandler(int level, Bool_t abort, const char *location,
44 const char *msg)
45{
46 // The default error handler function. It prints the message on stderr and
47 // if abort is set it aborts the application. Comapared to the default
48 // ROOT error handler this one also prints the date and time in front
49 // of each message.
50
51 if (level < gErrorIgnoreLevel)
52 return;
53
54 const char *type = 0;
55
56 if (level >= kInfo)
57 type = "Info";
58 if (level >= kWarning)
59 type = "Warning";
60 if (level >= kError)
61 type = "Error";
62 if (level >= kBreak)
63 type = "\n *** Break ***";
64 if (level >= kSysError)
65 type = "SysError";
66 if (level >= kFatal)
67 type = "Fatal";
68
69 TDatime dt;
70
71 if (level >= kBreak && level < kSysError)
72 fprintf(stderr, "%s: %s %s\n", dt.AsSQLString(), type, msg);
73 else if (!location || strlen(location) == 0)
74 fprintf(stderr, "%s: %s: %s\n", dt.AsSQLString(), type, msg);
75 else
76 fprintf(stderr, "%s: %s in <%s>: %s\n", dt.AsSQLString(), type, location,
77 msg);
78
79 fflush(stderr);
80 if (abort) {
81 fprintf(stderr, "aborting\n");
82 fflush(stderr);
83 if (gSystem) {
84 gSystem->StackTrace();
85 gSystem->Abort();
86 } else
87 ::abort();
88 }
89}
5ea08be4 90
91#ifdef USE_SMI
24df3da7 92static void SMI_handle_command()
5ea08be4 93{
94 // Handle SMI commands
95
96 char action[64], param[64];
97 int n_params;
98
99 smi_get_action(action, &n_params);
100 if (n_params >= 1) {
101 smi_get_par_value("PARAM", param);
102 } else {
103 strcpy(param, "");
104 }
105 if (strcmp(action, "STOP") == 0) {
a197a4ce 106 if (AliMDC::Instance()) AliMDC::Instance()->SetStopLoop();
5ea08be4 107 }
108 smi_set_state("RUNNING");
109}
110#endif
111
112//______________________________________________________________________________
113static void Usage(const char *prognam)
114{
115#ifdef USE_SMI
e10815f1 116 fprintf(stderr, "Usage: %s <sminame> <dbsize> <tagdbsize> <filter> <compmode> [date_file]\n",
5ea08be4 117 prognam);
118 fprintf(stderr, " <sminame> = name used by SMI\n");
119#else
e10815f1 120 fprintf(stderr, "Usage: %s <dbsize> <tagdbsize> <filter> <compmode> [date_file]\n",
5ea08be4 121 prognam);
122#endif
123 fprintf(stderr, " <dbsize> = maximum raw DB size (in bytes)\n");
124 fprintf(stderr, " (precede by - to delete raw and tag databases on close)\n");
e10815f1 125 fprintf(stderr, " <tagdbsize> = maximum tag DB size (in bytes, 0 for no tag DB)\n");
126 fprintf(stderr, " (precede by - to switch off the run DB)\n");
127 fprintf(stderr, " (precede by + to fill only the local run DB)\n");
128 fprintf(stderr, " <filter> = state of 3rd level filter (0: off, 1: transparent, 2: on)\n");
5ea08be4 129 fprintf(stderr, " <compmode> = compression level (see TFile)\n");
130 fprintf(stderr, " (precede by - to use RFIO, -0 is RFIO and 0 compression)\n");
9174317d 131 fprintf(stderr, " (precede by + to use rootd, +0 is rootd and 0 compression)\n");
132 fprintf(stderr, " (precede by %% to use Castor/rootd, %%0 is Castor/rootd and 0 compression)\n");
5ea08be4 133 fprintf(stderr, " (precede by @ to use /dev/null as sink)\n");
5ea08be4 134 fprintf(stderr, " [date_file] = optional input file (default reads from DATE EventBuffer)\n");
5ea08be4 135 fprintf(stderr, " (precede with - for endless loop on same file (use SIGUSR1 to stop)\n");
136}
137
138//______________________________________________________________________________
139int main(int argc, char **argv)
140{
141 // Convert a DATE data stream to a ROOT DB.
142
143 // Set ROOT in batch mode
144 gROOT->SetBatch();
145
24df3da7 146 // Set custom error handler
e10815f1 147 AliLog::SetHandleRootMessages(kFALSE);
24df3da7 148 SetErrorHandler(AliMDCErrorHandler);
149
e10815f1 150 // Default file system locations
151#ifdef USE_EB
152 const char* rawDBFS[2] = { "/data1/mdc", "/data2/mdc" };
153 const char* tagDBFS = "/data1/mdc/tags";
154 const char* runDBFS = "/data1/mdc/meta";
155 const char* rfioFS = "rfio:/castor/cern.ch/lcg/dc5";
156 const char* castorFS = "castor:/castor/cern.ch/lcg/dc5";
157#else
158 const char* rawDBFS[2] = { "/tmp/mdc1", "/tmp/mdc2" };
159 const char* tagDBFS = "/tmp/mdc1/tags";
160 const char* runDBFS = "/tmp/mdc1/meta";
161 TString user(gSystem->Getenv("USER")[0] + TString("/") +
162 gSystem->Getenv("USER"));
163 TString rfioStr("rfio:/castor/cern.ch/user/" + user);
164 const char* rfioFS = rfioStr.Data();
165 TString castorStr("castor:/castor/cern.ch/user/" + user);
166 const char* castorFS = castorStr.Data();
167#endif
168 const char* rootdFS = "root://localhost//tmp/mdc1";
f07ec911 169 // const char* alienHost = "alien://aliens7.cern.ch:15000/?direct";
170 const char* alienHost = NULL;
e10815f1 171 const char* alienDir = "/alice_mdc/DC";
172
173 // User defined file system locations
174 if (gSystem->Getenv("ALIMDC_RAWDB1"))
175 rawDBFS[0] = gSystem->Getenv("ALIMDC_RAWDB1");
176 if (gSystem->Getenv("ALIMDC_RAWDB2"))
177 rawDBFS[1] = gSystem->Getenv("ALIMDC_RAWDB2");
178 if (gSystem->Getenv("ALIMDC_TAGDB"))
179 tagDBFS = gSystem->Getenv("ALIMDC_TAGDB");
180 if (gSystem->Getenv("ALIMDC_RUNDB"))
181 runDBFS = gSystem->Getenv("ALIMDC_RUNDB");
182 if (gSystem->Getenv("ALIMDC_RFIO"))
183 rfioFS = gSystem->Getenv("ALIMDC_RFIO");
184 if (gSystem->Getenv("ALIMDC_CASTOR"))
185 castorFS = gSystem->Getenv("ALIMDC_CASTOR");
186 if (gSystem->Getenv("ALIMDC_ROOTD"))
187 rootdFS = gSystem->Getenv("ALIMDC_ROOTD");
188 if (gSystem->Getenv("ALIMDC_ALIENHOST"))
189 alienHost = gSystem->Getenv("ALIMDC_ALIENHOST");
190 if (gSystem->Getenv("ALIMDC_ALIENDIR"))
191 alienDir = gSystem->Getenv("ALIMDC_ALIENDIR");
192
193 // Handle command line arguments
5ea08be4 194 if ((argc == 2 && (!strcmp(argv[1], "-?") || !strcmp(argv[1], "-help"))) ||
e10815f1 195#ifdef USE_SMI
196 argc > 7 || argc < 6) {
197#else
5ea08be4 198 argc > 6 || argc < 5) {
e10815f1 199#endif
5ea08be4 200 Usage(argv[0]);
201 return 1;
202 }
203
e10815f1 204 Int_t iarg = 1;
205#ifdef USE_SMI
5ea08be4 206 char smiobj[128];
e10815f1 207 strcpy(smiobj, argv[iarg]);
5ea08be4 208 smi_attach(smiobj, SMI_handle_command);
209 smi_volatile();
210 smi_set_state("RUNNING");
e10815f1 211 iarg++;
5ea08be4 212#endif
213
9174317d 214 AliMDC::EWriteMode wmode = AliMDC::kLOCAL;
e10815f1 215 Int_t filterMode = 0;
216 Bool_t useLoop = kFALSE;
5ea08be4 217 Bool_t delFiles = kFALSE;
e10815f1 218 Bool_t rdbmsRunDB = kTRUE;
219 Int_t compress;
5ea08be4 220 Double_t maxFileSize;
e10815f1 221 Double_t maxTagSize;
222 const char* fs1 = NULL;
223 const char* fs2 = NULL;
5ea08be4 224
225 // no special arg checking so don't make errors
e10815f1 226 if (argv[iarg][0] == '-') {
5ea08be4 227 delFiles = kTRUE;
e10815f1 228 maxFileSize = atoi(argv[iarg]+1);
5ea08be4 229 } else
e10815f1 230 maxFileSize = atoi(argv[iarg]);
5ea08be4 231 if (maxFileSize < 1000 || maxFileSize > 2.e9) {
232 Error(argv[0], "unreasonable file size %f\n", maxFileSize);
233 return 1;
234 }
e10815f1 235 iarg++;
236
237 if (argv[iarg][0] == '-') {
238 runDBFS = NULL;
239 rdbmsRunDB = kFALSE;
240 alienHost = alienDir = NULL;
241 maxTagSize = atoi(argv[iarg]+1);
242 } else if (argv[iarg][0] == '+') {
243 rdbmsRunDB = kFALSE;
244 alienHost = alienDir = NULL;
245 maxTagSize = atoi(argv[iarg]+1);
246 } else
247 maxTagSize = atoi(argv[iarg]);
248 if (maxTagSize > 0 && (maxTagSize < 1000 || maxTagSize > 2.e9)) {
249 Error(argv[0], "unreasonable tag file size %f\n", maxTagSize);
250 return 1;
251 }
252 if (maxTagSize == 0) tagDBFS = NULL;
253 iarg++;
5ea08be4 254
e10815f1 255 filterMode = atoi(argv[iarg]);
256 if (filterMode < 0 || filterMode > 2) {
257 Error(argv[0], "unreasonable filter mode %d\n", filterMode);
258 return 1;
259 }
260 iarg++;
5ea08be4 261
e10815f1 262 if (argv[iarg][0] == '-') {
9174317d 263 wmode = AliMDC::kRFIO;
e10815f1 264 compress = atoi(argv[iarg]+1);
265 fs1 = rfioFS;
266 } else if (argv[iarg][0] == '+') {
9174317d 267 wmode = AliMDC::kROOTD;
e10815f1 268 compress = atoi(argv[iarg]+1);
269 fs1 = rootdFS;
270 } else if (argv[iarg][0] == '%') {
9174317d 271 wmode = AliMDC::kCASTOR;
e10815f1 272 compress = atoi(argv[iarg]+1);
273 fs1 = castorFS;
274 } else if (argv[iarg][0] == '@') {
9174317d 275 wmode = AliMDC::kDEVNULL;
e10815f1 276 compress = atoi(argv[iarg]+1);
277 } else {
278 compress = atoi(argv[iarg]);
279 fs1 = rawDBFS[0];
280 fs2 = rawDBFS[1];
281 }
5ea08be4 282 if (compress > 9) {
283 Error(argv[0], "unreasonable compression mode %d\n", compress);
284 return 1;
285 }
e10815f1 286 iarg++;
5ea08be4 287
e10815f1 288 char* file = NULL;
289 if (iarg < argc) {
290 file = argv[iarg];
291 if (argv[iarg][0] == '-') {
5ea08be4 292 useLoop = kTRUE;
e10815f1 293 file = argv[iarg]+1;
5ea08be4 294 }
295 }
296
297 // Create MDC processor object and process input stream
e10815f1 298 AliMDC mdcproc(compress, delFiles, AliMDC::EFilterMode(filterMode),
299 runDBFS, rdbmsRunDB, alienHost, alienDir,
300 maxTagSize, tagDBFS);
d67af9b1 301
e10815f1 302 Int_t result = mdcproc.Run(file, useLoop, wmode, maxFileSize, fs1, fs2);
d67af9b1 303
304 if (result == 0)
305 Info(argv[0], "normal termination of run");
306 else
307 Error(argv[0], "error termination of run, status: %d", result);
13d0d987 308 return result;
5ea08be4 309}