1 // Author: Mihai Niculescu 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 **************************************************************************/
12 #include <TXMLEngine.h>
15 #include <AliESDEvent.h>
16 #include <AliCDBManager.h>
17 #include <AliGRPPreprocessor.h>
18 #include <AliReconstruction.h>
19 #include <AliTPCRecoParam.h>
24 #include "AliEventServerUtil.h"
25 #include "AliEventServerReconstruction.h"
26 #include "AliStorageEventManager.h"
27 #include "AliStorageTypes.h"
29 #include "AliESDEvent.h"
30 #include "AliESDtrack.h"
31 #include "AliTrackPointArray.h"
32 #include "AliESDfriendTrack.h"
33 #include "AliExternalTrackParam.h"
34 #include "AliTrackerBase.h"
35 #include "AliTracker.h"
39 AliEventServerReconstruction::AliEventServerReconstruction()
44 fIsListenning(kFALSE),
48 fRecoIsRunning(false),
49 fRecoWasInitialized(false)
52 AliEventServerReconstruction::~AliEventServerReconstruction()
55 //if(fSettings!=0){/*delete fSettings;*/fSettings=0;}
56 if(fAliReco){delete fAliReco;fAliReco=0;}
59 void AliEventServerReconstruction::Close()
63 Info("AliRecoServer::Close", "Closing Server");
65 fIsListenning = kFALSE;
69 Bool_t AliEventServerReconstruction::StartReconstruction(Int_t run, const char* input)
71 cout<<"Start of run:"<<run<<endl;
75 // if(fSettings){delete fSettings;fSettings=0;}
76 //fSettings = new TEnv(AliEventServerUtil::GetPathToServerConf());
77 fSettings.ReadFile(AliEventServerUtil::GetPathToServerConf(),kEnvUser);
80 TString recoBaseDir = fSettings.GetValue("server.saveRecoDir",DEFAULT_SERVER_SAVE_RECO_DIR);
82 // Create directories and logfile
83 TString logFile = Form("%s/log/run%d.log",recoBaseDir.Data(),run);
84 Info("DoStart","Reconstruction log will be written to %s",logFile.Data());
85 if( gSystem->RedirectOutput(logFile.Data())!=0)
87 printf(Form("AliRecoServer::StartReconstruction [] Error while trying to redirect output to [%s]. Exiting...", logFile.Data()) );
90 gSystem->cd(recoBaseDir.Data());
94 if (RetrieveGRP(run,gdcs) <= 0 || gdcs.IsNull()){return kFALSE;}
96 gSystem->mkdir(Form("run%d", run));
97 gSystem->cd(Form("run%d", run));
99 // Create Reco and Reco Thread
100 cout<<"Setup reco will be called"<<endl;
103 fHost = (const char*)Form("%s:%d", fSettings.GetValue("server.host", DEFAULT_SERVER_HOST), fSettings.GetValue("server.port", DEFAULT_SERVER_PORT));
105 cout<<"Creating new thread"<<endl;
106 fRecoThread = new TThread("AliEventServerReconstruction",Dispatch, (void*)this);
108 fIsListenning = kTRUE;
110 cout<<"Reco started"<<endl;
114 bool AliEventServerReconstruction::StopReconstruction()
116 cout<<"Reco server -- StopPeconstruction() called"<<endl;
117 if(!fRecoIsRunning || !fRecoThread)
119 cout<<"Reco is not running. No need to stop it."<<endl;
122 if(!fRecoWasInitialized)
124 cout<<"Reco is under initialization. Wait until it's finished"<<endl;
128 cout<<"killing thread"<<endl;
130 cout<<"thread killed"<<endl;
133 cout<<"Reco server -- thread removed"<<endl;
134 // Emit("Stopped()");
136 cout<<"Reco server -- terminating reconstruction"<<endl;
137 fAliReco->SlaveTerminate();
138 if (fAliReco->GetAbort() != TSelector::kContinue) return false;
139 fAliReco->Terminate();
140 if (fAliReco->GetAbort() != TSelector::kContinue) return false;
142 if(fAliReco){delete fAliReco;fAliReco=0;}
143 cout<<"Reco server -- deleting CDBManager"<<endl;
144 if(fCDBmanager){fCDBmanager->Destroy();fCDBmanager=0;}
145 cout<<"Reco server -- recontruction stopped"<<endl;
146 fRecoIsRunning=false;
147 fRecoWasInitialized=false;
151 void AliEventServerReconstruction::ReconstructionHandle()
153 TThread::SetCancelAsynchronous();
154 TThread::SetCancelOn();
156 if(!fAliReco) return;
158 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
159 eventManager->CreateSocket(EVENTS_SERVER_PUB);
160 eventManager->CreateSocket(XML_PUB);
161 cout<<"Sockets created"<<endl;
162 fAliReco->Begin(NULL);
163 cout<<"Reco began"<<endl;
164 if (fAliReco->GetAbort() != TSelector::kContinue) return;
165 fAliReco->SlaveBegin(NULL);
166 cout<<"Slave began"<<endl;
167 if (fAliReco->GetAbort() != TSelector::kContinue) return;
169 fRecoWasInitialized=true;
170 //******* The loop over events
173 while (fAliReco->HasNextEventAfter(iEvent))
175 // check if process has enough resources
176 cout<<"Event server -- checking resources"<<endl;
177 if (!fAliReco->HasEnoughResources(iEvent)) break;
178 cout<<"Event server -- resources checked"<<endl;
179 Bool_t status = fAliReco->ProcessEvent(iEvent);
180 cout<<"Event server -- event processed"<<endl;
184 event = fAliReco->GetESDEvent();
185 cout<<"Event server -- sending event"<<endl;
186 eventManager->Send(event,EVENTS_SERVER_PUB);
187 cout<<"Event server -- sending event as xml"<<endl;
188 eventManager->SendAsXml(event,XML_PUB);
189 cout<<"Event server -- xml sent"<<endl;
193 cout<<"Event server -- aborting"<<endl;
194 fAliReco->Abort("ProcessEvent",TSelector::kAbortFile);
196 cout<<"Event server -- cleaning event"<<endl;
197 fAliReco->CleanProcessedEvent();
198 cout<<"Event server -- event cleaned"<<endl;
201 StopReconstruction();
204 Int_t AliEventServerReconstruction::RetrieveGRP(UInt_t run, TString &gdc)
206 //if(fSettings==0) return (-1);
208 // Retrieve GRP entry for given run from aldaqdb.
209 TString dbHost = fSettings.GetValue("logbook.host", DEFAULT_LOGBOOK_HOST);
210 Int_t dbPort = fSettings.GetValue("logbook.port", DEFAULT_LOGBOOK_PORT);
211 TString dbName = fSettings.GetValue("logbook.db", DEFAULT_LOGBOOK_DB);
212 TString user = fSettings.GetValue("logbook.user", DEFAULT_LOGBOOK_USER);
213 TString password = fSettings.GetValue("logbook.pass", DEFAULT_LOGBOOK_PASS);
215 Int_t ret=AliGRPPreprocessor::ReceivePromptRecoParameters(run, dbHost.Data(),
216 dbPort, dbName.Data(),
217 user.Data(), password.Data(),
218 Form("local://%s",gSystem->pwd()),
221 if(ret>0) Info("RetrieveGRP","Last run of the same type is: %d",ret);
222 else if(ret==0) Warning("RetrieveGRP","No previous run of the same type found");
223 else if(ret<0) Error("Retrieve","Error code while retrieving GRP parameters returned: %d",ret);
227 void AliEventServerReconstruction::SetupReco(const char* input)
229 //if(fSettings==0) return;
231 //AliTPCRecoParam::SetUseTimeCalibration(kFALSE); //-- !probably should be set from conf file!
233 printf(Form("=========================[local://%s/..]===========\n",gSystem->pwd()));
236 fCDBmanager = AliCDBManager::Instance();
238 fCDBmanager->SetDefaultStorage(fSettings.GetValue("cdb.defaultStorage", DEFAULT_CDB_STORAGE));
239 fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath1", DEFAULT_CDB_SPEC_STORAGE_PATH1),
240 fSettings.GetValue( "cdb.specificStorageValue1", DEFAULT_CDB_SPEC_STORAGE_VALUE1));
242 fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath2", DEFAULT_CDB_SPEC_STORAGE_PATH2),
243 fSettings.GetValue( "cdb.specificStorageValue2", DEFAULT_CDB_SPEC_STORAGE_VALUE2));
245 fCDBmanager->SetSpecificStorage(fSettings.GetValue( "cdb.specificStoragePath3", DEFAULT_CDB_SPEC_STORAGE_PATH3),
246 fSettings.GetValue( "cdb.specificStorageValue3", DEFAULT_CDB_SPEC_STORAGE_VALUE3));
248 /* Reconstruction settings */
249 if(!fAliReco)fAliReco = new AliReconstruction();
252 //rec->SetRunQA(fSettings->GetValue( "qa.runDetectors", DEFAULT_QA_RUN));
253 //rec->SetRunGlobalQA(fSettings->GetValue( "qa.runGlobal", DEFAULT_QA_RUN_GLOBAL));
254 fAliReco->SetQARefDefaultStorage(fSettings.GetValue( "qa.defaultStorage",DEFAULT_QAREF_STORAGE)) ;
255 //rec->SetRunPlaneEff(fSettings->GetValue( "reco.runPlaneEff", DEFAULT_RECO_RUN_PLANE_EFF));
257 fAliReco->SetRunQA(":");
258 fAliReco->SetRunGlobalQA(false);
259 fAliReco->SetRunPlaneEff(false);
261 // AliReconstruction settings
262 fAliReco->SetWriteESDfriend(fSettings.GetValue( "reco.writeESDfriend", DEFAULT_RECO_WRITE_ESDF));
263 fAliReco->SetWriteAlignmentData(fSettings.GetValue( "reco.writeAlignment",DEFAULT_RECO_WRITE_ALIGN));
264 fAliReco->SetInput(input); // reconstruct data from this input
265 fAliReco->SetRunReconstruction(fSettings.GetValue( "reco.detectors", DEFAULT_RECO_DETECTORS));
266 fAliReco->SetUseTrackingErrorsForAlignment("ITS"); //-- !should be set from conf file!
268 // switch off cleanESD
269 fAliReco->SetCleanESD(fSettings.GetValue( "reco.cleanESD",DEFAULT_RECO_CLEAN_ESD));
271 // init reco for given run
272 fAliReco->InitRun(input);