242b230020cbbdba2e283dff48047971b3be54a9
[u/mrichter/AliRoot.git] / RAW / AliRawReaderDateOnline.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 ///////////////////////////////////////////////////////////////////////////////
17 ///
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:
23 ///
24 /// : - events are taken from shared memory
25 ///  or
26 /// <DATE_filename> - events are taken from date file
27 ///
28 /// Cvetan Cheshkov 1/04/2008
29 ///////////////////////////////////////////////////////////////////////////////
30
31 #include "AliRawReaderDateOnline.h"
32 #include "AliLog.h"
33 #ifdef ALI_DATE
34 #include "event.h"
35 #include "monitor.h"
36 #endif
37
38 ClassImp(AliRawReaderDateOnline)
39
40 AliRawReaderDateOnline::AliRawReaderDateOnline(
41 #ifdef ALI_DATE
42                                    const char* filename
43 #else
44                                    const char* /* filename */
45 #endif
46                                    ) :
47   AliRawReaderDate((void*)NULL)
48 {
49
50 // Constructor
51 // Initialize the DATE monitoring libs
52
53 #ifdef ALI_DATE
54
55
56   //  Removal of the selection of physics events
57   //  Requested by Filimon and FMD experts
58   //  fSelectEventType = PHYSICS_EVENT;
59
60   int status;
61
62   /* define data source : this is argument 1 */  
63   status=monitorSetDataSource( (char* )filename );
64   if (status!=0) {
65     AliFatal(Form("monitorSetDataSource() failed : %s",monitorDecodeError(status)));
66   }
67
68   /* declare monitoring program */
69   status=monitorDeclareMp( __FILE__ );
70   if (status!=0) {
71     AliFatal(Form("monitorDeclareMp() failed : %s",monitorDecodeError(status)));
72   }
73
74   /* define wait event timeout - 1s max */
75   monitorSetNowait();
76   monitorSetNoWaitNetworkTimeout(1000);
77
78   const Char_t* table[]  = {"ALL", "yes", "*", "*",
79                             "EOR", "all","*", "*",
80                             NULL, NULL, NULL, NULL};
81   monitorDeclareTableExtended(const_cast<char**>(table));
82
83 #else
84   Fatal("AliRawReaderDateOnline", "this class was compiled without DATE");
85 #endif
86 }
87
88 Bool_t AliRawReaderDateOnline::NextEvent()
89 {
90 // wait and get the next event
91 // from shared memory
92
93 #ifdef ALI_DATE
94
95   // Event already loaded no need take a new one
96   if (AliRawReaderDate::NextEvent()) return kTRUE;
97
98   if (fEvent) free(fEvent);
99   fEvent = NULL;
100
101   while (1) {
102     /* get next event (blocking call until timeout) */
103     int status=monitorGetEventDynamic((void**)&fEvent);
104
105     if (status==MON_ERR_EOF) {
106       AliInfo("End of File detected");
107       Reset();
108       fEvent = NULL;
109       return kFALSE; /* end of monitoring file has been reached */
110     }
111     
112     if (status!=0) {
113       AliError(Form("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status)));
114       Reset();
115       fEvent = NULL;
116       return kFALSE;
117     }
118     
119     /* retry if got no event */
120     if (fEvent==NULL) {
121       continue;
122     }
123     
124     eventTypeType eventT=fEvent->eventType;
125     /* exit when last event received, no need to wait for TERM signal */
126     if (eventT==END_OF_RUN) {
127       AliInfo("EOR event detected");
128       Reset();
129       free(fEvent);
130       fEvent = NULL;
131       return kFALSE;
132     }
133     
134     if (!IsEventSelected()) {
135       free(fEvent);
136       continue;
137     }
138
139     AliInfo(Form("Run #%lu, event size: %lu, BC:0x%x, Orbit:0x%x, Period:0x%x",
140                  (unsigned long)fEvent->eventRunNb,
141                  (unsigned long)fEvent->eventSize,
142                  EVENT_ID_GET_BUNCH_CROSSING(fEvent->eventId),
143                  EVENT_ID_GET_ORBIT(fEvent->eventId),
144                  EVENT_ID_GET_PERIOD(fEvent->eventId)
145                  ));
146     break;
147   }
148
149   fEventNumber++;
150   Reset();
151
152   return kTRUE;
153
154 }
155
156 #else
157   return kFALSE;
158 }
159 #endif
160
161 AliRawReaderDateOnline::~AliRawReaderDateOnline()
162 {
163 // Destructor
164 // Free the last event in shared memory
165
166 #ifdef ALI_DATE
167   if (fEvent) free(fEvent);
168 #endif
169 }
170
171 void AliRawReaderDateOnline::SelectEvents(Int_t type,
172   ULong64_t triggerMask,
173   const char *triggerExpr)
174 {
175   // Select event by using DATE monitoring
176   // library
177 #ifdef ALI_DATE
178   const Char_t* table[]  = {"ALL", "no", "*", "*",
179                             "PHY", "yes","*", "*",
180                             "EOR", "all","*", "*",
181                             NULL, NULL, NULL, NULL};
182   TString trSelection;
183   for (Int_t i = 0; i < 50; i++) {
184     if (triggerMask & (1ull << i)) {
185         if (!trSelection.IsNull()) trSelection += "&";
186         trSelection += Form("%d",i+1);
187     }
188   }
189   table[7] = trSelection.Data();
190
191   monitorDeclareTableExtended(const_cast<char**>(table));
192   
193 #endif
194   AliRawReader::SelectEvents(type,triggerMask,triggerExpr);
195 }