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"
41 // avoid loading pythia and pdf
46 //_____________________________________________________________________________
47 class AliGDCInterruptHandler : public TSignalHandler {
49 AliGDCInterruptHandler();
50 Bool_t Notify() {fStop = kTRUE; return kTRUE;};
51 Bool_t Stop() const {return fStop;};
53 Bool_t fStop; // CTRL-C pressed
56 //_____________________________________________________________________________
57 AliGDCInterruptHandler::AliGDCInterruptHandler() :
58 TSignalHandler(kSigInterrupt, kFALSE)
64 //_____________________________________________________________________________
66 int main(int argc, char** argv)
68 // set ROOT in batch mode
71 // get data from a file or online from this node
74 status = monitorSetDataSource(argv[1]);
76 status = monitorSetDataSource(":");
78 if (status) ::Fatal("monitorSetDataSource", monitorDecodeError(status));
80 // monitor only a sample of physics events
81 char* table[] = {"Physics event", "yes", NULL};
82 status = monitorDeclareTable(table);
83 if (status) ::Fatal("monitorDeclareTable", monitorDecodeError(status));
85 // declare this monitoring program to DATE
86 status = monitorDeclareMp("data consistency check");
87 if (status) ::Fatal("monitorDeclareMp", monitorDecodeError(status));
89 // create the signal handler
90 AliGDCInterruptHandler* handler = new AliGDCInterruptHandler;
91 gSystem->AddSignalHandler(handler);
95 while (!handler->Stop()) {
97 status = monitorGetEventDynamic(&ptr);
98 if (status == (Int_t)MON_ERR_EOF) break;
99 if (status) ::Fatal("monitorGetEventDynamic", monitorDecodeError(status));
103 gSystem->Sleep(1000); // sleep for 1 second
108 AliRawReaderDate rawReader(ptr);
109 Int_t errorCode = rawReader.CheckData();
110 if ((errorCode != 0) && (errorCode != AliRawReader::kErrSize)) {
112 printf("\n%s\n", time.AsString());
113 const char* errMsg[6] = {"no error", "wrong magic word in sub event",
115 "wrong magic word in mini header",
116 "inconsistent size in sub event and mini header",
117 "access to data out of bounds"};
118 printf("Error: %s\n", errMsg[errorCode]);
119 printf("run: %d event: %d %d\n", rawReader.GetRunNumber(),
120 rawReader.GetEventId()[0], rawReader.GetEventId()[1]);
121 printf("trigger: %08x %08x detector: %08x\n",
122 rawReader.GetTriggerPattern()[0],
123 rawReader.GetTriggerPattern()[1],
124 rawReader.GetDetectorPattern()[0]);
125 printf("attributes: %08x %08x %08x\n", rawReader.GetAttributes()[0],
126 rawReader.GetAttributes()[1], rawReader.GetAttributes()[2]);
130 gSystem->ProcessEvents();
133 gSystem->RemoveSignalHandler(handler);
139 int main(int /*argc*/, char** /*argv*/)
141 ::Fatal("main", "this program was compiled without DATE");