]>
Commit | Line | Data |
---|---|---|
71d7c760 | 1 | // $Id$ |
2 | ||
3 | /************************************************************************** | |
9be2600f | 4 | * This file is property of and copyright by the ALICE HLT Project * |
5 | * ALICE Experiment at CERN, All rights reserved. * | |
71d7c760 | 6 | * * |
9be2600f | 7 | * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> * |
8 | * Timm Steinbeck <timm@kip.uni-heidelberg.de> * | |
9 | * for The ALICE HLT Project. * | |
71d7c760 | 10 | * * |
11 | * Permission to use, copy, modify and distribute this software and its * | |
12 | * documentation strictly for non-commercial purposes is hereby granted * | |
13 | * without fee, provided that the above copyright notice appears in all * | |
14 | * copies and that both the copyright notice and this permission notice * | |
15 | * appear in the supporting documentation. The authors make no claims * | |
16 | * about the suitability of this software for any purpose. It is * | |
17 | * provided "as is" without express or implied warranty. * | |
18 | **************************************************************************/ | |
19 | ||
96bda103 | 20 | /** @file AliHLTTPCGlobalMergerComponent.cxx |
ecefc48a | 21 | @author Timm Steinbeck, Matthias Richter |
22 | @date | |
23 | @brief HLT TPC global merger component. | |
24 | */ | |
71d7c760 | 25 | |
e67b0680 | 26 | // see header file for class documentation // |
27 | // or // | |
28 | // refer to README to build package // | |
29 | // or // | |
30 | // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt // | |
31 | ||
32 | #if __GNUC__>= 3 | |
71d7c760 | 33 | using namespace std; |
34 | #endif | |
35 | ||
36 | #include "AliHLTTPCGlobalMergerComponent.h" | |
7bcd6cad | 37 | //#include "AliHLTTPCTransform.h" |
a6c02c85 | 38 | #include "AliHLTTPCGlobalMerger.h" |
39 | #include "AliHLTTPCVertex.h" | |
40 | #include "AliHLTTPCVertexData.h" | |
41 | #include "AliHLTTPCTrackSegmentData.h" | |
42 | #include "AliHLTTPCTrackArray.h" | |
71d7c760 | 43 | #include "AliHLTTPCTrackletDataFormat.h" |
7bcd6cad | 44 | //#include "AliHLTTPCSpacePointData.h" |
45 | //#include "AliHLTTPCClusterDataFormat.h" | |
96bda103 | 46 | #include "AliHLTTPCDefinitions.h" |
e67b0680 | 47 | #include <cstdlib> |
48 | #include <cerrno> | |
71d7c760 | 49 | |
672f8b8c | 50 | /** ROOT macro for the implementation of ROOT specific class methods */ |
e67b0680 | 51 | ClassImp(AliHLTTPCGlobalMergerComponent); |
71d7c760 | 52 | |
53 | AliHLTTPCGlobalMergerComponent::AliHLTTPCGlobalMergerComponent() | |
96bda103 | 54 | : |
55 | fGlobalMerger(NULL), | |
56 | fVertex(NULL) | |
57 | { | |
58 | // see header file for class documentation | |
59 | // or | |
60 | // refer to README to build package | |
61 | // or | |
62 | // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt | |
63 | } | |
64 | ||
71d7c760 | 65 | AliHLTTPCGlobalMergerComponent::~AliHLTTPCGlobalMergerComponent() |
96bda103 | 66 | { |
67 | // see header file for class documentation | |
68 | } | |
71d7c760 | 69 | |
70 | // Public functions to implement AliHLTComponent's interface. | |
71 | // These functions are required for the registration process | |
72 | ||
73 | const char* AliHLTTPCGlobalMergerComponent::GetComponentID() | |
e67b0680 | 74 | { |
96bda103 | 75 | // see header file for class documentation |
e67b0680 | 76 | return "TPCGlobalMerger"; |
77 | } | |
71d7c760 | 78 | |
7bcd6cad | 79 | void AliHLTTPCGlobalMergerComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list) |
e67b0680 | 80 | { |
96bda103 | 81 | // see header file for class documentation |
e67b0680 | 82 | list.clear(); |
83 | list.push_back( AliHLTTPCDefinitions::fgkTrackSegmentsDataType ); | |
84 | list.push_back( AliHLTTPCDefinitions::fgkVertexDataType ); | |
85 | } | |
71d7c760 | 86 | |
8ede8717 | 87 | AliHLTComponentDataType AliHLTTPCGlobalMergerComponent::GetOutputDataType() |
e67b0680 | 88 | { |
96bda103 | 89 | // see header file for class documentation |
e67b0680 | 90 | return AliHLTTPCDefinitions::fgkTracksDataType; |
91 | } | |
71d7c760 | 92 | |
93 | void AliHLTTPCGlobalMergerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier ) | |
e67b0680 | 94 | { |
96bda103 | 95 | // see header file for class documentation |
e67b0680 | 96 | // XXX TODO: Find more realistic values. |
97 | constBase = 0; | |
98 | inputMultiplier = 1.0; | |
99 | } | |
71d7c760 | 100 | |
101 | AliHLTComponent* AliHLTTPCGlobalMergerComponent::Spawn() | |
e67b0680 | 102 | { |
96bda103 | 103 | // see header file for class documentation |
e67b0680 | 104 | return new AliHLTTPCGlobalMergerComponent; |
105 | } | |
71d7c760 | 106 | |
107 | void AliHLTTPCGlobalMergerComponent::SetMergerParameters(Double_t maxy,Double_t maxz,Double_t maxkappa,Double_t maxpsi,Double_t maxtgl) | |
e67b0680 | 108 | { |
96bda103 | 109 | // see header file for class documentation |
e67b0680 | 110 | fGlobalMerger->SetParameter( maxy, maxz, maxkappa, maxpsi, maxtgl ); |
111 | } | |
71d7c760 | 112 | |
5d2abf3b | 113 | int AliHLTTPCGlobalMergerComponent::DoInit( int /*argc*/, const char** /*argv*/ ) |
e67b0680 | 114 | { |
96bda103 | 115 | // see header file for class documentation |
e67b0680 | 116 | if ( fGlobalMerger || fVertex ) |
117 | return EINPROGRESS; | |
118 | fGlobalMerger = new AliHLTTPCGlobalMerger(); | |
119 | fVertex = new AliHLTTPCVertex(); | |
120 | SetMergerParameters(); | |
121 | return 0; | |
122 | } | |
71d7c760 | 123 | |
124 | int AliHLTTPCGlobalMergerComponent::DoDeinit() | |
e67b0680 | 125 | { |
96bda103 | 126 | // see header file for class documentation |
e67b0680 | 127 | if ( fGlobalMerger ) |
128 | delete fGlobalMerger; | |
129 | fGlobalMerger = NULL; | |
130 | if ( fVertex ) | |
131 | delete fVertex; | |
132 | fVertex = NULL; | |
133 | return 0; | |
134 | } | |
71d7c760 | 135 | |
8ede8717 | 136 | int AliHLTTPCGlobalMergerComponent::DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks, |
5d2abf3b | 137 | AliHLTComponentTriggerData& /*trigData*/, AliHLTUInt8_t* outputPtr, |
7bcd6cad | 138 | AliHLTUInt32_t& size, AliHLTComponentBlockDataList& outputBlocks ) |
e67b0680 | 139 | { |
96bda103 | 140 | // see header file for class documentation |
e67b0680 | 141 | const AliHLTComponentBlockData* iter = NULL; |
142 | const AliHLTComponentBlockData* lastVertexBlock = NULL; | |
143 | unsigned long ndx; | |
144 | ||
145 | std::vector<SliceData> slices; | |
146 | std::vector<SliceData>::iterator sdIter, sdEnd; | |
147 | int minSlice = INT_MAX, maxSlice = 0; | |
148 | bool found; | |
149 | AliHLTTPCTrackletData* inPtr; | |
150 | AliHLTTPCTrackletData* outPtr; | |
151 | UInt_t tSize = 0; | |
152 | Int_t slice=0; | |
153 | ||
154 | // Create sorted (by slice number) list of data (tracks and vertex) for each slice present. | |
155 | // also note the min and max slice numbers | |
156 | for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ ) | |
157 | { | |
158 | iter = blocks+ndx; | |
159 | slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter ); | |
160 | found=false; | |
161 | sdIter = slices.begin(); | |
162 | sdEnd = slices.end(); | |
163 | while ( sdIter != sdEnd ) | |
71d7c760 | 164 | { |
e67b0680 | 165 | if ( sdIter->fSlice > slice || sdIter->fSlice == slice ) |
166 | break; | |
167 | sdIter++; | |
168 | } | |
169 | if ( sdIter==sdEnd || sdIter->fSlice>slice ) | |
170 | { | |
171 | if ( sdIter == sdEnd ) | |
172 | maxSlice = slice; | |
173 | if ( sdIter==slices.begin() ) | |
174 | minSlice = slice; | |
175 | SliceData sd; | |
176 | sd.fSlice = slice; | |
177 | sd.fVertexBlock = NULL; | |
178 | sd.fVertexBlockIndex = 0; | |
179 | sd.fTrackletBlock = NULL; | |
180 | sd.fTrackletBlockIndex = 0; | |
181 | sdIter = slices.insert( sdIter, sd ); | |
182 | } | |
183 | if ( sdIter->fSlice == slice ) | |
184 | { | |
185 | if ( iter->fDataType == AliHLTTPCDefinitions::fgkTrackSegmentsDataType ) | |
71d7c760 | 186 | { |
e67b0680 | 187 | if ( !sdIter->fTrackletBlock ) |
188 | { | |
189 | sdIter->fTrackletBlock = iter; | |
190 | sdIter->fTrackletBlockIndex = ndx; | |
191 | } | |
192 | else | |
193 | { | |
194 | Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "Duplicate track data block", | |
195 | "Duplicate track data block for slice %lu in event 0x%08lX (%lu) - previous block: %lu - new block: %lu.", | |
196 | slice, evtData.fEventID, evtData.fEventID, sdIter->fTrackletBlockIndex, ndx ); | |
197 | } | |
71d7c760 | 198 | } |
e67b0680 | 199 | if ( iter->fDataType == AliHLTTPCDefinitions::fgkVertexDataType ) |
71d7c760 | 200 | { |
e67b0680 | 201 | lastVertexBlock = iter; |
202 | if ( !sdIter->fVertexBlock ) | |
71d7c760 | 203 | { |
e67b0680 | 204 | sdIter->fVertexBlock = iter; |
205 | sdIter->fVertexBlockIndex = ndx; | |
71d7c760 | 206 | } |
e67b0680 | 207 | else |
71d7c760 | 208 | { |
e67b0680 | 209 | Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "Duplicate vertex data block", |
210 | "Duplicate vertex data block for slice %lu in event 0x%08lX (%lu) - previous block: %lu - new block: %lu.", | |
211 | slice, evtData.fEventID, evtData.fEventID, sdIter->fVertexBlockIndex, ndx ); | |
71d7c760 | 212 | } |
213 | } | |
214 | } | |
e67b0680 | 215 | } |
71d7c760 | 216 | |
e67b0680 | 217 | //fGlobalMerger->Setup( minSlice, maxSlice ); |
218 | fGlobalMerger->Setup( 0, 35 ); | |
71d7c760 | 219 | |
e67b0680 | 220 | if ( !lastVertexBlock ) |
221 | { | |
222 | Logging( kHLTLogInfo, "HLT::GlobalMerger::DoEvent", "No vertex data block", | |
223 | "No vertex data block found for event 0x%08lX (%lu).", evtData.fEventID, evtData.fEventID ); | |
224 | fVertex->SetZero(); | |
225 | } | |
226 | else | |
227 | fVertex->Read( (AliHLTTPCVertexData*)( lastVertexBlock->fPtr ) ); | |
228 | ||
229 | // Add all tracks into the merger | |
230 | sdIter = slices.begin(); | |
231 | sdEnd = slices.end(); | |
232 | int lastSlice = -1; | |
233 | while ( sdIter != sdEnd ) | |
234 | { | |
235 | if ( sdIter->fVertexBlock ) | |
71d7c760 | 236 | { |
e67b0680 | 237 | fVertex->Read( (AliHLTTPCVertexData*)( sdIter->fVertexBlock->fPtr ) ); |
238 | fGlobalMerger->SetVertex( fVertex ); | |
71d7c760 | 239 | } |
e67b0680 | 240 | for ( int slNr=lastSlice+1; slNr<=sdIter->fSlice; slNr++ ) |
241 | fGlobalMerger->InitSlice( slNr ); | |
242 | if ( sdIter->fTrackletBlock ) | |
71d7c760 | 243 | { |
e67b0680 | 244 | inPtr = (AliHLTTPCTrackletData*)( sdIter->fTrackletBlock->fPtr ); |
245 | if ( !inPtr ) | |
71d7c760 | 246 | { |
e67b0680 | 247 | Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "No track data block", |
248 | "No track data block found for event 0x%08lX (%lu).", evtData.fEventID, evtData.fEventID ); | |
71d7c760 | 249 | } |
e67b0680 | 250 | else |
71d7c760 | 251 | { |
e67b0680 | 252 | //fGlobalMerger->InitSlice( sdIter->fSlice ); |
253 | fGlobalMerger->FillTracks( inPtr->fTrackletCnt, inPtr->fTracklets ); | |
254 | } | |
71d7c760 | 255 | } |
e67b0680 | 256 | lastSlice = sdIter->fSlice; |
257 | sdIter++; | |
258 | } | |
259 | for ( int slNr=lastSlice+1; slNr<=35; slNr++ ) | |
260 | fGlobalMerger->InitSlice( slNr ); | |
db16520a | 261 | |
71d7c760 | 262 | |
e67b0680 | 263 | // Now we can really merge |
264 | fGlobalMerger->Merge(); | |
265 | fGlobalMerger->AddAllTracks(); | |
71d7c760 | 266 | |
e67b0680 | 267 | UInt_t ntracks0=0; |
268 | outPtr = (AliHLTTPCTrackletData*)(outputPtr); | |
71d7c760 | 269 | |
e67b0680 | 270 | tSize = fGlobalMerger->GetOutTracks()->WriteTracks( ntracks0, outPtr->fTracklets ); |
271 | outPtr->fTrackletCnt = ntracks0; | |
71d7c760 | 272 | |
e67b0680 | 273 | tSize += sizeof(AliHLTTPCTrackletData); |
71d7c760 | 274 | |
e67b0680 | 275 | AliHLTComponentBlockData bd; |
276 | FillBlockData( bd ); | |
277 | bd.fOffset = 0; | |
278 | bd.fSize = tSize; | |
279 | bd.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( minSlice, maxSlice, 0, 5 ); | |
280 | outputBlocks.push_back( bd ); | |
71d7c760 | 281 | |
e67b0680 | 282 | size = tSize; |
283 | return 0; | |
284 | } | |
71d7c760 | 285 | |
286 |