1 // Author: Mihai Niculesu 2013
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 **************************************************************************/
9 #include "AliOnlineReconstruction.h"
10 #include "AliOnlineReconstructionUtil.h"
11 #include "AliStorageEventManager.h"
13 #include <TSQLServer.h>
14 #include <TSQLResult.h>
16 #include <TTimeStamp.h>
24 void GotSignal(int){gQuit = true;}
26 AliOnlineReconstruction::AliOnlineReconstruction(int run) :
30 fAliReco(new AliReconstruction()),
31 fCDBmanager(AliCDBManager::Instance())
33 // make sure that destructor is called when kill signal comes
35 memset(&sa,0,sizeof(sa));
36 sa.sa_handler = GotSignal;
37 sigfillset(&sa.sa_mask);
38 sigaction(SIGINT,&sa,NULL);
40 printf("CDB Lock is %s\n",AliCDBManager::Instance()->GetLock() ? "ON":"OFF");
42 fSettings.ReadFile(AliOnlineReconstructionUtil::GetPathToServerConf(), kEnvUser);
44 cout<<"after startofrun"<<endl;
47 AliOnlineReconstruction::~AliOnlineReconstruction()
49 cout<<"AliOnlineReconstruction -- destructor called...";
52 // fAliReco->SlaveTerminate();
53 // fAliReco->Terminate();
54 // delete fAliReco;fAliReco=0;
56 if(fCDBmanager){fCDBmanager->Destroy();fCDBmanager=0;}
60 void AliOnlineReconstruction::StartOfRun()
62 if(strcmp("local",fSettings.GetValue("data.source", DEFAULT_DATA_SOURCE))==0)
64 cout<<"Starting Reco for run "<<fRun<<endl;
65 fDataSource = Form("mem://%s/run%d", gSystem->Getenv("ONLINERECO_RAWFILES_DIR"), fRun);
67 else if(strcmp(fSettings.GetValue("data.source", DEFAULT_DATA_SOURCE),"run")==0)
69 cout<<"Starting Reco for GDCs active in current run:"<<fRun<<endl;
70 fDataSource = fSettings.GetValue("data.online.source", DEFAULT_DATA_ONLINE_SOURCE);
72 else{cout<<"\n\nWrong data source. Quitting\n\n"<<endl;}
74 TString recoBaseDir = fSettings.GetValue("server.saveRecoDir",DEFAULT_SERVER_SAVE_RECO_DIR);
75 cout<<"Reco base dir:"<<recoBaseDir<<endl;
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)
82 printf(Form("AliRecoServer::StartReconstruction [] Error while trying to redirect output to [%s]. Exiting...", logFile.Data()) );
85 gSystem->cd(recoBaseDir.Data());
87 cout<<"\n\nRetriving GRP\n\n"<<endl;
89 if (RetrieveGRP(gdcs) <= 0 || gdcs.IsNull()){return;}
91 gSystem->Exec(Form("rm -fr run%d;mkdir run%d",fRun,fRun));
92 gSystem->cd(Form("run%d",fRun));
95 cout<<"\n\nStarting reconstruction loop\n\n"<<endl;
99 int AliOnlineReconstruction::RetrieveGRP(TString &gdc)
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);
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;
113 Int_t ret=AliGRPPreprocessor::ReceivePromptRecoParameters(fRun, dbHost.Data(),
114 dbPort, dbName.Data(),
115 user.Data(), password.Data(),
116 Form("%s",cdbPath.Data()),
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);
125 void AliOnlineReconstruction::SetupReco()
127 printf(Form("=========================[local://%s/]===========\n",gSystem->pwd()));
130 cout<<"\n\nSetting CDB manager parameters\n\n"<<endl;
131 //fCDBmanager->SetRun(fRun);
132 cout<<"Set default storage"<<endl;
134 fCDBmanager->SetDefaultStorage(fSettings.GetValue("cdb.defaultStorage", DEFAULT_CDB_STORAGE));
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));
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");
156 //fCDBmanager->SetSpecificStorage("GRP/CTP/Scalers","local:///local/cdb");
158 fCDBmanager->Print();
160 /* Reconstruction settings */
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());
183 void AliOnlineReconstruction::ReconstructionLoop()
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);
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;
198 TString recoBaseDir = fSettings.GetValue("server.saveRecoDir",DEFAULT_SERVER_SAVE_RECO_DIR);
201 //******* The loop over events
204 struct recPointsStruct *files;
205 // while (fAliReco->HasNextEventAfter(iEvent) && !gQuit)
208 if(fAliReco->HasNextEventAfter(iEvent))
210 // remove files for previous event: (needed to send RecPoints:
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));
217 if (!fAliReco->HasEnoughResources(iEvent)) break;
218 cout<<"\n\nProcessing event:"<<iEvent<<endl<<endl;
219 Bool_t status = fAliReco->ProcessEvent(iEvent);
222 event = fAliReco->GetESDEvent();
223 eventManager->Send(event,EVENTS_SERVER_PUB);
224 //eventManager->SendAsXml(event,XML_PUB);
226 // sending RecPoints:
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;
241 cout<<"sending files"<<endl;
242 eventManager->Send(files,ITS_POINTS_PUB);
243 cout<<"files sent"<<endl;
245 for(int i=0;i<10;i++)
249 files->files[i]->Close();
250 delete files->files[i];files->files[i]=0;
251 cout<<"file deleted"<<endl;
256 //Saving ESD to file:
258 TFile *file = new TFile(Form("/local/storedFiles/AliESDs.root_%d",iEvent),"recreate");
259 TTree* tree= new TTree("esdTree", "esdTree");
260 event->WriteToTree(tree);
267 cout<<"Event server -- aborting"<<endl;
268 fAliReco->Abort("ProcessEvent",TSelector::kAbortFile);
271 fAliReco->CleanProcessedEvent();
277 cout<<"iEvent++"<<endl;
282 cout<<"No event after!"<<endl;
285 cout<<"after while"<<endl;
286 // fAliReco->SlaveTerminate();
287 //if (fAliReco->GetAbort() != TSelector::kContinue) return;
288 //fAliReco->Terminate();
289 //if (fAliReco->GetAbort() != TSelector::kContinue) return;