X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOSv1.cxx;h=40af90f04788c2a9c490c8a3a6795877f46918d6;hb=6b67074fc35c544cb82c12dc793fccd729eefc00;hp=3aea965ae92fb54b7a105273f574464244f4035c;hpb=184569b0bd9e9f3c977812c18194278ede53ba5e;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOSv1.cxx b/PHOS/AliPHOSv1.cxx index 3aea965ae92..40af90f0478 100644 --- a/PHOS/AliPHOSv1.cxx +++ b/PHOS/AliPHOSv1.cxx @@ -15,6 +15,35 @@ /* $Id$ */ +/* History of cvs commits: + * + * $Log$ + * Revision 1.111 2007/07/24 09:41:19 morsch + * AliStack included for kKeepBit. + * + * Revision 1.110 2007/03/10 08:58:52 kharlov + * Protection for noCPV geometry + * + * Revision 1.109 2007/03/01 11:37:37 kharlov + * Strip units changed from 8x1 to 8x2 (T.Pocheptsov) + * + * Revision 1.108 2007/02/02 09:40:50 alibrary + * Includes required by ROOT head + * + * Revision 1.107 2007/02/01 10:34:47 hristov + * Removing warnings on Solaris x86 + * + * Revision 1.106 2006/11/14 17:11:15 hristov + * Removing inheritances from TAttLine, TAttMarker and AliRndm in AliModule. The copy constructor and assignment operators are moved to the private part of the class and not implemented. The corresponding changes are propagated to the detectors + * + * Revision 1.105 2006/09/13 07:31:01 kharlov + * Effective C++ corrections (T.Pocheptsov) + * + * Revision 1.104 2005/05/28 14:19:05 schutz + * Compilation warnings fixed by T.P. + * + */ + //_________________________________________________________________________ // Implementation version v1 of PHOS Manager class //--- @@ -27,6 +56,7 @@ // --- ROOT system --- +#include #include #include @@ -40,28 +70,20 @@ #include "AliPHOSv1.h" #include "AliRun.h" #include "AliMC.h" +#include "AliStack.h" +#include "AliPHOSSimParam.h" ClassImp(AliPHOSv1) //____________________________________________________________________________ -AliPHOSv1::AliPHOSv1(): -AliPHOSv0() +AliPHOSv1::AliPHOSv1() : fCPVDigits("AliPHOSCPVDigit",20) { - - fLightYieldMean = 0. ; - fIntrinsicPINEfficiency = 0. ; - fLightYieldAttenuation = 0. ; - fRecalibrationFactor = 0. ; - fElectronsPerGeV = 0. ; - fAPDGain = 0. ; - fLightFactor = 0. ; - fAPDFactor = 0. ; - + //Def ctor. } //____________________________________________________________________________ AliPHOSv1::AliPHOSv1(const char *name, const char *title): - AliPHOSv0(name,title) + AliPHOSv0(name,title), fCPVDigits("AliPHOSCPVDigit",20) { // // We store hits : @@ -78,31 +100,12 @@ AliPHOSv1::AliPHOSv1(const char *name, const char *title): // and the TreeD at the end of the event (branch is set in FinishEvent() ). fHits= new TClonesArray("AliPHOSHit",1000) ; +// fCPVDigits("AliPHOSCPVDigit",20); gAlice->GetMCApp()->AddHitList(fHits) ; fNhits = 0 ; fIshunt = 2 ; // All hits are associated with primary particles - - //Photoelectron statistics: - // The light yield is a poissonian distribution of the number of - // photons created in the PbWo4 crystal, calculated using following formula - // NumberOfPhotons = EnergyLost * LightYieldMean* APDEfficiency * - // exp (-LightYieldAttenuation * DistanceToPINdiodeFromTheHit); - // LightYieldMean is parameter calculated to be over 47000 photons per GeV - // APDEfficiency is 0.02655 - // k_0 is 0.0045 from Valery Antonenko - // The number of electrons created in the APD is - // NumberOfElectrons = APDGain * LightYield - // The APD Gain is 300 - fLightYieldMean = 47000; - fIntrinsicPINEfficiency = 0.02655 ; //APD= 0.1875/0.1271 * 0.018 (PIN) - fLightYieldAttenuation = 0.0045 ; - fRecalibrationFactor = 13.418/ fLightYieldMean ; - fElectronsPerGeV = 2.77e+8 ; - fAPDGain = 300. ; - fLightFactor = fLightYieldMean * fIntrinsicPINEfficiency ; - fAPDFactor = (fRecalibrationFactor/100.) * fAPDGain ; } //____________________________________________________________________________ @@ -116,21 +119,6 @@ AliPHOSv1::~AliPHOSv1() } } -//____________________________________________________________________________ -void AliPHOSv1::Copy(AliPHOSv1 & phos) -{ - TObject::Copy(phos) ; - AliPHOSv0::Copy(phos) ; - phos.fLightYieldMean = fLightYieldMean ; - phos.fIntrinsicPINEfficiency = fIntrinsicPINEfficiency ; - phos.fLightYieldAttenuation = fLightYieldAttenuation ; - phos.fRecalibrationFactor = fRecalibrationFactor ; - phos.fElectronsPerGeV = fElectronsPerGeV ; - phos.fAPDGain = fAPDGain ; - phos.fLightFactor = fLightFactor ; - phos.fAPDFactor = fAPDFactor ; -} - //____________________________________________________________________________ void AliPHOSv1::AddHit(Int_t shunt, Int_t primary, Int_t Id, Float_t * hits) { @@ -146,7 +134,7 @@ void AliPHOSv1::AddHit(Int_t shunt, Int_t primary, Int_t Id, Float_t * hits) newHit = new AliPHOSHit(shunt, primary, Id, hits) ; for ( hitCounter = fNhits-1 ; hitCounter >= 0 && !deja ; hitCounter-- ) { - curHit = dynamic_cast((*fHits)[hitCounter]) ; + curHit = static_cast((*fHits)[hitCounter]) ; if(curHit->GetPrimary() != primary) break ; // We add hits with the same primary, while GEANT treats primaries succesively if( *curHit == *newHit ) { @@ -196,22 +184,24 @@ void AliPHOSv1::StepManager(void) TLorentzVector pos ; // Lorentz vector of the track current position Int_t copy ; - TString name = GetGeometry()->GetName() ; - Int_t moduleNumber ; - static Int_t idPCPQ = gMC->VolId("PCPQ"); + static Int_t idPCPQ = -1; + if (strstr(fTitle.Data(),"noCPV") == 0) + idPCPQ = gMC->VolId("PCPQ"); + if( gMC->CurrentVolID(copy) == idPCPQ && - (gMC->IsTrackEntering() ) && + (gMC->IsTrackEntering() ) && gMC->TrackCharge() != 0) { gMC -> TrackPosition(pos); - + Float_t xyzm[3], xyzd[3] ; Int_t i; for (i=0; i<3; i++) xyzm[i] = pos[i]; - gMC -> Gmtod (xyzm, xyzd, 1); // transform coordinate from master to daughter system - + gMC -> Gmtod (xyzm, xyzd, 1); // transform coordinate from master to daughter system + + Float_t xyd[3]={0,0,0} ; //local position of the entering xyd[0] = xyzd[0]; xyd[1] =-xyzd[2]; @@ -235,8 +225,8 @@ void AliPHOSv1::StepManager(void) gMC->CurrentVolOffID(3,moduleNumber); moduleNumber--; - TClonesArray *cpvDigits = new TClonesArray("AliPHOSCPVDigit",0); // array of digits for current hit - CPVDigitize(pmom,xyd,cpvDigits); +// TClonesArray *cpvDigits = new TClonesArray("AliPHOSCPVDigit",0); // array of digits for current hit + CPVDigitize(pmom,xyd,&fCPVDigits); Float_t xmean = 0; Float_t zmean = 0; @@ -245,29 +235,29 @@ void AliPHOSv1::StepManager(void) // 2. go through the current digit list and sum digits in pads - ndigits = cpvDigits->GetEntriesFast(); + ndigits = fCPVDigits.GetEntriesFast(); for (idigit=0; idigit(cpvDigits->UncheckedAt(idigit)); + AliPHOSCPVDigit *cpvDigit1 = static_cast(fCPVDigits.UncheckedAt(idigit)); Float_t x1 = cpvDigit1->GetXpad() ; Float_t z1 = cpvDigit1->GetYpad() ; for (Int_t jdigit=idigit+1; jdigit(cpvDigits->UncheckedAt(jdigit)); + AliPHOSCPVDigit *cpvDigit2 = static_cast(fCPVDigits.UncheckedAt(jdigit)); Float_t x2 = cpvDigit2->GetXpad() ; Float_t z2 = cpvDigit2->GetYpad() ; if (x1==x2 && z1==z2) { - Float_t qsum = cpvDigit1->GetQpad() + cpvDigit2->GetQpad() ; - cpvDigit2->SetQpad(qsum) ; - cpvDigits->RemoveAt(idigit) ; + Float_t qsumpad = cpvDigit1->GetQpad() + cpvDigit2->GetQpad() ; + cpvDigit2->SetQpad(qsumpad) ; + fCPVDigits.RemoveAt(idigit) ; } } } - cpvDigits->Compress() ; + fCPVDigits.Compress() ; // 3. add digits to temporary hit list fTmpHits - ndigits = cpvDigits->GetEntriesFast(); + ndigits = fCPVDigits.GetEntriesFast(); for (idigit=0; idigit(cpvDigits->UncheckedAt(idigit)); + AliPHOSCPVDigit *cpvDigit = static_cast(fCPVDigits.UncheckedAt(idigit)); relid[0] = moduleNumber + 1 ; // CPV (or PHOS) module number relid[1] =-1 ; // means CPV relid[2] = cpvDigit->GetXpad() ; // column number of a pad @@ -290,11 +280,7 @@ void AliPHOSv1::StepManager(void) qsum += cpvDigit->GetQpad(); } } - if (cpvDigits) { - cpvDigits->Delete(); - delete cpvDigits; - cpvDigits=0; - } + fCPVDigits.Clear(); } @@ -306,10 +292,6 @@ void AliPHOSv1::StepManager(void) xyzte[1] = pos[1] ; xyzte[2] = pos[2] ; - Float_t global[3], local[3] ; - global[0] = pos[0] ; - global[1] = pos[1] ; - global[2] = pos[2] ; Float_t lostenergy = gMC->Edep(); //Put in the TreeK particle entering PHOS and all its parents @@ -344,24 +326,25 @@ void AliPHOSv1::StepManager(void) gMC->CurrentVolOffID(3, strip); Int_t cell ; gMC->CurrentVolOffID(2, cell); - - Int_t row = 1 + GetGeometry()->GetNZ() - strip % GetGeometry()->GetNZ() ; - Int_t col = (Int_t) TMath::Ceil((Double_t) strip/GetGeometry()->GetNZ()) -1 ; - + + //Old formula for row is wrong. For example, I have strip 56 (28 for 2 x 8), row must be 1. + //But row == 1 + 56 - 56 % 56 == 57 (row == 1 + 28 - 28 % 28 == 29) + //Int_t row = 1 + GetGeometry()->GetEMCAGeometry()->GetNStripZ() - strip % (GetGeometry()->GetEMCAGeometry()->GetNStripZ()) ; + Int_t row = GetGeometry()->GetEMCAGeometry()->GetNStripZ() - (strip - 1) % (GetGeometry()->GetEMCAGeometry()->GetNStripZ()) ; + Int_t col = (Int_t) TMath::Ceil((Double_t) strip/(GetGeometry()->GetEMCAGeometry()->GetNStripZ())) -1 ; + + // Absid for 8x2-strips. Looks nice :) absid = (moduleNumber-1)*GetGeometry()->GetNCristalsInModule() + - row + (col*GetGeometry()->GetEMCAGeometry()->GetNCellsInStrip() + cell-1)*GetGeometry()->GetNZ() ; - - gMC->Gmtod(global, local, 1) ; + row * 2 + (col*GetGeometry()->GetEMCAGeometry()->GetNCellsXInStrip() + (cell - 1) / 2)*GetGeometry()->GetNZ() - (cell & 1 ? 1 : 0); + //Calculates the light yield, the number of photons produced in the //crystal - Float_t lightYield = gRandom->Poisson(fLightFactor * lostenergy * - exp(-fLightYieldAttenuation * - (local[1]+GetGeometry()->GetCrystalSize(1)/2.0 )) - ) ; + //There is no dependence of reponce on distance from energy deposition to APD + Float_t lightYield = gRandom->Poisson(AliPHOSSimParam::GetInstance()->GetLightFactor() * lostenergy) ; //Calculates de energy deposited in the crystal - xyzte[4] = fAPDFactor * lightYield ; + xyzte[4] = AliPHOSSimParam::GetInstance()->GetAPDFactor() * lightYield ; Int_t primary ; if(fIshunt == 2){ @@ -379,10 +362,9 @@ void AliPHOSv1::StepManager(void) part = gAlice->GetMCApp()->Particle(primary) ; } } - else + else{ primary = gAlice->GetMCApp()->GetPrimary( gAlice->GetMCApp()->GetCurrentTrackNumber() ); - - + } // add current hit to the hit list // Info("StepManager","%d %d", primary, tracknumber) ; @@ -427,8 +409,6 @@ void AliPHOSv1::CPVDigitize (TLorentzVector p, Float_t *zxhit, TClonesArray *cpv Float_t pNorm = p.Py(); Float_t eloss = kdEdx; -//Info("CPVDigitize", "YVK : %f %f | %f %f %d", hitX, hitZ, pX, pZ, pNorm) ; - Float_t dZY = pZ/pNorm * GetGeometry()->GetCPVGasThickness(); Float_t dXY = pX/pNorm * GetGeometry()->GetCPVGasThickness(); gRandom->Rannor(rnor1,rnor2);