]>
Commit | Line | Data |
---|---|---|
d2416c53 | 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 | ||
da6a894f | 18 | #include <signal.h> |
d2416c53 | 19 | #include <iostream> |
20 | ||
21 | using namespace std; | |
22 | ||
da6a894f | 23 | bool gQuit = false; |
24 | void GotSignal(int){gQuit = true;} | |
25 | ||
d2416c53 | 26 | AliOnlineReconstruction::AliOnlineReconstruction(int run) : |
27 | fRun(run), | |
28 | fDataSource(""), | |
29 | fSettings(0), | |
30 | fAliReco(new AliReconstruction()), | |
31 | fCDBmanager(AliCDBManager::Instance()) | |
32 | { | |
da6a894f | 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 | ||
d2416c53 | 42 | fSettings.ReadFile(AliOnlineReconstructionUtil::GetPathToServerConf(), kEnvUser); |
43 | StartOfRun(); | |
da6a894f | 44 | cout<<"after startofrun"<<endl; |
d2416c53 | 45 | } |
46 | ||
47 | AliOnlineReconstruction::~AliOnlineReconstruction() | |
48 | { | |
da6a894f | 49 | cout<<"AliOnlineReconstruction -- destructor called..."; |
50 | if(fAliReco) | |
51 | { | |
52 | // fAliReco->SlaveTerminate(); | |
53 | // fAliReco->Terminate(); | |
54 | // delete fAliReco;fAliReco=0; | |
55 | } | |
d2416c53 | 56 | if(fCDBmanager){fCDBmanager->Destroy();fCDBmanager=0;} |
da6a894f | 57 | cout<<"OK"<<endl; |
d2416c53 | 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; | |
89da3878 | 70 | fDataSource = fSettings.GetValue("data.online.source", DEFAULT_DATA_ONLINE_SOURCE); |
d2416c53 | 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()); | |
066a2879 | 80 | if( gSystem->RedirectOutput(logFile.Data(),"w")!=0) |
d2416c53 | 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()); | |
566ba262 | 86 | |
066a2879 | 87 | cout<<"\n\nRetriving GRP\n\n"<<endl; |
d2416c53 | 88 | TString gdcs; |
89 | if (RetrieveGRP(gdcs) <= 0 || gdcs.IsNull()){return;} | |
566ba262 | 90 | |
066a2879 | 91 | gSystem->Exec(Form("rm -fr run%d;mkdir run%d",fRun,fRun)); |
92 | gSystem->cd(Form("run%d",fRun)); | |
d2416c53 | 93 | |
94 | SetupReco(); | |
066a2879 | 95 | cout<<"\n\nStarting reconstruction loop\n\n"<<endl; |
d2416c53 | 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); | |
7dcdaa40 | 107 | TString cdbPath;// = fSettings.GetValue("cdb.defaultStorage", DEFAULT_CDB_STORAGE); |
d2416c53 | 108 | |
341ffc50 | 109 | cdbPath = Form("local://%s",gSystem->pwd()); |
a8b31706 | 110 | gSystem->Exec(Form("rm -fr %s/GRP",cdbPath.Data())); |
a7f93de6 | 111 | cout<<"CDB path for GRP:"<<cdbPath<<endl; |
112 | ||
d2416c53 | 113 | Int_t ret=AliGRPPreprocessor::ReceivePromptRecoParameters(fRun, dbHost.Data(), |
114 | dbPort, dbName.Data(), | |
115 | user.Data(), password.Data(), | |
a7f93de6 | 116 | Form("%s",cdbPath.Data()), |
d2416c53 | 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 | { | |
066a2879 | 127 | printf(Form("=========================[local://%s/]===========\n",gSystem->pwd())); |
d2416c53 | 128 | |
129 | /* Settings CDB */ | |
066a2879 | 130 | cout<<"\n\nSetting CDB manager parameters\n\n"<<endl; |
566ba262 | 131 | //fCDBmanager->SetRun(fRun); |
341ffc50 | 132 | cout<<"Set default storage"<<endl; |
133 | ||
566ba262 | 134 | fCDBmanager->SetDefaultStorage(fSettings.GetValue("cdb.defaultStorage", DEFAULT_CDB_STORAGE)); |
341ffc50 | 135 | |
136 | fCDBmanager->Print(); | |
566ba262 | 137 | cout<<"Set specific storage 1"<<endl; |
d2416c53 | 138 | fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath1", DEFAULT_CDB_SPEC_STORAGE_PATH1), |
566ba262 | 139 | fSettings.GetValue( "cdb.specificStorageValue1", DEFAULT_CDB_SPEC_STORAGE_VALUE1)); |
341ffc50 | 140 | fCDBmanager->Print(); |
566ba262 | 141 | cout<<"Set specific storage 2"<<endl; |
d2416c53 | 142 | fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath2", DEFAULT_CDB_SPEC_STORAGE_PATH2), |
143 | fSettings.GetValue( "cdb.specificStorageValue2", DEFAULT_CDB_SPEC_STORAGE_VALUE2)); | |
341ffc50 | 144 | fCDBmanager->Print(); |
7dcdaa40 | 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)); | |
566ba262 | 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 | ||
341ffc50 | 158 | fCDBmanager->Print(); |
159 | ||
d2416c53 | 160 | /* Reconstruction settings */ |
161 | ||
162 | // QA options | |
066a2879 | 163 | cout<<"\n\nSetting AliReconstruction parameters\n\n"<<endl; |
d2416c53 | 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)); | |
341ffc50 | 168 | fCDBmanager->Print(); |
169 | cout<<"\n\nSetting other reco options"<<endl; | |
d2416c53 | 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)); | |
341ffc50 | 177 | fCDBmanager->Print(); |
d2416c53 | 178 | // init reco for given run |
566ba262 | 179 | //fAliReco->SetOption("TPC","useHLTorRAW"); |
d2416c53 | 180 | fAliReco->InitRun(fDataSource.Data()); |
181 | } | |
182 | ||
183 | void AliOnlineReconstruction::ReconstructionLoop() | |
184 | { | |
066a2879 | 185 | cout<<"\n\nCreating sockets\n\n"<<endl; |
d2416c53 | 186 | AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance(); |
187 | eventManager->CreateSocket(EVENTS_SERVER_PUB); | |
188 | eventManager->CreateSocket(XML_PUB); | |
a7f93de6 | 189 | eventManager->CreateSocket(ITS_POINTS_PUB); |
d2416c53 | 190 | |
066a2879 | 191 | cout<<"\n\nStarting reconstruction\n\n"<<endl; |
d2416c53 | 192 | fAliReco->Begin(NULL); |
193 | if (fAliReco->GetAbort() != TSelector::kContinue) return; | |
194 | fAliReco->SlaveBegin(NULL); | |
195 | if (fAliReco->GetAbort() != TSelector::kContinue) return; | |
066a2879 | 196 | cout<<"\n\nStarting loop over events\n\n"<<endl; |
197 | ||
a7f93de6 | 198 | TString recoBaseDir = fSettings.GetValue("server.saveRecoDir",DEFAULT_SERVER_SAVE_RECO_DIR); |
199 | ||
200 | ||
d2416c53 | 201 | //******* The loop over events |
202 | Int_t iEvent = 0; | |
203 | AliESDEvent* event; | |
a7f93de6 | 204 | struct recPointsStruct *files; |
066a2879 | 205 | // while (fAliReco->HasNextEventAfter(iEvent) && !gQuit) |
206 | while (!gQuit) | |
d2416c53 | 207 | { |
066a2879 | 208 | if(fAliReco->HasNextEventAfter(iEvent)) |
209 | { | |
a7f93de6 | 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); | |
d2416c53 | 220 | |
a7f93de6 | 221 | if (status){ |
222 | event = fAliReco->GetESDEvent(); | |
223 | eventManager->Send(event,EVENTS_SERVER_PUB); | |
566ba262 | 224 | //eventManager->SendAsXml(event,XML_PUB); |
a7f93de6 | 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(); | |
7dcdaa40 | 272 | /* if(event) |
273 | { | |
274 | delete event; | |
275 | event=0; | |
276 | }*/ | |
a7f93de6 | 277 | cout<<"iEvent++"<<endl; |
278 | iEvent++; | |
066a2879 | 279 | } |
280 | else | |
281 | { | |
282 | cout<<"No event after!"<<endl; | |
8caf4f11 | 283 | gQuit=true; |
066a2879 | 284 | } |
d2416c53 | 285 | } |
da6a894f | 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; | |
d2416c53 | 291 | } |