]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSEmcRecPoint.cxx
Adding Analisys tasks for performance study
[u/mrichter/AliRoot.git] / PHOS / AliPHOSEmcRecPoint.cxx
index 3f72da1a15a4077abb0a34806e641a76dab549f3..63604ad2dfb8efc6a1effff3c2e1ea53af72a99a 100644 (file)
 /* History of cvs commits:
  *
  * $Log$
+ * Revision 1.59  2007/10/18 15:12:22  kharlov
+ * Moved MakePrimary to EMCRecPoint to rpduce correct order of primaries
+ *
+ * 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()
  *
@@ -63,7 +75,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 ;  
@@ -77,7 +89,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 ;  
@@ -91,14 +103,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] ; 
 }
 
@@ -344,7 +355,7 @@ void AliPHOSEmcRecPoint::ExecuteEvent(Int_t event, Int_t, Int_t) /*const*/
 }
 
 //____________________________________________________________________________
-void  AliPHOSEmcRecPoint::EvalDispersion(Float_t logWeight,TClonesArray * digits, TVector3 &vInc)
+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????????
@@ -480,7 +491,7 @@ void AliPHOSEmcRecPoint::EvalCoreEnergy(Float_t logWeight, TClonesArray * digits
 }
 
 //____________________________________________________________________________
-void  AliPHOSEmcRecPoint::EvalElipsAxis(Float_t logWeight,TClonesArray * digits, TVector3 &vInc)
+void  AliPHOSEmcRecPoint::EvalElipsAxis(Float_t logWeight,TClonesArray * digits, TVector3 & /* vInc */)
 {
   // Calculates the axis of the shower ellipsoid
 
@@ -559,7 +570,7 @@ void  AliPHOSEmcRecPoint::EvalElipsAxis(Float_t logWeight,TClonesArray * digits,
 }
 
 //____________________________________________________________________________
-void  AliPHOSEmcRecPoint::EvalMoments(Float_t logWeight,TClonesArray * digits, TVector3 &vInc)
+void  AliPHOSEmcRecPoint::EvalMoments(Float_t logWeight,TClonesArray * digits, TVector3 & /* vInc */)
 {
   // Calculate the shower moments in the eigen reference system
   // M2x, M2z, M3x, M4z
@@ -705,11 +716,75 @@ void  AliPHOSEmcRecPoint::EvalMoments(Float_t logWeight,TClonesArray * digits, T
   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<GetDigitsMultiplicity(); id++){
+    if(emax<fEnergyList[id])
+      imaxDigit=id ;
+  }
+  digit = dynamic_cast<AliPHOSDigit *>(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; fMulTrack<nprimaries ; fMulTrack++){
+    tempo[fMulTrack] = digit->GetPrimary(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<AliPHOSDigit *>(digits->At( fDigitsList[index] )) ; 
+    nprimaries = digit->GetNprimary() ;
+    for(Int_t ipr=0; ipr<nprimaries; ipr++){
+      Int_t iprimary = digit->GetPrimary(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<fMaxTrack){
+         tempo[fMulTrack]=iprimary ;
+         fMulTrack++ ;
+       }
+       else{
+         Error("EvalPrimaries", "GetNprimaries ERROR > 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 )
 {
   EvalCoreEnergy(logWeight, digits);
   EvalTime(digits) ;
+  EvalPrimaries(digits) ;
   AliPHOSRecPoint::EvalAll(digits) ;
 }
 //____________________________________________________________________________
@@ -771,8 +846,8 @@ void AliPHOSEmcRecPoint::EvalLocalPosition(Float_t logWeight, TVector3 &vtx, TCl
   Float_t depthx = 0.; 
   Float_t depthz = 0.;
   if (fAmp>0&&vInc.Y()!=0.) {
-    depthx = ( para * TMath::Log(fAmp) + parb ) * vInc.X()/vInc.Y() ;
-    depthz = ( para * TMath::Log(fAmp) + parb ) * vInc.Z()/vInc.Y() ;
+    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));