3 //**************************************************************************
4 //* This file is property of and copyright by the ALICE HLT Project *
5 //* ALICE Experiment at CERN, All rights reserved. *
7 //* Primary Authors: Jacek Otwinowski <J.Otwinowski@gsi.de> *
9 //* Permission to use, copy, modify and distribute this software and its *
10 //* documentation strictly for non-commercial purposes is hereby granted *
11 //* without fee, provided that the above copyright notice appears in all *
12 //* copies and that both the copyright notice and this permission notice *
13 //* appear in the supporting documentation. The authors make no claims *
14 //* about the suitability of this software for any purpose. It is *
15 //* provided "as is" without express or implied warranty. *
16 //**************************************************************************
18 /** @file AliHLTTPCOfflineTrackerCalibComponent.cxx
19 @author Jacek Otwinowski & Matthias Richter
21 @brief Wrapper component to the TPC offline tracker (ONLY CALIBRATION)
24 #include "AliHLTTPCOfflineTrackerCalibComponent.h"
26 #include "TClonesArray.h"
27 #include "TObjArray.h"
28 #include "TObjString.h"
29 #include "AliVParticle.h"
30 #include "AliCDBManager.h"
31 #include "AliCDBEntry.h"
32 #include "AliGeomManager.h"
34 #include "AliTPCReconstructor.h"
35 #include "AliTPCParam.h"
36 #include "AliTPCRecoParam.h"
37 #include "AliTPCParamSR.h"
38 #include "AliTPCtrackerMI.h"
39 #include "AliTPCClustersRow.h"
40 #include "AliTPCseed.h"
41 #include "AliESDEvent.h"
42 #include "AliHLTTPCDefinitions.h"
44 /** ROOT macro for the implementation of ROOT specific class methods */
45 ClassImp(AliHLTTPCOfflineTrackerCalibComponent)
47 AliHLTTPCOfflineTrackerCalibComponent::AliHLTTPCOfflineTrackerCalibComponent() : AliHLTProcessor(),
48 fGeometryFileName(""),
53 // Default constructor
54 fGeometryFileName = getenv("ALICE_ROOT");
55 fGeometryFileName += "/HLT/TPCLib/offline/geometry.root";
58 AliHLTTPCOfflineTrackerCalibComponent::~AliHLTTPCOfflineTrackerCalibComponent()
60 // see header file for class documentation
63 const char* AliHLTTPCOfflineTrackerCalibComponent::GetComponentID()
65 // see header file for class documentation
66 return "TPCOfflineTrackerCalib";
69 void AliHLTTPCOfflineTrackerCalibComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list)
71 // get input data type
72 list.push_back(kAliHLTDataTypeTObjArray|kAliHLTDataOriginTPC/*AliHLTTPCDefinitions::fgkOfflineClustersDataType*/);
75 AliHLTComponentDataType AliHLTTPCOfflineTrackerCalibComponent::GetOutputDataType()
77 // create output data type
78 //return kAliHLTDataTypeESDObject|kAliHLTDataOriginTPC/*AliHLTTPCDefinitions::fgkOfflineTrackSegmentsDataType*/;
79 return kAliHLTDataTypeTObjArray|kAliHLTDataOriginTPC;
82 void AliHLTTPCOfflineTrackerCalibComponent::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier)
84 // get output data size
89 AliHLTComponent* AliHLTTPCOfflineTrackerCalibComponent::Spawn()
91 // create instance of the component
92 return new AliHLTTPCOfflineTrackerCalibComponent;
95 int AliHLTTPCOfflineTrackerCalibComponent::DoInit( int argc, const char** argv )
100 #ifdef HAVE_NOT_TPCOFFLINE_REC
101 HLTFatal("AliRoot version > v4-13-Release required");
106 TString configuration="";
109 // loop over input parameters
110 for (int i=0; i<argc && iResult>=0; i++) {
112 if (argument.IsNull()) continue;
114 if (argument.CompareTo("-geometry")==0) {
115 if ((bMissingParam=(++i>=argc))) break;
117 HLTInfo("got \'-geometry\' argument: %s", argv[i]);
118 fGeometryFileName = argv[i];
119 HLTInfo("Geometry file is: %s", fGeometryFileName.c_str());
121 // the remaining arguments are treated as configuration
123 if (!configuration.IsNull()) configuration+=" ";
124 configuration+=argument;
129 HLTError("missing parameter for argument %s", argument.Data());
133 if (iResult>=0 && !configuration.IsNull()) {
134 iResult=Configure(configuration.Data());
136 iResult=Reconfigure(NULL, NULL);
144 AliGeomManager::LoadGeometry(fGeometryFileName.c_str());
145 if((AliGeomManager::GetGeometry()) == 0) {
146 HLTError("Cannot load geometry from file %s",fGeometryFileName.c_str());
150 // TPC reconstruction parameters
151 AliTPCRecoParam * tpcRecoParam = AliTPCRecoParam::GetHLTParam();
153 tpcRecoParam->SetClusterSharing(kTRUE);
155 AliTPCReconstructor tpcReconstructor;
156 tpcReconstructor.SetRecoParam(tpcRecoParam);
159 // TPC geometry parameters
160 fTPCGeomParam = new AliTPCParamSR;
162 fTPCGeomParam->ReadGeoMatrices();
166 fTracker = new AliTPCtrackerMI(fTPCGeomParam);
168 // AliESDEvent event needed by AliTPCtrackerMI
169 // output of the component
170 fESD = new AliESDEvent();
172 fESD->CreateStdContent();
175 if (!fTracker || !fESD || !fTPCGeomParam) {
176 HLTError("failed creating internal objects");
181 // read the default CDB entries
182 iResult=Reconfigure(NULL, NULL);
188 int AliHLTTPCOfflineTrackerCalibComponent::DoDeinit()
190 // deinit configuration
192 if(fTPCGeomParam) delete fTPCGeomParam; fTPCGeomParam = 0;
193 if(fTracker) delete fTracker; fTracker = 0;
194 if(fESD) delete fESD; fESD = 0;
199 int AliHLTTPCOfflineTrackerCalibComponent::DoEvent( const AliHLTComponentEventData& /*evtData*/, AliHLTComponentTriggerData& /*trigData*/)
202 HLTInfo("DoEvent processing data");
205 TClonesArray *clusterArray=0;
206 TObjArray *seedArray=0;
209 const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeTObjArray|kAliHLTDataOriginTPC);
211 HLTError("Cannot get first data block 0x%08x ",pBlock);
212 iResult=-ENOMEM; return iResult;
214 int minSlice=AliHLTTPCDefinitions::GetMinSliceNr(pBlock->fSpecification);
215 int maxSlice=AliHLTTPCDefinitions::GetMaxSliceNr(pBlock->fSpecification);
216 int minPatch=AliHLTTPCDefinitions::GetMinPatchNr(pBlock->fSpecification);
217 int maxPatch=AliHLTTPCDefinitions::GetMaxPatchNr(pBlock->fSpecification);
219 if (fTracker && fESD) {
220 // loop over input data blocks: TClonesArrays of clusters
221 for (TObject *pObj = (TObject *)GetFirstInputObject(kAliHLTDataTypeTObjArray|kAliHLTDataOriginTPC/*AliHLTTPCDefinitions::fgkOfflineClustersDataType*/,"TClonesArray",0);
222 pObj !=0 && iResult>=0;
223 pObj = (TObject *)GetNextInputObject(0)) {
224 clusterArray = dynamic_cast<TClonesArray*>(pObj);
225 if (!clusterArray) continue;
227 HLTInfo("load %d clusters from block %s 0x%08x", clusterArray->GetEntries(), DataType2Text(GetDataType(pObj)).c_str(), GetSpecification(pObj));
228 slice=AliHLTTPCDefinitions::GetMinSliceNr(GetSpecification(pObj));
229 patch=AliHLTTPCDefinitions::GetMinPatchNr(GetSpecification(pObj));
231 if(slice < minSlice) minSlice=slice;
232 if(slice > maxSlice) maxSlice=slice;
233 if(patch < minPatch) minPatch=patch;
234 if(patch > maxPatch) maxPatch=patch;
235 #ifndef HAVE_NOT_TPCOFFLINE_REC
236 fTracker->LoadClusters(clusterArray);
237 #endif //HAVE_NOT_TPCOFFLINE_REC
239 clusterArray->Delete();
240 }// end loop over input objects
242 #ifndef HAVE_NOT_TPCOFFLINE_REC
243 // Load outer sectors
244 fTracker->LoadOuterSectors();
245 // Load inner sectors
246 fTracker->LoadInnerSectors();
249 // set magnetic field for the ESD, assumes correct initialization of
251 fESD->SetMagneticField(AliTracker::GetBz());
254 fTracker->Clusters2Tracks(fESD);
257 seedArray = fTracker->GetSeeds();
259 Int_t nTracks = fESD->GetNumberOfTracks();
260 HLTInfo("Number TPC tracks %d", nTracks);
262 // calculate specification from the specification of input data blocks
263 AliHLTUInt32_t iSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( minSlice, maxSlice, minPatch, maxPatch );
264 HLTInfo("minSlice %d, maxSlice %d, minPatch %d, maxPatch %d", minSlice, maxSlice, minPatch, maxPatch);
267 if(seedArray) PushBack(seedArray, kAliHLTDataTypeTObjArray|kAliHLTDataOriginTPC, iSpecification);
270 if(seedArray) seedArray->Delete();
273 fTracker->UnloadClusters();
275 // reset ESDs and ESDs friends
279 HLTError("component not initialized");
286 int AliHLTTPCOfflineTrackerCalibComponent::Configure(const char* arguments)
288 // see header file for class documentation
290 if (!arguments) return iResult;
292 TString allArgs=arguments;
296 TObjArray* pTokens=allArgs.Tokenize(" ");
298 for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
299 argument=((TObjString*)pTokens->At(i))->GetString();
300 if (argument.IsNull()) continue;
302 if (argument.CompareTo("-solenoidBz")==0) {
303 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
304 // TODO: check if there is common functionality in the AliMagF* classes
305 float SolenoidBz=((TObjString*)pTokens->At(i))->GetString().Atof();
306 if (SolenoidBz<kAlmost0Field) SolenoidBz=kAlmost0Field;
307 AliMagF::BMap_t map = AliMagF::k5kG;
308 float factor=SolenoidBz/5;
312 } /*else if (SolenoidBz>=3. && SolenoidBz<4.5) {
313 map=AliMagFMaps::k4kG;
317 map=AliMagFMaps::k5kG;
321 // the magnetic field map is not supposed to change
322 // field initialization should be done once in the beginning
323 // TODO: does the factor need adjustment?
324 const AliMagF* currentMap = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
326 AliMagF* field = new AliMagF("MagneticFieldMap", "BMap", 2, 1., 1., 10., map);
327 TGeoGlobalMagField::Instance()->SetField(field);
328 HLTInfo("Solenoid Field set to: %f map %d", SolenoidBz, map);
329 } else if (currentMap->GetMapType()!=map) {
330 HLTWarning("omitting request to override field map %d with %d", currentMap->GetMapType(), map);
334 HLTError("unknown argument %s", argument.Data());
342 HLTError("missing parameter for argument %s", argument.Data());
348 int AliHLTTPCOfflineTrackerCalibComponent::Reconfigure(const char* cdbEntry, const char* chainId)
350 // see header file for class documentation
352 const char* path=kAliHLTCDBSolenoidBz;
353 const char* defaultNotify="";
356 defaultNotify=" (default)";
359 if (chainId) {} // just to get rid of warning, can not comment argument due to debug message
360 HLTDebug("reconfigure from entry %s%s, chain id %s", path, defaultNotify,(chainId!=NULL && chainId[0]!=0)?chainId:"<none>");
361 AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(path/*,GetRunNo()*/);
363 TObjString* pString=dynamic_cast<TObjString*>(pEntry->GetObject());
365 HLTDebug("received configuration object string: \'%s\'", pString->GetString().Data());
366 iResult=Configure(pString->GetString().Data());
368 HLTError("configuration object \"%s\" has wrong type, required TObjString", path);
371 HLTError("can not fetch object \"%s\" from CDB", path);