]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSv1.cxx
Bug fix for CPV-EMC distance
[u/mrichter/AliRoot.git] / PHOS / AliPHOSv1.cxx
index aa8fb410cd28be69ad67524d13b1c218e4dc8a0c..58acdc5e6ef3b0ae82386d53d7979d48c35f302e 100644 (file)
 
 /* $Id$ */
 
+/* History of cvs commits:
+ *
+ * $Log$
+ * 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 
 //---
-// Layout EMC + PPSD has name GPS2:
-// Produces cumulated hits
 //---
 // Layout EMC + CPV  has name IHEP:
 // Produces hits for CPV, cumulated hits
 //---
-// Layout EMC + CPV + PPSD has name GPS:
-// Produces hits for CPV, cumulated hits
 //---
 //*-- Author: Yves Schutz (SUBATECH)
 
 
 // --- ROOT system ---
-
-#include <TBRIK.h>
-#include <TNode.h>
+#include <TClonesArray.h>
 #include <TParticle.h>
-#include <TRandom.h>
-#include <TTree.h>
 #include <TVirtualMC.h>
 
 // --- Standard library ---
 
-#include <string.h>
-#include <stdlib.h>
 
 // --- AliRoot header files ---
-
-#include "AliConst.h"
 #include "AliPHOSCPVDigit.h"
 #include "AliPHOSGeometry.h"
 #include "AliPHOSHit.h"
-#include "AliPHOSQAFloatCheckable.h"
-#include "AliPHOSQAIntCheckable.h"
-#include "AliPHOSQAMeanChecker.h"
 #include "AliPHOSv1.h"
 #include "AliRun.h"
+#include "AliMC.h"
 
 ClassImp(AliPHOSv1)
 
 //____________________________________________________________________________
 AliPHOSv1::AliPHOSv1():
-AliPHOSv0()
+  fLightYieldMean(0.),
+  fIntrinsicPINEfficiency(0.),
+  fLightYieldAttenuation(0.),
+  fRecalibrationFactor(0.),
+  fElectronsPerGeV(0.),
+  fAPDGain(0.),
+  fLightFactor(0.),
+  fAPDFactor(0.)
 {
-  // default ctor: initialze data memebers
-  fQAHitsMul  = 0 ;
-  fQAHitsMulB = 0 ; 
-  fQATotEner  = 0 ; 
-  fQATotEnerB = 0 ; 
-
-  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),
+  fLightYieldMean(0.),
+  fIntrinsicPINEfficiency(0.),
+  fLightYieldAttenuation(0.),
+  fRecalibrationFactor(0.),
+  fElectronsPerGeV(0.),
+  fAPDGain(0.),
+  fLightFactor(0.),
+  fAPDFactor(0.)
 {
   //
   // We store hits :
@@ -98,7 +108,7 @@ 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) ; 
+  gAlice->GetMCApp()->AddHitList(fHits) ; 
 
   fNhits = 0 ;
 
@@ -122,40 +132,7 @@ AliPHOSv1::AliPHOSv1(const char *name, const char *title):
   fElectronsPerGeV        = 2.77e+8 ;
   fAPDGain                = 300. ;
   fLightFactor            = fLightYieldMean * fIntrinsicPINEfficiency ; 
-  fAPDFactor              = (fRecalibrationFactor/100.) * fAPDGain ; 
-
-
-  Int_t nb   = GetGeometry()->GetNModules() ; 
-  
-  // create checkables 
-  fQAHitsMul   = new AliPHOSQAIntCheckable("HitsM") ; 
-  fQATotEner   = new AliPHOSQAFloatCheckable("TotEn") ; 
-  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++ ) {
-    sprintf(tempo, "HitsMB%d", i+1) ; 
-    new( (*fQAHitsMulB)[i]) AliPHOSQAIntCheckable(tempo) ; 
-    sprintf(tempo, "TotEnB%d", i+1) ; 
-    new( (*fQATotEnerB)[i] ) AliPHOSQAFloatCheckable(tempo) ;
-  }
-
-  AliPHOSQAMeanChecker * hmc  = new AliPHOSQAMeanChecker("HitsMul", 100. ,25.) ; 
-  AliPHOSQAMeanChecker * emc  = new AliPHOSQAMeanChecker("TotEner", 10. ,5.) ; 
-  AliPHOSQAMeanChecker * bhmc = new AliPHOSQAMeanChecker("HitsMulB", 100. ,5.) ; 
-  AliPHOSQAMeanChecker * bemc = new AliPHOSQAMeanChecker("TotEnerB", 2. ,.5) ; 
-
-  // associate checkables and checkers 
-  fQAHitsMul->AddChecker(hmc) ; 
-  fQATotEner->AddChecker(emc) ; 
-  for ( i = 0 ; i < nb ; i++ ) {
-    (static_cast<AliPHOSQAIntCheckable*>((*fQAHitsMulB)[i]))->AddChecker(bhmc) ;
-    (static_cast<AliPHOSQAFloatCheckable*>((*fQATotEnerB)[i]))->AddChecker(bemc) ; 
-  }
-
+  fAPDFactor              = (fRecalibrationFactor/100.) * fAPDGain ;   
 }
 
 //____________________________________________________________________________
@@ -166,22 +143,11 @@ AliPHOSv1::~AliPHOSv1()
     fHits->Delete() ; 
     delete fHits ;
     fHits = 0 ; 
-  }
-  
-  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)
+void AliPHOSv1::AddHit(Int_t shunt, Int_t primary, 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 some time gate
@@ -192,7 +158,7 @@ void AliPHOSv1::AddHit(Int_t shunt, Int_t primary, Int_t tracknumber, Int_t Id,
   Bool_t deja = kFALSE ;
   AliPHOSGeometry * geom = GetGeometry() ; 
 
-  newHit = new AliPHOSHit(shunt, primary, tracknumber, Id, hits) ;
+  newHit = new AliPHOSHit(shunt, primary, Id, hits) ;
 
   for ( hitCounter = fNhits-1 ; hitCounter >= 0 && !deja ; hitCounter-- ) {
     curHit = dynamic_cast<AliPHOSHit*>((*fHits)[hitCounter]) ;
@@ -209,14 +175,10 @@ void AliPHOSv1::AddHit(Int_t shunt, Int_t primary, Int_t tracknumber, Int_t Id,
     // get the block Id number
     Int_t relid[4] ;
     geom->AbsToRelNumbering(Id, relid) ;
-    // and fill the relevant QA checkable (only if in PbW04)
-    if ( relid[1] == 0 ) {
-      fQAHitsMul->Update(1) ; 
-      (static_cast<AliPHOSQAIntCheckable*>((*fQAHitsMulB)[relid[0]-1]))->Update(1) ;
-    } 
+
     fNhits++ ;
   }
-
+  
   delete newHit;
 }
 
@@ -226,8 +188,6 @@ void AliPHOSv1::FinishPrimary()
   // called at the end of each track (primary) by AliRun
   // hits are reset for each new track
   // accumulate the total hit-multiplicity
-//   if ( fQAHitsMul ) 
-//     fQAHitsMul->Update( fHits->GetEntriesFast() ) ; 
 
 }
 
@@ -238,39 +198,6 @@ void AliPHOSv1::FinishEvent()
   // accumulate the hit-multiplicity and total energy per block 
   // if the values have been updated check it
   
-
-  if ( fQATotEner ) { 
-    if ( fQATotEner->HasChanged() ) {
-      fQATotEner->CheckMe() ; 
-      fQATotEner->Reset() ; 
-    }
-  }
-  
-  Int_t i ; 
-  if ( fQAHitsMulB && fQATotEnerB ) {
-    for (i = 0 ; i < GetGeometry()->GetNModules() ; i++) {
-      AliPHOSQAIntCheckable * ci = static_cast<AliPHOSQAIntCheckable*>((*fQAHitsMulB)[i]) ;  
-      AliPHOSQAFloatCheckable* cf = static_cast<AliPHOSQAFloatCheckable*>((*fQATotEnerB)[i]) ; 
-      if ( ci->HasChanged() ) { 
-       ci->CheckMe() ;  
-       ci->Reset() ;
-      } 
-      if ( cf->HasChanged() ) { 
-       cf->CheckMe() ; 
-       cf->Reset() ;
-      }
-    } 
-  }
-  
-  // check the total multiplicity 
-  
-  if ( fQAHitsMul ) {
-    if ( fQAHitsMul->HasChanged() ) { 
-      fQAHitsMul->CheckMe() ; 
-      fQAHitsMul->Reset() ; 
-    }
-  } 
-
   AliDetector::FinishEvent(); 
 }
 //____________________________________________________________________________
@@ -284,13 +211,13 @@ void AliPHOSv1::StepManager(void)
   TLorentzVector pos      ;           // Lorentz vector of the track current position
   Int_t          copy     ;
 
-  Int_t tracknumber =  gAlice->CurrentTrack() ; 
-  Int_t primary     =  gAlice->GetPrimary( gAlice->CurrentTrack() ); 
-  TString name      =  GetGeometry()->GetName() ; 
-
   Int_t moduleNumber ;
   
-  if( gMC->CurrentVolID(copy) == 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->TrackCharge() != 0) {      
     
@@ -325,7 +252,7 @@ void AliPHOSv1::StepManager(void)
     moduleNumber--;
     
     TClonesArray *cpvDigits = new TClonesArray("AliPHOSCPVDigit",0);   // array of digits for current hit
-    CPVDigitize(pmom,xyd,moduleNumber,cpvDigits);
+    CPVDigitize(pmom,xyd,cpvDigits);
       
     Float_t xmean = 0;
     Float_t zmean = 0;
@@ -344,8 +271,8 @@ void AliPHOSv1::StepManager(void)
        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) ;
+         Float_t qsumpad = cpvDigit1->GetQpad() + cpvDigit2->GetQpad() ;
+         cpvDigit2->SetQpad(qsumpad) ;
          cpvDigits->RemoveAt(idigit) ;
        }
       }
@@ -369,8 +296,9 @@ void AliPHOSv1::StepManager(void)
 
       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, xyzte);
+
+      Int_t primary  =  gAlice->GetMCApp()->GetPrimary( gAlice->GetMCApp()->GetCurrentTrackNumber() ); 
+      AddHit(fIshunt, primary, absid, xyzte);  
       
       if (cpvDigit->GetQpad() > 0.02) {
        xmean += cpvDigit->GetQpad() * (cpvDigit->GetXpad() + 0.5);
@@ -386,8 +314,8 @@ void AliPHOSv1::StepManager(void)
   }
 
  
-  
-  if(gMC->CurrentVolID(copy) == gMC->VolId("PXTL") ) { //  We are inside a PBWO crystal
+  static Int_t idPXTL = gMC->VolId("PXTL");  
+  if(gMC->CurrentVolID(copy) == idPXTL ) { //  We are inside a PBWO crystal
 
     gMC->TrackPosition(pos) ;
     xyzte[0] = pos[0] ;
@@ -404,14 +332,22 @@ void AliPHOSv1::StepManager(void)
     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) ; 
+      if (xyzd[1] < -GetGeometry()->GetCrystalSize(1)/2.+0.1){   //Entered close to forward surface  
+       Int_t parent = gAlice->GetMCApp()->GetCurrentTrackNumber() ; 
+       TParticle * part = gAlice->GetMCApp()->Particle(parent) ; 
+       Float_t vert[3],vertd[3] ;
+       vert[0]=part->Vx() ;
+       vert[1]=part->Vy() ;
+       vert[2]=part->Vz() ;
+       gMC -> Gmtod (vert, vertd, 1);    // transform coordinate from master to daughter system
+       if(vertd[1]<-GetGeometry()->GetCrystalSize(1)/2.-0.1){ //Particle is created in foront of PHOS 
+                                                              //0.1 to get rid of numerical errors 
          part->SetBit(kKeepBit);
-         parent = part->GetFirstMother() ; 
+         while ( parent != -1 ) {
+           part = gAlice->GetMCApp()->Particle(parent) ; 
+           part->SetBit(kKeepBit);
+           parent = part->GetFirstMother() ; 
+         }
        }
       }
     }
@@ -425,12 +361,16 @@ void AliPHOSv1::StepManager(void)
       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() ;
-      
+                   row * 2 + (col*GetGeometry()->GetEMCAGeometry()->GetNCellsXInStrip() + (cell - 1) / 2)*GetGeometry()->GetNZ() - (cell & 1 ? 1 : 0);
+
       gMC->Gmtod(global, local, 1) ;
       
       //Calculates the light yield, the number of photons produced in the
@@ -443,21 +383,38 @@ void AliPHOSv1::StepManager(void)
       //Calculates de energy deposited in the crystal  
       xyzte[4] = fAPDFactor * lightYield  ;
       
-      // add current hit to the hit list
-      // Info("StepManager","%d %d", primary, tracknumber) ; 
-      AddHit(fIshunt, primary,tracknumber, absid, xyzte);
+      Int_t primary ;
+      if(fIshunt == 2){
+       primary = gAlice->GetMCApp()->GetCurrentTrackNumber() ;
+       TParticle * part = gAlice->GetMCApp()->Particle(primary) ;
+       while ( !part->TestBit(kKeepBit) ) {
+         primary = part->GetFirstMother() ;
+         if(primary == -1){        
+           primary  =  gAlice->GetMCApp()->GetPrimary( gAlice->GetMCApp()->GetCurrentTrackNumber() ); 
+           break ; //there is a possibility that particle passed e.g. thermal isulator and hits a side 
+         //surface of the crystal. In this case it may have no primary at all. 
+         //We can not easily separate this case from the case when this is part of the shower, 
+         //developed in the neighboring crystal.
+         }
+         part = gAlice->GetMCApp()->Particle(primary) ;
+       }
+      }
+      else
+       primary  =  gAlice->GetMCApp()->GetPrimary( gAlice->GetMCApp()->GetCurrentTrackNumber() ); 
+
       
-      // fill the relevant QA Checkables
-      fQATotEner->Update( xyzte[4] ) ;                                             // total energy in PHOS
-      (static_cast<AliPHOSQAFloatCheckable*>((*fQATotEnerB)[moduleNumber-1]))->Update( xyzte[4] ) ; // energy in this block  
       
+      // add current hit to the hit list
+      // Info("StepManager","%d %d", primary, tracknumber) ; 
+      AddHit(fIshunt, primary, absid, xyzte);
+        
     } // there is deposited energy
   } // we are inside a PHOS Xtal
   
 }
 
 //____________________________________________________________________________
-void AliPHOSv1::CPVDigitize (TLorentzVector p, Float_t *zxhit, Int_t moduleNumber, TClonesArray *cpvDigits)
+void AliPHOSv1::CPVDigitize (TLorentzVector p, Float_t *zxhit, TClonesArray *cpvDigits)
 {
   // ------------------------------------------------------------------------
   // Digitize one CPV hit: