X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOSEmcRecPoint.cxx;h=b9249fa04dd1825e76fc9c9d17dae4cdbb9e529e;hb=14100b904c3e536fab893dde1b01be8e721d8c67;hp=a168af92d850c50ee1bae81a7d6321f58d4e4315;hpb=f33a376448d0eff553733df3e72ef1d6c6b81420;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOSEmcRecPoint.cxx b/PHOS/AliPHOSEmcRecPoint.cxx index a168af92d85..b9249fa04dd 100644 --- a/PHOS/AliPHOSEmcRecPoint.cxx +++ b/PHOS/AliPHOSEmcRecPoint.cxx @@ -18,6 +18,24 @@ /* History of cvs commits: * * $Log$ + * Revision 1.58 2007/04/16 09:03:37 kharlov + * Incedent angle correction fixed + * + * 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() + * + * 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. * @@ -49,58 +67,54 @@ ClassImp(AliPHOSEmcRecPoint) //____________________________________________________________________________ -AliPHOSEmcRecPoint::AliPHOSEmcRecPoint() : AliPHOSRecPoint() +AliPHOSEmcRecPoint::AliPHOSEmcRecPoint() : + AliPHOSRecPoint(), + fCoreEnergy(0.), fDispersion(0.), + fEnergyList(0), fTime(-1.), fNExMax(0), + fM2x(0.), fM2z(0.), fM3x(0.), fM4z(0.), + fPhixe(0.), fDistToBadCrystal(-1),fDebug(0) { // ctor - fMulDigit = 0 ; fAmp = 0. ; - fCoreEnergy = 0 ; - fEnergyList = 0 ; - fNExMax = 0 ; //Not unfolded yet - fTime = -1. ; fLocPos.SetX(1000000.) ; //Local position should be evaluated - fDebug=0; - } //____________________________________________________________________________ -AliPHOSEmcRecPoint::AliPHOSEmcRecPoint(const char * opt) : AliPHOSRecPoint(opt) +AliPHOSEmcRecPoint::AliPHOSEmcRecPoint(const char * opt) : + AliPHOSRecPoint(opt), + fCoreEnergy(0.), fDispersion(0.), + fEnergyList(0), fTime(-1.), fNExMax(0), + fM2x(0.), fM2z(0.), fM3x(0.), fM4z(0.), + fPhixe(0.), fDistToBadCrystal(-1), fDebug(0) { // ctor - fMulDigit = 0 ; fAmp = 0. ; - fNExMax = 0 ; //Not unfolded yet - fCoreEnergy = 0 ; - fEnergyList = 0 ; - fTime = -1. ; fLocPos.SetX(1000000.) ; //Local position should be evaluated - fDebug=0; - } //____________________________________________________________________________ -AliPHOSEmcRecPoint::AliPHOSEmcRecPoint(const AliPHOSEmcRecPoint & rp) : AliPHOSRecPoint(rp) +AliPHOSEmcRecPoint::AliPHOSEmcRecPoint(const AliPHOSEmcRecPoint & rp) : + AliPHOSRecPoint(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), fDistToBadCrystal(rp.fDistToBadCrystal), fDebug(rp.fDebug) { // cpy ctor - fMulDigit = rp.fMulDigit ; fAmp = rp.fAmp ; - fCoreEnergy = rp.fCoreEnergy ; fEnergyList = new Float_t[rp.fMulDigit] ; Int_t index ; for(index = 0 ; index < fMulDigit ; index++) fEnergyList[index] = rp.fEnergyList[index] ; - fNExMax = rp.fNExMax ; - fTime = rp.fTime ; } //____________________________________________________________________________ AliPHOSEmcRecPoint::~AliPHOSEmcRecPoint() { // dtor - if ( fEnergyList ) delete[] fEnergyList ; } @@ -339,10 +353,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. ; @@ -409,6 +424,7 @@ void AliPHOSEmcRecPoint::EvalDispersion(Float_t logWeight,TClonesArray * digits fDispersion = 0; if (d>=0) fDispersion = TMath::Sqrt(d) ; + } //______________________________________________________________________________ @@ -418,6 +434,7 @@ void AliPHOSEmcRecPoint::EvalCoreEnergy(Float_t logWeight, TClonesArray * digits // 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% +//DP: non-perpendicular incidence?????????????? Float_t coreRadius = 3 ; @@ -468,10 +485,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,7 +541,7 @@ void AliPHOSEmcRecPoint::EvalElipsAxis(Float_t logWeight,TClonesArray * digits) // Double_t CosZ ; // AliPHOSGetter * gime = AliPHOSGetter::Instance() ; // AliPHOSGeometry * phosgeom = (AliPHOSGeometry*)gime->PHOSGeometry(); - // Double_t DistanceToIP= (Double_t ) phosgeom->GetIPtoCrystalSurface() ; +// Double_t DistanceToIP= (Double_t ) phosgeom->GetIPtoCrystalSurface() ; // CosX = DistanceToIP/TMath::Sqrt(DistanceToIP*DistanceToIP+x*x) ; // CosZ = DistanceToIP/TMath::Sqrt(DistanceToIP*DistanceToIP+z*z) ; @@ -550,7 +568,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 @@ -696,20 +714,90 @@ 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=1; fMulTrack<=nprimaries ; fMulTrack++){ + tempo[fMulTrack-1] = digit->GetPrimary(fMulTrack) ; + } + + //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 ) { - // Evaluates all shower parameters - EvalLocalPosition(logWeight, digits) ; - EvalElipsAxis(logWeight, digits) ; - EvalMoments(logWeight, digits) ; - EvalDispersion(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. ; @@ -752,30 +840,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)); @@ -931,27 +1002,27 @@ void AliPHOSEmcRecPoint::Print(Option_t *) const TString message ; message = "AliPHOSEmcRecPoint:\n" ; - message += " digits # = " ; - AliInfo(Form(message.Data())) ; + message += "Digit multiplicity = %d" ; + message += ", cluster Energy = %f" ; + message += ", number of primaries = %d" ; + message += ", rec.point index = %d \n" ; + printf(message.Data(), fMulDigit, fAmp, fMulTrack,GetIndexInList() ) ; Int_t iDigit; + printf(" digits ids = ") ; for(iDigit=0; iDigit