b0201cbe |
1 | /************************************************************************** |
960d54ad |
2 | * This file is property of and copyright by the ALICE HLT Project * |
3 | * All rights reserved. * |
b0201cbe |
4 | * * |
960d54ad |
5 | * Primary Authors: * |
6 | * Indranil Das <indra.das@saha.ac.in> * |
b0201cbe |
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 * |
960d54ad |
13 | * about the suitability of this software for any purpose. It is * |
b0201cbe |
14 | * provided "as is" without express or implied warranty. * |
15 | **************************************************************************/ |
16 | |
17 | /* $Id$ */ |
18 | |
baff881d |
19 | ///* |
20 | // |
21 | // The HitRec Component is designed to deal the rawdata inputfiles to findout the |
22 | // the reconstructed hits. The output is send to the output block for further |
23 | // processing. |
24 | // |
25 | // Author : Indranil Das ( indra.das@saha.ac.in || indra.ehep@gmail.com ) |
26 | // |
27 | //*/ |
b0201cbe |
28 | |
960d54ad |
29 | #include "AliHLTMUONRecHitsBlockStruct.h" |
b0201cbe |
30 | #include "AliHLTMUONHitReconstructorComponent.h" |
b12fe461 |
31 | #include "AliHLTMUONHitReconstructor.h" |
960d54ad |
32 | #include "AliHLTMUONConstants.h" |
5ff5f960 |
33 | #include "AliHLTMUONDataBlockWriter.h" |
b0201cbe |
34 | #include "AliHLTLogging.h" |
35 | #include "AliHLTSystem.h" |
36 | #include "AliHLTDefinitions.h" |
37 | #include <stdlib.h> |
38 | #include <errno.h> |
39 | |
40 | namespace |
41 | { |
42 | // The global object used for automatic component registration, |
43 | // Note DO NOT use this component for calculation! |
44 | AliHLTMUONHitReconstructorComponent gAliHLTMUONHitReconstructorComponent; |
45 | } |
46 | |
b0201cbe |
47 | ClassImp(AliHLTMUONHitReconstructorComponent) |
48 | |
49 | |
50 | AliHLTMUONHitReconstructorComponent::AliHLTMUONHitReconstructorComponent() |
960d54ad |
51 | : |
52 | fHitRec(NULL), |
53 | fDDLDir(""), |
54 | fDDL(0), |
55 | fReaderType(false) |
b0201cbe |
56 | { |
b0201cbe |
57 | } |
58 | |
960d54ad |
59 | |
b0201cbe |
60 | AliHLTMUONHitReconstructorComponent::~AliHLTMUONHitReconstructorComponent() |
61 | { |
960d54ad |
62 | } |
b0201cbe |
63 | |
960d54ad |
64 | const char* AliHLTMUONHitReconstructorComponent::GetComponentID() |
65 | { |
66 | return "MUONHitRec"; // The ID of this component |
b0201cbe |
67 | } |
68 | |
b0201cbe |
69 | |
960d54ad |
70 | void AliHLTMUONHitReconstructorComponent::GetInputDataTypes( std::vector<AliHLTComponentDataType>& list) |
71 | { |
72 | list.clear(); |
73 | list.push_back( AliHLTMUONConstants::TrackingDDLRawDataType() ); |
74 | } |
b0201cbe |
75 | |
b0201cbe |
76 | |
960d54ad |
77 | AliHLTComponentDataType AliHLTMUONHitReconstructorComponent::GetOutputDataType() |
78 | { |
79 | return AliHLTMUONConstants::RecHitsBlockDataType(); |
80 | } |
b0201cbe |
81 | |
b0201cbe |
82 | |
960d54ad |
83 | void AliHLTMUONHitReconstructorComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier ) |
84 | { |
85 | constBase = 0; |
86 | inputMultiplier = 1; |
87 | } |
b0201cbe |
88 | |
b0201cbe |
89 | |
960d54ad |
90 | // Spawn function, return new instance of this class |
91 | AliHLTComponent* AliHLTMUONHitReconstructorComponent::Spawn() |
92 | { |
93 | return new AliHLTMUONHitReconstructorComponent; |
94 | } |
b0201cbe |
95 | |
b0201cbe |
96 | |
960d54ad |
97 | int AliHLTMUONHitReconstructorComponent::DoInit( int argc, const char** argv ) |
98 | { |
99 | // perform initialization. We check whether our relative output size is specified in the arguments. |
100 | |
101 | HLTInfo("Initialising DHLT HitReconstruction Component"); |
b0201cbe |
102 | |
960d54ad |
103 | fHitRec = new AliHLTMUONHitReconstructor(); |
104 | |
b0201cbe |
105 | |
960d54ad |
106 | // this is to get rid of the warning "unused parameter" |
107 | if (argc==0 && argv==NULL) { |
108 | HLTError("Arguments missing", " no arguments" ); |
109 | } |
b0201cbe |
110 | |
960d54ad |
111 | char lutFileName[500],buspatchFileName[500]; |
b0201cbe |
112 | |
960d54ad |
113 | int i = 0; |
114 | char* cpErr; |
115 | while ( i < argc ) |
116 | { |
117 | HLTDebug("argv[%d] == %s", i, argv[i] ); |
118 | |
119 | if ( !strcmp( argv[i], "lut" ) ) { |
120 | if ( argc <= i+1 ) { |
121 | HLTError("LookupTable filename not specified" ); |
122 | return EINVAL; /* Invalid argument */ |
123 | } |
124 | |
125 | sprintf(lutFileName,"%s",argv[i+1]); |
126 | |
127 | i += 2; |
128 | continue; |
129 | }// lut argument |
130 | |
131 | |
132 | if ( !strcmp( argv[i], "ddl" ) ) { |
133 | if ( argc <= i+1 ) { |
134 | HLTError("DDL number not specified" ); |
135 | return EINVAL; /* Invalid argument */ |
136 | } |
137 | |
138 | fDDL = strtoul( argv[i+1], &cpErr, 0 ); |
139 | if ( *cpErr ) |
140 | { |
141 | HLTError("Cannot convert '%s' to DDL Number ", argv[i+1] ); |
142 | return EINVAL; |
143 | } |
144 | |
145 | i += 2; |
146 | continue; |
147 | }// ddl argument |
148 | |
149 | |
150 | if ( !strcmp( argv[i], "rawdir" ) ) { |
151 | if ( argc <= i+1 ) { |
152 | HLTError("DDL directory not specified" ); |
153 | return EINVAL; /* Invalid argument */ |
154 | } |
155 | |
156 | fDDLDir = argv[i+1] ; |
157 | |
158 | i += 2; |
159 | continue; |
160 | }// ddl directory argument |
161 | |
162 | |
163 | if ( !strcmp( argv[i], "buspatchmap" ) ) { |
164 | if ( argc <= i+1 ) { |
165 | HLTError("Buspatch filename not specified" ); |
166 | return EINVAL; /* Invalid argument */ |
167 | } |
168 | |
169 | sprintf(buspatchFileName,"%s",argv[i+1]); |
170 | |
171 | i += 2; |
172 | continue; |
173 | }// buspatch argument |
174 | |
175 | if ( !strcmp( argv[i], "rawreader" ) ) { |
176 | fReaderType = true; // true when using rawreader for standalone it is set to false. |
177 | i += 1; |
178 | continue; |
179 | } |
180 | |
181 | HLTError("Unknown option '%s'", argv[i] ); |
182 | return EINVAL; |
183 | |
184 | }//while loop |
185 | |
186 | int lutline = fHitRec->GetLutLine(fDDL); |
baff881d |
187 | AliHLTMUONHitReconstructor::DHLTLut* lookupTable = new AliHLTMUONHitReconstructor::DHLTLut[lutline]; |
960d54ad |
188 | if(!ReadLookUpTable(lookupTable,lutFileName)){ |
189 | HLTError("Failed to read lut, lut cannot be read, DoInit"); |
b0201cbe |
190 | return ENOENT ; /* No such file or directory */ |
191 | }else{ |
960d54ad |
192 | |
b0201cbe |
193 | BusToDetElem busToDetElem; |
960d54ad |
194 | BusToDDL busToDDL; |
195 | if(!ReadBusPatchToDetElemFile(busToDetElem,busToDDL,buspatchFileName)){ |
196 | HLTError("Failed to read buspatchmap, buspatchmap cannot be read, DoInit"); |
b0201cbe |
197 | return ENOENT ; /* No such file or directory */ |
198 | } |
960d54ad |
199 | |
b0201cbe |
200 | fHitRec->SetBusToDetMap(busToDetElem); |
960d54ad |
201 | fHitRec->SetBusToDDLMap(busToDDL); |
202 | fHitRec->LoadLookUpTable(lookupTable,fDDL); |
203 | |
b0201cbe |
204 | }// reading lut |
205 | |
960d54ad |
206 | delete []lookupTable; |
207 | |
208 | HLTInfo("Initialisation of DHLT HitReconstruction Component is done"); |
209 | |
b0201cbe |
210 | return 0; |
211 | } |
212 | |
960d54ad |
213 | |
214 | int AliHLTMUONHitReconstructorComponent::DoDeinit() |
215 | { |
b0201cbe |
216 | if(fHitRec) |
217 | delete fHitRec; |
960d54ad |
218 | |
219 | HLTInfo(" Deinitialising DHLT HitReconstruction Component"); |
220 | |
b0201cbe |
221 | return 0; |
222 | } |
223 | |
b0201cbe |
224 | |
960d54ad |
225 | int AliHLTMUONHitReconstructorComponent::DoEvent( |
226 | const AliHLTComponentEventData& evtData, |
227 | const AliHLTComponentBlockData* blocks, |
228 | AliHLTComponentTriggerData& trigData, |
229 | AliHLTUInt8_t* outputPtr, |
230 | AliHLTUInt32_t& size, |
231 | std::vector<AliHLTComponentBlockData>& outputBlocks |
232 | ) |
233 | { |
234 | // Process an event |
b0201cbe |
235 | unsigned long totalSize = 0; |
960d54ad |
236 | |
237 | HLTDebug("Event : %d has : %lu blocks",(int)evtData.fEventID,evtData.fBlockCnt); |
238 | |
239 | // Loop over all input blocks in the event |
240 | for ( unsigned long n = 0; n < evtData.fBlockCnt; n++ ) |
241 | { |
242 | |
243 | HLTDebug("block : %d, block rawData : %p, block.fSize (bytes) : %d, blocks.fDataType.fID : %s, blocks.fDataType.fOrigin : %s, required type : %s\n", |
244 | n,blocks[n].fPtr,blocks[n].fSize,(char *)(blocks[n].fDataType.fID), |
245 | (char *)(blocks[n].fDataType.fOrigin,(char *)(AliHLTMUONConstants::TrackingDDLRawDataType().fID))); |
246 | |
b0201cbe |
247 | |
960d54ad |
248 | if(strncmp((char *)(blocks[n].fDataType.fID),(char *)(AliHLTMUONConstants::TrackingDDLRawDataType().fID),kAliHLTComponentDataTypefIDsize)) continue; |
249 | |
250 | |
251 | if ( totalSize > size ) |
252 | break; |
253 | |
254 | int totalDDLSize = blocks[n].fSize/sizeof(int); |
255 | |
256 | if(!totalDDLSize) continue; |
257 | |
258 | int ddlRawDataSize = totalDDLSize - fHitRec->GetkDDLHeaderSize(); |
259 | int *buffer = (int *)blocks[n].fPtr; |
260 | |
261 | |
262 | for(int j=0;j<totalDDLSize;j++) |
263 | HLTDebug("buffer[%d] : %x\n",j,buffer[j]); |
264 | |
265 | buffer = (int *)((int *)blocks[n].fPtr + fHitRec->GetkDDLHeaderSize()) ; |
266 | |
267 | AliHLTMUONRecHitStruct recHit[300]; |
268 | int nofHit = 300; |
269 | |
270 | if(! (fHitRec->Run(buffer,&ddlRawDataSize,recHit,&nofHit))){ |
271 | HLTError("ERROR In Processing of HitRec Algo "); |
272 | return EIO; |
b0201cbe |
273 | } |
960d54ad |
274 | |
275 | unsigned long mySize = sizeof(AliHLTMUONRecHitStruct) * nofHit; |
276 | |
277 | HLTDebug("Event %d and block %d has nofHit %d\n",(int)evtData.fEventID,n,nofHit); |
278 | |
279 | // Check how much space we have left and adapt this output block's size accordingly. |
280 | if ( totalSize + mySize > size ) |
281 | mySize = size-totalSize; |
282 | |
283 | Logging( kHLTLogDebug, "HLT::MUONHitRec::DoEvent", "mySize set (2)", "mySize == %lu B - totalSize == %lu - size == %lu", |
284 | mySize, totalSize, size ); |
285 | |
286 | if ( mySize<=0 ) |
287 | continue; // No room left to write a further block. |
288 | |
5ff5f960 |
289 | AliHLTMUONRecHitsBlockWriter block(outputPtr+totalSize, size-totalSize); |
290 | if (not block.InitCommonHeader()) |
291 | { |
292 | HLTError("There is not enough space in the output buffer for the new data block.", |
293 | " We require at least %u bytes, but have %u bytes left.", |
294 | sizeof(AliHLTMUONRecHitsBlockWriter::HeaderType), |
295 | block.BufferSize() |
296 | ); |
297 | break; |
298 | } |
299 | |
960d54ad |
300 | // Now copy the input block |
301 | unsigned long copied = 0; |
302 | // First copy all full multiples of the input block |
303 | |
304 | // And the copy the remaining fragment of the block |
305 | Logging( kHLTLogDebug, "1 : HLT::MUONHitRec::DoEvent", "Copying", "Copying %lu B - Copied: %lu B - totalSize: %lu B", |
306 | mySize-copied, copied, totalSize ); |
5ff5f960 |
307 | memcpy( block.GetArray(), &recHit[0], mySize); |
960d54ad |
308 | Logging( kHLTLogDebug, "HLT::MUONHitRec::DoEvent", "Copied", "Copied: %lu B - totalSize: %lu B", |
309 | copied, totalSize ); |
310 | |
5ff5f960 |
311 | block.SetNumberOfEntries(nofHit); |
312 | |
960d54ad |
313 | // Fill a block data structure for our output block. |
314 | AliHLTComponentBlockData bd; |
315 | FillBlockData(bd); |
316 | bd.fPtr = outputPtr; |
317 | // This block's start (offset) is after all other blocks written so far. |
318 | bd.fOffset = totalSize; |
5ff5f960 |
319 | bd.fSize = block.BytesUsed(); |
960d54ad |
320 | bd.fDataType = AliHLTMUONConstants::RecHitsBlockDataType(); |
321 | bd.fSpecification = blocks[n].fSpecification; |
322 | outputBlocks.push_back(bd); |
323 | |
324 | // Increase the total amount of data written so far to our output memory |
5ff5f960 |
325 | totalSize += block.BytesUsed(); |
b0201cbe |
326 | } |
960d54ad |
327 | // Finally we set the total size of output memory we consumed. |
b0201cbe |
328 | size = totalSize; |
329 | |
330 | return 0; |
331 | } |
332 | |
333 | |
960d54ad |
334 | bool AliHLTMUONHitReconstructorComponent::ReadLookUpTable(AliHLTMUONHitReconstructor::DHLTLut* lookupTable, const char* lutpath) |
b0201cbe |
335 | { |
960d54ad |
336 | if (fDDL < AliHLTMUONHitReconstructor::GetkDDLOffSet() || |
337 | fDDL >= AliHLTMUONHitReconstructor::GetkDDLOffSet() + AliHLTMUONHitReconstructor::GetkNofDDL()){ |
338 | HLTError("DDL number is out of range"); |
339 | return false; |
340 | } |
341 | |
342 | int lutLine = fHitRec->GetLutLine(fDDL); |
343 | |
344 | FILE* fin = fopen(lutpath, "r"); |
345 | if (fin == NULL){ |
346 | HLTError("Failed to open file: %s",lutpath); |
347 | return false; |
348 | } |
349 | |
350 | for(int i=0;i<lutLine;i++){ |
351 | fscanf( |
352 | fin, |
353 | "%d\t%d\t%d\t%f\t%f\t%f\t%d\t%d\n", |
354 | &lookupTable[i].fIdManuChannel, |
355 | &lookupTable[i].fIX, |
356 | &lookupTable[i].fIY, |
357 | &lookupTable[i].fRealX, |
358 | &lookupTable[i].fRealY, |
359 | &lookupTable[i].fRealZ, |
360 | &lookupTable[i].fPcbZone, |
361 | &lookupTable[i].fPlane |
362 | ); |
363 | } |
364 | |
365 | fclose(fin); |
366 | return true; |
b0201cbe |
367 | } |
368 | |
b0201cbe |
369 | |
960d54ad |
370 | bool AliHLTMUONHitReconstructorComponent::ReadBusPatchToDetElemFile(BusToDetElem& busToDetElem, BusToDDL& busToDDL, const char* buspatchmappath) |
b0201cbe |
371 | { |
960d54ad |
372 | char getLine[80]; |
373 | char temp; |
374 | int detElem, minBusPatch, maxBusPatch, ddl; |
375 | |
376 | FILE* fin = fopen(buspatchmappath, "r"); |
377 | if (fin == NULL){ |
378 | HLTError("Failed to open file: %s",buspatchmappath); |
379 | return false; |
380 | } |
381 | |
382 | while (feof(fin)==0){ |
383 | fgets(getLine,80,fin); |
384 | sscanf(getLine, "%d\t%d %c %d\t%d", &detElem, &minBusPatch, &temp, &maxBusPatch,&ddl); |
385 | if (detElem >= 700 && detElem <= 1025){ |
386 | |
387 | for(int i = minBusPatch; i <= maxBusPatch; i++){ |
388 | busToDetElem[i] = detElem; |
389 | busToDDL[i] = ddl; |
390 | }//for loop |
391 | } // detElem condn |
392 | } // while loop for file |
393 | |
394 | fclose(fin); |
395 | return true; |
b0201cbe |
396 | } |