X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOSEmcRecPoint.cxx;h=18742f87408f3a8d5d4386e358f51d98344f2041;hb=cce428fe6452d8c2f30fed360e52744a442ce008;hp=df8047056ea31f32670eb6eab24a250172bcd42f;hpb=9286201303faf22df30f835f6aa39b6517513db8;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOSEmcRecPoint.cxx b/PHOS/AliPHOSEmcRecPoint.cxx index df8047056ea..18742f87408 100644 --- a/PHOS/AliPHOSEmcRecPoint.cxx +++ b/PHOS/AliPHOSEmcRecPoint.cxx @@ -13,10 +13,14 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ +/* $Id$ */ + //_________________________________________________________________________ -// Rec Point in the PHOS EM calorimeter -//*-- Author : Dmitri Peressounko RRC KI -////////////////////////////////////////////////////////////////////////////// +// RecPoint implementation for PHOS-EMC +// An EmcRecPoint is a cluster of digits +// +//*-- Author: Dmitri Peressounko (RRC KI & SUBATECH) + // --- ROOT system --- #include "TPad.h" @@ -26,13 +30,14 @@ // --- Standard library --- -#include +#include // --- AliRoot header files --- #include "AliPHOSGeometry.h" #include "AliPHOSEmcRecPoint.h" #include "AliRun.h" +#include "AliPHOSIndexToObject.h" ClassImp(AliPHOSEmcRecPoint) @@ -50,33 +55,35 @@ AliPHOSEmcRecPoint::AliPHOSEmcRecPoint(Float_t W0, Float_t LocMaxCut) fW0 = W0 ; fLocMaxCut = LocMaxCut ; fLocPos.SetX(1000000.) ; //Local position should be evaluated + } //____________________________________________________________________________ -AliPHOSEmcRecPoint::~AliPHOSEmcRecPoint() +AliPHOSEmcRecPoint::~AliPHOSEmcRecPoint() { - // dtor + if ( fEnergyList ) + delete[] fEnergyList ; } //____________________________________________________________________________ -void AliPHOSEmcRecPoint::AddDigit(AliDigitNew & digit, Float_t Energy) +void AliPHOSEmcRecPoint::AddDigit(AliPHOSDigit & digit, Float_t Energy) { - // adds a digit to the digits list - // and accumulates the total amplitude and the multiplicity + // Adds a digit to the RecPoint + // and accumulates the total amplitude and the multiplicity if ( fMulDigit >= fMaxDigit ) { // increase the size of the lists fMaxDigit*=2 ; - int * tempo = new ( int[fMaxDigit] ) ; + Int_t * tempo = new ( Int_t[fMaxDigit] ) ; Float_t * tempoE = new ( Float_t[fMaxDigit] ) ; Int_t index ; for ( index = 0 ; index < fMulDigit ; index++ ){ - tempo[index] = fDigitsList[index] ; + tempo[index] = fDigitsList[index] ; tempoE[index] = fEnergyList[index] ; } delete [] fDigitsList ; - fDigitsList = new ( int[fMaxDigit] ) ; + fDigitsList = new ( Int_t[fMaxDigit] ) ; delete [] fEnergyList ; fEnergyList = new ( Float_t[fMaxDigit] ) ; @@ -90,14 +97,16 @@ void AliPHOSEmcRecPoint::AddDigit(AliDigitNew & digit, Float_t Energy) delete [] tempoE ; } // if - fDigitsList[fMulDigit] = (int) &digit ; - fEnergyList[fMulDigit++] = Energy ; + fDigitsList[fMulDigit] = digit.GetIndexInList() ; + fEnergyList[fMulDigit] = Energy ; + fMulDigit++ ; fAmp += Energy ; } //____________________________________________________________________________ Bool_t AliPHOSEmcRecPoint::AreNeighbours(AliPHOSDigit * digit1, AliPHOSDigit * digit2 ) { + // Tells if (true) or not (false) two digits are neighbors) Bool_t aren = kFALSE ; @@ -120,6 +129,8 @@ Bool_t AliPHOSEmcRecPoint::AreNeighbours(AliPHOSDigit * digit1, AliPHOSDigit * d //____________________________________________________________________________ Int_t AliPHOSEmcRecPoint::Compare(TObject * obj) { + // Compares two RecPoints according to their position in the PHOS modules + Int_t rv ; AliPHOSEmcRecPoint * clu = (AliPHOSEmcRecPoint *)obj ; @@ -158,7 +169,7 @@ Int_t AliPHOSEmcRecPoint::Compare(TObject * obj) //______________________________________________________________________________ void AliPHOSEmcRecPoint::ExecuteEvent(Int_t event, Int_t px, Int_t py) { - //Execute action corresponding to one event + // Execute action corresponding to one event // This member function is called when a AliPHOSRecPoint is clicked with the locator // // If Left button is clicked on AliPHOSRecPoint, the digits are switched on @@ -167,91 +178,98 @@ void AliPHOSEmcRecPoint::ExecuteEvent(Int_t event, Int_t px, Int_t py) // static Int_t pxold, pyold; - static TGraph * digitgraph = 0 ; - - if (!gPad->IsEditable()) return; - - TH2F * histo = 0 ; - TCanvas * histocanvas ; - - switch (event) { - - case kButton1Down: { - AliPHOSDigit * digit ; - AliPHOSGeometry * phosgeom = (AliPHOSGeometry *) fGeom ; - Int_t iDigit; - Int_t relid[4] ; - Float_t xi[fMulDigit] ; - Float_t zi[fMulDigit] ; - - // create the histogram for the single cluster - // 1. gets histogram boundaries - Float_t ximax = -999. ; - Float_t zimax = -999. ; - Float_t ximin = 999. ; - Float_t zimin = 999. ; - - for(iDigit=0; iDigitAbsToRelNumbering(digit->GetId(), relid) ; - phosgeom->RelPosInModule(relid, xi[iDigit], zi[iDigit]); - if ( xi[iDigit] > ximax ) - ximax = xi[iDigit] ; - if ( xi[iDigit] < ximin ) - ximin = xi[iDigit] ; - if ( zi[iDigit] > zimax ) - zimax = zi[iDigit] ; - if ( zi[iDigit] < zimin ) - zimin = zi[iDigit] ; - } - ximax += phosgeom->GetCrystalSize(0) / 2. ; - zimax += phosgeom->GetCrystalSize(2) / 2. ; - ximin -= phosgeom->GetCrystalSize(0) / 2. ; - zimin -= phosgeom->GetCrystalSize(2) / 2. ; - Int_t xdim = (int)( (ximax - ximin ) / phosgeom->GetCrystalSize(0) + 0.5 ) ; - Int_t zdim = (int)( (zimax - zimin ) / phosgeom->GetCrystalSize(2) + 0.5 ) ; - - // 2. gets the histogram title - - Text_t title[100] ; - sprintf(title,"Energy=%1.2f GeV ; Digits ; %d ", GetEnergy(), GetDigitsMultiplicity()) ; + AliPHOSIndexToObject * please = AliPHOSIndexToObject::GetInstance() ; - if (!histo) { - delete histo ; - histo = 0 ; - } - histo = new TH2F("cluster3D", title, xdim, ximin, ximax, zdim, zimin, zimax) ; - - Float_t x, z ; - for(iDigit=0; iDigitAbsToRelNumbering(digit->GetId(), relid) ; - phosgeom->RelPosInModule(relid, x, z); - histo->Fill(x, z, fEnergyList[iDigit] ) ; - } - - if (!digitgraph) { - digitgraph = new TGraph(fMulDigit,xi,zi); - digitgraph-> SetMarkerStyle(5) ; - digitgraph-> SetMarkerSize(1.) ; - digitgraph-> SetMarkerColor(1) ; - digitgraph-> Paint("P") ; - } - - Print() ; - histocanvas = new TCanvas("cluser", "a single cluster", 600, 500) ; - histocanvas->Draw() ; - histo->Draw("lego1") ; - - break; - } - - case kButton1Up: - if (digitgraph) { - delete digitgraph ; - digitgraph = 0 ; - } - break; + static TGraph * digitgraph = 0 ; + + if (!gPad->IsEditable()) return; + + TH2F * histo = 0 ; + TCanvas * histocanvas ; + + switch (event) { + + case kButton1Down: { + AliPHOSDigit * digit ; + AliPHOSGeometry * phosgeom = (AliPHOSGeometry *) fGeom ; + Int_t iDigit; + Int_t relid[4] ; + + const Int_t fMulDigit = AliPHOSEmcRecPoint::GetDigitsMultiplicity() ; + Float_t * xi = new Float_t[fMulDigit] ; + Float_t * zi = new Float_t[fMulDigit] ; + + // create the histogram for the single cluster + // 1. gets histogram boundaries + Float_t ximax = -999. ; + Float_t zimax = -999. ; + Float_t ximin = 999. ; + Float_t zimin = 999. ; + + for(iDigit=0; iDigitGimeDigit(fDigitsList[iDigit]) ) ; + phosgeom->AbsToRelNumbering(digit->GetId(), relid) ; + phosgeom->RelPosInModule(relid, xi[iDigit], zi[iDigit]); + if ( xi[iDigit] > ximax ) + ximax = xi[iDigit] ; + if ( xi[iDigit] < ximin ) + ximin = xi[iDigit] ; + if ( zi[iDigit] > zimax ) + zimax = zi[iDigit] ; + if ( zi[iDigit] < zimin ) + zimin = zi[iDigit] ; + } + ximax += phosgeom->GetCrystalSize(0) / 2. ; + zimax += phosgeom->GetCrystalSize(2) / 2. ; + ximin -= phosgeom->GetCrystalSize(0) / 2. ; + zimin -= phosgeom->GetCrystalSize(2) / 2. ; + Int_t xdim = (int)( (ximax - ximin ) / phosgeom->GetCrystalSize(0) + 0.5 ) ; + Int_t zdim = (int)( (zimax - zimin ) / phosgeom->GetCrystalSize(2) + 0.5 ) ; + + // 2. gets the histogram title + + Text_t title[100] ; + sprintf(title,"Energy=%1.2f GeV ; Digits ; %d ", GetEnergy(), GetDigitsMultiplicity()) ; + + if (!histo) { + delete histo ; + histo = 0 ; + } + histo = new TH2F("cluster3D", title, xdim, ximin, ximax, zdim, zimin, zimax) ; + + Float_t x, z ; + for(iDigit=0; iDigitGimeDigit(fDigitsList[iDigit]) ) ; + phosgeom->AbsToRelNumbering(digit->GetId(), relid) ; + phosgeom->RelPosInModule(relid, x, z); + histo->Fill(x, z, fEnergyList[iDigit] ) ; + } + + if (!digitgraph) { + digitgraph = new TGraph(fMulDigit,xi,zi); + digitgraph-> SetMarkerStyle(5) ; + digitgraph-> SetMarkerSize(1.) ; + digitgraph-> SetMarkerColor(1) ; + digitgraph-> Paint("P") ; + } + + Print() ; + histocanvas = new TCanvas("cluser", "a single cluster", 600, 500) ; + histocanvas->Draw() ; + histo->Draw("lego1") ; + + delete[] xi ; + delete[] zi ; + + break; + } + + case kButton1Up: + if (digitgraph) { + delete digitgraph ; + digitgraph = 0 ; + } + break; } } @@ -259,6 +277,10 @@ void AliPHOSEmcRecPoint::ExecuteEvent(Int_t event, Int_t px, Int_t py) //____________________________________________________________________________ Float_t AliPHOSEmcRecPoint::GetDispersion() { + // Calculates the dispersion of the shower at the origine of the RecPoint + + AliPHOSIndexToObject * please = AliPHOSIndexToObject::GetInstance() ; + Float_t d = 0 ; Float_t wtot = 0 ; @@ -266,14 +288,13 @@ Float_t AliPHOSEmcRecPoint::GetDispersion() GetLocalPosition(locpos); Float_t x = locpos.X() ; Float_t z = locpos.Z() ; - // Int_t i = GetPHOSMod() ; AliPHOSDigit * digit ; AliPHOSGeometry * phosgeom = (AliPHOSGeometry *) fGeom ; Int_t iDigit; for(iDigit=0; iDigitGimeDigit(fDigitsList[iDigit]) ) ; Int_t relid[4] ; Float_t xi ; Float_t zi ; @@ -292,6 +313,10 @@ Float_t AliPHOSEmcRecPoint::GetDispersion() //____________________________________________________________________________ void AliPHOSEmcRecPoint::GetElipsAxis(Float_t * lambda) { + // Calculates the axis of the shower ellipsoid + + AliPHOSIndexToObject * please = AliPHOSIndexToObject::GetInstance() ; + Float_t wtot = 0. ; Float_t x = 0.; Float_t z = 0.; @@ -304,7 +329,7 @@ void AliPHOSEmcRecPoint::GetElipsAxis(Float_t * lambda) Int_t iDigit; for(iDigit=0; iDigitGimeDigit(fDigitsList[iDigit]) ) ; Int_t relid[4] ; Float_t xi ; Float_t zi ; @@ -332,9 +357,60 @@ void AliPHOSEmcRecPoint::GetElipsAxis(Float_t * lambda) lambda[1] = TMath::Sqrt( 0.5 * (dxx + dzz) - TMath::Sqrt( 0.25 * (dxx - dzz) * (dxx - dzz) + dxz * dxz ) ) ; } +//____________________________________________________________________________ +void AliPHOSEmcRecPoint::GetLocalPosition(TVector3 &LPos) +{ + // Calculates the center of gravity in the local PHOS-module coordinates + + AliPHOSIndexToObject * please = AliPHOSIndexToObject::GetInstance() ; + + if( fLocPos.X() < 1000000.) { // already evaluated + LPos = fLocPos ; + return ; + } + + Float_t wtot = 0. ; + + Int_t relid[4] ; + + Float_t x = 0. ; + Float_t z = 0. ; + + AliPHOSDigit * digit ; + + AliPHOSGeometry * phosgeom = (AliPHOSGeometry *) fGeom ; + + Int_t iDigit; + + + for(iDigit=0; iDigitGimeDigit(fDigitsList[iDigit]) ); + + Float_t xi ; + Float_t zi ; + phosgeom->AbsToRelNumbering(digit->GetId(), relid) ; + phosgeom->RelPosInModule(relid, xi, zi); + Float_t w = TMath::Max( 0., fW0 + TMath::Log( fEnergyList[iDigit] / fAmp ) ) ; + x += xi * w ; + z += zi * w ; + wtot += w ; + + } + + x /= wtot ; + z /= wtot ; + fLocPos.SetX(x) ; + fLocPos.SetY(0.) ; + fLocPos.SetZ(z) ; + + LPos = fLocPos ; +} + //____________________________________________________________________________ Float_t AliPHOSEmcRecPoint::GetMaximalEnergy(void) { + // Finds the maximum energy in the cluster + Float_t menergy = 0. ; Int_t iDigit; @@ -348,8 +424,10 @@ Float_t AliPHOSEmcRecPoint::GetMaximalEnergy(void) } //____________________________________________________________________________ -Int_t AliPHOSEmcRecPoint::GetMultiplicityAtLevel(Float_t H) +Int_t AliPHOSEmcRecPoint::GetMultiplicityAtLevel(const Float_t H) { + // Calculates the multiplicity of digits with energy larger than H*energy + Int_t multipl = 0 ; Int_t iDigit ; for(iDigit=0; iDigitGimeDigit(fDigitsList[iDigit]) ) ; } for(iDigit = 0 ; iDigit < fMulDigit; iDigit++) { if(maxAt[iDigit] != -1) { digit = (AliPHOSDigit *) maxAt[iDigit] ; - + for(iDigitN = 0; iDigitN < fMulDigit; iDigitN++) { - digitN = (AliPHOSDigit *) fDigitsList[iDigitN] ; + digitN = (AliPHOSDigit *) ( please->GimeDigit(fDigitsList[iDigitN]) ) ; if ( AreNeighbours(digit, digitN) ) { if (fEnergyList[iDigit] > fEnergyList[iDigitN] ) { @@ -410,50 +493,6 @@ Int_t AliPHOSEmcRecPoint::GetNumberOfLocalMax(Int_t * maxAt, Float_t * maxAtEn return iDigitN ; } -//____________________________________________________________________________ -void AliPHOSEmcRecPoint::GetLocalPosition(TVector3 &LPos) -{ - if( fLocPos.X() < 1000000.) { // already evaluated - LPos = fLocPos ; - return ; - } - - Float_t wtot = 0. ; - - Int_t relid[4] ; - - Float_t x = 0. ; - Float_t z = 0. ; - - AliPHOSDigit * digit ; - - AliPHOSGeometry * phosgeom = (AliPHOSGeometry *) fGeom ; - - Int_t iDigit; - - - for(iDigit=0; iDigitAbsToRelNumbering(digit->GetId(), relid) ; - phosgeom->RelPosInModule(relid, xi, zi); - Float_t w = TMath::Max( 0., fW0 + TMath::Log( fEnergyList[iDigit] / fAmp ) ) ; - x += xi * w ; - z += zi * w ; - wtot += w ; - - } - - x /= wtot ; - z /= wtot ; - fLocPos.SetX(x) ; - fLocPos.SetY(0.) ; - fLocPos.SetZ(z) ; - - LPos = fLocPos ; -} // //____________________________________________________________________________ // AliPHOSEmcRecPoint& AliPHOSEmcRecPoint::operator = (AliPHOSEmcRecPoint Clu) @@ -492,6 +531,8 @@ void AliPHOSEmcRecPoint::GetLocalPosition(TVector3 &LPos) //____________________________________________________________________________ void AliPHOSEmcRecPoint::Print(Option_t * option) { + // Print the list of digits belonging to the cluster + cout << "AliPHOSEmcRecPoint: " << endl ; AliPHOSDigit * digit ; @@ -501,9 +542,11 @@ void AliPHOSEmcRecPoint::Print(Option_t * option) Float_t xi ; Float_t zi ; Int_t relid[4] ; - + + AliPHOSIndexToObject * please = AliPHOSIndexToObject::GetInstance() ; + for(iDigit=0; iDigitGimeDigit( fDigitsList[iDigit] ) ; phosgeom->AbsToRelNumbering(digit->GetId(), relid) ; phosgeom->RelPosInModule(relid, xi, zi); cout << " Id = " << digit->GetId() ; @@ -514,9 +557,9 @@ void AliPHOSEmcRecPoint::Print(Option_t * option) } cout << " Multiplicity = " << fMulDigit << endl ; cout << " Cluster Energy = " << fAmp << endl ; - + cout << " Stored at position " << GetIndexInList() << endl ; + } - //______________________________________________________________________________ void AliPHOSEmcRecPoint::Streamer(TBuffer &R__b) { @@ -526,17 +569,16 @@ void AliPHOSEmcRecPoint::Streamer(TBuffer &R__b) Version_t R__v = R__b.ReadVersion(); if (R__v) { } AliPHOSRecPoint::Streamer(R__b); R__b >> fDelta; + fEnergyList = new Float_t[fMulDigit] ; + R__b.ReadFastArray(fEnergyList, fMulDigit); R__b >> fLocMaxCut; - R__b.ReadArray(fEnergyList); R__b >> fW0; } else { R__b.WriteVersion(AliPHOSEmcRecPoint::IsA()); AliPHOSRecPoint::Streamer(R__b); R__b << fDelta; + R__b.WriteFastArray(fEnergyList, fMulDigit); R__b << fLocMaxCut; - R__b.WriteArray(fEnergyList, GetMaximumDigitMultiplicity() ); R__b << fW0; } } - -