X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOSEmcRecPoint.cxx;h=efca0fc5bbca6947b6ffa3cf0ecdb824ee48b90c;hb=8258c022ad4ec6fc3246df7051ebbf83f88183a2;hp=63604ad2dfb8efc6a1effff3c2e1ea53af72a99a;hpb=308fb9420c99d1c7c0fe86ac797c537ff337fff7;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOSEmcRecPoint.cxx b/PHOS/AliPHOSEmcRecPoint.cxx index 63604ad2dfb..efca0fc5bbc 100644 --- a/PHOS/AliPHOSEmcRecPoint.cxx +++ b/PHOS/AliPHOSEmcRecPoint.cxx @@ -32,23 +32,13 @@ * * Revision 1.55 2007/01/19 20:31:19 kharlov * Improved formatting for Print() - * - * Revision 1.54 2006/08/28 10:01:56 kharlov - * Effective C++ warnings fixed (Timur Pocheptsov) - * - * Revision 1.53 2005/12/20 14:28:47 hristov - * Additional protection - * - * Revision 1.52 2005/05/28 14:19:04 schutz - * Compilation warnings fixed by T.P. - * */ //_________________________________________________________________________ // RecPoint implementation for PHOS-EMC // An EmcRecPoint is a cluster of digits -//*-- -//*-- Author: Dmitri Peressounko (RRC KI & SUBATECH) +//-- +//-- Author: Dmitri Peressounko (RRC KI & SUBATECH) // --- ROOT system --- @@ -66,9 +56,13 @@ #include "AliPHOSGeometry.h" #include "AliPHOSDigit.h" #include "AliPHOSEmcRecPoint.h" +#include "AliPHOSReconstructor.h" ClassImp(AliPHOSEmcRecPoint) +Long64_t AliPHOSEmcRecPoint::fgInstCount=0; + + //____________________________________________________________________________ AliPHOSEmcRecPoint::AliPHOSEmcRecPoint() : AliPHOSRecPoint(), @@ -76,11 +70,17 @@ AliPHOSEmcRecPoint::AliPHOSEmcRecPoint() : fEnergyList(0), fTime(-1.), fNExMax(0), fM2x(0.), fM2z(0.), fM3x(0.), fM4z(0.), fPhixe(0.), fDistToBadCrystal(-1),fDebug(0) + ,fInstCount(0) { // ctor fMulDigit = 0 ; fAmp = 0. ; fLocPos.SetX(1000000.) ; //Local position should be evaluated + + fLambda[0] = 0.; + fLambda[1] = 0.; + fInstCount=fgInstCount++; + if (gDebug==-10) AliInfo(Form("0Create instance %lld",fInstCount)); } //____________________________________________________________________________ @@ -90,11 +90,17 @@ AliPHOSEmcRecPoint::AliPHOSEmcRecPoint(const char * opt) : fEnergyList(0), fTime(-1.), fNExMax(0), fM2x(0.), fM2z(0.), fM3x(0.), fM4z(0.), fPhixe(0.), fDistToBadCrystal(-1), fDebug(0) + ,fInstCount(0) { // ctor fMulDigit = 0 ; fAmp = 0. ; fLocPos.SetX(1000000.) ; //Local position should be evaluated + + fLambda[0] = 0.; + fLambda[1] = 0.; + fInstCount=fgInstCount++; + if (gDebug==-10) AliInfo(Form("1Create instance %lld",fInstCount)); } //____________________________________________________________________________ @@ -104,13 +110,20 @@ AliPHOSEmcRecPoint::AliPHOSEmcRecPoint(const AliPHOSEmcRecPoint & rp) : fEnergyList(0), fTime(rp.fTime), fNExMax(rp.fNExMax), fM2x(rp.fM2x), fM2z(rp.fM2z), fM3x(rp.fM3x), fM4z(rp.fM4z), fPhixe(rp.fPhixe), fDistToBadCrystal(rp.fDistToBadCrystal), fDebug(rp.fDebug) + ,fInstCount(0) { // cpy ctor fMulDigit = rp.fMulDigit ; fAmp = rp.fAmp ; if (rp.fMulDigit>0) fEnergyList = new Float_t[rp.fMulDigit] ; for(Int_t index = 0 ; index < fMulDigit ; index++) - fEnergyList[index] = rp.fEnergyList[index] ; + fEnergyList[index] = rp.fEnergyList[index] ; + + for(Int_t i=0; i<2; i++) { + fLambda[i] = rp.fLambda[i]; + } + fInstCount=fgInstCount++; + if (gDebug==-10) AliInfo(Form("2Create instance %lld",fInstCount)); } //____________________________________________________________________________ @@ -119,10 +132,13 @@ AliPHOSEmcRecPoint::~AliPHOSEmcRecPoint() // dtor if ( fEnergyList ) delete[] fEnergyList ; + if (gDebug==-10) AliInfo(Form("Delete instance %lld (%lld)",fInstCount, fgInstCount)); + if (fInstCount>=fgInstCount-1) fgInstCount--; + } //____________________________________________________________________________ -void AliPHOSEmcRecPoint::AddDigit(AliPHOSDigit & digit, Float_t Energy) +void AliPHOSEmcRecPoint::AddDigit(AliPHOSDigit & digit, Float_t Energy, Float_t time) { // Adds a digit to the RecPoint // and accumulates the total amplitude and the multiplicity @@ -156,11 +172,24 @@ void AliPHOSEmcRecPoint::AddDigit(AliPHOSDigit & digit, Float_t Energy) delete [] tempoE ; } // if + //time + Bool_t isMax=kTRUE ; + for(Int_t index = 0 ; index < fMulDigit ; index++ ){ + if(fEnergyList[index]>Energy){ + isMax=kFALSE ; + break ; + } + } + if(isMax){ + fTime=time ; + } + //Alternative time calculation - still to be validated + // fTime = (fTime*fAmp + time*Energy)/(fAmp+Energy) ; + fDigitsList[fMulDigit] = digit.GetIndexInList() ; fEnergyList[fMulDigit] = Energy ; fMulDigit++ ; fAmp += Energy ; - EvalPHOSMod(&digit) ; } @@ -258,15 +287,15 @@ void AliPHOSEmcRecPoint::ExecuteEvent(Int_t event, Int_t, Int_t) /*const*/ AliError(Form("Cannot find Run Loader in Default Event Folder")); return; } - AliPHOSLoader* gime = dynamic_cast(rn->GetLoader("PHOSLoader")); - if (gime == 0x0) + AliPHOSLoader* phosLoader = dynamic_cast(rn->GetLoader("PHOSLoader")); + if (phosLoader == 0x0) { AliError(Form("Cannot find PHOS Loader from Run Loader")); return; } - const TClonesArray * digits = gime->Digits() ; + const TClonesArray * digits = phosLoader->Digits() ; switch (event) { @@ -309,7 +338,7 @@ void AliPHOSEmcRecPoint::ExecuteEvent(Int_t event, Int_t, Int_t) /*const*/ // 2. gets the histogram title Text_t title[100] ; - sprintf(title,"Energy=%1.2f GeV ; Digits ; %d ", GetEnergy(), GetDigitsMultiplicity()) ; + snprintf(title,100,"Energy=%1.2f GeV ; Digits ; %d ", GetEnergy(), GetDigitsMultiplicity()) ; if (!histo) { delete histo ; @@ -430,7 +459,7 @@ void AliPHOSEmcRecPoint::EvalDispersion(Float_t logWeight,TClonesArray * digits } //______________________________________________________________________________ -void AliPHOSEmcRecPoint::EvalCoreEnergy(Float_t logWeight, TClonesArray * digits) +void AliPHOSEmcRecPoint::EvalCoreEnergy(Float_t logWeight, Float_t coreRadius, TClonesArray * digits) { // This function calculates energy in the core, // i.e. within a radius rad = 3cm around the center. Beyond this radius @@ -438,8 +467,6 @@ void AliPHOSEmcRecPoint::EvalCoreEnergy(Float_t logWeight, TClonesArray * digits // should be less than 2% //DP: non-perpendicular incidence?????????????? - Float_t coreRadius = 3 ; - Float_t x = 0 ; Float_t z = 0 ; @@ -541,8 +568,7 @@ void AliPHOSEmcRecPoint::EvalElipsAxis(Float_t logWeight,TClonesArray * digits, // //Apply correction due to non-perpendicular incidence // Double_t CosX ; // Double_t CosZ ; -// AliPHOSGetter * gime = AliPHOSGetter::Instance() ; -// AliPHOSGeometry * phosgeom = (AliPHOSGeometry*)gime->PHOSGeometry(); +// AliPHOSGeometry * phosgeom = AliPHOSGeometry::GetInstance() ; // Double_t DistanceToIP= (Double_t ) phosgeom->GetIPtoCrystalSurface() ; // CosX = DistanceToIP/TMath::Sqrt(DistanceToIP*DistanceToIP+x*x) ; @@ -728,10 +754,12 @@ void AliPHOSEmcRecPoint::EvalPrimaries(TClonesArray * digits) Float_t emax=0.; Int_t imaxDigit=0; for(Int_t id=0; id(digits->At( fDigitsList[imaxDigit] )) ; + digit = static_cast(digits->At( fDigitsList[imaxDigit] )) ; Int_t nprimaries = digit->GetNprimary() ; if ( nprimaries > fMaxTrack ) { fMulTrack = - 1 ; @@ -746,7 +774,7 @@ void AliPHOSEmcRecPoint::EvalPrimaries(TClonesArray * digits) for (Int_t index = 0 ; index < GetDigitsMultiplicity() ; index++ ) { // all digits if(index==imaxDigit) //already in continue ; - digit = dynamic_cast(digits->At( fDigitsList[index] )) ; + digit = static_cast(digits->At( fDigitsList[index] )) ; nprimaries = digit->GetNprimary() ; for(Int_t ipr=0; iprGetPrimary(ipr+1) ; @@ -772,17 +800,18 @@ void AliPHOSEmcRecPoint::EvalPrimaries(TClonesArray * digits) if(fTracksList)delete [] fTracksList; fTracksList = new Int_t[fMulTrack] ; } - for(Int_t index = 0; index < fMulTrack; index++) + for(Int_t index = 0; index < fMulTrack; index++){ fTracksList[index] = tempo[index] ; + } delete [] tempo ; } //____________________________________________________________________________ -void AliPHOSEmcRecPoint::EvalAll(Float_t logWeight, TClonesArray * digits ) +void AliPHOSEmcRecPoint::EvalAll(TClonesArray * digits ) { - EvalCoreEnergy(logWeight, digits); +// EvalCoreEnergy(logWeight, digits); EvalTime(digits) ; EvalPrimaries(digits) ; AliPHOSRecPoint::EvalAll(digits) ; @@ -856,7 +885,6 @@ void AliPHOSEmcRecPoint::EvalLocalPosition(Float_t logWeight, TVector3 &vtx, TCl fLocPos.SetY(0.) ; fLocPos.SetZ(z - depthz) ; - fLocPosM = 0 ; } //____________________________________________________________________________ @@ -948,10 +976,12 @@ Int_t AliPHOSEmcRecPoint::GetNumberOfLocalMax( AliPHOSDigit ** maxAt, Float_t return iDigitN ; } //____________________________________________________________________________ -void AliPHOSEmcRecPoint::EvalTime(TClonesArray * digits) +void AliPHOSEmcRecPoint::EvalTime(TClonesArray * /*digits*/) { // Define a rec.point time as a time in the cell with the maximum energy + //Time already evaluated during AddDigit() +/* Float_t maxE = 0; Int_t maxAt = 0; for(Int_t idig=0; idig < fMulDigit; idig++){ @@ -961,14 +991,14 @@ void AliPHOSEmcRecPoint::EvalTime(TClonesArray * digits) } } fTime = ((AliPHOSDigit*) digits->At(fDigitsList[maxAt]))->GetTime() ; - +*/ } //____________________________________________________________________________ -void AliPHOSEmcRecPoint::Purify(Float_t threshold){ +void AliPHOSEmcRecPoint::Purify(Float_t threshold, const TClonesArray * digits){ //Removes digits below threshold - Int_t * tempo = new Int_t[fMaxDigit]; - Float_t * tempoE = new Float_t[fMaxDigit]; + Int_t tempo[fMaxDigit]; + Float_t tempoE[fMaxDigit]; Int_t mult = 0 ; for(Int_t iDigit=0;iDigit< fMulDigit ;iDigit++){ @@ -978,8 +1008,43 @@ void AliPHOSEmcRecPoint::Purify(Float_t threshold){ mult++ ; } } - - fMulDigit = mult ; + + if(mult==0){ //too soft cluster + fMulDigit =0 ; + fAmp = 0.; //Recalculate total energy + } + + //Remove non-connected cells + Int_t index[mult] ; + Bool_t used[mult] ; + for(Int_t i=0; i0) + used[index[0]]=kTRUE ; //mark as used + for(Int_t i=0; iAt(tempo[index[i]]) ; + for(Int_t iDigit=0 ;iDigitAt(tempo[iDigit]) ; + if(AreNeighbours(digit,digitN)){ + index[inClu]= iDigit ; + inClu++ ; + used[iDigit]=kTRUE ; + } + } + } + + fMulDigit = inClu ; delete [] fDigitsList ; delete [] fEnergyList ; fDigitsList = new Int_t[fMulDigit]; @@ -987,14 +1052,10 @@ void AliPHOSEmcRecPoint::Purify(Float_t threshold){ fAmp = 0.; //Recalculate total energy for(Int_t iDigit=0;iDigit< fMulDigit ;iDigit++){ - fDigitsList[iDigit] = tempo[iDigit]; - fEnergyList[iDigit] = tempoE[iDigit] ; - fAmp+=tempoE[iDigit]; - } - - delete [] tempo ; - delete [] tempoE ; - + fDigitsList[iDigit] = tempo[index[iDigit]]; + fEnergyList[iDigit] = tempoE[index[iDigit]] ; + fAmp+=tempoE[index[iDigit]]; + } } //____________________________________________________________________________ void AliPHOSEmcRecPoint::Print(Option_t *) const