]>
Commit | Line | Data |
---|---|---|
2a24cbbe | 1 | //************************************************************************** |
2 | //* This file is property of and copyright by the ALICE HLT Project * | |
3 | //* ALICE Experiment at CERN, All rights reserved. * | |
4 | //* * | |
5 | //* Primary Authors: Svein Lindal <svein.lindal@gmail.com> * | |
6 | //* for The ALICE HLT Project. * | |
7 | //* * | |
8 | //* Permission to use, copy, modify and distribute this software and its * | |
9 | //* documentation strictly for non-commercial purposes is hereby granted * | |
10 | //* without fee, provided that the above copyright notice appears in all * | |
11 | //* copies and that both the copyright notice and this permission notice * | |
12 | //* appear in the supporting documentation. The authors make no claims * | |
13 | //* about the suitability of this software for any purpose. It is * | |
14 | //* provided "as is" without express or implied warranty. * | |
15 | //************************************************************************** | |
16 | ||
17 | /** @file AliHLTGlobalTrackMatcherComponent.cxx | |
18 | @author Svein Lindal | |
19 | @brief Component to match TPC tracks to Calo Clusters | |
20 | */ | |
21 | ||
22 | #if __GNUC__>= 3 | |
23 | using namespace std; | |
24 | #endif | |
25 | ||
26 | #include "AliHLTProcessor.h" | |
27 | #include "AliHLTGlobalTrackMatcherComponent.h" | |
28 | #include "AliHLTGlobalTrackMatcher.h" | |
29 | #include "TObjArray.h" | |
30 | #include "AliESDEvent.h" | |
31 | #include "AliESDtrack.h" | |
32 | #include "AliHLTGlobalBarrelTrack.h" | |
33 | #include "AliHLTCaloClusterDataStruct.h" | |
34 | #include "AliHLTCaloClusterReader.h" | |
35 | ||
36 | ||
37 | /** ROOT macro for the implementation of ROOT specific class methods */ | |
38 | AliHLTGlobalTrackMatcherComponent gAliHLTGlobalTrackMatcherComponent; | |
39 | ||
40 | ClassImp(AliHLTGlobalTrackMatcherComponent); | |
41 | ||
42 | AliHLTGlobalTrackMatcherComponent::AliHLTGlobalTrackMatcherComponent() : | |
43 | fTrackMatcher(NULL), | |
44 | fNEvents(0), | |
45 | fBz(-9999999), | |
70cad768 | 46 | fClusterReader(NULL), |
47 | fTrackArray(NULL) | |
2a24cbbe | 48 | { |
49 | // see header file for class documentation | |
50 | // or | |
51 | // refer to README to build package | |
52 | // or | |
53 | // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt | |
54 | ||
55 | } | |
56 | ||
57 | AliHLTGlobalTrackMatcherComponent::~AliHLTGlobalTrackMatcherComponent() | |
58 | { | |
59 | // see header file for class documentation | |
60 | if(fTrackMatcher) | |
61 | delete fTrackMatcher; | |
62 | fTrackMatcher = NULL; | |
63 | ||
64 | if(fClusterReader) | |
65 | delete fClusterReader; | |
66 | fClusterReader = NULL; | |
67 | ||
68 | } | |
69 | ||
70 | ||
71 | // Public functions to implement AliHLTComponent's interface. | |
72 | // These functions are required for the registration process | |
73 | const char* AliHLTGlobalTrackMatcherComponent::GetComponentID() | |
74 | { | |
75 | // see header file for class documentation | |
76 | return "TrackMatcher"; | |
77 | } | |
78 | ||
79 | void AliHLTGlobalTrackMatcherComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list) | |
80 | { | |
81 | // see header file for class documentation | |
82 | list.clear(); | |
83 | list.push_back( kAliHLTDataTypeTrack ); | |
84 | list.push_back( kAliHLTDataTypeCaloCluster ); | |
85 | } | |
86 | ||
87 | AliHLTComponentDataType AliHLTGlobalTrackMatcherComponent::GetOutputDataType() | |
88 | { | |
89 | // see header file for class documentation | |
90 | return kAliHLTDataTypeCaloCluster | kAliHLTDataOriginAny; | |
91 | } | |
92 | ||
93 | void AliHLTGlobalTrackMatcherComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier ) | |
94 | { | |
95 | // see header file for class documentation | |
96 | // XXX TODO: Find more realistic values. | |
97 | constBase = 80000; | |
c92e3ef0 | 98 | inputMultiplier = 1; |
2a24cbbe | 99 | } |
100 | ||
101 | AliHLTComponent* AliHLTGlobalTrackMatcherComponent::Spawn() | |
102 | { | |
103 | // see header file for class documentation | |
104 | return new AliHLTGlobalTrackMatcherComponent; | |
105 | } | |
106 | ||
a46c7ba5 | 107 | int AliHLTGlobalTrackMatcherComponent::DoInit( int argc, const char** argv ) |
108 | { | |
2a24cbbe | 109 | |
110 | //BALLE TODO, use command line values to initialise matching vaules | |
a46c7ba5 | 111 | // init |
2a24cbbe | 112 | Int_t iResult = argc; |
05ae9ad4 | 113 | |
a46c7ba5 | 114 | if(argc > 0){ |
115 | HLTWarning("Ignoring all configuration args, starting with: argv %s", argv[0]); | |
2a24cbbe | 116 | } |
117 | ||
05ae9ad4 | 118 | if(!fClusterReader) |
119 | fClusterReader = new AliHLTCaloClusterReader(); | |
a46c7ba5 | 120 | |
05ae9ad4 | 121 | fBz = GetBz(); |
122 | if(fBz == -999999) { | |
123 | HLTError("Magnetic field not properly set, current value: %d", fBz); | |
05ae9ad4 | 124 | } |
70cad768 | 125 | |
a46c7ba5 | 126 | if(!fTrackMatcher) |
127 | fTrackMatcher = new AliHLTGlobalTrackMatcher(); | |
05ae9ad4 | 128 | |
a46c7ba5 | 129 | fNEvents = 0; |
130 | ||
131 | if(!fTrackArray){ | |
132 | fTrackArray = new TObjArray(); | |
133 | fTrackArray->SetOwner(kFALSE); | |
134 | } | |
135 | ||
136 | return iResult; | |
137 | } | |
2a24cbbe | 138 | |
a46c7ba5 | 139 | int AliHLTGlobalTrackMatcherComponent::DoDeinit() |
140 | { | |
2a24cbbe | 141 | // see header file for class documentation |
142 | Int_t iResult = 1; | |
143 | ||
144 | if(fTrackMatcher) | |
145 | delete fTrackMatcher; | |
146 | fTrackMatcher = NULL; | |
147 | ||
148 | if(fClusterReader) | |
149 | delete fClusterReader; | |
150 | fClusterReader = NULL; | |
151 | ||
152 | ||
a46c7ba5 | 153 | fNEvents = 0; |
154 | ||
2a24cbbe | 155 | return iResult; |
156 | } | |
157 | ||
a46c7ba5 | 158 | int AliHLTGlobalTrackMatcherComponent::DoEvent(const AliHLTComponentEventData& /*evtData*/, AliHLTComponentTriggerData& /*trigData*/) |
159 | { | |
2a24cbbe | 160 | |
161 | //See header file for documentation | |
162 | Int_t iResult = 0; | |
163 | ||
164 | if ( GetFirstInputBlock( kAliHLTDataTypeSOR ) || GetFirstInputBlock( kAliHLTDataTypeEOR ) ) | |
165 | return 0; | |
166 | ||
a46c7ba5 | 167 | |
168 | fNEvents++; | |
169 | ||
170 | //Loop over TPC blocks | |
171 | //BALLE TODO check that the tracks in the TObjArray are fine over several blocks | |
172 | ||
173 | fTrackArray->Clear(); | |
174 | vector<AliHLTGlobalBarrelTrack> tracks; | |
70cad768 | 175 | |
a46c7ba5 | 176 | for (const AliHLTComponentBlockData* pBlock = GetFirstInputBlock(kAliHLTDataTypeTrack|kAliHLTDataOriginTPC); pBlock!=NULL; pBlock=GetNextInputBlock()) { |
177 | ||
178 | if ((iResult=AliHLTGlobalBarrelTrack::ConvertTrackDataArray(reinterpret_cast<const AliHLTTracksData*>(pBlock->fPtr), pBlock->fSize, tracks))>=0) { | |
e5b4e619 | 179 | for(UInt_t it = 0; it < tracks.size(); it++) { |
180 | AliHLTGlobalBarrelTrack track = tracks.at(it); | |
181 | fTrackArray->AddLast(dynamic_cast<TObject*>(&(tracks.at(it)))); | |
182 | } | |
183 | } else { | |
184 | HLTWarning("Converting tracks to vector failed"); | |
185 | } | |
05ae9ad4 | 186 | |
a46c7ba5 | 187 | // //Push the TPC block on, without any changes |
c830cd50 | 188 | //PushBack(pBlock->fPtr, pBlock->fSize, pBlock->fDataType, pBlock->fSpecification); |
a46c7ba5 | 189 | |
190 | } | |
2a24cbbe | 191 | |
ec54c698 | 192 | AliHLTCaloClusterDataStruct * caloClusterStruct; |
193 | //Get the PHOS Clusters | |
194 | vector<AliHLTCaloClusterDataStruct*> phosClustersVector; | |
195 | ||
e5b4e619 | 196 | for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeCaloCluster | kAliHLTDataOriginPHOS); pBlock!=NULL; pBlock=GetNextInputBlock()) { |
197 | AliHLTCaloClusterHeaderStruct *caloClusterHeader = reinterpret_cast<AliHLTCaloClusterHeaderStruct*>(pBlock->fPtr); | |
198 | fClusterReader->SetMemory(caloClusterHeader); | |
199 | if ( (caloClusterHeader->fNClusters) < 0) { | |
200 | HLTWarning("Event has negative number of clusters: %d! Very bad for vector resizing", (Int_t) (caloClusterHeader->fNClusters)); | |
201 | continue; | |
202 | } else { | |
203 | phosClustersVector.reserve( (int) (caloClusterHeader->fNClusters) + phosClustersVector.size() ); | |
204 | while( (caloClusterStruct = fClusterReader->NextCluster()) != 0) { | |
205 | phosClustersVector.push_back(caloClusterStruct); | |
206 | } | |
a46c7ba5 | 207 | } |
e5b4e619 | 208 | } |
ec54c698 | 209 | |
210 | ||
211 | //Get the EMCAL Clusters | |
212 | vector<AliHLTCaloClusterDataStruct*> emcalClustersVector; | |
213 | for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeCaloCluster | kAliHLTDataOriginEMCAL); pBlock!=NULL; pBlock=GetNextInputBlock()) { | |
214 | AliHLTCaloClusterHeaderStruct *caloClusterHeader = reinterpret_cast<AliHLTCaloClusterHeaderStruct*>(pBlock->fPtr); | |
215 | fClusterReader->SetMemory(caloClusterHeader); | |
e5b4e619 | 216 | if ( (caloClusterHeader->fNClusters) < 0) { |
217 | HLTWarning("Event has negative number of clusters: %d! Very bad for vector resizing", (Int_t) (caloClusterHeader->fNClusters)); | |
218 | continue; | |
219 | } else { | |
220 | emcalClustersVector.reserve( (int) (caloClusterHeader->fNClusters) + emcalClustersVector.size() ); | |
221 | while( (caloClusterStruct = fClusterReader->NextCluster()) != 0) { | |
222 | emcalClustersVector.push_back(caloClusterStruct); | |
ec54c698 | 223 | } |
e5b4e619 | 224 | } |
ec54c698 | 225 | } |
226 | ||
227 | iResult = fTrackMatcher->Match(fTrackArray, phosClustersVector, emcalClustersVector, fBz); | |
2a24cbbe | 228 | |
ec54c698 | 229 | //Push the blocks on |
e5b4e619 | 230 | for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeCaloCluster | kAliHLTDataOriginAny); pBlock!=NULL; pBlock=GetNextInputBlock()) { |
231 | PushBack(pBlock->fPtr, pBlock->fSize, pBlock->fDataType, pBlock->fSpecification); | |
232 | } | |
233 | ||
01d100c8 | 234 | fTrackArray->Clear(); |
e5b4e619 | 235 | |
a46c7ba5 | 236 | return iResult; |
2a24cbbe | 237 | } |
238 | ||
239 | // int AliHLTGlobalTrackMatcherComponent::Configure(const char* arguments) | |
240 | // { | |
241 | // Int_t iResult = 1; | |
242 | // return iResult; | |
243 | // } | |
244 | ||
245 | // int AliHLTGlobalTrackMatcherComponent::Reconfigure(const char* cdbEntry, const char* chainId) | |
246 | // { | |
247 | // Int_t iResult = 1; | |
248 | // return iResult; | |
249 | // } |