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");
43 fSettings.ReadFile(AliOnlineReconstructionUtil::GetPathToServerConf(), kEnvUser);
45 cout<<"after startofrun"<<endl;
48 AliOnlineReconstruction::~AliOnlineReconstruction()
50 cout<<"AliOnlineReconstruction -- destructor called...";
53 // fAliReco->SlaveTerminate();
54 // fAliReco->Terminate();
55 // delete fAliReco;fAliReco=0;
57 if(fCDBmanager){fCDBmanager->Destroy();fCDBmanager=0;}
61 void AliOnlineReconstruction::StartOfRun()
63 if(strcmp("local",fSettings.GetValue("data.source", DEFAULT_DATA_SOURCE))==0)
65 cout<<"Starting Reco for run "<<fRun<<endl;
66 fDataSource = Form("mem://%s/run%d", gSystem->Getenv("ONLINERECO_RAWFILES_DIR"), fRun);
68 else if(strcmp(fSettings.GetValue("data.source", DEFAULT_DATA_SOURCE),"run")==0)
70 cout<<"Starting Reco for GDCs active in current run:"<<fRun<<endl;
71 fDataSource = "mem://@*:";
73 else{cout<<"\n\nWrong data source. Quitting\n\n"<<endl;}
75 TString recoBaseDir = fSettings.GetValue("server.saveRecoDir",DEFAULT_SERVER_SAVE_RECO_DIR);
76 cout<<"Reco base dir:"<<recoBaseDir<<endl;
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)
83 printf(Form("AliRecoServer::StartReconstruction [] Error while trying to redirect output to [%s]. Exiting...", logFile.Data()) );
86 gSystem->cd(recoBaseDir.Data());
89 if (RetrieveGRP(gdcs) <= 0 || gdcs.IsNull()){return;}
91 gSystem->Exec(Form("rm -fr run%d;mkdir run%d;cd run%d",fRun,fRun,fRun));
97 int AliOnlineReconstruction::RetrieveGRP(TString &gdc)
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);
106 Int_t ret=AliGRPPreprocessor::ReceivePromptRecoParameters(fRun, dbHost.Data(),
107 dbPort, dbName.Data(),
108 user.Data(), password.Data(),
109 Form("local://%s",gSystem->pwd()),
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);
118 void AliOnlineReconstruction::SetupReco()
120 printf(Form("=========================[local://%s/..]===========\n",gSystem->pwd()));
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 */
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));
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));
146 // init reco for given run
147 fAliReco->InitRun(fDataSource.Data());
150 void AliOnlineReconstruction::ReconstructionLoop()
152 AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
153 eventManager->CreateSocket(EVENTS_SERVER_PUB);
154 eventManager->CreateSocket(XML_PUB);
156 fAliReco->Begin(NULL);
157 if (fAliReco->GetAbort() != TSelector::kContinue) return;
158 fAliReco->SlaveBegin(NULL);
159 if (fAliReco->GetAbort() != TSelector::kContinue) return;
161 //******* The loop over events
164 while (fAliReco->HasNextEventAfter(iEvent) && !gQuit)
166 if (!fAliReco->HasEnoughResources(iEvent)) break;
167 Bool_t status = fAliReco->ProcessEvent(iEvent);
170 event = fAliReco->GetESDEvent();
171 eventManager->Send(event,EVENTS_SERVER_PUB);
172 eventManager->SendAsXml(event,XML_PUB);
175 cout<<"Event server -- aborting"<<endl;
176 fAliReco->Abort("ProcessEvent",TSelector::kAbortFile);
179 fAliReco->CleanProcessedEvent();
180 cout<<"iEvent++"<<endl;
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;