3 /**************************************************************************
4 * This file is property of and copyright by the ALICE HLT Project *
5 * All rights reserved. *
7 * Primary Authors: Oystein Djuvsland *
9 * Permission to use, copy, modify and distribute this software and its *
10 * documentation strictly for non-commercial purposes is hereby granted *
11 * without fee, provided that the above copyright notice appears in all *
12 * copies and that both the copyright notice and this permission notice *
13 * appear in the supporting documentation. The authors make no claims *
14 * about the suitability of this software for any purpose. It is *
15 * provided "as is" without express or implied warranty. *
16 **************************************************************************/
19 * @file AliHLTPHOSClusterAnalyser.cxx
20 * @author Oystein Djuvsland
22 * @brief Cluster analyser for PHOS HLT
25 // see header file for class documentation
27 // refer to README to build package
29 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
31 #include "AliHLTPHOSClusterAnalyser.h"
32 #include "AliHLTPHOSRecPointHeaderStruct.h"
33 #include "AliHLTPHOSRecPointDataStruct.h"
34 #include "AliHLTPHOSCaloClusterHeaderStruct.h"
35 #include "AliHLTPHOSCaloClusterDataStruct.h"
36 #include "AliHLTPHOSPhysicsAnalyzer.h"
37 #include "AliPHOSGeometry.h"
40 ClassImp(AliHLTPHOSClusterAnalyser);
42 AliHLTPHOSClusterAnalyser::AliHLTPHOSClusterAnalyser() :
47 fCaloClusterDataPtr(0),
48 fCaloClusterHeaderPtr(0),
54 fHaveDistanceToBadChannel(false)
56 //See header file for documentation
59 fAnalyzerPtr = new AliHLTPHOSPhysicsAnalyzer();
60 fPHOSGeometry = AliPHOSGeometry::GetInstance("noCPV");
63 AliHLTPHOSClusterAnalyser::~AliHLTPHOSClusterAnalyser()
68 AliHLTPHOSClusterAnalyser::SetCaloClusterDataPtr(AliHLTPHOSCaloClusterDataStruct *caloClusterDataPtr)
70 //see header file for documentation
71 fCaloClusterDataPtr = caloClusterDataPtr;
74 AliHLTPHOSClusterAnalyser::SetRecPointDataPtr(AliHLTPHOSRecPointHeaderStruct *recPointDataPtr)
76 fNRecPoints = recPointDataPtr->fNRecPoints;
77 fRecPointDataPtr = reinterpret_cast<AliHLTPHOSRecPointDataStruct*>(reinterpret_cast<Char_t*>(recPointDataPtr)+sizeof(AliHLTPHOSRecPointHeaderStruct));
81 AliHLTPHOSClusterAnalyser::CalculateCenterOfGravity()
83 //see header file for documentation
90 AliHLTPHOSDigitDataStruct *digit = 0;
91 //AliPHOSGeometry * phosgeom = AliPHOSGeometry::GetInstance() ;
93 AliHLTPHOSRecPointDataStruct *recPoint = fRecPointDataPtr;
97 for(Int_t iRecPoint=0; iRecPoint < fNRecPoints; iRecPoint++)
99 digit = &(recPoint->fDigits);
100 for(iDigit = 0; iDigit < recPoint->fMultiplicity; iDigit++)
105 //cout << "COG digits (x:z:amp:time): " << xi << " : " << zi << " : " << digit->fEnergy << " : " << digit->fTime << endl;
106 if (recPoint->fAmp > 0 && digit->fEnergy > 0)
108 Float_t w = TMath::Max( 0., fLogWeight + TMath::Log( digit->fEnergy / recPoint->fAmp ) ) ;
118 recPoint->fX = x/wtot ;
119 recPoint->fZ = z/wtot ;
125 recPoint = reinterpret_cast<AliHLTPHOSRecPointDataStruct*>(digit);
132 AliHLTPHOSClusterAnalyser::CalculateRecPointMoments()
134 //See header file for documentation
139 AliHLTPHOSClusterAnalyser::CalculateClusterMoments(AliHLTPHOSRecPointDataStruct */*recPointPtr*/, AliHLTPHOSCaloClusterDataStruct* /*clusterPtr*/)
141 //See header file for documentation
147 AliHLTPHOSClusterAnalyser::DeconvoluteClusters()
149 //See header file for documentation
154 AliHLTPHOSClusterAnalyser::CreateClusters(UInt_t availableSize, UInt_t& totSize)
156 //See header file for documentation
158 UInt_t maxClusterSize = sizeof(AliHLTPHOSCaloClusterDataStruct) + (6 << 7); //Reasonable estimate... (6 = sizeof(Short_t) + sizeof(Float_t)
160 AliHLTPHOSRecPointDataStruct* recPointPtr = fRecPointDataPtr;
161 AliHLTPHOSDigitDataStruct* digitPtr = &(recPointPtr->fDigits);
163 AliHLTPHOSCaloClusterDataStruct* caloClusterPtr = fCaloClusterDataPtr;
164 UShort_t* cellIDPtr = &(caloClusterPtr->fCellsAbsId);
165 Float_t* cellAmpFracPtr = &(caloClusterPtr->fCellsAmpFraction);
169 Float_t globalPos[3];
172 //fPHOSGeometry = AliPHOSGeometry::GetInstance("noCPV");
174 for(Int_t i = 0; i < fNRecPoints; i++) //FIXME needs fix when we start unfolding (number of clusters not necessarily same as number of recpoints gotten from the clusterizer
177 if(availableSize < (totSize + maxClusterSize))
179 return -1; //Might get out of buffer, exiting
181 localPos[0] = recPointPtr->fX;
182 localPos[1] = recPointPtr->fZ;
184 fAnalyzerPtr->GlobalPosition( localPos, globalPos, recPointPtr->fModule);
186 caloClusterPtr->fGlobalPos[0] = globalPos[0];
187 caloClusterPtr->fGlobalPos[1] = globalPos[1];
188 caloClusterPtr->fGlobalPos[2] = globalPos[2];
190 //cout << "Local Position (x:z:module): " << localPos[0] << " : "<< localPos[1] << " : " << recPointPtr->fModule << endl;
192 //cout << "Global Position (x:y:z): " << globalPos[0] << " : "<< globalPos[1] << " : " << globalPos[2] << endl << endl;
194 caloClusterPtr->fNCells = recPointPtr->fMultiplicity;
196 cellIDPtr = &(caloClusterPtr->fCellsAbsId);
197 cellAmpFracPtr = &(caloClusterPtr->fCellsAmpFraction);
199 for(UInt_t j = 0; j < caloClusterPtr->fNCells; j++)
201 // fPHOSGeometry->RelPosToAbsId((Int_t)(recPointPtr->fModule + 1), (double)(digitPtr->fX), (double)(digitPtr->fZ), id);
203 *cellAmpFracPtr = digitPtr->fEnergy/recPointPtr->fAmp;
205 cellIDPtr = reinterpret_cast<UShort_t*>(reinterpret_cast<char*>(cellAmpFracPtr) + sizeof(Float_t));
206 cellAmpFracPtr = reinterpret_cast<Float_t*>(reinterpret_cast<char*>(cellIDPtr) + sizeof(Short_t));
209 caloClusterPtr->fEnergy = recPointPtr->fAmp;
213 FitCluster(recPointPtr);
217 caloClusterPtr->fDispersion = 0;
218 caloClusterPtr->fFitQuality = 0;
219 caloClusterPtr->fM20 = 0;
220 caloClusterPtr->fM02 = 0;
221 // caloClusterPtr->fM11 = 0;
225 caloClusterPtr->fEmcCpvDistance = GetCPVDistance(recPointPtr);
229 caloClusterPtr->fEmcCpvDistance = -1;
233 DoParticleIdentification(caloClusterPtr);
237 for(Int_t k = 0; k < AliPID::kSPECIESN; k++)
239 caloClusterPtr->fPID[k] = 0;
242 if(fHaveDistanceToBadChannel)
244 caloClusterPtr->fDistanceToBadChannel = GetDistanceToBadChannel(caloClusterPtr);
248 caloClusterPtr->fDistanceToBadChannel = -1;
251 caloClusterPtr->fClusterType = '\0';
252 totSize += sizeof(AliHLTPHOSCaloClusterDataStruct) + (caloClusterPtr->fNCells)*(sizeof(Short_t) +sizeof(Float_t)-1);
254 caloClusterPtr = reinterpret_cast<AliHLTPHOSCaloClusterDataStruct*>(cellAmpFracPtr);
255 recPointPtr = reinterpret_cast<AliHLTPHOSRecPointDataStruct*>(digitPtr);
256 digitPtr = &(recPointPtr->fDigits);