]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MONITOR/alionlinereco/AliOnlineReconstruction.cxx
Online reco now listens only in PHYSICS_1
[u/mrichter/AliRoot.git] / MONITOR / alionlinereco / 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
43   fSettings.ReadFile(AliOnlineReconstructionUtil::GetPathToServerConf(), kEnvUser);
44   StartOfRun();
45   cout<<"after startofrun"<<endl;
46 }
47
48 AliOnlineReconstruction::~AliOnlineReconstruction()
49 {
50   cout<<"AliOnlineReconstruction -- destructor called...";
51   if(fAliReco)
52     {
53       //        fAliReco->SlaveTerminate();
54       //        fAliReco->Terminate(); 
55       //        delete fAliReco;fAliReco=0;
56     }
57   if(fCDBmanager){fCDBmanager->Destroy();fCDBmanager=0;}
58   cout<<"OK"<<endl;
59 }
60
61 void AliOnlineReconstruction::StartOfRun()
62 {
63   if(strcmp("local",fSettings.GetValue("data.source", DEFAULT_DATA_SOURCE))==0)
64     {
65       cout<<"Starting Reco for run "<<fRun<<endl;
66       fDataSource = Form("mem://%s/run%d", gSystem->Getenv("ONLINERECO_RAWFILES_DIR"), fRun);
67     }
68   else if(strcmp(fSettings.GetValue("data.source", DEFAULT_DATA_SOURCE),"run")==0)
69     {
70       cout<<"Starting Reco for GDCs active in current run:"<<fRun<<endl;
71       fDataSource = "mem://@*:";
72     }
73   else{cout<<"\n\nWrong data source. Quitting\n\n"<<endl;}
74
75   TString recoBaseDir = fSettings.GetValue("server.saveRecoDir",DEFAULT_SERVER_SAVE_RECO_DIR);
76   cout<<"Reco base dir:"<<recoBaseDir<<endl;
77
78   // Create directories and logfile
79   TString logFile = Form("%s/log/run%d.log",recoBaseDir.Data(),fRun);
80   Info("DoStart","Reconstruction log will be written to %s",logFile.Data());
81   if( gSystem->RedirectOutput(logFile.Data())!=0)
82     {
83       printf(Form("AliRecoServer::StartReconstruction [] Error while trying to redirect output to [%s]. Exiting...", logFile.Data()) );
84       return;
85     }
86   gSystem->cd(recoBaseDir.Data());
87
88   TString gdcs;
89   if (RetrieveGRP(gdcs) <= 0 || gdcs.IsNull()){return;}
90
91   gSystem->Exec(Form("rm -fr run%d;mkdir run%d;cd run%d",fRun,fRun,fRun));
92
93   SetupReco();
94   ReconstructionLoop();
95 }
96
97 int AliOnlineReconstruction::RetrieveGRP(TString &gdc)
98 {
99         // Retrieve GRP entry for given run from aldaqdb.
100         TString dbHost = fSettings.GetValue("logbook.host", DEFAULT_LOGBOOK_HOST);
101         Int_t   dbPort =  fSettings.GetValue("logbook.port", DEFAULT_LOGBOOK_PORT);
102         TString dbName =  fSettings.GetValue("logbook.db", DEFAULT_LOGBOOK_DB);
103         TString user =  fSettings.GetValue("logbook.user", DEFAULT_LOGBOOK_USER);
104         TString password = fSettings.GetValue("logbook.pass", DEFAULT_LOGBOOK_PASS);
105
106         Int_t ret=AliGRPPreprocessor::ReceivePromptRecoParameters(fRun, dbHost.Data(),
107                                                                   dbPort, dbName.Data(),
108                                                                   user.Data(), password.Data(),
109                                                                   Form("local://%s",gSystem->pwd()),
110                                                                   gdc);
111
112         if(ret>0) Info("RetrieveGRP","Last run of the same type is: %d",ret);
113         else if(ret==0) Warning("RetrieveGRP","No previous run of the same type found");
114         else if(ret<0) Error("Retrieve","Error code while retrieving GRP parameters returned: %d",ret);
115         return(ret);
116 }
117
118 void AliOnlineReconstruction::SetupReco()
119 {
120         printf(Form("=========================[local://%s/..]===========\n",gSystem->pwd()));
121
122         /* Settings CDB */
123         fCDBmanager->SetDefaultStorage(fSettings.GetValue("cdb.defaultStorage", DEFAULT_CDB_STORAGE));
124         fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath1", DEFAULT_CDB_SPEC_STORAGE_PATH1),  
125                                     fSettings.GetValue( "cdb.specificStorageValue1", DEFAULT_CDB_SPEC_STORAGE_VALUE1));
126         fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath2", DEFAULT_CDB_SPEC_STORAGE_PATH2),  
127                                     fSettings.GetValue( "cdb.specificStorageValue2", DEFAULT_CDB_SPEC_STORAGE_VALUE2));
128         fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath3", DEFAULT_CDB_SPEC_STORAGE_PATH3),  
129                                     fSettings.GetValue( "cdb.specificStorageValue3", DEFAULT_CDB_SPEC_STORAGE_VALUE3));
130         /* Reconstruction settings */  
131
132         // QA options
133         fAliReco->SetRunQA(fSettings.GetValue("qa.runDetectors",DEFAULT_QA_RUN));
134         fAliReco->SetRunGlobalQA(fSettings.GetValue("qa.runGlobal",DEFAULT_QA_RUN_GLOBAL));
135         fAliReco->SetQARefDefaultStorage(fSettings.GetValue("qa.defaultStorage",DEFAULT_QAREF_STORAGE)) ;
136         fAliReco->SetRunPlaneEff(fSettings.GetValue("reco.runPlaneEff",DEFAULT_RECO_RUN_PLANE_EFF));
137
138         // AliReconstruction settings
139         fAliReco->SetWriteESDfriend(fSettings.GetValue( "reco.writeESDfriend",DEFAULT_RECO_WRITE_ESDF));
140         fAliReco->SetWriteAlignmentData(fSettings.GetValue( "reco.writeAlignment",DEFAULT_RECO_WRITE_ALIGN));
141         fAliReco->SetInput(fDataSource.Data()); // reconstruct data from this input
142         fAliReco->SetRunReconstruction(fSettings.GetValue( "reco.detectors", DEFAULT_RECO_DETECTORS));
143         fAliReco->SetUseTrackingErrorsForAlignment("ITS"); //-- !should be set from conf file!
144         fAliReco->SetCleanESD(fSettings.GetValue( "reco.cleanESD",DEFAULT_RECO_CLEAN_ESD));
145
146         // init reco for given run
147         fAliReco->InitRun(fDataSource.Data());
148 }
149
150 void AliOnlineReconstruction::ReconstructionLoop()
151 {
152         AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
153         eventManager->CreateSocket(EVENTS_SERVER_PUB);
154         eventManager->CreateSocket(XML_PUB);
155
156         fAliReco->Begin(NULL);
157         if (fAliReco->GetAbort() != TSelector::kContinue) return;
158         fAliReco->SlaveBegin(NULL);
159         if (fAliReco->GetAbort() != TSelector::kContinue) return;
160         
161         //******* The loop over events
162         Int_t iEvent = 0;
163         AliESDEvent* event;
164         while (fAliReco->HasNextEventAfter(iEvent) && !gQuit)
165         {
166                 if (!fAliReco->HasEnoughResources(iEvent)) break;
167                 Bool_t status = fAliReco->ProcessEvent(iEvent);
168       
169                 if (status){
170                         event = fAliReco->GetESDEvent();
171                         eventManager->Send(event,EVENTS_SERVER_PUB);
172                         eventManager->SendAsXml(event,XML_PUB);
173                 }
174                 else{
175                   cout<<"Event server -- aborting"<<endl;
176                   fAliReco->Abort("ProcessEvent",TSelector::kAbortFile);
177                 }
178                 cout<<"clean"<<endl;
179                 fAliReco->CleanProcessedEvent();
180                 cout<<"iEvent++"<<endl;
181                 iEvent++;
182         }
183         cout<<"after while"<<endl;
184         //      fAliReco->SlaveTerminate();
185         //if (fAliReco->GetAbort() != TSelector::kContinue) return;
186         //fAliReco->Terminate();
187         //if (fAliReco->GetAbort() != TSelector::kContinue) return; 
188 }