1 /**************************************************************************
2 * This file is property of and copyright by the ALICE HLT Project *
3 * All rights reserved. *
5 * Primary Authors: Oystein Djuvsland *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 * @file AliHLTPHOSClusterizer.cxx
18 * @author Oystein Djuvsland
20 * @brief Clusterizer for PHOS HLT
23 // see header file for class documentation
25 // refer to README to build package
27 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
29 #include "AliHLTPHOSClusterizer.h"
30 #include "AliHLTPHOSBase.h"
32 #include "AliHLTPHOSRecPointContainerStruct.h"
33 #include "AliHLTPHOSRecPointDataStruct.h"
34 #include "AliHLTPHOSDigitDataStruct.h"
35 #include "AliHLTPHOSDigitContainerDataStruct.h"
36 #include "TClonesArray.h"
37 #include "AliPHOSGeometry.h"
38 #include "AliPHOSDigit.h"
39 #include "AliPHOSRecoParam.h"
41 ClassImp(AliHLTPHOSClusterizer);
43 AliHLTPHOSClusterizer::AliHLTPHOSClusterizer():
45 fEmcClusteringThreshold(0),
46 fEmcMinEnergyThreshold(0),
54 fDigitContainerPtr(0),
55 fRecPointContainerPtr(0),
59 //See header file for documentation
60 fPHOSGeometry = AliPHOSGeometry::GetInstance("noCPV");
61 fEmcClusteringThreshold = 0.2;
62 fEmcMinEnergyThreshold = 0.03;
63 fEmcTimeGate = 1.e-6 ;
70 AliHLTPHOSClusterizer::~AliHLTPHOSClusterizer()
72 //See header file for documentation
76 AliHLTPHOSClusterizer::SetRecPointContainer(AliHLTPHOSRecPointContainerStruct* recPointContainerPtr)
78 fRecPointContainerPtr = recPointContainerPtr;
79 fRecPointContainerPtr->fNRecPoints = 0;
83 AliHLTPHOSClusterizer::SetRecoParameters(AliPHOSRecoParam* params)
85 //see header file for documentation
86 fEmcClusteringThreshold = params->GetEMCClusteringThreshold();
87 fEmcMinEnergyThreshold = params->GetEMCMinE();
88 fLogWeight = params->GetEMCLogWeight();
92 AliHLTPHOSClusterizer::SetOfflineMode(AliPHOSLoader* getter)
94 //see header file for documentation
95 fRecPointContainerPtr = new AliHLTPHOSRecPointContainerStruct();
96 fDigitContainerPtr = new AliHLTPHOSDigitContainerDataStruct();
98 fDigitArrayPtr = fGetterPtr->Digits();
99 fEmcRecPointsPtr = fGetterPtr->EmcRecPoints();
104 AliHLTPHOSClusterizer::GetEvent(Int_t i)
106 //see header file for documentation
109 // fGetterPtr->Event(i, "D");
110 fGetterPtr->GetEvent();
111 for(Int_t j = 0; j < fDigitArrayPtr->GetEntries(); j++)
113 fDigitPtr = (AliPHOSDigit*)fDigitArrayPtr->At(j);
114 fPHOSGeometry->AbsToRelNumbering(fDigitPtr->GetId(), coord);
115 fDigitContainerPtr->fDigitDataStruct[j].fX = coord[3];
116 fDigitContainerPtr->fDigitDataStruct[j].fZ = coord[2];
117 fDigitContainerPtr->fDigitDataStruct[j].fModule = coord[0];
118 fDigitContainerPtr->fDigitDataStruct[j].fEnergy = fDigitPtr->GetEnergy();
119 fDigitContainerPtr->fDigitDataStruct[j].fTime = fDigitPtr->GetTime();
121 fDigitContainerPtr->fNDigits = fDigitArrayPtr->GetEntriesFast();
126 AliHLTPHOSClusterizer::GetNEvents()
128 //see header file for documentation
131 // Logging(kHLTLogWarning, __FILE__ , "information not available" , "GetNEvents() Number of events not available in online mod");
134 return fGetterPtr->MaxEvent();
139 AliHLTPHOSClusterizer::ClusterizeEvent()
141 //see header file for documentation
142 Int_t nRecPoints = 0;
145 AliHLTPHOSRecPointDataStruct *recPoint = 0;
147 //Clusterization starts
148 for(i = 0; i < fDigitContainerPtr->fNDigits; i++)
151 fDigitsInCluster = 0;
152 if(fDigitContainerPtr->fDigitDataStruct[i].fEnergy < fEmcClusteringThreshold)
156 recPoint = &(fRecPointContainerPtr->fRecPointArray[nRecPoints]);
159 recPoint->fModule = fDigitContainerPtr->fDigitDataStruct[i].fModule;
162 recPoint->fDigitsList[fDigitsInCluster] = fDigitContainerPtr->fDigitDataStruct[i];
163 recPoint->fAmp += fDigitContainerPtr->fDigitDataStruct[i].fEnergy;
164 fDigitContainerPtr->fDigitDataStruct[i].fEnergy = 0;
167 ScanForNeighbourDigits(i, recPoint);
169 recPoint->fMultiplicity = fDigitsInCluster;
171 }//end of clusterization
172 fRecPointContainerPtr->fNRecPoints = nRecPoints;
178 AliHLTPHOSClusterizer::ScanForNeighbourDigits(Int_t index, AliHLTPHOSRecPointDataStruct* recPoint)
181 //see header file for documentation
183 for(UInt_t j = 0; j < fDigitContainerPtr->fNDigits; j++)
185 if(fDigitContainerPtr->fDigitDataStruct[j].fEnergy > fEmcMinEnergyThreshold)
187 switch(AreNeighbours(&(fDigitContainerPtr->fDigitDataStruct[index]),
188 &(fDigitContainerPtr->fDigitDataStruct[j])))
193 recPoint->fDigitsList[fDigitsInCluster] = fDigitContainerPtr->fDigitDataStruct[j];
194 recPoint->fAmp += fDigitContainerPtr->fDigitDataStruct[j].fEnergy;
195 fDigitContainerPtr->fDigitDataStruct[j].fEnergy = 0;
197 ScanForNeighbourDigits(j, recPoint);
209 AliHLTPHOSClusterizer::AreNeighbours(AliHLTPHOSDigitDataStruct* digit1,
210 AliHLTPHOSDigitDataStruct* digit2)
212 //see header file for documentation
214 if ( (digit1->fModule == digit2->fModule) /*&& (coord1[1]==coord2[1])*/ ) // inside the same PHOS module
216 Int_t rowdiff = TMath::Abs( digit1->fZ - digit2->fZ );
217 Int_t coldiff = TMath::Abs( digit1->fX - digit2->fX );
219 if (( coldiff <= 1 ) && ( rowdiff <= 1 ))
221 if(TMath::Abs(digit1->fTime - digit2->fTime ) < fEmcTimeGate)
231 AliHLTPHOSClusterizer::CalculateCenterOfGravity()
233 //see header file for documentation
240 AliHLTPHOSRecPointDataStruct *recPoint = 0;
241 AliHLTPHOSDigitDataStruct *digit = 0;
243 UInt_t iRecPoint = 0;
245 for(iRecPoint=0; iRecPoint<fRecPointContainerPtr->fNRecPoints; iRecPoint++)
247 recPoint = &(fRecPointContainerPtr->fRecPointArray[iRecPoint]);
248 for(iDigit = 0; iDigit < recPoint->fMultiplicity; iDigit++)
250 digit = &(recPoint->fDigitsList[iDigit]);
252 //fPHOSGeometry->AbsToRelNumbering(digit->fID, relid) ;
253 // fPHOSGeometry->RelPosInModule(relid, xi, zi);
257 if (recPoint->fAmp > 0 && digit->fEnergy > 0)
259 Float_t w = TMath::Max( 0., fLogWeight + TMath::Log( digit->fEnergy / recPoint->fAmp ) ) ;
268 recPoint->fX = x/wtot ;
269 recPoint->fZ = z/wtot ;