+// $Id$
+
/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* *
* provided "as is" without express or implied warranty. *
**************************************************************************/
+#include <iostream>
#include "AliHLTPHOSClusterizerComponent.h"
#include "AliHLTPHOSClusterizer.h"
#include "AliHLTPHOSRecPointDataStruct.h"
+#include "AliHLTPHOSRecPointHeaderStruct.h"
+#include "AliHLTPHOSDigitDataStruct.h"
#include "AliHLTPHOSDigitContainerDataStruct.h"
// or
// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
-#if __GNUC__>= 3
-using namespace std;
-#endif
-
-const AliHLTComponentDataType AliHLTPHOSClusterizerComponent::fgkInputDataTypes[]=
- {
- kAliHLTVoidDataType,{0,"",""}
- };
-
AliHLTPHOSClusterizerComponent gAliHLTPHOSClusterizerComponent;
-
-AliHLTPHOSClusterizerComponent::AliHLTPHOSClusterizerComponent(): AliHLTPHOSProcessor(), fClusterizerPtr(0), fOutPtr(0),
- fRecPointStructArrayPtr(0) //, fRecPointListPtr(0)
+AliHLTPHOSClusterizerComponent::AliHLTPHOSClusterizerComponent():
+ AliHLTPHOSProcessor(),
+ fAllDigitsPtr(0),
+ fClusterizerPtr(0),
+ fDigitCount(0),
+ fNoCrazyness(0)
{
//See headerfile for documentation
}
{
//See headerfile for documentation
- if (fClusterizerPtr)
+ if(fClusterizerPtr)
{
delete fClusterizerPtr;
fClusterizerPtr = 0;
}
-
- if (fRecPointStructArrayPtr)
+ if(fAllDigitsPtr)
{
- for (int i = 0; i < 1000; i++)
- {
- // fRecPointStructArrayPtr[i].Del();
- }
- delete fRecPointStructArrayPtr;
- fRecPointStructArrayPtr = 0;
+ delete fAllDigitsPtr;
+ fAllDigitsPtr = 0;
}
-
}
fClusterizerPtr = 0;
}
- for (int i = 0; i < 1000; i++)
- {
- // fRecPointStructArrayPtr[i].Del();
- }
-
- if (fRecPointStructArrayPtr)
- {
- for (int i = 0; i < 1000; i++)
- {
- // fRecPointStructArrayPtr[i].Del();
- }
- delete fRecPointStructArrayPtr;
- fRecPointStructArrayPtr = 0;
- }
-
return 0;
}
AliHLTPHOSClusterizerComponent::GetComponentID()
{
//See headerfile for documentation
- return "AliHltPhosClusterizer";
+ return "PhosClusterizer";
}
void
AliHLTPHOSClusterizerComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list)
{
//See headerfile for documentation
-
- const AliHLTComponentDataType* pType=fgkInputDataTypes;
- while (pType->fID!=0)
- {
- list.push_back(*pType);
- pType++;
- }
+ list.clear();
+ list.push_back(AliHLTPHOSDefinitions::fgkDigitDataType);
}
AliHLTComponentDataType
AliHLTPHOSClusterizerComponent::GetOutputDataType()
{
//See headerfile for documentation
-
- return AliHLTPHOSDefinitions::fgkAliHLTClusterDataType;
+ return AliHLTPHOSDefinitions::fgkRecPointDataType;
}
void
{
//See headerfile for documentation
- constBase = 30;
- inputMultiplier = 0.2;
+ constBase = sizeof(AliHLTPHOSRecPointHeaderStruct) + sizeof(AliHLTPHOSRecPointDataStruct) + (sizeof(AliHLTPHOSDigitDataStruct) << 7); //Reasonable estimate... ;
+ inputMultiplier = 1.5;
}
int
std::vector<AliHLTComponentBlockData>& outputBlocks)
{
//See headerfile for documentation
- UInt_t tSize = 0;
+
+ if(blocks == 0) return 0;
+
UInt_t offset = 0;
UInt_t mysize = 0;
Int_t nRecPoints = 0;
Int_t nDigits = 0;
- Int_t j =0;
+ UInt_t availableSize = size;
AliHLTUInt8_t* outBPtr;
outBPtr = outputPtr;
const AliHLTComponentBlockData* iter = 0;
unsigned long ndx;
-
- AliHLTPHOSDigitContainerDataStruct *digitContainerPtr = 0;
- fClusterizerPtr->SetRecPointContainer((AliHLTPHOSRecPointContainerStruct*)outBPtr);
-
+
+ UInt_t specification = 0;
+
+ AliHLTPHOSDigitHeaderStruct *digitHeaderPtr = 0;
+ AliHLTPHOSDigitHeaderStruct *outputDigitHeaderPtr = reinterpret_cast<AliHLTPHOSDigitHeaderStruct*>(outBPtr);
+
+ // HLTError("Header pointer before screwing around: 0x%x", outputDigitHeaderPtr);
+
+ AliHLTPHOSDigitDataStruct *firstDigitPtr = 0;
+ AliHLTPHOSDigitDataStruct *lastDigitPtr = 0;
+
+ // Adding together all the digits, should be put in standalone method
for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
{
iter = blocks+ndx;
- digitContainerPtr = reinterpret_cast<AliHLTPHOSDigitContainerDataStruct*>(iter->fPtr);
- if (iter->fDataType != AliHLTPHOSDefinitions::fgkAliHLTDigitDataType)
- {
- continue;
- }
- for (UInt_t i = 0; i < digitContainerPtr->fNDigits; i++)
- {
- if(fNoCrazyness && digitContainerPtr->fDigitDataStruct[i].fCrazyness)
- continue;
-
- fAllDigitsPtr->fDigitDataStruct[j+nDigits].fX = digitContainerPtr->fDigitDataStruct[i].fX;
- fAllDigitsPtr->fDigitDataStruct[j+nDigits].fZ = digitContainerPtr->fDigitDataStruct[i].fZ;
- fAllDigitsPtr->fDigitDataStruct[j+nDigits].fAmplitude = digitContainerPtr->fDigitDataStruct[i].fAmplitude;
- fAllDigitsPtr->fDigitDataStruct[j+nDigits].fTime = digitContainerPtr->fDigitDataStruct[i].fTime;
- j++;
- }
- nDigits++;
+ if (iter->fDataType == AliHLTPHOSDefinitions::fgkDigitDataType)
+ {
+ // Get the digit header
+ digitHeaderPtr = reinterpret_cast<AliHLTPHOSDigitHeaderStruct*>(iter->fPtr);
+
+ // Update the number of digits
+ nDigits += digitHeaderPtr->fNDigits;
+
+ // Get the specification
+ specification = specification|iter->fSpecification;
+
+ // Check if we have the first buffer in the event
+ if(!firstDigitPtr)
+ {
+ if(availableSize < digitHeaderPtr->fNDigits*sizeof(AliHLTPHOSDigitDataStruct) + sizeof(AliHLTPHOSDigitHeaderStruct))
+ {
+ // HLTError("Buffer overflow: Trying to write data of size: %d bytes. Output buffer available: %d bytes.", totSize, size);
+ HLTError("Buffer overflow: Trying to write data of size: %d bytes. Output buffer available: %d bytes.", mysize, size);
+ return -1;
+ }
+ // If so, lets copy the header and the corresponding digits to the output
+ memcpy(outBPtr, iter->fPtr, digitHeaderPtr->fNDigits*sizeof(AliHLTPHOSDigitDataStruct) + sizeof(AliHLTPHOSDigitHeaderStruct));
+
+ // Set the pointer to the first digit in the list
+ // firstDigitPtr = reinterpret_cast<AliHLTPHOSDigitDataStruct*>(outBPtr + sizeof(AliHLTPHOSDigitHeaderStruct) + digitHeaderPtr->fFirstDigitOffset);
+ firstDigitPtr = reinterpret_cast<AliHLTPHOSDigitDataStruct*>(outBPtr + digitHeaderPtr->fFirstDigitOffset);
+
+ // lastDigitPtr = reinterpret_cast<AliHLTPHOSDigitDataStruct*>(outBPtr + sizeof(AliHLTPHOSDigitHeaderStruct) + digitHeaderPtr->fLastDigitOffset);
+ lastDigitPtr = reinterpret_cast<AliHLTPHOSDigitDataStruct*>(outBPtr + digitHeaderPtr->fLastDigitOffset);
+
+ // Update the amount of the output buffer we have used
+ mysize += digitHeaderPtr->fNDigits*sizeof(AliHLTPHOSDigitDataStruct) + sizeof(AliHLTPHOSDigitHeaderStruct);
+ }
+ else
+ {
+ // Check if we have space for
+ if(availableSize < digitHeaderPtr->fNDigits*sizeof(AliHLTPHOSDigitDataStruct))
+ {
+ HLTError("Buffer overflow: Trying to write data of size: %d bytes. Output buffer available: %d bytes.", mysize, size);
+ return -1;
+ }
+
+ // If we already have copied the first buffer to the output copy only the digits
+ memcpy(outBPtr, reinterpret_cast<const void*>(reinterpret_cast<UChar_t*>(iter->fPtr)+sizeof(AliHLTPHOSDigitHeaderStruct)), digitHeaderPtr->fNDigits*sizeof(AliHLTPHOSDigitDataStruct));
+
+ // Check if the first digit in this buffer has a ID less than the first digit in the previous
+ // if(firstDigitPtr->fID > reinterpret_cast<AliHLTPHOSDigitDataStruct*>(reinterpret_cast<UChar_t*>(iter->fPtr) + sizeof(AliHLTPHOSDigitDataStruct) + digitHeaderPtr->fFirstDigitOffset)->fID)
+ AliHLTPHOSDigitDataStruct *thisFirst =
+ reinterpret_cast<AliHLTPHOSDigitDataStruct*>(reinterpret_cast<UChar_t*>(iter->fPtr) + digitHeaderPtr->fFirstDigitOffset);
+ if(firstDigitPtr->fID > thisFirst->fID)
+ {
+ // If that is the case we have to take care of the ordering
+
+ HLTError("Re-ordering digit blocks...");
+ // The last digit in the current buffer has to link to the first digit in the previous buffer
+ // AliHLTPHOSDigitDataStruct *thisLast = reinterpret_cast<AliHLTPHOSDigitDataStruct*>(outBPtr + sizeof(AliHLTPHOSDigitHeaderStruct) + digitHeaderPtr->fLastDigitOffset);
+ AliHLTPHOSDigitDataStruct *thisLast = reinterpret_cast<AliHLTPHOSDigitDataStruct*>(outBPtr - sizeof(AliHLTPHOSDigitHeaderStruct) + digitHeaderPtr->fLastDigitOffset);
+ thisLast->fMemOffsetNext = reinterpret_cast<Long_t>(firstDigitPtr) - reinterpret_cast<Long_t>(thisLast);
+
+ // Setting the pointer to the new first digit
+ firstDigitPtr = reinterpret_cast<AliHLTPHOSDigitDataStruct*>(outBPtr + digitHeaderPtr->fFirstDigitOffset - sizeof(AliHLTPHOSDigitHeaderStruct));
+ }
+ else
+ {
+ // Previous last digit need to link to the current first digit
+ lastDigitPtr->fMemOffsetNext = reinterpret_cast<Long_t>(lastDigitPtr) - (reinterpret_cast<Long_t>(outBPtr) + digitHeaderPtr->fFirstDigitOffset - sizeof(AliHLTPHOSDigitHeaderStruct));
+
+ // We need to change the last digit pointer
+ lastDigitPtr = reinterpret_cast<AliHLTPHOSDigitDataStruct*>(reinterpret_cast<Long_t>(outBPtr) + digitHeaderPtr->fLastDigitOffset - sizeof(AliHLTPHOSDigitHeaderStruct));
+ }
+ // Update the amount of the output buffer we have used
+ mysize += digitHeaderPtr->fNDigits*sizeof(AliHLTPHOSDigitDataStruct);
+ }
+
+ outBPtr += mysize;
+ }
+ }
+
+ // The digit header in the output needs to know about the position of the new first digit
+ // outputDigitHeaderPtr->fFirstDigitOffset = reinterpret_cast<Long_t>(firstDigitPtr) - reinterpret_cast<Long_t>(outputDigitHeaderPtr) + sizeof(AliHLTPHOSDigitHeaderStruct);
+ outputDigitHeaderPtr->fFirstDigitOffset = reinterpret_cast<Long_t>(firstDigitPtr) - reinterpret_cast<Long_t>(outputDigitHeaderPtr);
+
+ // The digit header in the output needs to know about the position of the new last digit
+ // outputDigitHeaderPtr->fLastDigitOffset = reinterpret_cast<Long_t>(lastDigitPtr) - reinterpret_cast<Long_t>(outputDigitHeaderPtr) + sizeof(AliHLTPHOSDigitHeaderStruct);
+ outputDigitHeaderPtr->fLastDigitOffset = reinterpret_cast<Long_t>(lastDigitPtr) - reinterpret_cast<Long_t>(outputDigitHeaderPtr);
+ if(firstDigitPtr)
+ {
+ // HLTError("Header pointer after screwing around: 0x%x", outputDigitHeaderPtr);
+ // HLTError("First/last offset: %d / %d, first digit ID: %d, energy: %f", outputDigitHeaderPtr->fFirstDigitOffset, outputDigitHeaderPtr->fLastDigitOffset, firstDigitPtr->fID, firstDigitPtr->fEnergy);
}
- fOutPtr = (AliHLTPHOSRecPointContainerStruct*)outBPtr;
- nRecPoints = fClusterizerPtr->ClusterizeEvent();
- cout << "Number of clusters found: " << nRecPoints << " extracted from " << nDigits << " digits" << endl;
+ HLTDebug("Number of digits: %d", nDigits);
- mysize = 0;
- offset = tSize;
+ if(nDigits > 0)
+ {
- mysize += sizeof(AliHLTPHOSRecPointDataStruct);
+ AliHLTPHOSRecPointHeaderStruct* recPointHeaderPtr = reinterpret_cast<AliHLTPHOSRecPointHeaderStruct*>(outBPtr);
- AliHLTComponentBlockData bd;
- FillBlockData( bd );
- bd.fOffset = offset;
- bd.fSize = mysize;
- // PTH bd.fDataType = AliHLTPHOSPhysicsDefinitions::fgkAliHLTClusterDataType;
- bd.fDataType = AliHLTPHOSDefinitions::fgkAliHLTClusterDataType;
- bd.fSpecification = 0xFFFFFFFF;
- outputBlocks.push_back( bd );
+ fClusterizerPtr->SetRecPointDataPtr(reinterpret_cast<AliHLTPHOSRecPointDataStruct*>(outBPtr+sizeof(AliHLTPHOSRecPointHeaderStruct)));
- tSize += mysize;
- outBPtr += mysize;
+ nRecPoints = fClusterizerPtr->ClusterizeEvent(outputDigitHeaderPtr, availableSize, mysize);
+ recPointHeaderPtr->fNRecPoints = nRecPoints;
- if ( tSize > size )
+ mysize += sizeof(AliHLTPHOSRecPointHeaderStruct);
+
+ HLTDebug("Number of clusters: %d", nRecPoints);
+ }
+ AliHLTComponentBlockData clusterBd;
+ FillBlockData( clusterBd );
+ clusterBd.fOffset = offset;
+ clusterBd.fSize = mysize;
+ clusterBd.fDataType = AliHLTPHOSDefinitions::fgkRecPointDataType;
+ clusterBd.fSpecification = specification;
+ outputBlocks.push_back( clusterBd );
+
+ if(false)
{
- Logging( kHLTLogFatal, "HLT::AliHLTPHOSClusterizerComponent::DoEvent", "Too much data",
- "Data written over allowed buffer. Amount written: %lu, allowed amount: %lu."
- , tSize, size );
- return EMSGSIZE;
+ AliHLTComponentBlockData digitBd;
+ FillBlockData(digitBd);
}
+
+ size = mysize;
+
+ return 0;
+}
+int
+AliHLTPHOSClusterizerComponent::Reconfigure(const char* cdbEntry, const char* /*chainId*/)
+{
+ // see header file for class documentation
- size = tSize;
-// fClusterizerPtr->ResetCellEnergyArray();
+ const char* path="HLT/ConfigPHOS/ClusterizerComponent";
- return 0;
+ if (cdbEntry) path = cdbEntry;
+ return ConfigureFromCDBTObjString(cdbEntry);
+}
+
+int
+AliHLTPHOSClusterizerComponent::ScanConfigurationArgument(int argc, const char **argv)
+{
+ //See header file for documentation
+
+ if(argc <= 0) return 0;
+
+ int i=0;
+
+ TString argument=argv[i];
+
+ if (argument.CompareTo("-digitthreshold") == 0)
+ {
+ if (++i >= argc) return -EPROTO;
+ argument = argv[i];
+ fClusterizerPtr->SetEmcMinEnergyThreshold(argument.Atof());
+ return 1;
+ }
+
+ if (argument.CompareTo("-recpointthreshold") == 0)
+ {
+ if (++i >= argc) return -EPROTO;
+ argument = argv[i];
+ fClusterizerPtr->SetEmcClusteringThreshold(argument.Atof());
+ return 1;
+ }
+ return 0;
}
int
fAllDigitsPtr = new AliHLTPHOSDigitContainerDataStruct();
fClusterizerPtr = new AliHLTPHOSClusterizer();
- //fClusterizerPtr->SetNoCrazyness(true);
+ fClusterizerPtr->SetDigitContainer(fAllDigitsPtr);
+ fNoCrazyness = false;
//
- for (int i = 0; i < argc; i++)
- {
- /*
- if(!strcmp("-energythreshold", argv[i]))
- fClusterizerPtr->SetThreshold(atof(argv[i+1]));
- if(!strcmp("-clusterthreshold", argv[i]))
- fClusterizerPtr->SetClusterThreshold(atof(argv[i+1]));
- if(!strcmp("-highgain", argv[i]))
- fClusterizerPtr->SetHighGainFactor(atof(argv[i+1]));
- if(!strcmp("-lowgain", argv[i]))
- fClusterizerPtr->SetLowGainFactor(atof(argv[i+1]));
- if(!strcmp("-arraysize", argv[i]))
- fClusterizerPtr->SetArraySize(atoi(argv[i+1]));*/
- }
- // fClusterizerPtr->ResetCellEnergyArray();
+ // const char *path = "HLT/ConfigPHOS/ClusterizerComponent";
+
+ // ConfigureFromCDBTObjString(path);
- fRecPointStructArrayPtr = new AliHLTPHOSRecPointDataStruct[1000];
- for (int i = 0; i < 1000; i++)
+ for (int i = 0; i < argc; i++)
{
- fRecPointStructArrayPtr[i].fMultiplicity = atoi(argv[4])* atoi(argv[4]);
- // fRecPointStructArrayPtr[i].New();
+ ScanConfigurationArgument(i, argv);
}
- /*
- printf("Clusterizer component started with:\n");
- printf(" Cell threshold: %f\n", fClusterizerPtr->GetThreshold());
- printf(" Cluster threshold: %f\n", fClusterizerPtr->GetClusterThreshold());
- printf(" High gain factor: %f\n", fClusterizerPtr->GetHighGainFactor());
- printf(" Low gain factor: %f\n", fClusterizerPtr->GetLowGainFactor());
- printf(" Cluster array size: %d\n\n", fClusterizerPtr->GetArraySize());
- */
+
return 0;
}