]>
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 | ||
b09247a2 | 36 | #include <climits> |
71d7c760 | 37 | #include "AliHLTTPCGlobalMergerComponent.h" |
7bcd6cad | 38 | //#include "AliHLTTPCTransform.h" |
a6c02c85 | 39 | #include "AliHLTTPCGlobalMerger.h" |
40 | #include "AliHLTTPCVertex.h" | |
41 | #include "AliHLTTPCVertexData.h" | |
42 | #include "AliHLTTPCTrackSegmentData.h" | |
43 | #include "AliHLTTPCTrackArray.h" | |
71d7c760 | 44 | #include "AliHLTTPCTrackletDataFormat.h" |
7bcd6cad | 45 | //#include "AliHLTTPCSpacePointData.h" |
46 | //#include "AliHLTTPCClusterDataFormat.h" | |
96bda103 | 47 | #include "AliHLTTPCDefinitions.h" |
e67b0680 | 48 | #include <cstdlib> |
49 | #include <cerrno> | |
71d7c760 | 50 | |
672f8b8c | 51 | /** ROOT macro for the implementation of ROOT specific class methods */ |
e67b0680 | 52 | ClassImp(AliHLTTPCGlobalMergerComponent); |
71d7c760 | 53 | |
54 | AliHLTTPCGlobalMergerComponent::AliHLTTPCGlobalMergerComponent() | |
96bda103 | 55 | : |
56 | fGlobalMerger(NULL), | |
57 | fVertex(NULL) | |
58 | { | |
59 | // see header file for class documentation | |
60 | // or | |
61 | // refer to README to build package | |
62 | // or | |
63 | // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt | |
64 | } | |
65 | ||
71d7c760 | 66 | AliHLTTPCGlobalMergerComponent::~AliHLTTPCGlobalMergerComponent() |
96bda103 | 67 | { |
68 | // see header file for class documentation | |
69 | } | |
71d7c760 | 70 | |
71 | // Public functions to implement AliHLTComponent's interface. | |
72 | // These functions are required for the registration process | |
73 | ||
74 | const char* AliHLTTPCGlobalMergerComponent::GetComponentID() | |
e67b0680 | 75 | { |
96bda103 | 76 | // see header file for class documentation |
e67b0680 | 77 | return "TPCGlobalMerger"; |
78 | } | |
71d7c760 | 79 | |
7bcd6cad | 80 | void AliHLTTPCGlobalMergerComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list) |
e67b0680 | 81 | { |
96bda103 | 82 | // see header file for class documentation |
e67b0680 | 83 | list.clear(); |
84 | list.push_back( AliHLTTPCDefinitions::fgkTrackSegmentsDataType ); | |
85 | list.push_back( AliHLTTPCDefinitions::fgkVertexDataType ); | |
86 | } | |
71d7c760 | 87 | |
8ede8717 | 88 | AliHLTComponentDataType AliHLTTPCGlobalMergerComponent::GetOutputDataType() |
e67b0680 | 89 | { |
96bda103 | 90 | // see header file for class documentation |
e67b0680 | 91 | return AliHLTTPCDefinitions::fgkTracksDataType; |
92 | } | |
71d7c760 | 93 | |
94 | void AliHLTTPCGlobalMergerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier ) | |
e67b0680 | 95 | { |
96bda103 | 96 | // see header file for class documentation |
e67b0680 | 97 | // XXX TODO: Find more realistic values. |
98 | constBase = 0; | |
99 | inputMultiplier = 1.0; | |
100 | } | |
71d7c760 | 101 | |
102 | AliHLTComponent* AliHLTTPCGlobalMergerComponent::Spawn() | |
e67b0680 | 103 | { |
96bda103 | 104 | // see header file for class documentation |
e67b0680 | 105 | return new AliHLTTPCGlobalMergerComponent; |
106 | } | |
71d7c760 | 107 | |
108 | void AliHLTTPCGlobalMergerComponent::SetMergerParameters(Double_t maxy,Double_t maxz,Double_t maxkappa,Double_t maxpsi,Double_t maxtgl) | |
e67b0680 | 109 | { |
96bda103 | 110 | // see header file for class documentation |
e67b0680 | 111 | fGlobalMerger->SetParameter( maxy, maxz, maxkappa, maxpsi, maxtgl ); |
112 | } | |
71d7c760 | 113 | |
5d2abf3b | 114 | int AliHLTTPCGlobalMergerComponent::DoInit( int /*argc*/, const char** /*argv*/ ) |
e67b0680 | 115 | { |
96bda103 | 116 | // see header file for class documentation |
e67b0680 | 117 | if ( fGlobalMerger || fVertex ) |
118 | return EINPROGRESS; | |
119 | fGlobalMerger = new AliHLTTPCGlobalMerger(); | |
120 | fVertex = new AliHLTTPCVertex(); | |
121 | SetMergerParameters(); | |
122 | return 0; | |
123 | } | |
71d7c760 | 124 | |
125 | int AliHLTTPCGlobalMergerComponent::DoDeinit() | |
e67b0680 | 126 | { |
96bda103 | 127 | // see header file for class documentation |
e67b0680 | 128 | if ( fGlobalMerger ) |
129 | delete fGlobalMerger; | |
130 | fGlobalMerger = NULL; | |
131 | if ( fVertex ) | |
132 | delete fVertex; | |
133 | fVertex = NULL; | |
134 | return 0; | |
135 | } | |
71d7c760 | 136 | |
8ede8717 | 137 | int AliHLTTPCGlobalMergerComponent::DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks, |
5d2abf3b | 138 | AliHLTComponentTriggerData& /*trigData*/, AliHLTUInt8_t* outputPtr, |
7bcd6cad | 139 | AliHLTUInt32_t& size, AliHLTComponentBlockDataList& outputBlocks ) |
e67b0680 | 140 | { |
96bda103 | 141 | // see header file for class documentation |
8ba9a9ee | 142 | int iResult=0; |
e67b0680 | 143 | const AliHLTComponentBlockData* iter = NULL; |
144 | const AliHLTComponentBlockData* lastVertexBlock = NULL; | |
145 | unsigned long ndx; | |
146 | ||
147 | std::vector<SliceData> slices; | |
148 | std::vector<SliceData>::iterator sdIter, sdEnd; | |
149 | int minSlice = INT_MAX, maxSlice = 0; | |
150 | bool found; | |
151 | AliHLTTPCTrackletData* inPtr; | |
152 | AliHLTTPCTrackletData* outPtr; | |
153 | UInt_t tSize = 0; | |
154 | Int_t slice=0; | |
155 | ||
156 | // Create sorted (by slice number) list of data (tracks and vertex) for each slice present. | |
157 | // also note the min and max slice numbers | |
158 | for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ ) | |
159 | { | |
160 | iter = blocks+ndx; | |
161 | slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter ); | |
162 | found=false; | |
163 | sdIter = slices.begin(); | |
164 | sdEnd = slices.end(); | |
165 | while ( sdIter != sdEnd ) | |
71d7c760 | 166 | { |
e67b0680 | 167 | if ( sdIter->fSlice > slice || sdIter->fSlice == slice ) |
168 | break; | |
169 | sdIter++; | |
170 | } | |
171 | if ( sdIter==sdEnd || sdIter->fSlice>slice ) | |
172 | { | |
173 | if ( sdIter == sdEnd ) | |
174 | maxSlice = slice; | |
175 | if ( sdIter==slices.begin() ) | |
176 | minSlice = slice; | |
177 | SliceData sd; | |
178 | sd.fSlice = slice; | |
179 | sd.fVertexBlock = NULL; | |
180 | sd.fVertexBlockIndex = 0; | |
181 | sd.fTrackletBlock = NULL; | |
182 | sd.fTrackletBlockIndex = 0; | |
183 | sdIter = slices.insert( sdIter, sd ); | |
184 | } | |
185 | if ( sdIter->fSlice == slice ) | |
186 | { | |
187 | if ( iter->fDataType == AliHLTTPCDefinitions::fgkTrackSegmentsDataType ) | |
71d7c760 | 188 | { |
e67b0680 | 189 | if ( !sdIter->fTrackletBlock ) |
190 | { | |
191 | sdIter->fTrackletBlock = iter; | |
192 | sdIter->fTrackletBlockIndex = ndx; | |
193 | } | |
194 | else | |
195 | { | |
196 | Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "Duplicate track data block", | |
197 | "Duplicate track data block for slice %lu in event 0x%08lX (%lu) - previous block: %lu - new block: %lu.", | |
198 | slice, evtData.fEventID, evtData.fEventID, sdIter->fTrackletBlockIndex, ndx ); | |
199 | } | |
71d7c760 | 200 | } |
e67b0680 | 201 | if ( iter->fDataType == AliHLTTPCDefinitions::fgkVertexDataType ) |
71d7c760 | 202 | { |
e67b0680 | 203 | lastVertexBlock = iter; |
204 | if ( !sdIter->fVertexBlock ) | |
71d7c760 | 205 | { |
e67b0680 | 206 | sdIter->fVertexBlock = iter; |
207 | sdIter->fVertexBlockIndex = ndx; | |
71d7c760 | 208 | } |
e67b0680 | 209 | else |
71d7c760 | 210 | { |
e67b0680 | 211 | Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "Duplicate vertex data block", |
212 | "Duplicate vertex data block for slice %lu in event 0x%08lX (%lu) - previous block: %lu - new block: %lu.", | |
213 | slice, evtData.fEventID, evtData.fEventID, sdIter->fVertexBlockIndex, ndx ); | |
71d7c760 | 214 | } |
215 | } | |
216 | } | |
e67b0680 | 217 | } |
71d7c760 | 218 | |
e67b0680 | 219 | //fGlobalMerger->Setup( minSlice, maxSlice ); |
220 | fGlobalMerger->Setup( 0, 35 ); | |
71d7c760 | 221 | |
e67b0680 | 222 | if ( !lastVertexBlock ) |
223 | { | |
224 | Logging( kHLTLogInfo, "HLT::GlobalMerger::DoEvent", "No vertex data block", | |
225 | "No vertex data block found for event 0x%08lX (%lu).", evtData.fEventID, evtData.fEventID ); | |
226 | fVertex->SetZero(); | |
227 | } | |
228 | else | |
229 | fVertex->Read( (AliHLTTPCVertexData*)( lastVertexBlock->fPtr ) ); | |
230 | ||
231 | // Add all tracks into the merger | |
232 | sdIter = slices.begin(); | |
233 | sdEnd = slices.end(); | |
234 | int lastSlice = -1; | |
235 | while ( sdIter != sdEnd ) | |
236 | { | |
237 | if ( sdIter->fVertexBlock ) | |
71d7c760 | 238 | { |
e67b0680 | 239 | fVertex->Read( (AliHLTTPCVertexData*)( sdIter->fVertexBlock->fPtr ) ); |
240 | fGlobalMerger->SetVertex( fVertex ); | |
71d7c760 | 241 | } |
e67b0680 | 242 | for ( int slNr=lastSlice+1; slNr<=sdIter->fSlice; slNr++ ) |
243 | fGlobalMerger->InitSlice( slNr ); | |
244 | if ( sdIter->fTrackletBlock ) | |
71d7c760 | 245 | { |
e67b0680 | 246 | inPtr = (AliHLTTPCTrackletData*)( sdIter->fTrackletBlock->fPtr ); |
247 | if ( !inPtr ) | |
71d7c760 | 248 | { |
e67b0680 | 249 | Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "No track data block", |
250 | "No track data block found for event 0x%08lX (%lu).", evtData.fEventID, evtData.fEventID ); | |
71d7c760 | 251 | } |
e67b0680 | 252 | else |
71d7c760 | 253 | { |
e67b0680 | 254 | //fGlobalMerger->InitSlice( sdIter->fSlice ); |
255 | fGlobalMerger->FillTracks( inPtr->fTrackletCnt, inPtr->fTracklets ); | |
256 | } | |
71d7c760 | 257 | } |
e67b0680 | 258 | lastSlice = sdIter->fSlice; |
259 | sdIter++; | |
260 | } | |
261 | for ( int slNr=lastSlice+1; slNr<=35; slNr++ ) | |
262 | fGlobalMerger->InitSlice( slNr ); | |
db16520a | 263 | |
71d7c760 | 264 | |
e67b0680 | 265 | // Now we can really merge |
266 | fGlobalMerger->Merge(); | |
267 | fGlobalMerger->AddAllTracks(); | |
71d7c760 | 268 | |
8ba9a9ee | 269 | // check if there was enough space in the output buffer |
270 | UInt_t ntracks0=fGlobalMerger->GetOutTracks()->GetNTracks(); | |
271 | if (outputPtr==NULL || (sizeof(AliHLTTPCTrackletData)+ntracks0*sizeof(AliHLTTPCTrackSegmentData)>size)) { | |
272 | iResult=-ENOSPC; | |
273 | } else { | |
e67b0680 | 274 | outPtr = (AliHLTTPCTrackletData*)(outputPtr); |
71d7c760 | 275 | |
e67b0680 | 276 | tSize = fGlobalMerger->GetOutTracks()->WriteTracks( ntracks0, outPtr->fTracklets ); |
277 | outPtr->fTrackletCnt = ntracks0; | |
71d7c760 | 278 | |
e67b0680 | 279 | tSize += sizeof(AliHLTTPCTrackletData); |
71d7c760 | 280 | |
e67b0680 | 281 | AliHLTComponentBlockData bd; |
282 | FillBlockData( bd ); | |
283 | bd.fOffset = 0; | |
284 | bd.fSize = tSize; | |
285 | bd.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( minSlice, maxSlice, 0, 5 ); | |
286 | outputBlocks.push_back( bd ); | |
8ba9a9ee | 287 | } |
71d7c760 | 288 | |
e67b0680 | 289 | size = tSize; |
8ba9a9ee | 290 | return iResult; |
e67b0680 | 291 | } |
71d7c760 | 292 | |
293 |