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 **************************************************************************/
16 ///////////////////////////////////////////////////////////////////////////////
18 /// This is a class for reading raw data from a date monitoring libraries.
19 /// It supports two modes - event taken from shared memory via DATE monitoring
20 /// libs, or an emulation mode when the events are taken from a DATE file using
21 /// the same monitoring libs.
22 /// The constructor requires an argument:
24 /// : - events are taken from shared memory
26 /// <DATE_filename> - events are taken from date file
28 /// Cvetan Cheshkov 1/04/2008
29 ///////////////////////////////////////////////////////////////////////////////
32 #include "AliRawReaderDateOnline.h"
39 ClassImp(AliRawReaderDateOnline)
41 Bool_t AliRawReaderDateOnline::fgNoSleep = kTRUE;
43 AliRawReaderDateOnline::AliRawReaderDateOnline(
47 const char* /* filename */
49 , const Char_t** customTable) :
50 AliRawReaderDate((void*)NULL),
56 // Initialize the DATE monitoring libs
61 // Removal of the selection of physics events
62 // Requested by Filimon and FMD experts
63 // fSelectEventType = PHYSICS_EVENT;
67 /* define data source : this is argument 1 */
68 status=monitorSetDataSource( (char* )filename );
70 AliFatal(Form("monitorSetDataSource() failed : %s",monitorDecodeError(status)));
73 /* declare monitoring program */
74 status=monitorDeclareMp( __FILE__ );
76 AliFatal(Form("monitorDeclareMp() failed : %s",monitorDecodeError(status)));
79 /* define wait event timeout - 1s max */
81 monitorSetNoWaitNetworkTimeout(1000);
84 const Char_t* table[] = {"ALL", "few", "*", "*",
85 "EOR", "yes","*", "*",
86 NULL, NULL, NULL, NULL};
87 monitorDeclareTableExtended(const_cast<char**>(table));
90 AliInfo("Custom monitoring table:");
92 while (fTable[index] != NULL) {
93 AliInfo(Form("%s %s %s %s",fTable[index],fTable[index+1],fTable[index+2],fTable[index+3]));
96 monitorDeclareTableExtended(const_cast<char**>(fTable));
98 // install SIGUSR1 handler to allow clean end-of-events loop
99 gSystem->AddSignalHandler(new AliRawReaderDateIntHandler(this));
102 Fatal("AliRawReaderDateOnline", "this class was compiled without DATE");
106 Bool_t AliRawReaderDateOnline::NextEvent()
108 // wait and get the next event
109 // from shared memory
115 AliInfo("Raw-data reading stopped by SIGUSR1");
116 if (fEvent) free(fEvent);
121 // Event already loaded no need take a new one
122 if (AliRawReaderDate::NextEvent()) return kTRUE;
124 if (fEvent) free(fEvent);
128 /* get next event (blocking call until timeout) */
129 int status=monitorGetEventDynamic((void**)&fEvent);
131 if (status==MON_ERR_EOF) {
132 AliInfo("End of File detected");
135 return kFALSE; /* end of monitoring file has been reached */
139 AliError(Form("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status)));
145 /* retry if got no event */
147 if (fgNoSleep) gSystem->ProcessEvents();
151 eventTypeType eventT=fEvent->eventType;
152 /* exit when last event received, no need to wait for TERM signal */
153 if (eventT==END_OF_RUN) {
154 AliInfo("EOR event detected");
161 if (!IsEventSelected()) {
164 if (fgNoSleep) gSystem->ProcessEvents();
168 AliInfo(Form("Run #%lu, event size: %lu, BC:0x%x, Orbit:0x%x, Period:0x%x",
169 (unsigned long)fEvent->eventRunNb,
170 (unsigned long)fEvent->eventSize,
171 EVENT_ID_GET_BUNCH_CROSSING(fEvent->eventId),
172 EVENT_ID_GET_ORBIT(fEvent->eventId),
173 EVENT_ID_GET_PERIOD(fEvent->eventId)
190 AliRawReaderDateOnline::~AliRawReaderDateOnline()
193 // Free the last event in shared memory
196 if (fEvent) free(fEvent);
200 void AliRawReaderDateOnline::SelectEvents(Int_t type,
201 ULong64_t triggerMask,
202 const char *triggerExpr)
204 // Select event by using DATE monitoring
207 const Char_t* table[] = {"ALL", "no", "*", "*",
208 "PHY", "yes","*", "*",
209 "EOR", "yes","*", "*",
210 NULL, NULL, NULL, NULL};
212 for (Int_t i = 0; i < 50; i++) {
213 if (triggerMask & (1ull << i)) {
214 if (!trSelection.IsNull()) trSelection += "&";
215 trSelection += Form("%d",i);
218 table[7] = trSelection.Data();
221 monitorDeclareTableExtended(const_cast<char**>(table));
224 AliRawReader::SelectEvents(type,triggerMask,triggerExpr);
227 //______________________________________________________________________________
228 void AliRawReaderDateOnline::Stop()
230 // Stop the event loop (called on SIGUSR1)