2 /**************************************************************************
3 * This file is property of and copyright by the ALICE HLT Project *
4 * All rights reserved. *
6 * Primary Authors: Per Thomas Hille, Oystein Djuvsland *
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 **************************************************************************/
17 #include "AliHLTCaloRawAnalyzer.h"
18 #include "AliHLTCaloRawAnalyzerComponentv3.h"
19 #include "AliHLTCaloChannelDataHeaderStruct.h"
20 #include "AliHLTCaloChannelDataStruct.h"
21 #include "AliHLTCaloMapper.h"
22 #include "AliHLTCaloSanityInspector.h"
23 #include "AliAltroRawStreamV3.h"
24 #include "AliRawReaderMemory.h"
25 #include "AliAltroRawStreamV3.h"
26 #include "AliCaloRawStreamV3.h"
28 AliHLTCaloRawAnalyzerComponentv3::AliHLTCaloRawAnalyzerComponentv3():
32 // fkDoPushRawData(false),
33 fkDoPushRawData(false),
35 fSanityInspectorPtr(0),
36 fRawReaderMemoryPtr(0),
37 fAltroRawStreamPtr(0),
42 fMaxPeakPosition(100),
47 // fMapperPtr = new AliHLTCaloMapper();
49 fRawReaderMemoryPtr = new AliRawReaderMemory();
51 fAltroRawStreamPtr = new AliAltroRawStreamV3(fRawReaderMemoryPtr);
53 fSanityInspectorPtr = new AliHLTCaloSanityInspector();
55 // if( fkDoPushRawData == true )
57 fRawDataWriter = new RawDataWriter();
60 fAltroRawStreamPtr = new AliCaloRawStreamV3(fRawReaderMemoryPtr, TString("EMCAL"));
65 AliHLTCaloRawAnalyzerComponentv3::~AliHLTCaloRawAnalyzerComponentv3()
74 AliHLTCaloRawAnalyzerComponentv3::Deinit()
87 if(fRawReaderMemoryPtr)
89 delete fRawReaderMemoryPtr;
90 fRawReaderMemoryPtr = 0;
92 if(fAltroRawStreamPtr)
94 delete fAltroRawStreamPtr;
95 fAltroRawStreamPtr = 0;
102 AliHLTCaloRawAnalyzerComponentv3::GetComponentID()
105 return "CaloRawAnalyzerv3";
112 AliHLTCaloRawAnalyzerComponentv3::GetInputDataTypes( vector<AliHLTComponentDataType>& list)
116 list.push_back( AliHLTCaloDefinitions::fgkDDLPackedRawDataType | kAliHLTDataOriginPHOS);
120 AliHLTComponentDataType
121 AliHLTCaloRawAnalyzerComponentv3::GetOutputDataType()
124 return AliHLTCaloDefinitions::fgkChannelDataType;
128 AliHLTCaloRawAnalyzerComponentv3::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier )
131 constBase = sizeof(AliHLTCaloChannelDataHeaderStruct);
132 inputMultiplier = 0.5;
137 AliHLTCaloRawAnalyzerComponentv3::DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks, AliHLTComponentTriggerData& /*trigData*/,
138 AliHLTUInt8_t* outputPtr, AliHLTUInt32_t& size, vector<AliHLTComponentBlockData>& outputBlocks )
143 if( fPhosEventCount%300 == 0 )
145 cout << __FILE__<<__LINE__<< " Processing event " << fPhosEventCount << endl;
149 // Int_t blockSize = 0;
151 Int_t blockSize = -1;
153 const AliHLTComponentBlockData* iter = NULL;
156 for( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
159 if( CheckInputDataType( iter->fDataType ) == false )
165 InitMapping( iter->fSpecification);
167 blockSize = DoIt(iter, outputPtr, size, totSize); // Processing the block
171 if(blockSize == -1) // If the processing returns -1 we are out of buffer and return an error msg.
176 totSize += blockSize; //Keeping track of the used size
177 AliHLTComponentBlockData bdChannelData;
178 FillBlockData( bdChannelData );
179 bdChannelData.fOffset = 0; //FIXME
180 bdChannelData.fSize = blockSize;
182 // bdChannelData.fDataType = AliHLTPHOSDefinitions::fgkChannelDataType;
183 bdChannelData.fDataType = AliHLTCaloDefinitions::fgkChannelDataType;
185 bdChannelData.fSpecification = iter->fSpecification;
186 outputBlocks.push_back(bdChannelData);
187 outputPtr += blockSize; //Updating position of the output buffer
191 size = totSize; //telling the framework how much buffer space we have used.
202 AliHLTCaloRawAnalyzerComponentv3::DoIt(const AliHLTComponentBlockData* iter, AliHLTUInt8_t* outputPtr, const AliHLTUInt32_t size, UInt_t& totSize)
208 Short_t channelCount = 0;
210 AliHLTCaloChannelDataHeaderStruct *channelDataHeaderPtr = reinterpret_cast<AliHLTCaloChannelDataHeaderStruct*>(outputPtr);
211 AliHLTCaloChannelDataStruct *channelDataPtr = reinterpret_cast<AliHLTCaloChannelDataStruct*>(outputPtr+sizeof(AliHLTCaloChannelDataHeaderStruct));
216 totSize += sizeof( AliHLTCaloChannelDataHeaderStruct );
217 fRawReaderMemoryPtr->SetMemory( reinterpret_cast<UChar_t*>( iter->fPtr ), static_cast<ULong_t>( iter->fSize ) );
218 fRawReaderMemoryPtr->SetEquipmentID( fMapperPtr->GetDDLFromSpec( iter->fSpecification) + 4608 );
219 fRawReaderMemoryPtr->Reset();
220 fRawReaderMemoryPtr->NextEvent();
222 if( fkDoPushRawData == true)
224 fRawDataWriter->NewEvent( );
229 if(fAltroRawStreamPtr != NULL)
231 delete fAltroRawStreamPtr;
232 fAltroRawStreamPtr=NULL;
240 // fAltroRawStreamPtr = new AliCaloRawStreamV3(fRawReaderMemoryPtr, TString("EMCAL"));
245 fAltroRawStreamPtr->NextDDL();
248 while( fAltroRawStreamPtr->NextChannel() )
250 // cout << __FILE__ << ":" << __LINE__ << ":" <<__FUNCTION__ << "T3" << endl;
251 if( fAltroRawStreamPtr->GetHWAddress() < 128 || ( fAltroRawStreamPtr->GetHWAddress() ^ 0x800) < 128 )
258 UShort_t* firstBunchPtr = 0;
259 int chId = fMapperPtr->GetChannelID(iter->fSpecification, fAltroRawStreamPtr->GetHWAddress());
260 if( fkDoPushRawData == true)
262 fRawDataWriter->SetChannelId( chId );
267 while( fAltroRawStreamPtr->NextBunch() == true )
269 nSamples = fAltroRawStreamPtr->GetBunchLength();
270 if( fkDoPushRawData == true)
272 fRawDataWriter->WriteBunchData( fAltroRawStreamPtr->GetSignals(), nSamples, fAltroRawStreamPtr->GetEndTimeBin() );
274 firstBunchPtr = const_cast< UShort_t* >( fAltroRawStreamPtr->GetSignals() );
279 totSize += sizeof( AliHLTCaloChannelDataStruct );
282 HLTError("Buffer overflow: Trying to write data of size: %d bytes. Output buffer available: %d bytes.", totSize, size);
286 fAnalyzerPtr->SetData( firstBunchPtr, nSamples);
288 fAnalyzerPtr->Evaluate(0, nSamples);
289 // fAnalyzerPtr->Evaluate(0, 25);
294 // if(fAnalyzerPtr->GetTiming() > fMinPeakPosition && fAnalyzerPtr->GetTiming() < fMaxPeakPosition)
296 channelDataPtr->fChannelID = chId;
297 channelDataPtr->fEnergy = static_cast<Float_t>(fAnalyzerPtr->GetEnergy()) - fOffset;
299 channelDataPtr->fTime = static_cast<Float_t>(fAnalyzerPtr->GetTiming());
300 channelDataPtr->fCrazyness = static_cast<Short_t>(crazyness);
302 channelDataPtr++; // Updating position of the free output.
308 if( fkDoPushRawData == true)
310 fRawDataWriter->NewChannel();
319 channelDataHeaderPtr->fNChannels = channelCount;
320 channelDataHeaderPtr->fAlgorithm = fAlgorithm;
321 channelDataHeaderPtr->fInfo = 0;
326 if( fkDoPushRawData == true)
328 tmpsize += fRawDataWriter->CopyBufferToSharedMemory( (UShort_t *)channelDataPtr, size, totSize);
331 // channelDataHeaderPtr->fHasRawData = false;
332 channelDataHeaderPtr->fHasRawData = fkDoPushRawData;
333 HLTDebug("Number of channels: %d", channelCount);
334 tmpsize += sizeof(AliHLTCaloChannelDataStruct)*channelCount + sizeof(AliHLTCaloChannelDataHeaderStruct);
343 AliHLTCaloRawAnalyzerComponentv3::DoInit( int argc, const char** argv )
346 //See base class for documentation
347 // fPrintInfo = kFALSE;
351 // fMapperPtr = new AliHLTCaloMapper();
355 for(int i = 0; i < argc; i++)
357 if(!strcmp("-offset", argv[i]))
359 fOffset = atoi(argv[i+1]);
361 if(!strcmp("-bunchsizecut", argv[i]))
363 fBunchSizeCut = atoi(argv[i+1]);
365 if(!strcmp("-minpeakposition", argv[i]))
367 fMinPeakPosition = atoi(argv[i+1]);
369 if(!strcmp("-maxpeakposition", argv[i]))
371 fMaxPeakPosition = atoi(argv[i+1]);
376 if( fMapperPtr->GetIsInitializedMapping() == false)
378 Logging(kHLTLogFatal, __FILE__ , IntToChar( __LINE__ ) , "AliHLTCaloMapper::Could not initialise mapping from file %s, aborting", fMapperPtr->GetFilePath());
389 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::RawDataWriter() : //fIsFirstChannel(true),
391 fCurrentChannelSize(0),
392 // fIsFirstChannel(true),
394 // fBufferSize( NZROWSRCU*NXCOLUMNSRCU*ALTROMAXSAMPLES*NGAINS +1000 ),
395 fBufferSize( 64*56*ALTROMAXSAMPLES*NGAINS +1000 ),
396 fCurrentChannelIdPtr(0),
397 fCurrentChannelSizePtr(0),
398 fCurrentChannelDataPtr(0),
401 fRawDataBuffer = new UShort_t[fBufferSize];
408 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::Init()
410 fCurrentChannelIdPtr = fRawDataBuffer;
411 fCurrentChannelSizePtr = fRawDataBuffer +1;
412 fCurrentChannelDataPtr = fRawDataBuffer +2;
418 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::NewEvent()
426 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::NewChannel( )
428 *fCurrentChannelSizePtr = fCurrentChannelSize;
429 fCurrentChannelIdPtr += fCurrentChannelSize;
430 fCurrentChannelSizePtr += fCurrentChannelSize;
431 fCurrentChannelDataPtr += fCurrentChannelSize;
433 fCurrentChannelSize = 2;
439 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::WriteBunchData(const UShort_t *bunchdata, const int length, const UInt_t starttimebin )
441 fCurrentChannelDataPtr[fBufferIndex] = starttimebin;
442 fCurrentChannelSize ++;
444 fCurrentChannelDataPtr[fBufferIndex] = length;
445 fCurrentChannelSize ++;
450 for(int i=0; i < length; i++)
452 fCurrentChannelDataPtr[ fBufferIndex + i ] = bunchdata[i];
455 fCurrentChannelSize += length;
456 fTotalSize += length;
457 fBufferIndex += length;
462 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::SetChannelId( const UShort_t channeldid )
464 *fCurrentChannelIdPtr = channeldid;
469 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::ResetBuffer()
471 for(int i=0; i < fBufferSize ; i++ )
473 fRawDataBuffer[i] = 0;
479 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::CopyBufferToSharedMemory(UShort_t *memPtr, const int sizetotal, const int sizeused )
481 int sizerequested = (sizeof(int)*fTotalSize + sizeused);
483 if( sizerequested > sizetotal )
489 for(int i=0; i < fTotalSize; i++)
491 memPtr[i] = fRawDataBuffer[i];