1 // $Id: AliHLTCaloClusterizerComponent.cxx 36709 2009-11-12 16:57:55Z odjuvsla $
3 /**************************************************************************
4 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
6 * Authors: Oystein Djuvsland <oysteind@ift.uib.no> *
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 "AliHLTCaloClusterizerComponent.h"
18 #include "AliHLTCaloClusterizer.h"
19 #include "AliHLTCaloClusterAnalyser.h"
20 #include "AliHLTCaloRecPointDataStruct.h"
21 #include "AliHLTCaloRecPointHeaderStruct.h"
22 #include "AliHLTCaloDigitDataStruct.h"
23 #include "AliHLTCaloDigitContainerDataStruct.h"
24 #include "AliHLTCaloDefinitions.h"
25 #include "AliHLTCaloClusterDataStruct.h"
26 #include "AliHLTCaloRecoParamHandler.h"
29 /** @file AliHLTCaloClusterizerComponent.cxx
30 @author Oystein Djuvsland
32 @brief A clusterizer component for PHOS HLT
35 // see header file for class documentation
37 // refer to README to build package
39 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
41 ClassImp(AliHLTCaloClusterizerComponent);
43 AliHLTCaloClusterizerComponent::AliHLTCaloClusterizerComponent(TString det):
44 AliHLTCaloProcessor(),
45 AliHLTCaloConstantsHandler(det),
49 fDigitsPointerArray(0),
50 fOutputDigitsArray(0),
53 fCopyDigitsToOuput(kTRUE)
55 //See headerfile for documentation
61 AliHLTCaloClusterizerComponent::~AliHLTCaloClusterizerComponent()
63 //See headerfile for documentation
67 delete fClusterizerPtr;
73 AliHLTCaloClusterizerComponent::DoEvent(const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
74 AliHLTComponentTriggerData& /*trigData*/, AliHLTUInt8_t* outputPtr, AliHLTUInt32_t& size,
75 std::vector<AliHLTComponentBlockData>& outputBlocks)
77 //See headerfile for documentation
79 if (blocks == 0) return 0;
87 UInt_t availableSize = size;
88 AliHLTUInt8_t* outBPtr;
90 const AliHLTComponentBlockData* iter = 0;
93 UInt_t specification = 0;
95 AliHLTCaloDigitDataStruct *digitDataPtr = 0;
97 // Adding together all the digits, should be put in standalone method
98 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
102 if (iter->fDataType == (AliHLTCaloDefinitions::fgkDigitDataType|fDataOrigin))
105 // Update the number of digits
106 nDigits = iter->fSize/sizeof(AliHLTCaloDigitDataStruct);
107 availableSize -= iter->fSize;
109 specification = specification|iter->fSpecification;
111 digitDataPtr = reinterpret_cast<AliHLTCaloDigitDataStruct*>(iter->fPtr);
113 // We copy the digits to the digit buffer used by the clusterizer
114 // This is convinient since we want the digits from all DDLs before starting
115 // Could be changed if this is a bottle neck.
116 for (Int_t i = 0; i < nDigits; i++)
118 fDigitsPointerArray[digCount] = digitDataPtr;
128 AliHLTCaloClusterHeaderStruct* caloClusterHeaderPtr = reinterpret_cast<AliHLTCaloClusterHeaderStruct*>(outBPtr);
129 caloClusterHeaderPtr->fNDigits = digCount;
131 outBPtr += sizeof(AliHLTCaloClusterHeaderStruct);
132 mysize += sizeof(AliHLTCaloClusterHeaderStruct);
134 // Sort the digit pointers
135 // qsort(fDigitsPointerArray, digCount, sizeof(AliHLTCaloDigitDataStruct*), CompareDigits);
138 if (fCopyDigitsToOuput)
140 // Copy the digits to the output
141 fOutputDigitsArray = reinterpret_cast<AliHLTCaloDigitDataStruct*>(outBPtr);
143 for (Int_t n = 0; n < digCount; n++)
145 memcpy(outBPtr, fDigitsPointerArray[n], sizeof(AliHLTCaloDigitDataStruct));
146 //fOutputDigitsArray[n] = reinterpret_cast<AliHLTCaloDigitDataStruct*>(outBPtr);
147 outBPtr = outBPtr + sizeof(AliHLTCaloDigitDataStruct);
151 // Update the size of the output we have used, needs to be removed if we don't push the digits
152 mysize += digCount*sizeof(AliHLTCaloDigitDataStruct);
154 // Do the clusterisation
155 nRecPoints = fClusterizerPtr->ClusterizeEvent(digCount);
157 HLTDebug("Number of rec points found: %d", nRecPoints);
159 // Give the cluster output to the analyser
160 fAnalyserPtr->SetCaloClusterData(reinterpret_cast<AliHLTCaloClusterDataStruct*>(outBPtr));
162 // Give the rec points to the analyser (input)
163 fAnalyserPtr->SetRecPointArray(fClusterizerPtr->GetRecPoints(), nRecPoints);
165 // Give the digits to the analyser
166 //fAnalyserPtr->SetDigitDataArray(fOutputDigitsArray);
167 fAnalyserPtr->SetDigitDataArray(fDigitsPointerArray);
169 // Then we create the clusters
170 Int_t nClusters = fAnalyserPtr->CreateClusters(nRecPoints, size, mysize);
174 HLTError("Error in clusterisation");
175 caloClusterHeaderPtr->fNClusters = 0;
179 caloClusterHeaderPtr->fNClusters = nClusters;
182 HLTDebug("Number of clusters: %d", nRecPoints);
184 AliHLTComponentBlockData bd;
188 bd.fDataType = kAliHLTDataTypeCaloCluster | fDataOrigin;
189 bd.fSpecification = specification;
190 outputBlocks.push_back( bd );
199 AliHLTCaloClusterizerComponent::Reconfigure(const char* cdbEntry, const char* /*chainId*/)
201 // see header file for class documentation
203 const char* path="HLT/ConfigPHOS/ClusterizerComponent";
205 if (cdbEntry) path = cdbEntry;
207 return ConfigureFromCDBTObjString(cdbEntry);
211 AliHLTCaloClusterizerComponent::ScanConfigurationArgument(int argc, const char **argv)
213 //See header file for documentation
215 if (argc <= 0) return 0;
219 TString argument=argv[i];
221 if (argument.CompareTo("-digitthreshold") == 0)
223 if (++i >= argc) return -EPROTO;
225 fClusterizerPtr->SetEmcMinEnergyThreshold(argument.Atof());
229 if (argument.CompareTo("-recpointthreshold") == 0)
231 if (++i >= argc) return -EPROTO;
233 fClusterizerPtr->SetEmcClusteringThreshold(argument.Atof());
237 if (argument.CompareTo("-cutonsinglecell") == 0)
239 if (++i >= argc) return -EPROTO;
241 fAnalyserPtr->SetCutOnSingleCellClusters(true, argument.Atof());
244 if (argument.CompareTo("-sortbyposition") == 0)
246 fClusterizerPtr->SetSortDigitsByPosition();
254 AliHLTCaloClusterizerComponent::DoInit(int argc, const char** argv )
256 //See headerfile for documentation
258 fDigitsPointerArray = new AliHLTCaloDigitDataStruct*[fCaloConstants->GetNXCOLUMNSMOD()*fCaloConstants->GetNZROWSMOD()];
260 fClusterizerPtr = new AliHLTCaloClusterizer(fCaloConstants->GetDETNAME());
262 fClusterizerPtr->SetDigitArray(fDigitsPointerArray);
264 fClusterizerPtr->SetSortDigitsByEnergy();
266 fAnalyserPtr = new AliHLTCaloClusterAnalyser();
268 if (fCaloConstants->GetDETNAME() == "PHOS")
270 fAnalyserPtr->SetClusterType(kPHOSCluster);
272 else if (fCaloConstants->GetDETNAME() == "EMCAL")
274 fAnalyserPtr->SetClusterType(kEMCALClusterv1);
278 fAnalyserPtr->SetClusterType(kUndef);
280 InitialiseGeometry();
283 if (!fRecoParamsPtr->GetParametersFromCDB())
285 fAnalyserPtr->SetRecoParamHandler(fRecoParamsPtr);
286 fClusterizerPtr->SetEmcClusteringThreshold(fRecoParamsPtr->GetRecPointThreshold());
287 fClusterizerPtr->SetEmcMinEnergyThreshold(fRecoParamsPtr->GetRecPointMemberThreshold());
292 // const char *path = "HLT/ConfigPHOS/ClusterizerComponent";
294 // ConfigureFromCDBTObjString(path);
296 for (int i = 0; i < argc; i++)
298 ScanConfigurationArgument(i, argv);
303 int AliHLTCaloClusterizerComponent::DoDeinit()
305 // See header file for documentation
306 if (fDigitsPointerArray)
308 delete [] fDigitsPointerArray;
309 fDigitsPointerArray = 0;
313 delete fClusterizerPtr;
325 AliHLTCaloClusterizerComponent::CompareDigits(const void *dig0, const void *dig1)
327 // See header file for documentation
328 return (*((AliHLTCaloDigitDataStruct**)(dig0)))->fID - (*((AliHLTCaloDigitDataStruct**)(dig1)))->fID;
330 //return (*((AliHLTCaloDigitDataStruct**)(dig0)))->fID - (*((AliHLTCaloDigitDataStruct**)(dig1)))->fID;