First primary most probable now
authorschutz <schutz@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 6 Jan 2003 17:06:07 +0000 (17:06 +0000)
committerschutz <schutz@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 6 Jan 2003 17:06:07 +0000 (17:06 +0000)
PHOS/AliPHOSDigit.cxx
PHOS/AliPHOSEmcRecPoint.cxx
PHOS/AliPHOSRecPoint.cxx

index 6e69b62886e9c46151bdcea11f204668c1a722ea..7808863b77f7bc7be135fac677f490f452c9ede4 100644 (file)
@@ -158,30 +158,59 @@ AliPHOSDigit& AliPHOSDigit::operator+(AliPHOSDigit const & digit)
   // Adds the amplitude of digits and completes the list of primary particles
   // if amplitude is larger than 
   
-  fAmp += digit.fAmp ;
-  if(fTime > digit.fTime)
-    fTime = digit.fTime ;
-  
-  Int_t max1 = fNprimary ; 
-  
-  Int_t index ; 
-  for (index = 0 ; index < digit.fNprimary ; index++){
-    Bool_t deja = kTRUE ;
-    Int_t old ;
-    for ( old = 0 ; (old < max1) && deja; old++) { //already have this primary?
-      if(fPrimary[old] == (digit.fPrimary)[index])
-       deja = kFALSE;
-    }
-    if(deja){
-      fPrimary[fNprimary] = (digit.fPrimary)[index] ; 
-      fNprimary++ ;
-      if(fNprimary>fNMaxPrimary) {
+  Int_t toAdd = fNprimary ;
+  if(digit.fNprimary>0){
+    if(fAmp < digit.fAmp){//most energetic primary in digit => first primaries in list from second digit
+      for (Int_t index = 0 ; index < digit.fNprimary ; index++){
+       for (Int_t old = 0 ; old < fNprimary ; old++) { //already have this primary?
+         if(fPrimary[old] == (digit.fPrimary)[index]){
+           fPrimary[old] = -1 ; //removed
+           toAdd-- ;
+           break ;
+         }
+       }
+      }
+      if(digit.fNprimary+toAdd >fNMaxPrimary)  //Do not change primary list
        Error("Operator +", "Increase NMaxPrimary") ;
-       return *this ;
+      else{
+       for(Int_t index = fNprimary-1 ; index >=0 ; index--){ //move old primaries      
+         if(fPrimary[index]>-1){
+           fPrimary[fNprimary+toAdd]=fPrimary[index] ;
+           toAdd-- ;
+         }
+       }
+       //copy new primaries
+       for(Int_t index = 0; index < digit.fNprimary ; index++){
+         fPrimary[index] = (digit.fPrimary)[index] ;   
+       }
       }
     }
+    else{ //add new primaries to the end
+      for(Int_t index = 0 ; index < digit.fNprimary ; index++){
+       Bool_t deja = kTRUE ;
+       for(Int_t old = 0 ; old < fNprimary; old++) { //already have this primary?
+         if(fPrimary[old] == (digit.fPrimary)[index]){
+           deja = kFALSE;
+           break ;
+         }      
+       }
+       if(deja){
+         fPrimary[fNprimary] = (digit.fPrimary)[index] ; 
+         fNprimary++ ;
+         if(fNprimary>fNMaxPrimary) {
+           Error("Operator +", "Increase NMaxPrimary") ;
+           break ;
+         }
+       }
+      }
+      
+    }
   }
   
+  fAmp += digit.fAmp ;
+  if(fTime > digit.fTime)
+    fTime = digit.fTime ;
+  
   return *this ;
 }
 
index c16a40d0182cec7fdeade52d80489fe14b407603..ebbb0494d84c7050e067e5c9c3531d8413530acf 100644 (file)
@@ -485,12 +485,12 @@ void AliPHOSEmcRecPoint::EvalAll(Float_t logWeight, TClonesArray * digits )
 {
   // Evaluates all shower parameters
 
-  AliPHOSRecPoint::EvalAll(logWeight,digits) ;
   EvalLocalPosition(logWeight, digits) ;
   EvalElipsAxis(logWeight, digits) ;
   EvalDispersion(logWeight, digits) ;
   EvalCoreEnergy(logWeight, digits);
   EvalTime(digits) ;
+  AliPHOSRecPoint::EvalAll(logWeight,digits) ;
 }
 //____________________________________________________________________________
 void AliPHOSEmcRecPoint::EvalLocalPosition(Float_t logWeight, TClonesArray * digits)
index 7ccbf5189d0ff2b47b6060f0dd26b6d0325e9c00..5f262dc29ef4699acd30eb970cbb0c416500886b 100644 (file)
@@ -191,42 +191,70 @@ void AliPHOSRecPoint::EvalPHOSMod(AliPHOSDigit * digit)
 void  AliPHOSRecPoint::EvalPrimaries(TClonesArray * digits)
 {
   // Constructs the list of primary particles (tracks) which have contributed to this RecPoint
+  // First in the list - primary, made strongest contribution to the center
+
   
   AliPHOSDigit * digit ;
   Int_t * tempo    = new Int_t[fMaxTrack] ;
 
+  //Find digit in center
+  AliPHOSGeometry * geom = AliPHOSGeometry::GetInstance("IHEP","") ;
+  if(!geom){
+    Error("EvalPrimaries","Can not instantiate PHOS geometry") ;
+    return ;
+  }
+  TVector3  pos ;
+  TMatrix  mat ;
+  GetGlobalPosition(pos,mat) ;
+  Int_t module ;
+  Double_t x,z ;
+  geom->ImpactOnEmc(pos.Theta(),pos.Phi(),module,z,x);
+  Int_t absId ;
+  geom->RelPosToAbsId(module,x,z,absId) ;
+  //copy primaries
   Int_t index ;  
   for ( index = 0 ; index < GetDigitsMultiplicity() ; index++ ) { // all digits
     digit = dynamic_cast<AliPHOSDigit *>(digits->At( fDigitsList[index] )) ; 
-    Int_t nprimaries = digit->GetNprimary() ;
-    if(nprimaries){
-      Int_t * newprimaryarray = new Int_t[nprimaries] ;
-      Int_t ii ; 
-      for ( ii = 0 ; ii < nprimaries ; ii++)
-       newprimaryarray[ii] = digit->GetPrimary(ii+1) ; 
-
-      Int_t jndex ;
-      for ( jndex = 0 ; jndex < nprimaries ; jndex++ ) { // all primaries in digit
-       if ( fMulTrack > fMaxTrack ) {
-         fMulTrack = - 1 ;
-         Error("EvalPrimaries", "GetNprimaries ERROR > increase fMaxTrack" ) ;
-         break ;
-       }
-       Int_t newprimary = newprimaryarray[jndex] ;
-       Int_t kndex ;
-       Bool_t already = kFALSE ;
-       for ( kndex = 0 ; kndex < fMulTrack ; kndex++ ) { //check if not already stored
-         if ( newprimary == tempo[kndex] ){
-           already = kTRUE ;
+    if(digit->GetId() == absId){ 
+      fMulTrack = digit->GetNprimary() ;
+      for(Int_t ii = 0 ; ii < fMulTrack ; ii++)
+       tempo[ii] = digit->GetPrimary(ii+1) ; 
+    }
+  }
+  
+  for ( index = 0 ; index < GetDigitsMultiplicity() ; index++ ) { // all digits
+    digit = dynamic_cast<AliPHOSDigit *>(digits->At( fDigitsList[index] )) ; 
+    if(digit->GetId()!=absId){ //already done
+      Int_t nprimaries = digit->GetNprimary() ;
+      if(nprimaries){
+       Int_t * newprimaryarray = new Int_t[nprimaries] ;
+       Int_t ii ; 
+       for ( ii = 0 ; ii < nprimaries ; ii++)
+         newprimaryarray[ii] = digit->GetPrimary(ii+1) ; 
+       
+       Int_t jndex ;
+       for ( jndex = 0 ; jndex < nprimaries ; jndex++ ) { // all primaries in digit
+         if ( fMulTrack > fMaxTrack ) {
+           fMulTrack = - 1 ;
+           Error("EvalPrimaries", "GetNprimaries ERROR > increase fMaxTrack" ) ;
            break ;
          }
-       } // end of check
-       if ( !already) { // store it
-         tempo[fMulTrack] = newprimary ; 
-         fMulTrack++ ;
-       } // store it
-      } // all primaries in digit
-      delete [] newprimaryarray ; 
+         Int_t newprimary = newprimaryarray[jndex] ;
+         Int_t kndex ;
+         Bool_t already = kFALSE ;
+         for ( kndex = 0 ; kndex < fMulTrack ; kndex++ ) { //check if not already stored
+           if ( newprimary == tempo[kndex] ){
+             already = kTRUE ;
+             break ;
+           }
+         } // end of check
+         if ( !already) { // store it
+           tempo[fMulTrack] = newprimary ; 
+           fMulTrack++ ;
+         } // store it
+       } // all primaries in digit
+       delete [] newprimaryarray ; 
+      }
     }
   } // all digits