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 "AliCaloRawAnalyzer.h"
18 #include "AliCaloBunchInfo.h"
19 #include "AliCaloFitResults.h"
20 #include "AliHLTCaloRawAnalyzerComponentv3.h"
21 #include "AliHLTCaloChannelDataHeaderStruct.h"
22 #include "AliHLTCaloChannelDataStruct.h"
23 #include "AliHLTCaloMapper.h"
24 #include "AliHLTCaloSanityInspector.h"
25 #include "AliAltroRawStreamV3.h"
26 #include "AliRawReaderMemory.h"
27 #include "AliCaloRawStreamV3.h"
28 #include "AliHLTCaloConstantsHandler.h"
29 #include "AliHLTCaloChannelRawDataStruct.h"
35 ClassImp(AliHLTCaloRawAnalyzerComponentv3);
38 #include "TStopwatch.h"
39 TStopwatch fgWatch; //CRAP PTH
42 AliHLTCaloRawAnalyzerComponentv3::AliHLTCaloRawAnalyzerComponentv3(TString det):AliHLTCaloProcessor(),
43 AliHLTCaloConstantsHandler(det),
48 fSanityInspectorPtr(0),
49 fRawReaderMemoryPtr(0),
50 fAltroRawStreamPtr(0),
55 fMaxPeakPosition(100),
56 fDoPushBadRawData(false),
57 fDoPushRawData(false),
62 fRawReaderMemoryPtr = new AliRawReaderMemory();
63 fAltroRawStreamPtr = new AliAltroRawStreamV3(fRawReaderMemoryPtr);
64 fSanityInspectorPtr = new AliHLTCaloSanityInspector();
66 if( fDoPushRawData == true )
68 fRawDataWriter = new RawDataWriter(fCaloConstants);
71 fAltroRawStreamPtr = new AliCaloRawStreamV3(fRawReaderMemoryPtr, det);
75 AliHLTCaloRawAnalyzerComponentv3::~AliHLTCaloRawAnalyzerComponentv3()
77 delete fRawReaderMemoryPtr;
78 delete fAltroRawStreamPtr;
79 delete fRawDataWriter;
80 delete fSanityInspectorPtr;
86 AliHLTCaloRawAnalyzerComponentv3::DoInit( int argc, const char** argv )
88 //See base class for documentation
91 for(int i = 0; i < argc; i++)
93 if(!strcmp("-offset", argv[i]))
95 fOffset = atoi(argv[i+1]);
97 if(!strcmp("-bunchsizecut", argv[i]))
99 fBunchSizeCut = atoi(argv[i+1]);
101 if(!strcmp("-minpeakposition", argv[i]))
103 fMinPeakPosition = atoi(argv[i+1]);
105 if(!strcmp("-maxpeakposition", argv[i]))
107 fMaxPeakPosition = atoi(argv[i+1]);
109 if(!strcmp("-pushrawdata", argv[i]))
111 fDoPushRawData = true;
113 if(!strcmp("-pushbaddata", argv[i]))
115 fDoPushBadRawData = true;
117 if(fDoPushBadRawData && fDoPushRawData)
119 HLTWarning("fDoPushBadRawData and fDoPushRawData in conflict, using fDoPushRawData");
120 fDoPushBadRawData = false;
122 if(!strcmp("-suppressalilogwarnings", argv[i]))
124 AliLog::SetGlobalLogLevel(AliLog::kError); //PHOS sometimes produces bad data -> Fill up the HLT logs...
134 AliHLTCaloRawAnalyzerComponentv3::DoDeinit()
136 if(fAltroRawStreamPtr)
138 delete fAltroRawStreamPtr;
139 fAltroRawStreamPtr = 0;
148 AliHLTCaloRawAnalyzerComponentv3::PrintDebugInfo()
150 static double wlast = -1;
151 static double wcurrent = 0;
155 if( fCaloEventCount %1000 == 0 )
157 cout << __FILE__ << __LINE__ << " : Processing event " << fCaloEventCount << endl;
159 wcurrent = fgWatch.RealTime();
160 cout << __FILE__ << __LINE__ << "The event rate is " <<
161 1000/( wcurrent - wlast ) << " Hz" << endl; fgWatch.Start(kFALSE);
168 AliHLTCaloRawAnalyzerComponentv3::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier )
171 constBase = sizeof(AliHLTCaloChannelDataHeaderStruct);
172 inputMultiplier = 1.5;
177 AliHLTCaloRawAnalyzerComponentv3::CheckInputDataType(const AliHLTComponentDataType &datatype)
179 vector <AliHLTComponentDataType> validTypes;
180 GetInputDataTypes(validTypes);
182 for(int i=0; i < validTypes.size(); i++ )
184 if ( datatype == validTypes.at(i) )
190 HLTDebug("Invalid Datatype");
196 AliHLTCaloRawAnalyzerComponentv3::DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
197 AliHLTComponentTriggerData& /*trigData*/,
198 AliHLTUInt8_t* outputPtr, AliHLTUInt32_t& size, vector<AliHLTComponentBlockData>& outputBlocks )
209 Int_t blockSize = -1;
211 const AliHLTComponentBlockData* iter = NULL;
214 for( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
217 if( ! CheckInputDataType(iter->fDataType) )
222 if(iter->fSpecification != fCurrentSpec)
224 fCurrentSpec = iter->fSpecification;
225 InitMapping(iter->fSpecification);
228 blockSize = DoIt(iter, outputPtr, size, totSize); // Processing the block
229 totSize += blockSize; //Keeping track of the used size
230 AliHLTComponentBlockData bdChannelData;
231 FillBlockData( bdChannelData );
232 bdChannelData.fOffset = 0; //FIXME
233 bdChannelData.fSize = blockSize;
234 bdChannelData.fDataType = GetOutputDataType();
235 bdChannelData.fSpecification = iter->fSpecification;
236 outputBlocks.push_back(bdChannelData);
237 outputPtr += blockSize; //Updating position of the output buffer
241 size = totSize; //telling the framework how much buffer space we have used.
250 AliHLTCaloRawAnalyzerComponentv3::DoIt(const AliHLTComponentBlockData* iter, AliHLTUInt8_t* outputPtr, const AliHLTUInt32_t size, UInt_t& totSize)
255 Short_t channelCount = 0;
257 AliHLTCaloChannelDataHeaderStruct *channelDataHeaderPtr = reinterpret_cast<AliHLTCaloChannelDataHeaderStruct*>(outputPtr);
258 AliHLTCaloChannelDataStruct *channelDataPtr = reinterpret_cast<AliHLTCaloChannelDataStruct*>(outputPtr+sizeof(AliHLTCaloChannelDataHeaderStruct));
259 totSize += sizeof( AliHLTCaloChannelDataHeaderStruct );
260 fRawReaderMemoryPtr->SetMemory( reinterpret_cast<UChar_t*>( iter->fPtr ), static_cast<ULong_t>( iter->fSize ) );
261 fRawReaderMemoryPtr->SetEquipmentID( fMapperPtr->GetDDLFromSpec( iter->fSpecification) + fCaloConstants->GetDDLOFFSET() );
262 fRawReaderMemoryPtr->Reset();
263 fRawReaderMemoryPtr->NextEvent();
265 if( fDoPushRawData == true)
267 fRawDataWriter->NewEvent( );
270 if(fAltroRawStreamPtr->NextDDL())
274 while( fAltroRawStreamPtr->NextChannel() )
276 if( fAltroRawStreamPtr->GetHWAddress() < 128 || ( fAltroRawStreamPtr->GetHWAddress() ^ 0x800) < 128 )
283 UShort_t* firstBunchPtr = 0;
284 int chId = fMapperPtr->GetChannelID(iter->fSpecification, fAltroRawStreamPtr->GetHWAddress());
286 if( fDoPushRawData == true)
288 fRawDataWriter->SetChannelId( chId );
291 vector <AliCaloBunchInfo> bvctr;
292 while( fAltroRawStreamPtr->NextBunch() == true )
294 bvctr.push_back( AliCaloBunchInfo( fAltroRawStreamPtr->GetStartTimeBin(),
295 fAltroRawStreamPtr->GetBunchLength(),
296 fAltroRawStreamPtr->GetSignals() ) );
298 nSamples = fAltroRawStreamPtr->GetBunchLength();
299 if( fDoPushRawData == true)
301 fRawDataWriter->WriteBunchData( fAltroRawStreamPtr->GetSignals(),
302 nSamples, fAltroRawStreamPtr->GetEndTimeBin() );
304 firstBunchPtr = const_cast< UShort_t* >( fAltroRawStreamPtr->GetSignals() );
307 totSize += sizeof( AliHLTCaloChannelDataStruct );
310 HLTError("Buffer overflow: Trying to write data of size: %d bytes. Output buffer available: %d bytes.", totSize, size);
314 AliCaloFitResults res = fAnalyzerPtr->Evaluate( bvctr, fAltroRawStreamPtr->GetAltroCFG1(),
315 fAltroRawStreamPtr->GetAltroCFG2() );
317 HLTDebug("Channel energy: %f, max sig: %d, gain = %d, x = %d, z = %d", res.GetAmp(), res.GetMaxSig(),
318 (chId >> 12)&0x1, chId&0x3f, (chId >> 6)&0x3f);
320 channelDataPtr->fChannelID = chId;
321 channelDataPtr->fEnergy = static_cast<Float_t>( res.GetAmp() ) - fOffset;
322 channelDataPtr->fTime = static_cast<Float_t>( res.GetTof() );
323 channelDataPtr->fCrazyness = static_cast<Short_t>(crazyness);
325 channelDataPtr++; // Updating position of the free output.
329 if( fDoPushRawData == true)
331 fRawDataWriter->NewChannel();
336 channelDataHeaderPtr->fNChannels = channelCount;
337 channelDataHeaderPtr->fAlgorithm = fAlgorithm;
338 channelDataHeaderPtr->fInfo = 0;
340 if( fDoPushRawData == true)
342 tmpsize += fRawDataWriter->CopyBufferToSharedMemory( (UShort_t *)channelDataPtr, size, totSize);
345 channelDataHeaderPtr->fHasRawData = fDoPushRawData;
346 HLTDebug("Number of channels: %d", channelCount);
347 tmpsize += sizeof(AliHLTCaloChannelDataStruct)*channelCount + sizeof(AliHLTCaloChannelDataHeaderStruct);
354 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::RawDataWriter(AliHLTCaloConstants* cConst) :
356 fCurrentChannelSize(0),
358 fBufferSize( 64*56*cConst->GetNGAINS()*cConst->GetALTROMAXSAMPLES() +1000 ),
359 fCurrentChannelIdPtr(0),
360 fCurrentChannelSizePtr(0),
361 fCurrentChannelDataPtr(0),
364 fRawDataBuffer = new UShort_t[fBufferSize];
369 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::~RawDataWriter()
371 delete [] fRawDataBuffer;
376 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::Init()
378 fCurrentChannelIdPtr = fRawDataBuffer;
379 fCurrentChannelSizePtr = fRawDataBuffer +1;
380 fCurrentChannelDataPtr = fRawDataBuffer +2;
386 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::NewEvent()
394 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::NewChannel( )
396 *fCurrentChannelSizePtr = fCurrentChannelSize;
397 fCurrentChannelIdPtr += fCurrentChannelSize;
398 fCurrentChannelSizePtr += fCurrentChannelSize;
399 fCurrentChannelDataPtr += fCurrentChannelSize;
401 fCurrentChannelSize = 2;
407 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::WriteBunchData(const UShort_t *bunchdata, const int length, const UInt_t starttimebin )
409 fCurrentChannelDataPtr[fBufferIndex] = starttimebin;
410 fCurrentChannelSize ++;
412 fCurrentChannelDataPtr[fBufferIndex] = length;
413 fCurrentChannelSize ++;
418 for(int i=0; i < length; i++)
420 fCurrentChannelDataPtr[ fBufferIndex + i ] = bunchdata[i];
423 fCurrentChannelSize += length;
424 fTotalSize += length;
425 fBufferIndex += length;
430 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::SetChannelId( const UShort_t channeldid )
432 *fCurrentChannelIdPtr = channeldid;
437 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::ResetBuffer()
439 for(int i=0; i < fBufferSize ; i++ )
441 fRawDataBuffer[i] = 0;
447 AliHLTCaloRawAnalyzerComponentv3::RawDataWriter::CopyBufferToSharedMemory(UShort_t *memPtr, const int sizetotal, const int sizeused )
449 int sizerequested = (sizeof(int)*fTotalSize + sizeused);
451 if( sizerequested > sizetotal )
457 for(int i=0; i < fTotalSize; i++)
459 memPtr[i] = fRawDataBuffer[i];