Quit online reconstruction when all events were reconstructed
[u/mrichter/AliRoot.git] / MONITOR / MONITORzmq / AliOnlineReconstruction.cxx
1 // Author:  Mihai Niculesu 2013
2
3 /**************************************************************************
4  * Copyright(c) 1998-2013, ALICE Experiment at CERN, all rights reserved. *)
5  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
6  * full copyright notice.                                                 *
7  **************************************************************************/
8
9 #include "AliOnlineReconstruction.h"
10 #include "AliOnlineReconstructionUtil.h"
11 #include "AliStorageEventManager.h"
12
13 #include <TSQLServer.h>
14 #include <TSQLResult.h>
15 #include <TSQLRow.h>
16 #include <TTimeStamp.h>
17
18 #include <signal.h>
19 #include <iostream>
20
21 using namespace std;
22
23 bool gQuit = false;
24 void GotSignal(int){gQuit = true;}
25
26 AliOnlineReconstruction::AliOnlineReconstruction(int run) :
27   fRun(run),
28   fDataSource(""),
29   fSettings(0),
30   fAliReco(new AliReconstruction()),
31   fCDBmanager(AliCDBManager::Instance())
32 {
33   // make sure that destructor is called when kill signal comes
34   struct sigaction sa;
35   memset(&sa,0,sizeof(sa));
36   sa.sa_handler = GotSignal;
37   sigfillset(&sa.sa_mask);
38   sigaction(SIGINT,&sa,NULL);
39
40   printf("CDB Lock is %s\n",AliCDBManager::Instance()->GetLock() ? "ON":"OFF");
41
42   fSettings.ReadFile(AliOnlineReconstructionUtil::GetPathToServerConf(), kEnvUser);
43   StartOfRun();
44   cout<<"after startofrun"<<endl;
45 }
46
47 AliOnlineReconstruction::~AliOnlineReconstruction()
48 {
49   cout<<"AliOnlineReconstruction -- destructor called...";
50   if(fAliReco)
51     {
52       //        fAliReco->SlaveTerminate();
53       //        fAliReco->Terminate(); 
54       //        delete fAliReco;fAliReco=0;
55     }
56   if(fCDBmanager){fCDBmanager->Destroy();fCDBmanager=0;}
57   cout<<"OK"<<endl;
58 }
59
60 void AliOnlineReconstruction::StartOfRun()
61 {
62   if(strcmp("local",fSettings.GetValue("data.source", DEFAULT_DATA_SOURCE))==0)
63     {
64       cout<<"Starting Reco for run "<<fRun<<endl;
65       fDataSource = Form("mem://%s/run%d", gSystem->Getenv("ONLINERECO_RAWFILES_DIR"), fRun);
66     }
67   else if(strcmp(fSettings.GetValue("data.source", DEFAULT_DATA_SOURCE),"run")==0)
68     {
69       cout<<"Starting Reco for GDCs active in current run:"<<fRun<<endl;
70       fDataSource = fSettings.GetValue("data.online.source", DEFAULT_DATA_ONLINE_SOURCE);
71     }
72   else{cout<<"\n\nWrong data source. Quitting\n\n"<<endl;}
73
74   TString recoBaseDir = fSettings.GetValue("server.saveRecoDir",DEFAULT_SERVER_SAVE_RECO_DIR);
75   cout<<"Reco base dir:"<<recoBaseDir<<endl;
76
77   // Create directories and logfile
78   TString logFile = Form("%s/log/run%d.log",recoBaseDir.Data(),fRun);
79   Info("DoStart","Reconstruction log will be written to %s",logFile.Data());
80   if( gSystem->RedirectOutput(logFile.Data(),"w")!=0)
81     {
82       printf(Form("AliRecoServer::StartReconstruction [] Error while trying to redirect output to [%s]. Exiting...", logFile.Data()) );
83       return;
84     }
85   gSystem->cd(recoBaseDir.Data());
86   
87   cout<<"\n\nRetriving GRP\n\n"<<endl;
88   TString gdcs;
89   if (RetrieveGRP(gdcs) <= 0 || gdcs.IsNull()){return;}
90   
91   gSystem->Exec(Form("rm -fr run%d;mkdir run%d",fRun,fRun));
92   gSystem->cd(Form("run%d",fRun));
93
94   SetupReco();
95   cout<<"\n\nStarting reconstruction loop\n\n"<<endl;
96   ReconstructionLoop();
97 }
98
99 int AliOnlineReconstruction::RetrieveGRP(TString &gdc)
100 {
101         // Retrieve GRP entry for given run from aldaqdb.
102         TString dbHost = fSettings.GetValue("logbook.host", DEFAULT_LOGBOOK_HOST);
103         Int_t   dbPort =  fSettings.GetValue("logbook.port", DEFAULT_LOGBOOK_PORT);
104         TString dbName =  fSettings.GetValue("logbook.db", DEFAULT_LOGBOOK_DB);
105         TString user =  fSettings.GetValue("logbook.user", DEFAULT_LOGBOOK_USER);
106         TString password = fSettings.GetValue("logbook.pass", DEFAULT_LOGBOOK_PASS);
107         TString cdbPath;// = fSettings.GetValue("cdb.defaultStorage", DEFAULT_CDB_STORAGE);
108
109         cdbPath = Form("local://%s",gSystem->pwd());
110         gSystem->Exec(Form("rm -fr %s/GRP",cdbPath.Data()));
111         cout<<"CDB path for GRP:"<<cdbPath<<endl;
112
113         Int_t ret=AliGRPPreprocessor::ReceivePromptRecoParameters(fRun, dbHost.Data(),
114                                                                   dbPort, dbName.Data(),
115                                                                   user.Data(), password.Data(),
116                                                                   Form("%s",cdbPath.Data()),
117                                                                   gdc);
118
119         if(ret>0) Info("RetrieveGRP","Last run of the same type is: %d",ret);
120         else if(ret==0) Warning("RetrieveGRP","No previous run of the same type found");
121         else if(ret<0) Error("Retrieve","Error code while retrieving GRP parameters returned: %d",ret);
122         return(ret);
123 }
124
125 void AliOnlineReconstruction::SetupReco()
126 {
127         printf(Form("=========================[local://%s/]===========\n",gSystem->pwd()));
128
129         /* Settings CDB */
130         cout<<"\n\nSetting CDB manager parameters\n\n"<<endl;
131         //fCDBmanager->SetRun(fRun);
132         cout<<"Set default storage"<<endl;
133
134         fCDBmanager->SetDefaultStorage(fSettings.GetValue("cdb.defaultStorage", DEFAULT_CDB_STORAGE));
135
136         fCDBmanager->Print();
137                 cout<<"Set specific storage 1"<<endl;
138         fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath1", DEFAULT_CDB_SPEC_STORAGE_PATH1),  
139                                             fSettings.GetValue( "cdb.specificStorageValue1", DEFAULT_CDB_SPEC_STORAGE_VALUE1));
140         fCDBmanager->Print();
141 cout<<"Set specific storage 2"<<endl;
142         fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath2", DEFAULT_CDB_SPEC_STORAGE_PATH2),  
143                                     fSettings.GetValue( "cdb.specificStorageValue2", DEFAULT_CDB_SPEC_STORAGE_VALUE2));
144         fCDBmanager->Print();
145         cout<<"Set specific storage 3"<<endl;
146         fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath3", DEFAULT_CDB_SPEC_STORAGE_PATH3),  
147                                     fSettings.GetValue( "cdb.specificStorageValue3", DEFAULT_CDB_SPEC_STORAGE_VALUE3));
148
149
150         //fCDBmanager->SetSpecificStorage("TPC/Calib//PreprocStatus","local:///local/cdb");
151         //fCDBmanager->SetSpecificStorage("TPC/Calib//HighVoltage","local:///local/cdb");
152         //fCDBmanager->SetSpecificStorage("TPC/Calib//Goofie","local:///local/cdb");
153         //fCDBmanager->SetSpecificStorage("GRP/CTP/LTUConfig","local:///local/cdb");
154
155
156         //fCDBmanager->SetSpecificStorage("GRP/CTP/Scalers","local:///local/cdb");
157
158         fCDBmanager->Print();
159
160         /* Reconstruction settings */  
161
162         // QA options
163         cout<<"\n\nSetting AliReconstruction parameters\n\n"<<endl;
164         fAliReco->SetRunQA(fSettings.GetValue("qa.runDetectors",DEFAULT_QA_RUN));
165         fAliReco->SetRunGlobalQA(fSettings.GetValue("qa.runGlobal",DEFAULT_QA_RUN_GLOBAL));
166         fAliReco->SetQARefDefaultStorage(fSettings.GetValue("qa.defaultStorage",DEFAULT_QAREF_STORAGE)) ;
167         fAliReco->SetRunPlaneEff(fSettings.GetValue("reco.runPlaneEff",DEFAULT_RECO_RUN_PLANE_EFF));
168         fCDBmanager->Print();
169         cout<<"\n\nSetting other reco options"<<endl;
170         // AliReconstruction settings
171         fAliReco->SetWriteESDfriend(fSettings.GetValue( "reco.writeESDfriend",DEFAULT_RECO_WRITE_ESDF));
172         fAliReco->SetWriteAlignmentData(fSettings.GetValue( "reco.writeAlignment",DEFAULT_RECO_WRITE_ALIGN));
173         fAliReco->SetInput(fDataSource.Data()); // reconstruct data from this input
174         fAliReco->SetRunReconstruction(fSettings.GetValue( "reco.detectors", DEFAULT_RECO_DETECTORS));
175         fAliReco->SetUseTrackingErrorsForAlignment("ITS"); //-- !should be set from conf file!
176         fAliReco->SetCleanESD(fSettings.GetValue( "reco.cleanESD",DEFAULT_RECO_CLEAN_ESD));
177         fCDBmanager->Print();
178         // init reco for given run
179         //fAliReco->SetOption("TPC","useHLTorRAW");
180         fAliReco->InitRun(fDataSource.Data());
181 }
182
183 void AliOnlineReconstruction::ReconstructionLoop()
184 {
185   cout<<"\n\nCreating sockets\n\n"<<endl;
186         AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
187         eventManager->CreateSocket(EVENTS_SERVER_PUB);
188         eventManager->CreateSocket(XML_PUB);
189         eventManager->CreateSocket(ITS_POINTS_PUB);
190
191         cout<<"\n\nStarting reconstruction\n\n"<<endl;
192         fAliReco->Begin(NULL);
193         if (fAliReco->GetAbort() != TSelector::kContinue) return;
194         fAliReco->SlaveBegin(NULL);
195         if (fAliReco->GetAbort() != TSelector::kContinue) return;
196         cout<<"\n\nStarting loop over events\n\n"<<endl;
197
198         TString recoBaseDir = fSettings.GetValue("server.saveRecoDir",DEFAULT_SERVER_SAVE_RECO_DIR);
199
200
201         //******* The loop over events
202         Int_t iEvent = 0;
203         AliESDEvent* event;
204         struct recPointsStruct *files;
205         //      while (fAliReco->HasNextEventAfter(iEvent) && !gQuit)
206         while (!gQuit)
207         {
208           if(fAliReco->HasNextEventAfter(iEvent))
209             {
210               // remove files for previous event: (needed to send RecPoints:
211               /*
212               gSystem->cd(recoBaseDir.Data());
213               gSystem->Exec(Form("rm -fr run%d;mkdir run%d",fRun,fRun));
214               gSystem->cd(Form("run%d",fRun));
215               */
216               
217               if (!fAliReco->HasEnoughResources(iEvent)) break;
218               cout<<"\n\nProcessing event:"<<iEvent<<endl<<endl;
219               Bool_t status = fAliReco->ProcessEvent(iEvent);
220       
221               if (status){
222                 event = fAliReco->GetESDEvent();
223                 eventManager->Send(event,EVENTS_SERVER_PUB);
224                 //eventManager->SendAsXml(event,XML_PUB);
225
226                 // sending RecPoints:
227                 /*
228                 cout<<"loading file"<<endl;
229                 files->files[0] = TFile::Open("./ITS.RecPoints.root");
230                 files->files[1] = TFile::Open("./TOF.RecPoints.root");
231                 files->files[2] = TFile::Open("./galice.root");
232                 files->files[3] = NULL;
233                 files->files[4] = NULL;
234                 files->files[5] = NULL;
235                 files->files[6] = NULL;
236                 files->files[7] = NULL;
237                 files->files[8] = NULL;
238                 files->files[9] = NULL;
239
240
241                 cout<<"sending files"<<endl;
242                 eventManager->Send(files,ITS_POINTS_PUB);
243                 cout<<"files sent"<<endl;
244         
245                 for(int i=0;i<10;i++)
246                   {
247                     if(files->files[i])
248                       {
249                         files->files[i]->Close();
250                         delete files->files[i];files->files[i]=0;
251                         cout<<"file deleted"<<endl;
252                       }
253                   }
254                 */
255
256                 //Saving ESD to file:
257                 /*
258                   TFile *file = new TFile(Form("/local/storedFiles/AliESDs.root_%d",iEvent),"recreate");
259                   TTree* tree= new TTree("esdTree", "esdTree");
260                   event->WriteToTree(tree);
261                   tree-> Fill();
262                   tree->Write();
263                   file->Close();
264                 */
265               }
266               else{
267                 cout<<"Event server -- aborting"<<endl;
268                 fAliReco->Abort("ProcessEvent",TSelector::kAbortFile);
269               }
270               cout<<"clean"<<endl;
271               fAliReco->CleanProcessedEvent();
272               /*      if(event)
273                 {
274                   delete event;
275                   event=0;
276                   }*/
277               cout<<"iEvent++"<<endl;
278               iEvent++;
279             }
280           else
281             {
282               cout<<"No event after!"<<endl;
283               gQuit=true;
284             }
285         }
286         cout<<"after while"<<endl;
287         //      fAliReco->SlaveTerminate();
288         //if (fAliReco->GetAbort() != TSelector::kContinue) return;
289         //fAliReco->Terminate();
290         //if (fAliReco->GetAbort() != TSelector::kContinue) return; 
291 }