fix coding convention violations
[u/mrichter/AliRoot.git] / RAW / alimdc_main.cxx
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
26 #ifdef USE_SMI
27 extern "C" {
28    #include <smirtl.h>
29 }
30 #endif
31
32 #include "AliMDC.h"
33
34 //______________________________________________________________________________
35 static void AliMDCErrorHandler(int level, Bool_t abort, const char *location,
36                                const char *msg)
37 {
38    // The default error handler function. It prints the message on stderr and
39    // if abort is set it aborts the application. Comapared to the default
40    // ROOT error handler this one also prints the date and time in front
41    // of each message.
42
43    if (level < gErrorIgnoreLevel)
44       return;
45
46    const char *type = 0;
47
48    if (level >= kInfo)
49       type = "Info";
50    if (level >= kWarning)
51       type = "Warning";
52    if (level >= kError)
53       type = "Error";
54    if (level >= kBreak)
55       type = "\n *** Break ***";
56    if (level >= kSysError)
57       type = "SysError";
58    if (level >= kFatal)
59       type = "Fatal";
60
61    TDatime dt;
62
63    if (level >= kBreak && level < kSysError)
64       fprintf(stderr, "%s: %s %s\n", dt.AsSQLString(), type, msg);
65    else if (!location || strlen(location) == 0)
66       fprintf(stderr, "%s: %s: %s\n", dt.AsSQLString(), type, msg);
67    else
68       fprintf(stderr, "%s: %s in <%s>: %s\n", dt.AsSQLString(), type, location,
69               msg);
70
71    fflush(stderr);
72    if (abort) {
73       fprintf(stderr, "aborting\n");
74       fflush(stderr);
75       if (gSystem) {
76          gSystem->StackTrace();
77          gSystem->Abort();
78       } else
79          ::abort();
80    }
81 }
82
83 #ifdef USE_SMI
84 static void SMI_handle_command()
85 {
86    // Handle SMI commands
87
88    char action[64], param[64];
89    int n_params;
90
91    smi_get_action(action, &n_params);
92    if (n_params >= 1) {
93       smi_get_par_value("PARAM", param);
94    } else {
95       strcpy(param, "");
96    }
97    if (strcmp(action, "STOP") == 0) {
98       if (AliMDC::Instance()) AliMDC::Instance()->SetStopLoop();
99    }
100    smi_set_state("RUNNING");
101 }
102 #endif
103
104 //______________________________________________________________________________
105 static void Usage(const char *prognam)
106 {
107 #ifdef USE_SMI
108       fprintf(stderr, "Usage: %s <sminame> <dbsize> <filter> <compmode> [date_file]\n",
109               prognam);
110       fprintf(stderr, " <sminame> = name used by SMI\n");
111 #else
112       fprintf(stderr, "Usage: %s <dbsize> <filter> <compmode> [date_file]\n",
113               prognam);
114 #endif
115       fprintf(stderr, " <dbsize> = maximum raw DB size (in bytes)\n");
116       fprintf(stderr, "    (precede by - to delete raw and tag databases on close)\n");
117       fprintf(stderr, " <filter> = state of 3rd level filter (0 or 1)\n");
118       fprintf(stderr, " <compmode> = compression level (see TFile)\n");
119       fprintf(stderr, "    (precede by - to use RFIO, -0 is RFIO and 0 compression)\n");
120       fprintf(stderr, "    (precede by + to use rootd, +0 is rootd and 0 compression)\n");
121       fprintf(stderr, "    (precede by %% to use Castor/rootd, %%0 is Castor/rootd and 0 compression)\n");
122       fprintf(stderr, "    (precede by @ to use /dev/null as sink)\n");
123 #ifdef USE_EB
124       fprintf(stderr, " [date_file] = optional input file (default reads from DATE EventBuffer)\n");
125 #else
126       fprintf(stderr, " [date_file] = optional input file (default reads from pipe /tmp/alimdc.fifo)\n");
127 #endif
128       fprintf(stderr, "    (precede with - for endless loop on same file (use SIGUSR1 to stop)\n");
129 }
130
131 //______________________________________________________________________________
132 int main(int argc, char **argv)
133 {
134    // Convert a DATE data stream to a ROOT DB.
135
136    // Set ROOT in batch mode
137    gROOT->SetBatch();
138
139    // Set custom error handler
140    SetErrorHandler(AliMDCErrorHandler);
141
142 #ifdef USE_SMI
143     // Handle command line arguments
144    if ((argc == 2 && (!strcmp(argv[1], "-?") || !strcmp(argv[1], "-help"))) ||
145        argc > 6 || argc < 5) {
146       Usage(argv[0]);
147       return 1;
148    }
149
150    char smiobj[128];
151    strcpy(smiobj, argv[1]);
152    smi_attach(smiobj, SMI_handle_command);
153    smi_volatile();
154    smi_set_state("RUNNING");
155
156    for (int i = 1; i < argc-1; i++)
157       argv[i] = argv[i+1];
158    argc--;
159
160 #else
161    // Handle command line arguments
162    if ((argc == 2 && (!strcmp(argv[1], "-?") || !strcmp(argv[1], "-help"))) ||
163        argc > 5 || argc < 4) {
164       Usage(argv[0]);
165       return 1;
166    }
167 #endif
168
169    AliMDC::EWriteMode wmode = AliMDC::kLOCAL;
170    Bool_t   useFilter = kFALSE, useLoop = kFALSE;
171    Bool_t   delFiles = kFALSE;
172    Int_t    fd = -1, compress;
173    Double_t maxFileSize;
174
175    // no special arg checking so don't make errors
176    if (argv[1][0] == '-') {
177       delFiles = kTRUE;
178       maxFileSize = atoi(argv[1]+1);
179    } else
180       maxFileSize = atoi(argv[1]);
181    if (maxFileSize < 1000 || maxFileSize > 2.e9) {
182       Error(argv[0], "unreasonable file size %f\n", maxFileSize);
183       return 1;
184    }
185
186    int filter = atoi(argv[2]);
187    if (filter != 0)
188       useFilter = kTRUE;
189
190    if (argv[3][0] == '-') {
191       wmode = AliMDC::kRFIO;
192       compress = atoi(argv[3]+1);
193    } else if (argv[3][0] == '+') {
194       wmode = AliMDC::kROOTD;
195       compress = atoi(argv[3]+1);
196    } else if (argv[3][0] == '%') {
197       wmode = AliMDC::kCASTOR;
198       compress = atoi(argv[3]+1);
199    } else if (argv[3][0] == '@') {
200       wmode = AliMDC::kDEVNULL;
201       compress = atoi(argv[3]+1);
202    } else
203       compress = atoi(argv[3]);
204    if (compress > 9) {
205       Error(argv[0], "unreasonable compression mode %d\n", compress);
206       return 1;
207    }
208
209    if (argc == 5) {
210       char *file = argv[4];
211       if (argv[4][0] == '-') {
212          useLoop = kTRUE;
213          file = argv[4]+1;
214       }
215       if ((fd = open(file, O_RDONLY)) == -1) {
216          Error(argv[0], "cannot open input file %s", argv[4]);
217          return 1;
218       }
219    }
220
221    // Create MDC processor object and process input stream
222    AliMDC mdcproc(fd, compress, maxFileSize, useFilter, wmode, useLoop, delFiles);
223
224 #ifdef USE_DEBUG
225    mdcproc.SetDebugLevel(3);
226 #endif
227
228    Int_t result = 0;
229
230    result = mdcproc.Run();
231
232    if (result == 0)
233       Info(argv[0], "normal termination of run");
234    else
235       Error(argv[0], "error termination of run, status: %d", result);
236    return result;
237 }