removing the generation of the local solenoidBz OCDB entry
[u/mrichter/AliRoot.git] / HLT / sim / AliHLTSimulation.cxx
CommitLineData
4cbaf07b 1// $Id$
2
c5123824 3//**************************************************************************
4//* This file is property of and copyright by the ALICE HLT Project *
5//* ALICE Experiment at CERN, All rights reserved. *
6//* *
7//* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8//* for The ALICE HLT Project. *
9//* *
10//* Permission to use, copy, modify and distribute this software and its *
11//* documentation strictly for non-commercial purposes is hereby granted *
12//* without fee, provided that the above copyright notice appears in all *
13//* copies and that both the copyright notice and this permission notice *
14//* appear in the supporting documentation. The authors make no claims *
15//* about the suitability of this software for any purpose. It is *
16//* provided "as is" without express or implied warranty. *
17//**************************************************************************
4cbaf07b 18
19/** @file AliHLTSimulation.cxx
20 @author Matthias Richter
21 @date
22 @brief Binding class for HLT simulation in AliRoot. */
23
24#include <cassert>
25#include <cerrno>
7777fa45 26#include "TObjArray.h"
27#include "TObjString.h"
4cbaf07b 28#include "AliHLTSimulation.h"
5a29e5cb 29#include "AliSimulation.h"
4cbaf07b 30#include "AliLog.h"
90c37647 31#include "AliRun.h"
4cbaf07b 32#include "AliRunLoader.h"
90c37647 33#include "AliHeader.h"
90c37647 34#include "AliCDBManager.h"
35#include "AliCDBEntry.h"
36#include "AliCDBPath.h"
37#include "AliCDBId.h"
38#include "AliCDBMetaData.h"
8dd79235 39#include "AliCDBStorage.h"
40#include "AliGRPObject.h"
9f199018 41#include "AliGRPManager.h"
4cbaf07b 42#include "AliHLTSystem.h"
7bf6c76d 43#include "AliHLTPluginBase.h"
7777fa45 44#include "AliRawReaderFile.h"
45#include "AliRawReaderDate.h"
46#include "AliRawReaderRoot.h"
a8420176 47#include "AliESDEvent.h"
2c0e5942 48#include "AliHLTOUTComponent.h"
9f199018 49#include "AliTracker.h"
8dd79235 50#include "TGeoGlobalMagField.h"
51#include "TSystem.h"
4e1f4995 52#include "TMath.h"
9f199018 53#include "TGeoGlobalMagField.h"
4cbaf07b 54
55#if ALIHLTSIMULATION_LIBRARY_VERSION != LIBHLTSIM_VERSION
56#error library version in header file and lib*.pkg do not match
57#endif
58
59/** ROOT macro for the implementation of ROOT specific class methods */
60ClassImp(AliHLTSimulation);
61
62AliHLTSimulation::AliHLTSimulation()
63 :
64 fOptions(),
7bf6c76d 65 fpPluginBase(new AliHLTPluginBase),
7777fa45 66 fpRawReader(NULL)
4cbaf07b 67{
68 // see header file for class documentation
69 // or
70 // refer to README to build package
71 // or
72 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
73}
74
75AliHLTSimulation::~AliHLTSimulation()
76{
77 // see header file for function documentation
7bf6c76d 78 if (fpPluginBase) delete fpPluginBase;
79 fpPluginBase=NULL;
80
7777fa45 81 if (fpRawReader) {
82 delete fpRawReader;
83 }
84 fpRawReader=NULL;
4cbaf07b 85}
86
87AliHLTSimulation* AliHLTSimulation::CreateInstance()
88{
89 // see header file for function documentation
90 return new AliHLTSimulation;
91}
92
93int AliHLTSimulation::DeleteInstance(AliHLTSimulation* pSim)
94{
95 // see header file for function documentation
96 assert(pSim!=NULL);
97 delete pSim;
98 return 0;
99}
100
101int AliHLTSimulation::Init(AliRunLoader* pRunLoader, const char* options)
102{
103 // init the simulation
104 fOptions=options;
7777fa45 105 TString sysOp;
4cbaf07b 106
7bf6c76d 107 if(!fpPluginBase) {
108 AliError("internal initialization failed");
109 return -EINVAL;
110 }
111
112 AliHLTSystem* pSystem=fpPluginBase->GetInstance();
113 if (!pSystem) {
114 AliError("can not get AliHLTSystem instance");
4cbaf07b 115 return -ENOMEM;
116 }
7bf6c76d 117 if (pSystem->CheckStatus(AliHLTSystem::kError)) {
4cbaf07b 118 AliError("HLT system in error state");
119 return -EFAULT;
120 }
121
7777fa45 122 // scan options for specific entries
123 TObjArray* pTokens=fOptions.Tokenize(" ");
124 if (pTokens) {
125 int iEntries=pTokens->GetEntries();
126 for (int i=0; i<iEntries; i++) {
127 TString token=(((TObjString*)pTokens->At(i))->GetString());
128 if (token.Contains("rawfile=")) {
129 TString param=token.ReplaceAll("rawfile=", "");
130 if (param.EndsWith("/")) {
131 AliInfo(Form("creating AliRawReaderFile (%s)", param.Data()));
132 fpRawReader = new AliRawReaderFile(param);
133 } else if (param.EndsWith(".root")) {
134 AliInfo(Form("creating AliRawReaderRoot (%s)", param.Data()));
135 fpRawReader = new AliRawReaderRoot(param);
136 } else if (!param.IsNull()) {
137 AliInfo(Form("creating AliRawReaderDate (%s)", param.Data()));
138 fpRawReader = new AliRawReaderDate(param);
7777fa45 139 }
140 if (fpRawReader) {
141 fpRawReader->RewindEvents();
142 int count=0;
32f88fc5 143 for ( ; fpRawReader->NextEvent(); count++) {/* empty body */};
7777fa45 144 if (count!=pRunLoader->GetNumberOfEvents()) {
c5123824 145 AliError(Form("mismatch in event count: runloader %d, rawreader %d; ignoring rawreader",
7777fa45 146 pRunLoader->GetNumberOfEvents(), count));
147 count=0;
148 }
149 if (count>0) {
150 fpRawReader->RewindEvents();
151 fpRawReader->NextEvent();
152 } else {
153 delete fpRawReader;
154 fpRawReader=NULL;
155 }
156 }
2c0e5942 157 } else if (token.Contains("writerawfiles=")) {
158 if (!token.ReplaceAll("writerawfiles=", "").Contains("HLT")) {
159 AliHLTOUTComponent::ClearGlobalOption(AliHLTOUTComponent::kWriteRawFiles);
160 }
7777fa45 161 } else {
162 if (sysOp.Length()>0) sysOp+=" ";
163 sysOp+=token;
164 }
165 }
166 delete pTokens;
167 }
168
90c37647 169 AliCDBManager* man = AliCDBManager::Instance();
170 if (man && man->IsDefaultStorageSet())
171 {
90c37647 172 int runNo=pRunLoader->GetHeader()->GetRun();
8dd79235 173
174 // init solenoid field
9f199018 175 // 2009-11-07 magnetic field handling fo HLT components has been switched to the
176 // global AliMagF instance, the HLT/ConfigHLT/SolenoidBz entry is obsolete
177 // The global instance is either established by the AliRoot environment or the
178 // component external interface.
179 if (TGeoGlobalMagField::Instance()->GetField()) {
180 AliDebug(0, Form("magnetic field: %f", AliTracker::GetBz()));
8dd79235 181 } else {
182 // workaround for bug #51285
9f199018 183 AliGRPManager grpman;
184 if (grpman.ReadGRPEntry() &&
185 grpman.SetMagField()) {
186 // nothing to do any more
8dd79235 187 }
9f199018 188 AliError(Form("can not get the AliMagF instance, falling back to GRP entry (%f)", AliTracker::GetBz()));
90c37647 189 }
8dd79235 190 } else if (man) {
191 AliError("OCDB default storage not yet set, can not prepare OCDB entries");
192 } else {
193 AliError("unable to get instance of AliCDBMetaData, can not prepare OCDB entries");
90c37647 194 }
195
7777fa45 196 // scan options
7bf6c76d 197 if (pSystem->ScanOptions(sysOp.Data())<0) {
4cbaf07b 198 AliError("error setting options for HLT system");
199 return -EINVAL;
200 }
201
7bf6c76d 202 if (!pSystem->CheckStatus(AliHLTSystem::kReady)) {
203 if ((pSystem->Configure(fpRawReader, pRunLoader))<0) {
4cbaf07b 204 AliError("error during HLT system configuration");
205 return -EFAULT;
206 }
207 }
208
209 return 0;
210}
211
212
213int AliHLTSimulation::Run(AliRunLoader* pRunLoader)
214{
215 // HLT reconstruction for simulated data
7bf6c76d 216 if(!fpPluginBase) {
217 AliError("internal initialization failed");
218 return -EINVAL;
219 }
220
4cbaf07b 221 if(!pRunLoader) {
222 AliError("Missing RunLoader! 0x0");
223 return -EINVAL;
224 }
225
7777fa45 226 int nEvents = pRunLoader->GetNumberOfEvents();
4cbaf07b 227 int iResult=0;
228
7bf6c76d 229 AliHLTSystem* pSystem=fpPluginBase->GetInstance();
230 if (!pSystem) {
231 AliError("can not get AliHLTSystem instance");
232 return -ENOMEM;
233 }
234
235 if (pSystem->CheckStatus(AliHLTSystem::kError)) {
4cbaf07b 236 AliError("HLT system in error state");
237 return -EFAULT;
238 }
7777fa45 239
240 // Note: the rawreader is already placed at the first event
7bf6c76d 241 if ((iResult=pSystem->Reconstruct(1, pRunLoader, fpRawReader))>=0) {
242 pSystem->FillESD(0, pRunLoader, NULL);
7777fa45 243 for (int i=1; i<nEvents; i++) {
244 if (fpRawReader && !fpRawReader->NextEvent()) {
c5123824 245 AliError("mismatch in event count, rawreader corrupted");
7777fa45 246 break;
247 }
7bf6c76d 248 pSystem->Reconstruct(1, pRunLoader, fpRawReader);
249 pSystem->FillESD(i, pRunLoader, NULL);
7777fa45 250 }
dee38f1b 251 // send specific 'event' to execute the stop sequence
7bf6c76d 252 pSystem->Reconstruct(0, NULL, NULL);
4cbaf07b 253 }
254 return iResult;
255}
256
257
258AliHLTSimulation* AliHLTSimulationCreateInstance()
259{
260 // see header file for function documentation
261 return AliHLTSimulation::CreateInstance();
262}
263
264int AliHLTSimulationDeleteInstance(AliHLTSimulation* pSim)
265{
266 // see header file for function documentation
267 return AliHLTSimulation::DeleteInstance(pSim);
268}
269
270int AliHLTSimulationInit(AliHLTSimulation* pSim, AliRunLoader* pRunLoader, const char* options)
271{
272 assert(pSim!=NULL);
273 if (pSim) {
274 return pSim->Init(pRunLoader, options);
275 }
276 return -ENODEV;
277}
278
279int AliHLTSimulationRun(AliHLTSimulation* pSim, AliRunLoader* pRunLoader)
280{
281 assert(pSim!=NULL);
282 if (pSim) {
283 return pSim->Run(pRunLoader);
284 }
285 return -ENODEV;
286}
287
288int AliHLTSimulationGetLibraryVersion()
289{
290 // see header file for function documentation
291 return LIBHLTSIM_VERSION;
292}
b50357c9 293
5a29e5cb 294int AliHLTSimulationSetup(AliHLTSimulation* /*pHLTSim*/, AliSimulation* pSim, const char* specificObjects)
8dd79235 295{
296 // see header file for function documentation
297
298 // this is an attempt to solve issue #48360
299 // since there are many jobs running in parallel during the production,
300 // all the jobs want to put entries into the OCDB. The solution is to
301 // make them temporary, since they are only used to propagate information
302 // from the simulation to the reconstruction.
5a29e5cb 303
304 if (!pSim) return -EINVAL;
305 const char* entries[]={
5a29e5cb 306 NULL
307 };
308
309 TString specificStorage;
310 specificStorage.Form("local://%s",gSystem->pwd());
311 for (const char** pEntry=entries; *pEntry!=NULL; pEntry++) {
312 const char* pObject=specificObjects?strstr(specificObjects, *pEntry):NULL;
313 if (pObject) {
314 // skip this entry if it is found in the list and either
315 // last one or separated by a blank
316 pObject+=strlen(*pEntry);
317 if (*pObject==0 || *pObject==' ') continue;
318 }
319 pSim->SetSpecificStorage(*pEntry, specificStorage.Data());
8dd79235 320 }
1daa8d18 321
322 return 0;
8dd79235 323}
324
5a29e5cb 325#ifndef HAVE_COMPILEINFO
326extern "C" void CompileInfo(const char*& date, const char*& time)
b50357c9 327{
328 // the fall back compile info of the HLTsim library
329 // this is not up-to-date if other files have been changed and recompiled
330 date=__DATE__; time=__TIME__;
331 return;
332}
5a29e5cb 333#endif