Updating the AliAnalysisFemtoTask to work with
[u/mrichter/AliRoot.git] / SHUTTLE / AliShuttleTrigger.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  $Log$
18  Revision 1.15  2007/12/10 18:29:23  acolla
19  Some log added to the listen mode
20
21  Revision 1.14  2007/12/07 19:14:36  acolla
22  in AliShuttleTrigger:
23
24  Added automatic collection of new runs on a regular time basis (settable from the configuration)
25
26  in AliShuttleConfig: new members
27
28  - triggerWait: time to wait for DIM trigger (s) before starting automatic collection of new runs
29  - mode: run mode (test, prod) -> used to build log folder (logs or logs_PROD)
30
31  in AliShuttle:
32
33  - logs now stored in logs/#RUN/DET_#RUN.log
34
35  Revision 1.13  2006/11/16 16:16:48  jgrosseo
36  introducing strict run ordering flag
37  removed giving preprocessor name to preprocessor, they have to know their name themselves ;-)
38
39  Revision 1.12  2006/10/20 15:22:59  jgrosseo
40  o) Adding time out to the execution of the preprocessors: The Shuttle forks and the parent process monitors the child
41  o) Merging Collect, CollectAll, CollectNew function
42  o) Removing implementation of empty copy constructors (declaration still there!)
43
44  Revision 1.11  2006/10/02 16:38:39  jgrosseo
45  update (alberto):
46  fixed memory leaks
47  storing of objects that failed to be stored to the grid before
48  interfacing of shuttle status table in daq system
49
50  Revision 1.10  2006/08/15 10:50:00  jgrosseo
51  effc++ corrections (alberto)
52
53  Revision 1.9  2006/08/08 14:19:29  jgrosseo
54  Update to shuttle classes (Alberto)
55
56  - Possibility to set the full object's path in the Preprocessor's and
57  Shuttle's  Store functions
58  - Possibility to extend the object's run validity in the same classes
59  ("startValidity" and "validityInfinite" parameters)
60  - Implementation of the StoreReferenceData function to store reference
61  data in a dedicated CDB storage.
62
63  Revision 1.8  2006/07/21 07:37:20  jgrosseo
64  last run is stored after each run
65
66  Revision 1.7  2006/07/20 09:54:40  jgrosseo
67  introducing status management: The processing per subdetector is divided into several steps,
68  after each step the status is stored on disk. If the system crashes in any of the steps the Shuttle
69  can keep track of the number of failures and skips further processing after a certain threshold is
70  exceeded. These thresholds can be configured in LDAP.
71
72  Revision 1.6  2006/07/19 10:09:55  jgrosseo
73  new configuration, accesst to DAQ FES (Alberto)
74
75  Revision 1.5  2006/07/10 13:01:41  jgrosseo
76  enhanced storing of last sucessfully processed run (alberto)
77
78  Revision 1.4  2006/07/04 14:59:57  jgrosseo
79  revision of AliDCSValue: Removed wrapper classes, reduced storage size per value by factor 2
80
81  Revision 1.3  2006/06/12 09:11:16  jgrosseo
82  coding conventions (Alberto)
83
84  Revision 1.2  2006/06/06 14:26:40  jgrosseo
85  o) removed files that were moved to STEER
86  o) shuttle updated to follow the new interface (Alberto)
87
88  Revision 1.1  2006/03/07 07:52:34  hristov
89  New version (B.Yordanov)
90
91  Revision 1.5  2005/11/21 09:03:48  byordano
92  one more print added
93
94  Revision 1.4  2005/11/20 10:12:37  byordano
95  comments added to AliShuttleTrigger
96
97  */
98
99
100 // 
101 // This class is to deal with DAQ LogBook and DAQ "end of run" notification.
102 // It has severeal two modes:
103 //      1) synchronized - Collect()
104 //      2) asynchronized - Run() - starts listening for DAQ "end of run"
105 //              notification by DIM service.
106 //
107
108 #include "AliShuttleTrigger.h"
109
110 #include <TSystem.h>
111
112 #include "AliLog.h"
113 #include "AliShuttleConfig.h"
114 #include "AliShuttle.h"
115 #include "DATENotifier.h"
116
117 ClassImp(TerminateSignalHandler)
118 ClassImp(AliShuttleTrigger)
119
120 //______________________________________________________________________________________________
121 Bool_t TerminateSignalHandler::Notify()
122 {
123 // Sentd terminate command to the Shuttle trigger
124
125         AliInfo("Terminate signal received ...");
126         fTrigger->Terminate();
127
128         return kTRUE;
129 }
130
131 //______________________________________________________________________________________________
132 AliShuttleTrigger::AliShuttleTrigger(const AliShuttleConfig* config):
133         fConfig(config), fShuttle(NULL),
134         fNotified(kFALSE), fTerminate(kFALSE),
135         fMutex(), fCondition(&fMutex),
136         fQuitSignalHandler(0),
137         fInterruptSignalHandler(0)
138 {
139         //
140         // config - pointer to the AliShuttleConfig object which represents
141         // the configuration
142         // mainStorage - pointer to AliCDBStorage for the undelying CDBStorage
143         // localStorage (local) CDB storage to be used if mainStorage is unavailable
144         //
145
146         if (!fConfig->IsValid()) AliFatal("********** !!!!! Invalid configuration !!!!! **********");
147         UInt_t timeout = fConfig->GetDCSTimeOut();
148         Int_t retries = fConfig->GetDCSRetries();
149         fShuttle = new AliShuttle(config, timeout, retries);
150
151         TerminateSignalHandler* fQuitSignalHandler = new TerminateSignalHandler(this, kSigQuit);
152         TerminateSignalHandler* fInterruptSignalHandler = new TerminateSignalHandler(this, kSigInterrupt);
153
154         gSystem->AddSignalHandler(fQuitSignalHandler);
155         gSystem->AddSignalHandler(fInterruptSignalHandler);
156
157 }
158
159 //______________________________________________________________________________________________
160 AliShuttleTrigger::~AliShuttleTrigger() 
161 {
162   // destructor
163
164         gSystem->RemoveSignalHandler(fQuitSignalHandler);
165         gSystem->RemoveSignalHandler(fInterruptSignalHandler);
166
167         delete fShuttle;
168
169   delete fQuitSignalHandler;
170   fQuitSignalHandler = 0;
171
172   delete fInterruptSignalHandler;
173   fInterruptSignalHandler = 0;
174 }
175
176 //______________________________________________________________________________________________
177 Bool_t AliShuttleTrigger::Notify() {
178         //
179         // Trigger Collect() methods in asynchronized (listen) mode.
180         // Usually called automaticly by DATENotifier on "end of run" 
181         // notification event.
182         //
183
184         fMutex.Lock();
185
186         fNotified = kTRUE;
187         fCondition.Signal();
188
189         fMutex.UnLock();
190
191         return kTRUE;
192 }
193
194 //______________________________________________________________________________________________
195 void AliShuttleTrigger::Terminate() {
196         //
197         // Stop triggers listen mode and exist from Run()
198         // Usually called automaticly by TerminateSignalHandler.
199         //
200
201         fTerminate = kTRUE;
202         fCondition.Signal();
203 }
204
205 //______________________________________________________________________________________________
206 void AliShuttleTrigger::Run() {
207         //
208         // AliShuttleTrigger main loop for asynchronized (listen) mode.
209         // It spawns DIM service listener and waits for DAQ "end of run"
210         // notification. Calls Collect() on notification.
211         //
212
213         fTerminate = kFALSE;
214
215         DATENotifier* notifier = new DATENotifier(this, "/DATE/LOGBOOK/UPDATE");
216
217         Int_t nTry=0; 
218         Int_t nMaxTry = fConfig->GetMaxRetries()+1;
219         Int_t received=0;
220         
221         AliInfo("Listening for ECS trigger");
222         
223         while (1) {
224         
225                 fMutex.Lock();
226
227                 while (!(fNotified || fTerminate)) {
228                         received=fCondition.TimedWaitRelative(1000*fConfig->GetTriggerWait());
229                         if (received==1) break; // 1 = timeout
230                 }
231
232                 fNotified = kFALSE;
233                 
234                 fMutex.UnLock();
235
236                 if (fTerminate) {
237                         AliInfo("Terminated.");
238                         break;          
239                 }
240                 
241                 if (received == 0)
242                 {
243                         AliInfo("Trigger from ECS received!");
244                 } else if (received == 1) {
245                         AliInfo(Form("Timeout (%d s) waiting for trigger. "
246                                 "Starting collection of new runs!", 
247                                         fConfig->GetTriggerWait()));
248                 } else {
249                         AliInfo("Error receiving trigger from ECS!");
250                         break;
251                 }
252                 
253                 nTry++;
254                 AliInfo(Form("Received %d triggers so far", nTry));
255                 
256                 if (fConfig->GetRunMode() == AliShuttleConfig::kTest)
257                 {
258                         if(nTry>=nMaxTry)
259                         {
260                                 AliInfo(Form("Collect() ran more than %d times -> Exiting!", 
261                                                 nMaxTry));
262                                 break;
263                         }
264                 }
265         
266                 Collect();
267         }
268
269         delete notifier;
270 }
271
272 //______________________________________________________________________________________________
273 Bool_t AliShuttleTrigger::Collect(Int_t run)
274 {
275         //
276         // this function creates a thread that runs the shuttle
277         // then it checks if the shuttle is still running by checking the monitoring functions of the shuttle
278         //
279
280   return fShuttle->Collect(run);
281 }