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),
59 //_____________________________________________________________________________
61 int main(int argc, char** argv)
63 // set ROOT in batch mode
66 // get data from a file or online from this node
69 status = monitorSetDataSource(argv[1]);
71 status = monitorSetDataSource(":");
73 if (status) ::Fatal("monitorSetDataSource", monitorDecodeError(status));
75 // monitor only a sample of physics events
76 char* table[] = {"Physics event", "yes", NULL};
77 status = monitorDeclareTable(table);
78 if (status) ::Fatal("monitorDeclareTable", monitorDecodeError(status));
80 // declare this monitoring program to DATE
81 status = monitorDeclareMp("data consistency check");
82 if (status) ::Fatal("monitorDeclareMp", monitorDecodeError(status));
84 // create the signal handler
85 AliGDCInterruptHandler* handler = new AliGDCInterruptHandler;
86 gSystem->AddSignalHandler(handler);
90 while (!handler->Stop()) {
92 status = monitorGetEventDynamic(&ptr);
93 if (status == (Int_t)MON_ERR_EOF) break;
94 if (status) ::Fatal("monitorGetEventDynamic", monitorDecodeError(status));
98 gSystem->Sleep(1000); // sleep for 1 second
103 AliRawReaderDate rawReader(ptr);
104 Int_t errorCode = rawReader.CheckData();
105 if ((errorCode != 0) && (errorCode != AliRawReader::kErrSize)) {
107 printf("\n%s\n", time.AsString());
108 const char* errMsg[6] = {"no error", "wrong magic word in sub event",
110 "wrong magic word in mini header",
111 "inconsistent size in sub event and mini header",
112 "access to data out of bounds"};
113 printf("Error: %s\n", errMsg[errorCode]);
114 printf("run: %d event: %d %d\n", rawReader.GetRunNumber(),
115 rawReader.GetEventId()[0], rawReader.GetEventId()[1]);
116 printf("trigger: %08x %08x detector: %08x\n",
117 rawReader.GetTriggerPattern()[0],
118 rawReader.GetTriggerPattern()[1],
119 rawReader.GetDetectorPattern()[0]);
120 printf("attributes: %08x %08x %08x\n", rawReader.GetAttributes()[0],
121 rawReader.GetAttributes()[1], rawReader.GetAttributes()[2]);
125 gSystem->ProcessEvents();
128 gSystem->RemoveSignalHandler(handler);
134 int main(int /*argc*/, char** /*argv*/)
136 ::Fatal("main", "this program was compiled without DATE");