X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOSv1.cxx;h=a9bb43a4f26b86e4625828fa369e3b1a339ecab6;hb=e3817e5f4ce8d76720d023a93be3b17b5d5a8fa5;hp=7e9e0c1a0f6773308a5c94e098186c8e7f707e6d;hpb=597e6309ce79a217171b2f6625d6157251a8f448;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOSv1.cxx b/PHOS/AliPHOSv1.cxx index 7e9e0c1a0f6..a9bb43a4f26 100644 --- a/PHOS/AliPHOSv1.cxx +++ b/PHOS/AliPHOSv1.cxx @@ -31,27 +31,18 @@ // --- ROOT system --- - -#include "TBRIK.h" -#include "TNode.h" #include "TRandom.h" -#include "TTree.h" +#include "TParticle.h" +#include "TClonesArray.h" // --- Standard library --- -#include -#include -#include -#include - // --- AliRoot header files --- #include "AliPHOSv1.h" #include "AliPHOSHit.h" #include "AliPHOSCPVDigit.h" #include "AliRun.h" -#include "AliConst.h" -#include "AliMC.h" #include "AliPHOSGeometry.h" #include "AliPHOSQAIntCheckable.h" #include "AliPHOSQAFloatCheckable.h" @@ -99,10 +90,11 @@ 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) ; + gAlice->AddHitList(fHits) ; fNhits = 0 ; - fIshunt = 1 ; // All hits are associated with primary particles + fIshunt = 2 ; // All hits are associated with primary particles //Photoelectron statistics: // The light yield is a poissonian distribution of the number of @@ -130,8 +122,10 @@ AliPHOSv1::AliPHOSv1(const char *name, const char *title): // create checkables fQAHitsMul = new AliPHOSQAIntCheckable("HitsM") ; fQATotEner = new AliPHOSQAFloatCheckable("TotEn") ; - fQAHitsMulB = new TClonesArray("AliPHOSQAIntCheckable",nb) ; + fQAHitsMulB = new TClonesArray("AliPHOSQAIntCheckable",nb) ; + fQAHitsMulB->SetOwner() ; fQATotEnerB = new TClonesArray("AliPHOSQAFloatCheckable", nb); + fQATotEnerB->SetOwner() ; char tempo[20] ; Int_t i ; for ( i = 0 ; i < nb ; i++ ) { @@ -166,15 +160,24 @@ AliPHOSv1::~AliPHOSv1() delete fHits ; fHits = 0 ; } - if (fTreeQA) - delete fTreeQA ; + + if ( fQAHitsMulB ) { + fQAHitsMulB->Delete() ; + delete fQAHitsMulB ; + } + + if ( fQATotEnerB ) { + fQATotEnerB->Delete() ; + delete fQATotEnerB ; + } + } //____________________________________________________________________________ void AliPHOSv1::AddHit(Int_t shunt, Int_t primary, Int_t tracknumber, Int_t Id, Float_t * hits) { // Add a hit to the hit list. - // A PHOS hit is the sum of all hits in a single crystal from one primary and within soem taime gate + // A PHOS hit is the sum of all hits in a single crystal from one primary and within some time gate Int_t hitCounter ; AliPHOSHit *newHit ; @@ -267,7 +270,7 @@ void AliPHOSv1::StepManager(void) Int_t relid[4] ; // (box, layer, row, column) indices Int_t absid ; // absolute cell ID number - Float_t xyze[5]={-1000,-1000,-1000,0,0} ; // position wrt MRS, time and energy deposited + Float_t xyzte[5]={-1000.,-1000.,-1000.,0.,0.} ; // position wrt MRS, time and energy deposited TLorentzVector pos ; // Lorentz vector of the track current position Int_t copy ; @@ -280,31 +283,31 @@ void AliPHOSv1::StepManager(void) if( gMC->CurrentVolID(copy) == gMC->VolId("PCPQ") && (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 - Float_t xyd[3]={0,0,0} ; //local posiiton of the entering + Float_t xyd[3]={0,0,0} ; //local position of the entering xyd[0] = xyzd[0]; - xyd[1] =-xyzd[1]; - xyd[2] =-xyzd[2]; - + xyd[1] =-xyzd[2]; + xyd[2] =-xyzd[1]; + // Current momentum of the hit's track in the local ref. system TLorentzVector pmom ; //momentum of the particle initiated hit gMC -> TrackMomentum(pmom); Float_t pm[3], pd[3]; for (i=0; i<3; i++) pm[i] = pmom[i]; - + gMC -> Gmtod (pm, pd, 2); // transform 3-momentum from master to daughter system pmom[0] = pd[0]; pmom[1] =-pd[1]; pmom[2] =-pd[2]; - + // Digitize the current CPV hit: // 1. find pad response and @@ -354,10 +357,10 @@ void AliPHOSv1::StepManager(void) // add current digit to the temporary hit list - xyze[3] = gMC->TrackTime() ; - xyze[4] = cpvDigit->GetQpad() ; // amplitude in a pad + xyzte[3] = gMC->TrackTime() ; + xyzte[4] = cpvDigit->GetQpad() ; // amplitude in a pad primary = -1; // No need in primary for CPV - AddHit(fIshunt, primary, tracknumber, absid, xyze); + AddHit(fIshunt, primary, tracknumber, absid, xyzte); if (cpvDigit->GetQpad() > 0.02) { xmean += cpvDigit->GetQpad() * (cpvDigit->GetXpad() + 0.5); @@ -377,65 +380,70 @@ void AliPHOSv1::StepManager(void) if(gMC->CurrentVolID(copy) == gMC->VolId("PXTL") ) { // We are inside a PBWO crystal gMC->TrackPosition(pos) ; - xyze[0] = pos[0] ; - xyze[1] = pos[1] ; - xyze[2] = pos[2] ; - - //Put in the TreeK particle entering PHOS - if(gMC->IsTrackEntering() ) { - Float_t xyzm[3]={pos[0],pos[1],pos[2]} ; - Float_t xyzd[3] ; - gMC -> Gmtod (xyzm, xyzd, 1); // transform coordinate from master to daughter system - // Select tracks coming to the crystal from up or down - if (xyzd[1] > GetGeometry()->GetCrystalSize(1)/2-0.002 || - xyzd[1] < -GetGeometry()->GetCrystalSize(1)/2+0.002) - gAlice->KeepTrack(tracknumber) ; - } - + xyzte[0] = pos[0] ; + 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 + if ( gMC->IsTrackEntering() ){ + Float_t xyzd[3] ; + gMC -> Gmtod (xyzte, xyzd, 1); // transform coordinate from master to daughter system + if (xyzd[1] > GetGeometry()->GetCrystalSize(1)/2-0.002 || + xyzd[1] < -GetGeometry()->GetCrystalSize(1)/2+0.002) { + TParticle * part = 0 ; + Int_t parent = gAlice->CurrentTrack() ; + while ( parent != -1 ) { + part = gAlice->Particle(parent) ; + part->SetBit(kKeepBit); + parent = part->GetFirstMother() ; + } + } + } if ( lostenergy != 0 ) { // Track is inside the crystal and deposits some energy + xyzte[3] = gMC->TrackTime() ; - xyze[3] = gMC->TrackTime() ; - gMC->CurrentVolOffID(10, moduleNumber) ; // get the PHOS module number ; Int_t strip ; 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 ; - + absid = (moduleNumber-1)*GetGeometry()->GetNCristalsInModule() + row + (col*GetGeometry()->GetEMCAGeometry()->GetNCellsInStrip() + cell-1)*GetGeometry()->GetNZ() ; - + gMC->Gmtod(global, local, 1) ; - //Calculates the light yield, the number of photns produced in the + //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 )) ) ; + //Calculates de energy deposited in the crystal - xyze[4] = fAPDFactor * lightYield ; + xyzte[4] = fAPDFactor * lightYield ; // add current hit to the hit list - AddHit(fIshunt, primary,tracknumber, absid, xyze); + // Info("StepManager","%d %d", primary, tracknumber) ; + AddHit(fIshunt, primary,tracknumber, absid, xyzte); // fill the relevant QA Checkables - fQATotEner->Update( xyze[4] ) ; // total energy in PHOS - (static_cast((*fQATotEnerB)[moduleNumber-1]))->Update( xyze[4] ) ; // energy in this block - + fQATotEner->Update( xyzte[4] ) ; // total energy in PHOS + (static_cast((*fQATotEnerB)[moduleNumber-1]))->Update( xyzte[4] ) ; // energy in this block + } // there is deposited energy } // we are inside a PHOS Xtal - + } //____________________________________________________________________________ @@ -472,7 +480,7 @@ void AliPHOSv1::CPVDigitize (TLorentzVector p, Float_t *zxhit, Int_t moduleNumbe Float_t pNorm = p.Py(); Float_t eloss = kdEdx; -// cout << "CPVDigitize: YVK : "<GetCPVGasThickness(); Float_t dXY = pX/pNorm * GetGeometry()->GetCPVGasThickness();