1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // this program performs local monitoring on a GDC and checks the //
21 // consistency of the data //
23 // If an argument is given, this is taken as the name of a date file which //
24 // is used instead of the local node. //
25 // The program can be stopped by pressing CTRL-C. //
27 ///////////////////////////////////////////////////////////////////////////////
30 #include <TSysEvtHandler.h>
35 #include "AliRawReaderDate.h"
40 //_____________________________________________________________________________
41 class AliGDCInterruptHandler : public TSignalHandler {
43 AliGDCInterruptHandler();
44 Bool_t Notify() {fStop = kTRUE; return kTRUE;};
45 Bool_t Stop() const {return fStop;};
47 Bool_t fStop; // CTRL-C pressed
50 //_____________________________________________________________________________
51 AliGDCInterruptHandler::AliGDCInterruptHandler() :
52 TSignalHandler(kSigInterrupt, kFALSE)
58 //_____________________________________________________________________________
60 int main(int argc, char** argv)
62 // set ROOT in batch mode
65 // get data from a file or online from this node
68 status = monitorSetDataSource(argv[1]);
70 status = monitorSetDataSource(":");
72 if (status) ::Fatal("monitorSetDataSource", monitorDecodeError(status));
74 // monitor only a sample of physics events
75 char* table[] = {"Physics event", "yes", NULL};
76 status = monitorDeclareTable(table);
77 if (status) ::Fatal("monitorDeclareTable", monitorDecodeError(status));
79 // declare this monitoring program to DATE
80 status = monitorDeclareMp("data consistency check");
81 if (status) ::Fatal("monitorDeclareMp", monitorDecodeError(status));
83 // create the signal handler
84 AliGDCInterruptHandler* handler = new AliGDCInterruptHandler;
85 gSystem->AddSignalHandler(handler);
89 while (!handler->Stop()) {
91 status = monitorGetEventDynamic(&ptr);
92 if (status == (Int_t)MON_ERR_EOF) break;
93 if (status) ::Fatal("monitorGetEventDynamic", monitorDecodeError(status));
97 gSystem->Sleep(1000); // sleep for 1 second
102 AliRawReaderDate rawReader(ptr);
103 Int_t errorCode = rawReader.CheckData();
104 if ((errorCode != 0) && (errorCode != AliRawReader::kErrSize)) {
106 printf("\n%s\n", time.AsString());
107 const char* errMsg[6] = {"no error", "wrong magic word in sub event",
109 "wrong magic word in mini header",
110 "inconsistent size in sub event and mini header",
111 "access to data out of bounds"};
112 printf("Error: %s\n", errMsg[errorCode]);
113 printf("run: %d event: %d %d\n", rawReader.GetRunNumber(),
114 rawReader.GetEventId()[0], rawReader.GetEventId()[1]);
115 printf("trigger: %08x %08x detector: %08x\n",
116 rawReader.GetTriggerPattern()[0],
117 rawReader.GetTriggerPattern()[1],
118 rawReader.GetDetectorPattern()[0]);
119 printf("attributes: %08x %08x %08x\n", rawReader.GetAttributes()[0],
120 rawReader.GetAttributes()[1], rawReader.GetAttributes()[2]);
124 gSystem->ProcessEvents();
127 gSystem->RemoveSignalHandler(handler);
133 int main(int /*argc*/, char** /*argv*/)
135 ::Fatal("main", "this program was compiled without DATE");