]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSDigit.cxx
Some other problem with the HP compiler fixed.
[u/mrichter/AliRoot.git] / PHOS / AliPHOSDigit.cxx
index 89d7c1a9b52b5a209ebfebd369842dee7673bb10..7cf26b412098a2d2a9c5cf1e6541782bc2c221df 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
+/* $Id$ */
+
 //_________________________________________________________________________
-// Digit class for PHOS that contains an absolute ID and an energy
-//*-- Author : Laurent Aphecetche  SUBATECH 
-//////////////////////////////////////////////////////////////////////////////
+//  PHOS digit: Id
+//              energy
+//              3 identifiers for the primary particle(s) at the origine of the digit
+//  The digits are made in FinishEvent() by summing all the hits in a single PHOS crystal or PPSD gas cell
+//  It would be nice to replace the 3 identifiers by an array, but, because digits are kept in a TClonesQArray,
+//   it is not possible to stream such an array... (beyond my understqnding!)
+//
+//*-- Author: Laurent Aphecetche & Yves Schutz (SUBATECH)
+
 
 // --- ROOT system ---
 
 // --- Standard library ---
 
-#include <iostream>
-#include <cassert> 
+#include <iostream.h>
 
 // --- AliRoot header files ---
 
 ClassImp(AliPHOSDigit)
 
 //____________________________________________________________________________
-  AliPHOSDigit::AliPHOSDigit() : fPrimary(0)
+  AliPHOSDigit::AliPHOSDigit() 
 {
-  fNprimary = 0 ;  
-  Int_t index ; 
-  for (index = 1 ; index <= 3 ; index++)
-    SetPrimary(index, -1) ; 
-}
-
-//____________________________________________________________________________
-AliPHOSDigit::AliPHOSDigit(Int_t primary, Int_t id, Int_t DigEnergy) 
-{  
-  fId         = id ;
-  fAmp        = DigEnergy ;
-  fPrimary    = new Int_t[1] ; 
-  fPrimary[0] = primary ;
-  fNprimary   = 1 ; 
-  SetPrimary(1, primary) ; 
+  // default ctor 
 
+  fIndexInList = -1 ; 
+  fNprimary    = 0 ;  
+  fPrimary1    = -1 ; 
+  fPrimary2    = -1 ; 
+  fPrimary3    = -1 ;
 }
 
 //____________________________________________________________________________
