]>
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()); | |
a7f93de6 | 86 | // gSystem->cd("/"); |
066a2879 | 87 | cout<<"\n\nRetriving GRP\n\n"<<endl; |
d2416c53 | 88 | TString gdcs; |
89 | if (RetrieveGRP(gdcs) <= 0 || gdcs.IsNull()){return;} | |
a7f93de6 | 90 | //gSystem->cd(recoBaseDir.Data()); |
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); | |
066a2879 | 107 | TString cdbPath = fSettings.GetValue("cdb.defaultStorage", DEFAULT_CDB_STORAGE); |
d2416c53 | 108 | |
341ffc50 | 109 | cdbPath = Form("local://%s",gSystem->pwd()); |
a7f93de6 | 110 | cout<<"CDB path for GRP:"<<cdbPath<<endl; |
111 | ||
d2416c53 | 112 | Int_t ret=AliGRPPreprocessor::ReceivePromptRecoParameters(fRun, dbHost.Data(), |
113 | dbPort, dbName.Data(), | |
114 | user.Data(), password.Data(), | |
a7f93de6 | 115 | Form("%s",cdbPath.Data()), |
d2416c53 | 116 | gdc); |
117 | ||
118 | if(ret>0) Info("RetrieveGRP","Last run of the same type is: %d",ret); | |
119 | else if(ret==0) Warning("RetrieveGRP","No previous run of the same type found"); | |
120 | else if(ret<0) Error("Retrieve","Error code while retrieving GRP parameters returned: %d",ret); | |
121 | return(ret); | |
122 | } | |
123 | ||
124 | void AliOnlineReconstruction::SetupReco() | |
125 | { | |
066a2879 | 126 | printf(Form("=========================[local://%s/]===========\n",gSystem->pwd())); |
d2416c53 | 127 | |
128 | /* Settings CDB */ | |
066a2879 | 129 | cout<<"\n\nSetting CDB manager parameters\n\n"<<endl; |
130 | fCDBmanager->SetRun(fRun); | |
341ffc50 | 131 | cout<<"Set default storage"<<endl; |
132 | ||
d2416c53 | 133 | fCDBmanager->SetDefaultStorage(fSettings.GetValue("cdb.defaultStorage", DEFAULT_CDB_STORAGE)); |
341ffc50 | 134 | |
135 | fCDBmanager->Print(); | |
136 | cout<<"Set specific storage 1"<<endl; | |
d2416c53 | 137 | fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath1", DEFAULT_CDB_SPEC_STORAGE_PATH1), |
138 | fSettings.GetValue( "cdb.specificStorageValue1", DEFAULT_CDB_SPEC_STORAGE_VALUE1)); | |
341ffc50 | 139 | fCDBmanager->Print(); |
140 | cout<<"Set specific storage 2"<<endl; | |
d2416c53 | 141 | fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath2", DEFAULT_CDB_SPEC_STORAGE_PATH2), |
142 | fSettings.GetValue( "cdb.specificStorageValue2", DEFAULT_CDB_SPEC_STORAGE_VALUE2)); | |
341ffc50 | 143 | fCDBmanager->Print(); |
144 | cout<<"Set specific storage 3"<<endl; | |
d2416c53 | 145 | fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath3", DEFAULT_CDB_SPEC_STORAGE_PATH3), |
146 | fSettings.GetValue( "cdb.specificStorageValue3", DEFAULT_CDB_SPEC_STORAGE_VALUE3)); | |
341ffc50 | 147 | fCDBmanager->Print(); |
148 | ||
d2416c53 | 149 | /* Reconstruction settings */ |
150 | ||
151 | // QA options | |
066a2879 | 152 | cout<<"\n\nSetting AliReconstruction parameters\n\n"<<endl; |
d2416c53 | 153 | fAliReco->SetRunQA(fSettings.GetValue("qa.runDetectors",DEFAULT_QA_RUN)); |
154 | fAliReco->SetRunGlobalQA(fSettings.GetValue("qa.runGlobal",DEFAULT_QA_RUN_GLOBAL)); | |
155 | fAliReco->SetQARefDefaultStorage(fSettings.GetValue("qa.defaultStorage",DEFAULT_QAREF_STORAGE)) ; | |
156 | fAliReco->SetRunPlaneEff(fSettings.GetValue("reco.runPlaneEff",DEFAULT_RECO_RUN_PLANE_EFF)); | |
341ffc50 | 157 | fCDBmanager->Print(); |
158 | cout<<"\n\nSetting other reco options"<<endl; | |
d2416c53 | 159 | // AliReconstruction settings |
160 | fAliReco->SetWriteESDfriend(fSettings.GetValue( "reco.writeESDfriend",DEFAULT_RECO_WRITE_ESDF)); | |
161 | fAliReco->SetWriteAlignmentData(fSettings.GetValue( "reco.writeAlignment",DEFAULT_RECO_WRITE_ALIGN)); | |
162 | fAliReco->SetInput(fDataSource.Data()); // reconstruct data from this input | |
163 | fAliReco->SetRunReconstruction(fSettings.GetValue( "reco.detectors", DEFAULT_RECO_DETECTORS)); | |
164 | fAliReco->SetUseTrackingErrorsForAlignment("ITS"); //-- !should be set from conf file! | |
165 | fAliReco->SetCleanESD(fSettings.GetValue( "reco.cleanESD",DEFAULT_RECO_CLEAN_ESD)); | |
341ffc50 | 166 | fCDBmanager->Print(); |
d2416c53 | 167 | // init reco for given run |
168 | fAliReco->InitRun(fDataSource.Data()); | |
169 | } | |
170 | ||
171 | void AliOnlineReconstruction::ReconstructionLoop() | |
172 | { | |
066a2879 | 173 | cout<<"\n\nCreating sockets\n\n"<<endl; |
d2416c53 | 174 | AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance(); |
175 | eventManager->CreateSocket(EVENTS_SERVER_PUB); | |
176 | eventManager->CreateSocket(XML_PUB); | |
a7f93de6 | 177 | eventManager->CreateSocket(ITS_POINTS_PUB); |
d2416c53 | 178 | |
066a2879 | 179 | cout<<"\n\nStarting reconstruction\n\n"<<endl; |
d2416c53 | 180 | fAliReco->Begin(NULL); |
181 | if (fAliReco->GetAbort() != TSelector::kContinue) return; | |
182 | fAliReco->SlaveBegin(NULL); | |
183 | if (fAliReco->GetAbort() != TSelector::kContinue) return; | |
066a2879 | 184 | cout<<"\n\nStarting loop over events\n\n"<<endl; |
185 | ||
a7f93de6 | 186 | TString recoBaseDir = fSettings.GetValue("server.saveRecoDir",DEFAULT_SERVER_SAVE_RECO_DIR); |
187 | ||
188 | ||
d2416c53 | 189 | //******* The loop over events |
190 | Int_t iEvent = 0; | |
191 | AliESDEvent* event; | |
a7f93de6 | 192 | struct recPointsStruct *files; |
066a2879 | 193 | // while (fAliReco->HasNextEventAfter(iEvent) && !gQuit) |
194 | while (!gQuit) | |
d2416c53 | 195 | { |
066a2879 | 196 | if(fAliReco->HasNextEventAfter(iEvent)) |
197 | { | |
a7f93de6 | 198 | // remove files for previous event: (needed to send RecPoints: |
199 | /* | |
200 | gSystem->cd(recoBaseDir.Data()); | |
201 | gSystem->Exec(Form("rm -fr run%d;mkdir run%d",fRun,fRun)); | |
202 | gSystem->cd(Form("run%d",fRun)); | |
203 | */ | |
204 | ||
205 | if (!fAliReco->HasEnoughResources(iEvent)) break; | |
206 | cout<<"\n\nProcessing event:"<<iEvent<<endl<<endl; | |
207 | Bool_t status = fAliReco->ProcessEvent(iEvent); | |
d2416c53 | 208 | |
a7f93de6 | 209 | if (status){ |
210 | event = fAliReco->GetESDEvent(); | |
211 | eventManager->Send(event,EVENTS_SERVER_PUB); | |
212 | eventManager->SendAsXml(event,XML_PUB); | |
213 | ||
214 | // sending RecPoints: | |
215 | /* | |
216 | cout<<"loading file"<<endl; | |
217 | files->files[0] = TFile::Open("./ITS.RecPoints.root"); | |
218 | files->files[1] = TFile::Open("./TOF.RecPoints.root"); | |
219 | files->files[2] = TFile::Open("./galice.root"); | |
220 | files->files[3] = NULL; | |
221 | files->files[4] = NULL; | |
222 | files->files[5] = NULL; | |
223 | files->files[6] = NULL; | |
224 | files->files[7] = NULL; | |
225 | files->files[8] = NULL; | |
226 | files->files[9] = NULL; | |
227 | ||
228 | ||
229 | cout<<"sending files"<<endl; | |
230 | eventManager->Send(files,ITS_POINTS_PUB); | |
231 | cout<<"files sent"<<endl; | |
232 | ||
233 | for(int i=0;i<10;i++) | |
234 | { | |
235 | if(files->files[i]) | |
236 | { | |
237 | files->files[i]->Close(); | |
238 | delete files->files[i];files->files[i]=0; | |
239 | cout<<"file deleted"<<endl; | |
240 | } | |
241 | } | |
242 | */ | |
243 | ||
244 | //Saving ESD to file: | |
245 | /* | |
246 | TFile *file = new TFile(Form("/local/storedFiles/AliESDs.root_%d",iEvent),"recreate"); | |
247 | TTree* tree= new TTree("esdTree", "esdTree"); | |
248 | event->WriteToTree(tree); | |
249 | tree-> Fill(); | |
250 | tree->Write(); | |
251 | file->Close(); | |
252 | */ | |
253 | } | |
254 | else{ | |
255 | cout<<"Event server -- aborting"<<endl; | |
256 | fAliReco->Abort("ProcessEvent",TSelector::kAbortFile); | |
257 | } | |
258 | cout<<"clean"<<endl; | |
259 | fAliReco->CleanProcessedEvent(); | |
260 | cout<<"iEvent++"<<endl; | |
261 | iEvent++; | |
066a2879 | 262 | } |
263 | else | |
264 | { | |
265 | cout<<"No event after!"<<endl; | |
266 | } | |
d2416c53 | 267 | } |
da6a894f | 268 | cout<<"after while"<<endl; |
269 | // fAliReco->SlaveTerminate(); | |
270 | //if (fAliReco->GetAbort() != TSelector::kContinue) return; | |
271 | //fAliReco->Terminate(); | |
272 | //if (fAliReco->GetAbort() != TSelector::kContinue) return; | |
d2416c53 | 273 | } |