4 #include "AliHLTPHOSClusterizer.h"
5 #include "AliHLTPHOSBase.h"
7 #include "AliHLTPHOSRecPointContainerStruct.h"
8 #include "AliHLTPHOSRecPointDataStruct.h"
9 #include "AliHLTPHOSDigitDataStruct.h"
10 #include "AliHLTPHOSDigitContainerDataStruct.h"
11 #include "TClonesArray.h"
12 #include "AliPHOSGeometry.h"
13 #include "AliPHOSDigit.h"
14 #include "AliPHOSRecoParamEmc.h"
16 ClassImp(AliHLTPHOSClusterizer);
18 AliHLTPHOSClusterizer::AliHLTPHOSClusterizer():
20 fEmcClusteringThreshold(0),
21 fEmcMinEnergyThreshold(0),
29 fDigitContainerPtr(0),
30 fRecPointContainerPtr(0),
34 //See header file for documentation
35 fPHOSGeometry = AliPHOSGeometry::GetInstance("noCPV");
36 fEmcClusteringThreshold = 0.2;
37 fEmcMinEnergyThreshold = 0.03;
38 fEmcTimeGate = 1.e-8 ;
45 AliHLTPHOSClusterizer::AliHLTPHOSClusterizer(const AliHLTPHOSClusterizer &)
47 //Copy constructor, not implemented
50 AliHLTPHOSClusterizer::~AliHLTPHOSClusterizer()
56 AliHLTPHOSClusterizer::SetRecoParameters(AliPHOSRecoParamEmc* params)
58 fEmcClusteringThreshold = params->GetClusteringThreshold();
59 fEmcMinEnergyThreshold = params->GetMinE();
60 fLogWeight = params->GetLogWeight();
64 AliHLTPHOSClusterizer::SetOfflineMode(AliPHOSGetter* getter)
66 fRecPointContainerPtr = new AliHLTPHOSRecPointContainerStruct();
67 fDigitContainerPtr = new AliHLTPHOSDigitContainerDataStruct();
69 fDigitArrayPtr = fGetterPtr->Digits();
70 fEmcRecPointsPtr = fGetterPtr->EmcRecPoints();
75 AliHLTPHOSClusterizer::GetEvent(Int_t i)
79 fGetterPtr->Event(i, "D");
80 for(Int_t j = 0; j < fDigitArrayPtr->GetEntries(); j++)
82 fDigitPtr = (AliPHOSDigit*)fDigitArrayPtr->At(j);
83 fPHOSGeometry->AbsToRelNumbering(fDigitPtr->GetId(), coord);
84 fDigitContainerPtr->fDigitDataStruct[j].fX = coord[3];
85 fDigitContainerPtr->fDigitDataStruct[j].fZ = coord[2];
86 fDigitContainerPtr->fDigitDataStruct[j].fModule = coord[0];
87 fDigitContainerPtr->fDigitDataStruct[j].fEnergy = fDigitPtr->GetEnergy();
88 fDigitContainerPtr->fDigitDataStruct[j].fTime = fDigitPtr->GetTime();
90 fDigitContainerPtr->fNDigits = fDigitArrayPtr->GetEntriesFast();
95 AliHLTPHOSClusterizer::GetNEvents()
99 printf("Number of events not available in online mode!\n");
102 return fGetterPtr->MaxEvent();
107 AliHLTPHOSClusterizer::ClusterizeEvent()
109 // Steering method to construct the clusters stored in a list of Reconstructed Points
110 // A cluster is defined as a list of neighbour digits
111 Int_t nRecPoints = 0;
115 AliHLTPHOSRecPointDataStruct *recPoint = 0;
117 //Clusterization starts
118 for(i = 0; i < fDigitContainerPtr->fNDigits; i++)
121 fDigitsInCluster = 0;
123 if(fDigitContainerPtr->fDigitDataStruct[i].fEnergy < fEmcClusteringThreshold)
128 recPoint = &(fRecPointContainerPtr->fRecPointArray[nRecPoints]);
131 recPoint->fDigitsList[fDigitsInCluster] = fDigitContainerPtr->fDigitDataStruct[i];
132 recPoint->fAmp += fDigitContainerPtr->fDigitDataStruct[i].fEnergy;
133 fDigitContainerPtr->fDigitDataStruct[i].fEnergy = 0;
136 ScanForNeighbourDigits(i, recPoint);
138 recPoint->fMultiplicity = fDigitsInCluster;
139 }//end of clusterization
140 fRecPointContainerPtr->fNRecPoints = nRecPoints;
146 AliHLTPHOSClusterizer::ScanForNeighbourDigits(Int_t index, AliHLTPHOSRecPointDataStruct* recPoint)
150 for(UInt_t j = 0; j < fDigitContainerPtr->fNDigits; j++)
152 if(fDigitContainerPtr->fDigitDataStruct[j].fEnergy > fEmcMinEnergyThreshold)
154 switch(AreNeighbours(&(fDigitContainerPtr->fDigitDataStruct[index]),
155 &(fDigitContainerPtr->fDigitDataStruct[j])))
160 recPoint->fDigitsList[fDigitsInCluster] = fDigitContainerPtr->fDigitDataStruct[j];
161 recPoint->fAmp += fDigitContainerPtr->fDigitDataStruct[j].fEnergy;
162 fDigitContainerPtr->fDigitDataStruct[j].fEnergy = 0;
164 ScanForNeighbourDigits(j, recPoint);
176 AliHLTPHOSClusterizer::AreNeighbours(AliHLTPHOSDigitDataStruct* digit1,
177 AliHLTPHOSDigitDataStruct* digit2)
183 // fPHOSGeometry->AbsToRelNumbering(digit1->fID, coord1);
184 //fPHOSGeometry->AbsToRelNumbering(digit2->fID, coord2);
187 if ( (digit1->fModule == digit2->fModule) /*&& (coord1[1]==coord2[1])*/ ) // inside the same PHOS module
190 Int_t rowdiff = TMath::Abs( digit1->fZ - digit2->fZ );
191 Int_t coldiff = TMath::Abs( digit1->fX - digit2->fX );
193 if (( coldiff <= 1 ) && ( rowdiff <= 1 ))
195 if(TMath::Abs(digit1->fTime - digit2->fTime ) < fEmcTimeGate)
203 AliHLTPHOSClusterizer::CalculateCenterOfGravity()
206 // Calculates the center of gravity in the local PHOS-module coordinates
216 AliHLTPHOSRecPointDataStruct *recPoint = 0;
217 AliHLTPHOSDigitDataStruct *digit = 0;
219 AliPHOSGeometry * phosgeom = AliPHOSGeometry::GetInstance() ;
224 for(iRecPoint=0; iRecPoint<fRecPointContainerPtr->fNRecPoints; iRecPoint++)
226 recPoint = &(fRecPointContainerPtr->fRecPointArray[iRecPoint]);
227 for(iDigit = 0; iDigit < recPoint->fMultiplicity; iDigit++)
229 digit = &(recPoint->fDigitsList[iDigit]);
231 //fPHOSGeometry->AbsToRelNumbering(digit->fID, relid) ;
232 // fPHOSGeometry->RelPosInModule(relid, xi, zi);
236 if (recPoint->fAmp > 0 && digit->fEnergy > 0)
238 Float_t w = TMath::Max( 0., fLogWeight + TMath::Log( digit->fEnergy / recPoint->fAmp ) ) ;
247 recPoint->fX = x/wtot ;
248 recPoint->fZ = z/wtot ;