]>
Commit | Line | Data |
---|---|---|
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 */ | |
60 | ClassImp(AliHLTSimulation); | |
61 | ||
62 | AliHLTSimulation::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 | ||
75 | AliHLTSimulation::~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 | ||
87 | AliHLTSimulation* AliHLTSimulation::CreateInstance() | |
88 | { | |
89 | // see header file for function documentation | |
90 | return new AliHLTSimulation; | |
91 | } | |
92 | ||
93 | int AliHLTSimulation::DeleteInstance(AliHLTSimulation* pSim) | |
94 | { | |
95 | // see header file for function documentation | |
96 | assert(pSim!=NULL); | |
97 | delete pSim; | |
98 | return 0; | |
99 | } | |
100 | ||
101 | int 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 | ||
213 | int 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 | ||
258 | AliHLTSimulation* AliHLTSimulationCreateInstance() | |
259 | { | |
260 | // see header file for function documentation | |
261 | return AliHLTSimulation::CreateInstance(); | |
262 | } | |
263 | ||
264 | int AliHLTSimulationDeleteInstance(AliHLTSimulation* pSim) | |
265 | { | |
266 | // see header file for function documentation | |
267 | return AliHLTSimulation::DeleteInstance(pSim); | |
268 | } | |
269 | ||
270 | int 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 | ||
279 | int AliHLTSimulationRun(AliHLTSimulation* pSim, AliRunLoader* pRunLoader) | |
280 | { | |
281 | assert(pSim!=NULL); | |
282 | if (pSim) { | |
283 | return pSim->Run(pRunLoader); | |
284 | } | |
285 | return -ENODEV; | |
286 | } | |
287 | ||
288 | int AliHLTSimulationGetLibraryVersion() | |
289 | { | |
290 | // see header file for function documentation | |
291 | return LIBHLTSIM_VERSION; | |
292 | } | |
b50357c9 | 293 | |
5a29e5cb | 294 | int 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 |
326 | extern "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 |