- support for event by event reconstruction added to AliHLTSystem
[u/mrichter/AliRoot.git] / HLT / rec / AliHLTReconstructor.cxx
1 // $Id$
2
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  **************************************************************************/
18
19 /** @file   AliHLTReconstruction.cxx
20     @author Matthias Richter
21     @date   
22     @brief  Binding class for HLT reconstruction in AliRoot. */
23
24 #include <TSystem.h>
25 #include <TObjString.h>
26 #include "AliHLTReconstructor.h"
27 #include "AliLog.h"
28 #include "AliHLTSystem.h"
29
30 ClassImp(AliHLTReconstructor)
31
32 AliHLTReconstructor::AliHLTReconstructor()
33   : 
34   AliReconstructor(),
35   fpSystem(NULL)
36
37   //constructor
38 }
39
40 AliHLTReconstructor::~AliHLTReconstructor()
41
42   //destructor
43
44   if (fpSystem) {
45     AliDebug(0, Form("delete HLT system: status %#x", fpSystem->GetStatusFlags()));
46     if (fpSystem->CheckStatus(AliHLTSystem::kReady)) {
47       // send specific 'event' to execute the stop sequence
48       fpSystem->Reconstruct(0, NULL, NULL);
49     }
50     delete fpSystem;
51   }
52   fpSystem=NULL;
53 }
54
55 void AliHLTReconstructor::Init()
56 {
57   // init the reconstructor
58   if (!fpSystem) fpSystem=new AliHLTSystem;
59   if (!fpSystem) {
60     AliError("can not create AliHLTSystem object");
61     return;
62   }
63   if (fpSystem->CheckStatus(AliHLTSystem::kError)) {
64     AliError("HLT system in error state");
65     return;
66   }
67
68   // the options scan has been moved to AliHLTSystem, the old code
69   // here is kept to be able to run an older version of the HLT code
70   // with newer AliRoot versions.
71   TString libs("");
72   TString option = GetOption();
73   TObjArray* pTokens=option.Tokenize(" ");
74   option="";
75   if (pTokens) {
76     int iEntries=pTokens->GetEntries();
77     for (int i=0; i<iEntries; i++) {
78       TString token=(((TObjString*)pTokens->At(i))->GetString());
79       if (token.Contains("loglevel=")) {
80         TString param=token.ReplaceAll("loglevel=", "");
81         if (param.IsDigit()) {
82           fpSystem->SetGlobalLoggingLevel((AliHLTComponentLogSeverity)param.Atoi());
83         } else if (param.BeginsWith("0x") &&
84                    param.Replace(0,2,"",0).IsHex()) {
85           int severity=0;
86           sscanf(param.Data(),"%x", &severity);
87           fpSystem->SetGlobalLoggingLevel((AliHLTComponentLogSeverity)severity);
88         } else {
89           AliWarning("wrong parameter for option \'loglevel=\', (hex) number expected");
90         }
91       } else if (token.Contains("alilog=off")) {
92         fpSystem->SwitchAliLog(0);
93       } else if (token.BeginsWith("lib") && token.EndsWith(".so")) {
94         libs+=token;
95         libs+=" ";
96       } else {
97         if (option.Length()>0) option+=" ";
98         option+=token;
99       }
100     }
101     delete pTokens;
102   }
103
104   if (!libs.IsNull() &&
105       (!fpSystem->CheckStatus(AliHLTSystem::kLibrariesLoaded)) &&
106       (fpSystem->LoadComponentLibraries(libs.Data())<0)) {
107     AliError("error while loading HLT libraries");
108     return;
109   }
110
111   if (!fpSystem->CheckStatus(AliHLTSystem::kReady)) {
112     typedef int (*AliHLTSystemSetOptions)(AliHLTSystem* pInstance, const char* options);
113     gSystem->Load("libHLTinterface.so");
114     AliHLTSystemSetOptions pFunc=(AliHLTSystemSetOptions)(gSystem->DynFindSymbol("libHLTinterface.so", "AliHLTSystemSetOptions"));
115     if (pFunc) {
116       if ((pFunc)(fpSystem, option.Data())<0) {
117       AliError("error setting options for HLT system");
118       return;   
119       }
120     } else if (option.Length()>0) {
121       AliError(Form("version of HLT system does not support the options \'%s\'", option.Data()));
122       return;
123     }
124     if ((fpSystem->Configure())<0) {
125       AliError("error during HLT system configuration");
126       return;
127     }
128   }
129 }
130
131 void AliHLTReconstructor::Reconstruct(AliRawReader* /*rawReader*/, TTree* /*clustersTree*/) const 
132 {
133   // reconstruction of real data without writing of ESD
134
135   // all reconstruction has been moved to FillESD
136 //   int iResult=0;
137 //   if (fpSystem) {
138 //     if (fpSystem->CheckStatus(AliHLTSystem::kError)) {
139 //       AliError("HLT system in error state");
140 //       return;
141 //     }
142 //     if ((iResult=fpSystem->Reconstruct(1, NULL, rawReader))>=0) {
143 //     }
144 //   }
145 }
146
147 void AliHLTReconstructor::FillESD(AliRawReader* rawReader, TTree* /*clustersTree*/, 
148                                   AliESDEvent* esd) const
149 {
150   // reconstruct real data and fill ESD
151   int iResult=0;
152   if (fpSystem) {
153     if (fpSystem->CheckStatus(AliHLTSystem::kError)) {
154       AliError("HLT system in error state");
155       return;
156     }
157     if (!fpSystem->CheckStatus(AliHLTSystem::kReady)) {
158       AliError("HLT system in wrong state");
159       return;
160     }
161     if ((iResult=fpSystem->Reconstruct(1, NULL, rawReader))>=0) {
162       fpSystem->FillESD(-1, NULL, esd);
163     }
164   }
165 }
166
167 void AliHLTReconstructor::Reconstruct(TTree* /*digitsTree*/, TTree* /*clustersTree*/) const
168 {
169   // reconstruct simulated data
170
171   // all reconstruction has been moved to FillESD
172   //AliReconstructor::Reconstruct(digitsTree,clustersTree);
173 }
174
175 void AliHLTReconstructor::FillESD(TTree* digitsTree, TTree* clustersTree, AliESDEvent* esd) const
176 {
177   // reconstruct simulated data and fill ESD
178
179   // later this is the place to extract the simulated HLT data
180   // for now it's only an user failure condition as he tries to run HLT reconstruction
181   // on simulated data 
182   TString option = GetOption();
183   if (!option.IsNull()) {
184     AliWarning(Form("HLT reconstruction of simulated data takes place in AliSimulation\n"
185                     "        /***  run macro *****************************************/\n"
186                     "        AliSimulation sim;\n"
187                     "        sim.SetRunHLT(\"%s\");\n"
188                     "        sim.SetRunGeneration(kFALSE);\n"
189                     "        sim.SetMakeDigits(\"\");\n"
190                     "        sim.SetMakeSDigits(\"\");\n"
191                     "        sim.SetMakeDigitsFromHits(\"\");\n"
192                     "        sim.Run();\n"
193                     "        /*********************************************************/", option.Data()));
194   }
195   AliReconstructor::FillESD(digitsTree,clustersTree,esd);
196 }