-AliPHOSDigit::AliPHOSDigit(const AliPHOSDigit & digit
+AliPHOSDigit::AliPHOSDigit(Int_t primary, Int_t id, Int_t DigEnergy, Int_t index
 {  
-  fId       = digit.fId;
-  fAmp      = digit.fAmp ;
-  fNprimary = digit.GetNprimary() ;
-  fPrimary  = new Int_t[fNprimary] ;
-  Int_t * primary = digit.GetPrimary() ;
-  Int_t  index ;
-  for ( index = 0 ; index < fNprimary ; index++ ) {
-    fPrimary[index] = primary[index] ;
-    SetPrimary( index+1, digit.GetPrimary(index+1) ) ; 
-  }
-
+  // ctor with all data 
+
+  fAmp         = DigEnergy ;
+  fId          = id ;
+  fIndexInList = index ; 
+  fPrimary1    = primary ;
+  fNprimary    = 1 ; 
+  fPrimary2    = -1 ; 
+  fPrimary3    = -1 ;
 }
 
 //____________________________________________________________________________
-AliPHOSDigit::~AliPHOSDigit()
+AliPHOSDigit::AliPHOSDigit(const AliPHOSDigit & digit) 
 {
-  if ( fPrimary != 0 ) 
-    delete fPrimary ; 
+  // copy ctor
+  
+  fAmp         = digit.fAmp ;
+  fId          = digit.fId;
+  fIndexInList = digit.fIndexInList ; 
+  fNprimary    = digit.fNprimary ;
+  fPrimary1    = digit.fPrimary1 ;
+  fPrimary2    = digit.fPrimary2 ;
+  fPrimary3    = digit.fPrimary3 ;
 }
 
 //____________________________________________________________________________
 Int_t AliPHOSDigit::Compare(TObject * obj)
 {
-  Int_t rv ; 
+  // Compares two digits with respect to its Id
+  // to sort according increasing Id
+
+  Int_t rv ;
 
   AliPHOSDigit * digit = (AliPHOSDigit *)obj ; 
 
@@ -99,6 +105,8 @@ Int_t AliPHOSDigit::Compare(TObject * obj)
 //____________________________________________________________________________
 Int_t AliPHOSDigit::GetPrimary(Int_t index) const
 {
+  // Returns the primary particle id index =1,2,3
   Int_t rv = -1 ; 
   if ( index > 3 )
     cout << "AliPHOSDigit  ERROR > only 3 primaries allowed" << endl ; 
@@ -123,6 +131,8 @@ Int_t AliPHOSDigit::GetPrimary(Int_t index) const
 //____________________________________________________________________________
 Bool_t AliPHOSDigit::operator==(AliPHOSDigit const & digit) const 
 {
+  // Two digits are equal if they have the same Id
+  
   if ( fId == digit.fId ) 
     return kTRUE ;
   else 
@@ -132,50 +142,52 @@ Bool_t AliPHOSDigit::operator==(AliPHOSDigit const & digit) const
 //____________________________________________________________________________
 AliPHOSDigit& AliPHOSDigit::operator+(AliPHOSDigit const & digit) 
 {
-  fAmp += digit.fAmp ;
-  
-  Int_t * tempo = new Int_t[fNprimary] ; 
-  Int_t index ; 
-  
-  Int_t oldfNprimary = fNprimary ; 
+  // Adds the amplitude of digits and completes the list of primary particles
 
-  for ( index = 0 ; index < oldfNprimary ; index++ ){
-    tempo[index] = fPrimary[index] ; 
-  }  
-  delete fPrimary ; 
-  fNprimary += digit.GetNprimary() ; 
-  fPrimary = new Int_t[fNprimary] ; 
+  fAmp += digit.fAmp ;
   
-  for ( index = 0 ; index < oldfNprimary  ; index++ ) { 
-    fPrimary[index] = tempo[index] ; 
-  }
-
-  Int_t jndex = 0 ; 
-  for ( index = oldfNprimary ; index < fNprimary ; index++ ) { 
-    fPrimary[index] = digit.fPrimary[jndex] ; 
-    jndex++ ; 
-  }
-
   // Here comes something crummy ... but I do not know how to stream pointers
   // because AliPHOSDigit is in a TCLonesArray
-
-    if ( fNprimary > 3 )
+  
+  Int_t tempo1[3] ; 
+  tempo1[0] = fPrimary1 ; 
+  tempo1[1] = fPrimary2 ; 
+  tempo1[2] = fPrimary3 ; 
+
+  Int_t tempo2[3] ; 
+  tempo2[0] = digit.fPrimary1 ; 
+  tempo2[1] = digit.fPrimary2 ; 
+  tempo2[2] = digit.fPrimary3 ; 
+
+  Int_t max1 = fNprimary ; 
+  Int_t max2 = digit.fNprimary ; 
+  if ( fNprimary >= 3 ) {
+    cout << "AliPHOSDigit + operator  ERROR > too many primaries, modify AliPHOSDigit" << endl ; 
+  } 
+  else {
+    fNprimary += digit.fNprimary ; 
+    if ( fNprimary > 3 ) {
       cout << "AliPHOSDigit + operator  ERROR > too many primaries, modify AliPHOSDigit" << endl ; 
-    else {
-      switch (fNprimary) {  
-      case 1 :
-       SetPrimary(1, fPrimary[0]) ; 
-       break ; 
-      case 2 :
-       SetPrimary(2, fPrimary[1]) ; 
-       break ; 
-      case 3:
-       SetPrimary(3, fPrimary[2]) ; 
-       break ; 
-      }
+      fNprimary = 3 ;
     }
+    
+    Int_t tempo3[3] ;
+    Int_t index ; 
+    for (index = 0 ; index < 3 ; index++)
+      tempo3[index] = 0 ; 
+
+    for (index = 0 ; index < max1 ; index++)
+      tempo3[index] = tempo1[index] ;
+
+    for (index = 0 ; index < max2 ; index++)
+      tempo3[index+max1] = tempo2[index] ; 
+    
+    fPrimary1 = tempo3[0] ; 
+    fPrimary2 = tempo3[1] ; 
+    fPrimary3 = tempo3[2] ; 
 
+  }
  // end of crummy stuff      
 
   return *this ;
@@ -184,24 +196,14 @@ AliPHOSDigit& AliPHOSDigit::operator+(AliPHOSDigit const & digit)
 //____________________________________________________________________________
 ostream& operator << ( ostream& out , const AliPHOSDigit & digit)
 {
-  out << "ID " << digit.fId << " Energy = " << digit.fAmp ;
-
+  // Prints the data of the digit
+  
+  out << "ID " << digit.fId << " Energy = " << digit.fAmp << endl 
+      << "Primary 1 = " << digit.fPrimary1 << endl 
+      << "Primary 2 = " << digit.fPrimary2 << endl 
+      << "Primary 3 = " << digit.fPrimary3 << endl 
+      << "Position in list = " << digit.fIndexInList << endl ; 
   return out ;
 }
 
-//____________________________________________________________________________
-void AliPHOSDigit::SetPrimary(Int_t index, Int_t value) 
-{
-  switch (index) {
-  case 1 : 
-    fPrimary1 = value ; 
-    break ; 
-  case 2 : 
-    fPrimary2 = value ; 
-    break ; 
-  case 3 :
-    fPrimary3 = value ; 
-    break ; 
-  }
 
- }