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 #ifndef HAVE_NOT_PHOSRECOPARAMEMC // set from configure if EMC functionality not available in AliPHOSRecoParam
40 #include "AliPHOSRecoParam.h"
42 #include "AliPHOSRecoParamEmc.h"
45 ClassImp(AliHLTPHOSClusterizer);
47 AliHLTPHOSClusterizer::AliHLTPHOSClusterizer():
49 fEmcClusteringThreshold(0),
50 fEmcMinEnergyThreshold(0),
58 fDigitContainerPtr(0),
59 fRecPointContainerPtr(0),
63 //See header file for documentation
64 fPHOSGeometry = AliPHOSGeometry::GetInstance("noCPV");
65 fEmcClusteringThreshold = 0.2;
66 fEmcMinEnergyThreshold = 0.03;
67 fEmcTimeGate = 1.e-6 ;
74 AliHLTPHOSClusterizer::~AliHLTPHOSClusterizer()
76 //See header file for documentation
80 AliHLTPHOSClusterizer::SetRecPointContainer(AliHLTPHOSRecPointContainerStruct* recPointContainerPtr)
82 fRecPointContainerPtr = recPointContainerPtr;
83 fRecPointContainerPtr->fNRecPoints = 0;
87 AliHLTPHOSClusterizer::SetRecoParameters(AliPHOSRecoParam* params)
89 //see header file for documentation
90 #ifndef HAVE_NOT_PHOSRECOPARAMEMC // set from configure if EMC functionality not available in AliPHOSRecoParam
91 // the new AliPHOSRecoParam functions, available from revision
92 fEmcClusteringThreshold = params->GetEMCClusteringThreshold();
93 fEmcMinEnergyThreshold = params->GetEMCMinE();
94 fLogWeight = params->GetEMCLogWeight();
96 fEmcClusteringThreshold = params->GetClusteringThreshold();
97 fEmcMinEnergyThreshold = params->GetMinE();
98 fLogWeight = params->GetLogWeight();
103 AliHLTPHOSClusterizer::SetOfflineMode(AliPHOSLoader* getter)
105 //see header file for documentation
106 fRecPointContainerPtr = new AliHLTPHOSRecPointContainerStruct();
107 fDigitContainerPtr = new AliHLTPHOSDigitContainerDataStruct();
109 fDigitArrayPtr = fGetterPtr->Digits();
110 fEmcRecPointsPtr = fGetterPtr->EmcRecPoints();
115 AliHLTPHOSClusterizer::GetEvent(Int_t i)
117 //see header file for documentation
120 // fGetterPtr->Event(i, "D");
121 fGetterPtr->GetEvent();
122 for(Int_t j = 0; j < fDigitArrayPtr->GetEntries(); j++)
124 fDigitPtr = (AliPHOSDigit*)fDigitArrayPtr->At(j);
125 fPHOSGeometry->AbsToRelNumbering(fDigitPtr->GetId(), coord);
126 fDigitContainerPtr->fDigitDataStruct[j].fX = coord[3];
127 fDigitContainerPtr->fDigitDataStruct[j].fZ = coord[2];
128 fDigitContainerPtr->fDigitDataStruct[j].fModule = coord[0];
129 fDigitContainerPtr->fDigitDataStruct[j].fEnergy = fDigitPtr->GetEnergy();
130 fDigitContainerPtr->fDigitDataStruct[j].fTime = fDigitPtr->GetTime();
132 fDigitContainerPtr->fNDigits = fDigitArrayPtr->GetEntriesFast();
137 AliHLTPHOSClusterizer::GetNEvents()
139 //see header file for documentation
142 // Logging(kHLTLogWarning, __FILE__ , "information not available" , "GetNEvents() Number of events not available in online mod");
145 return fGetterPtr->MaxEvent();
150 AliHLTPHOSClusterizer::ClusterizeEvent()
152 //see header file for documentation
153 Int_t nRecPoints = 0;
156 AliHLTPHOSRecPointDataStruct *recPoint = 0;
158 //Clusterization starts
159 for(i = 0; i < fDigitContainerPtr->fNDigits; i++)
162 fDigitsInCluster = 0;
163 if(fDigitContainerPtr->fDigitDataStruct[i].fEnergy < fEmcClusteringThreshold)
167 recPoint = &(fRecPointContainerPtr->fRecPointArray[nRecPoints]);
170 recPoint->fModule = fDigitContainerPtr->fDigitDataStruct[i].fModule;
173 recPoint->fDigitsList[fDigitsInCluster] = fDigitContainerPtr->fDigitDataStruct[i];
174 recPoint->fAmp += fDigitContainerPtr->fDigitDataStruct[i].fEnergy;
175 fDigitContainerPtr->fDigitDataStruct[i].fEnergy = 0;
178 ScanForNeighbourDigits(i, recPoint);
180 recPoint->fMultiplicity = fDigitsInCluster;
182 }//end of clusterization
183 fRecPointContainerPtr->fNRecPoints = nRecPoints;
189 AliHLTPHOSClusterizer::ScanForNeighbourDigits(Int_t index, AliHLTPHOSRecPointDataStruct* recPoint)
192 //see header file for documentation
194 for(UInt_t j = 0; j < fDigitContainerPtr->fNDigits; j++)
196 if(fDigitContainerPtr->fDigitDataStruct[j].fEnergy > fEmcMinEnergyThreshold)
198 switch(AreNeighbours(&(fDigitContainerPtr->fDigitDataStruct[index]),
199 &(fDigitContainerPtr->fDigitDataStruct[j])))
204 recPoint->fDigitsList[fDigitsInCluster] = fDigitContainerPtr->fDigitDataStruct[j];
205 recPoint->fAmp += fDigitContainerPtr->fDigitDataStruct[j].fEnergy;
206 fDigitContainerPtr->fDigitDataStruct[j].fEnergy = 0;
208 ScanForNeighbourDigits(j, recPoint);
220 AliHLTPHOSClusterizer::AreNeighbours(AliHLTPHOSDigitDataStruct* digit1,
221 AliHLTPHOSDigitDataStruct* digit2)
223 //see header file for documentation
225 if ( (digit1->fModule == digit2->fModule) /*&& (coord1[1]==coord2[1])*/ ) // inside the same PHOS module
227 Int_t rowdiff = TMath::Abs( digit1->fZ - digit2->fZ );
228 Int_t coldiff = TMath::Abs( digit1->fX - digit2->fX );
230 if (( coldiff <= 1 ) && ( rowdiff <= 1 ))
232 if(TMath::Abs(digit1->fTime - digit2->fTime ) < fEmcTimeGate)
242 AliHLTPHOSClusterizer::CalculateCenterOfGravity()
244 //see header file for documentation
251 AliHLTPHOSRecPointDataStruct *recPoint = 0;
252 AliHLTPHOSDigitDataStruct *digit = 0;
254 UInt_t iRecPoint = 0;
256 for(iRecPoint=0; iRecPoint<fRecPointContainerPtr->fNRecPoints; iRecPoint++)
258 recPoint = &(fRecPointContainerPtr->fRecPointArray[iRecPoint]);
259 for(iDigit = 0; iDigit < recPoint->fMultiplicity; iDigit++)
261 digit = &(recPoint->fDigitsList[iDigit]);
263 //fPHOSGeometry->AbsToRelNumbering(digit->fID, relid) ;
264 // fPHOSGeometry->RelPosInModule(relid, xi, zi);
268 if (recPoint->fAmp > 0 && digit->fEnergy > 0)
270 Float_t w = TMath::Max( 0., fLogWeight + TMath::Log( digit->fEnergy / recPoint->fAmp ) ) ;
279 recPoint->fX = x/wtot ;
280 recPoint->fZ = z/wtot ;