X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOSEmcRecPoint.cxx;h=a461d7ff9a2f5babddebece42931a80d1d39ee7d;hb=f9f2650dd9d592733fcbb7bae81d3e7f41608138;hp=9614579aa4d4e51324cfc40085614a86c5d9dfb8;hpb=6f766adab7b46937acc98a534bbea814aaa4347b;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOSEmcRecPoint.cxx b/PHOS/AliPHOSEmcRecPoint.cxx index 9614579aa4d..a461d7ff9a2 100644 --- a/PHOS/AliPHOSEmcRecPoint.cxx +++ b/PHOS/AliPHOSEmcRecPoint.cxx @@ -18,22 +18,27 @@ /* History of cvs commits: * * $Log$ - * Revision 1.54 2006/08/28 10:01:56 kharlov - * Effective C++ warnings fixed (Timur Pocheptsov) + * Revision 1.59 2007/10/18 15:12:22 kharlov + * Moved MakePrimary to EMCRecPoint to rpduce correct order of primaries * - * Revision 1.53 2005/12/20 14:28:47 hristov - * Additional protection + * Revision 1.58 2007/04/16 09:03:37 kharlov + * Incedent angle correction fixed * - * Revision 1.52 2005/05/28 14:19:04 schutz - * Compilation warnings fixed by T.P. + * Revision 1.57 2007/04/05 10:18:58 policheh + * Introduced distance to nearest bad crystal. * + * Revision 1.56 2007/03/06 06:47:28 kharlov + * DP:Possibility to use actual vertex position added + * + * Revision 1.55 2007/01/19 20:31:19 kharlov + * Improved formatting for Print() */ //_________________________________________________________________________ // 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 --- @@ -51,6 +56,7 @@ #include "AliPHOSGeometry.h" #include "AliPHOSDigit.h" #include "AliPHOSEmcRecPoint.h" +#include "AliPHOSReconstructor.h" ClassImp(AliPHOSEmcRecPoint) @@ -60,7 +66,7 @@ AliPHOSEmcRecPoint::AliPHOSEmcRecPoint() : fCoreEnergy(0.), fDispersion(0.), fEnergyList(0), fTime(-1.), fNExMax(0), fM2x(0.), fM2z(0.), fM3x(0.), fM4z(0.), - fPhixe(0.), fDebug(0) + fPhixe(0.), fDistToBadCrystal(-1),fDebug(0) { // ctor fMulDigit = 0 ; @@ -74,7 +80,7 @@ AliPHOSEmcRecPoint::AliPHOSEmcRecPoint(const char * opt) : fCoreEnergy(0.), fDispersion(0.), fEnergyList(0), fTime(-1.), fNExMax(0), fM2x(0.), fM2z(0.), fM3x(0.), fM4z(0.), - fPhixe(0.), fDebug(0) + fPhixe(0.), fDistToBadCrystal(-1), fDebug(0) { // ctor fMulDigit = 0 ; @@ -88,14 +94,13 @@ AliPHOSEmcRecPoint::AliPHOSEmcRecPoint(const AliPHOSEmcRecPoint & rp) : fCoreEnergy(rp.fCoreEnergy), fDispersion(rp.fDispersion), fEnergyList(0), fTime(rp.fTime), fNExMax(rp.fNExMax), fM2x(rp.fM2x), fM2z(rp.fM2z), fM3x(rp.fM3x), fM4z(rp.fM4z), - fPhixe(rp.fPhixe), fDebug(rp.fDebug) + fPhixe(rp.fPhixe), fDistToBadCrystal(rp.fDistToBadCrystal), fDebug(rp.fDebug) { // cpy ctor fMulDigit = rp.fMulDigit ; fAmp = rp.fAmp ; - fEnergyList = new Float_t[rp.fMulDigit] ; - Int_t index ; - for(index = 0 ; index < fMulDigit ; index++) + if (rp.fMulDigit>0) fEnergyList = new Float_t[rp.fMulDigit] ; + for(Int_t index = 0 ; index < fMulDigit ; index++) fEnergyList[index] = rp.fEnergyList[index] ; } @@ -244,15 +249,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) { @@ -341,10 +346,11 @@ void AliPHOSEmcRecPoint::ExecuteEvent(Int_t event, Int_t, Int_t) /*const*/ } //____________________________________________________________________________ -void AliPHOSEmcRecPoint::EvalDispersion(Float_t logWeight,TClonesArray * digits) +void AliPHOSEmcRecPoint::EvalDispersion(Float_t logWeight,TClonesArray * digits, TVector3 & /* vInc */) { // Calculates the dispersion of the shower at the origine of the RecPoint - + //DP: should we correct dispersion for non-perpendicular hit???????? + Float_t d = 0. ; Float_t wtot = 0. ; @@ -411,17 +417,17 @@ void AliPHOSEmcRecPoint::EvalDispersion(Float_t logWeight,TClonesArray * digits fDispersion = 0; if (d>=0) fDispersion = TMath::Sqrt(d) ; + } //______________________________________________________________________________ -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 // in accordance with shower profile the energy deposition // should be less than 2% - - Float_t coreRadius = 3 ; +//DP: non-perpendicular incidence?????????????? Float_t x = 0 ; Float_t z = 0 ; @@ -470,10 +476,11 @@ void AliPHOSEmcRecPoint::EvalCoreEnergy(Float_t logWeight, TClonesArray * digits fCoreEnergy += fEnergyList[iDigit] ; } + } //____________________________________________________________________________ -void AliPHOSEmcRecPoint::EvalElipsAxis(Float_t logWeight,TClonesArray * digits) +void AliPHOSEmcRecPoint::EvalElipsAxis(Float_t logWeight,TClonesArray * digits, TVector3 & /* vInc */) { // Calculates the axis of the shower ellipsoid @@ -523,9 +530,8 @@ 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(); - // Double_t DistanceToIP= (Double_t ) phosgeom->GetIPtoCrystalSurface() ; +// AliPHOSGeometry * phosgeom = AliPHOSGeometry::GetInstance() ; +// Double_t DistanceToIP= (Double_t ) phosgeom->GetIPtoCrystalSurface() ; // CosX = DistanceToIP/TMath::Sqrt(DistanceToIP*DistanceToIP+x*x) ; // CosZ = DistanceToIP/TMath::Sqrt(DistanceToIP*DistanceToIP+z*z) ; @@ -552,7 +558,7 @@ void AliPHOSEmcRecPoint::EvalElipsAxis(Float_t logWeight,TClonesArray * digits) } //____________________________________________________________________________ -void AliPHOSEmcRecPoint::EvalMoments(Float_t logWeight,TClonesArray * digits) +void AliPHOSEmcRecPoint::EvalMoments(Float_t logWeight,TClonesArray * digits, TVector3 & /* vInc */) { // Calculate the shower moments in the eigen reference system // M2x, M2z, M3x, M4z @@ -698,20 +704,89 @@ void AliPHOSEmcRecPoint::EvalMoments(Float_t logWeight,TClonesArray * digits) fPhixe = phi; } +//______________________________________________________________________________ +void AliPHOSEmcRecPoint::EvalPrimaries(TClonesArray * digits) +{ + // Constructs the list of primary particles (tracks) which have contributed to this RecPoint + + AliPHOSDigit * digit ; + Int_t * tempo = new Int_t[fMaxTrack] ; + + //First find digit with maximal energy deposition and copy its primaries + Float_t emax=0.; + Int_t imaxDigit=0; + for(Int_t id=0; id(digits->At( fDigitsList[imaxDigit] )) ; + Int_t nprimaries = digit->GetNprimary() ; + if ( nprimaries > fMaxTrack ) { + fMulTrack = - 1 ; + Error("EvalPrimaries", "GetNprimaries ERROR > increase fMaxTrack" ) ; + nprimaries = fMaxTrack; //skip the rest + } + for(fMulTrack=0; fMulTrackGetPrimary(fMulTrack+1) ; + } + + //Now add other digits contributions + for (Int_t index = 0 ; index < GetDigitsMultiplicity() ; index++ ) { // all digits + if(index==imaxDigit) //already in + continue ; + digit = dynamic_cast(digits->At( fDigitsList[index] )) ; + nprimaries = digit->GetNprimary() ; + for(Int_t ipr=0; iprGetPrimary(ipr+1) ; + Bool_t notIn=1 ; + for(Int_t kndex = 0 ; (kndex < fMulTrack)&& notIn ; kndex++ ) { //check if not already stored + if(iprimary == tempo[kndex]){ + notIn = kFALSE ; + } + } + if(notIn){ + if(fMulTrack increase fMaxTrack!!!" ) ; + break ; + } + } + } + } // all digits + if(fMulTrack > 0){ + if(fTracksList)delete [] fTracksList; + fTracksList = new Int_t[fMulTrack] ; + } + 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 ) { - // Evaluates all shower parameters - EvalLocalPosition(logWeight, digits) ; - EvalElipsAxis(logWeight, digits) ; - EvalMoments(logWeight, digits) ; - EvalDispersion(logWeight, digits) ; - EvalCoreEnergy(logWeight, digits); +// EvalCoreEnergy(logWeight, digits); EvalTime(digits) ; + EvalPrimaries(digits) ; AliPHOSRecPoint::EvalAll(digits) ; } //____________________________________________________________________________ -void AliPHOSEmcRecPoint::EvalLocalPosition(Float_t logWeight, TClonesArray * digits) +void AliPHOSEmcRecPoint::EvalAll(Float_t logWeight, TVector3 &vtx, TClonesArray * digits ) +{ + // Evaluates all shower parameters + TVector3 vInc ; + EvalLocalPosition(logWeight, vtx, digits,vInc) ; + EvalElipsAxis(logWeight, digits, vInc) ; //they are evaluated with momenta + EvalMoments(logWeight, digits, vInc) ; + EvalDispersion(logWeight, digits, vInc) ; +} +//____________________________________________________________________________ +void AliPHOSEmcRecPoint::EvalLocalPosition(Float_t logWeight, TVector3 &vtx, TClonesArray * digits, TVector3 &vInc) { // Calculates the center of gravity in the local PHOS-module coordinates Float_t wtot = 0. ; @@ -754,30 +829,13 @@ void AliPHOSEmcRecPoint::EvalLocalPosition(Float_t logWeight, TClonesArray * dig Float_t para = 0.925 ; Float_t parb = 6.52 ; - Float_t xo,yo,zo ; //Coordinates of the origin - //We should check all 3 possibilities to avoid seg.v. - if(gAlice && gAlice->GetMCApp() && gAlice->Generator()) - gAlice->Generator()->GetOrigin(xo,yo,zo) ; - else{ - xo=yo=zo=0.; - } - Float_t phi = phosgeom->GetPHOSAngle(relid[0]) ; + phosgeom->GetIncidentVector(vtx,GetPHOSMod(),x,z,vInc) ; - //Transform to the local ref.frame - Float_t xoL,yoL ; - xoL = xo*TMath::Cos(phi)-yo*TMath::Sin(phi) ; - yoL = xo*TMath::Sin(phi)+yo*TMath::Cos(phi) ; - - Float_t radius = phosgeom->GetIPtoCrystalSurface()-yoL; - - Float_t incidencephi = TMath::ATan((x-xoL ) / radius) ; - Float_t incidencetheta = TMath::ATan((z-zo) / radius) ; - Float_t depthx = 0.; Float_t depthz = 0.; - if (fAmp>0) { - depthx = ( para * TMath::Log(fAmp) + parb ) * TMath::Sin(incidencephi) ; - depthz = ( para * TMath::Log(fAmp) + parb ) * TMath::Sin(incidencetheta) ; + if (fAmp>0&&vInc.Y()!=0.) { + depthx = ( para * TMath::Log(fAmp) + parb ) * vInc.X()/TMath::Abs(vInc.Y()) ; + depthz = ( para * TMath::Log(fAmp) + parb ) * vInc.Z()/TMath::Abs(vInc.Y()) ; } else AliError(Form("Wrong amplitude %f\n", fAmp)); @@ -786,7 +844,6 @@ void AliPHOSEmcRecPoint::EvalLocalPosition(Float_t logWeight, TClonesArray * dig fLocPos.SetY(0.) ; fLocPos.SetZ(z - depthz) ; - fLocPosM = 0 ; } //____________________________________________________________________________