ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

//_________________________________________________________________________
//  AliESDCaloCluster extension for PHOS to recalculate cluster 
//  parameters in case of recalibration.
//*--
//*-- Author: Dmitri Peressounko (RRC KI)


// --- ROOT system ---
#include "TVector3.h"
#include "TMath.h"

// --- Standard library ---

// --- AliRoot header files ---
#include "AliLog.h" 
#include "AliPHOSGeometry.h" 
#include "AliPHOSPIDv1.h" 
#include "AliPHOSReconstructor.h"
#include "AliPHOSEsdCluster.h" 
#include "AliPHOSCalibData.h"
#include "AliESDCaloCells.h"

ClassImp(AliPHOSEsdCluster)

//____________________________________________________________________________
AliPHOSEsdCluster::AliPHOSEsdCluster() : 
  AliESDCaloCluster(),fRecalibrated(0)
{
  // ctor
}
//____________________________________________________________________________
AliPHOSEsdCluster::AliPHOSEsdCluster(const AliESDCaloCluster & clu) : 
  AliESDCaloCluster(clu),fRecalibrated(0)
{
  // cpy ctor
}

//____________________________________________________________________________
AliPHOSEsdCluster::~AliPHOSEsdCluster()
{
  // dtor
}
//____________________________________________________________________________
void AliPHOSEsdCluster::Recalibrate(AliPHOSCalibData * calibData,AliESDCaloCells *phsCells){
  //If not done yet, apply recalibration coefficients to energies list
  //NOTE that after recalibration fCellsAmpFraction contains not FRACTION but FULL energy 
  
  if(fRecalibrated)
    return ;
  
  if(!calibData)
    return ;
  
  AliPHOSGeometry * phosgeom =  AliPHOSGeometry::GetInstance() ;
  if(!phosgeom)
    AliFatal("AliPHOSGeometry was not contructed\n") ;
  
  for(Int_t i=0; i<fNCells; i++){
    Int_t relId[4];
    phosgeom->AbsToRelNumbering(fCellsAbsId[i],relId) ;
    Int_t   module = relId[0];
    Int_t   column = relId[3];
    Int_t   row    = relId[2];
    Double_t energy = phsCells->GetCellAmplitude(fCellsAbsId[i]) ;
    fCellsAmpFraction[i]*=energy*calibData->GetADCchannelEmc(module,column,row);
  }
  
  fRecalibrated=kTRUE; 
}
//____________________________________________________________________________
void  AliPHOSEsdCluster::EvalAll(Float_t logWeight, TVector3 &vtx){
    //If recalibrated - recalculate all cluster parameters
  if(!fRecalibrated)
    return ;

  EvalEnergy() ; //Energy should be evaluated first
  EvalCoord(logWeight, vtx) ;
  
}
//____________________________________________________________________________
void AliPHOSEsdCluster::EvalEnergy(){
  if(!fRecalibrated) // no need to recalibrate
    return ;
    
  fEnergy=0. ;
  for(Int_t iDigit=0; iDigit<fNCells; iDigit++) {
    fEnergy+=fCellsAmpFraction[iDigit] ;
  }
  //Correct for nonlinearity later   
}
//____________________________________________________________________________
void AliPHOSEsdCluster::EnergyCorrection(){
  //apply nonlinearity correction 
  fEnergy = AliPHOSReconstructor::CorrectNonlinearity(fEnergy) ;
}
//____________________________________________________________________________
void AliPHOSEsdCluster::EvalPID(AliPHOSPIDv1 * /*pid*/){           
  //re-evaluate identification parameters
//  pid->CalculatePID(fEnergy,fDispersion,fEmcCpvDistance,tof,fPID) ;  
//  pid->CalculatePID(fEnergy,fDispersion,fM20,fM02,fEmcCpvDistance,tof,fPID) ;
}
//____________________________________________________________________________
void AliPHOSEsdCluster::EvalCoord(Float_t logWeight, TVector3 &vtx)
{
  // Calculates new center of gravity in the local PHOS-module coordinates 
  // and tranfers into global ALICE coordinates
  // Calculates Dispersion and main axis
  if(!fRecalibrated) // no need to recalibrate
    return ;
 
  Float_t wtot = 0. ;
  Int_t relid[4] ;
  Int_t phosMod=0 ;
  Float_t xMean = 0. ;
  Float_t zMean = 0. ;

  AliPHOSGeometry * phosgeom =  AliPHOSGeometry::GetInstance() ;
  if(!phosgeom)
    AliFatal("AliPHOSGeometry was not contructed\n") ;

  for(Int_t iDigit=0; iDigit<fNCells; iDigit++) {
    Float_t xi ;
    Float_t zi ;
    phosgeom->AbsToRelNumbering(fCellsAbsId[iDigit], relid) ;
    phosgeom->RelPosInModule(relid, xi, zi);
    phosMod=relid[0] ;
    Double_t ei=fCellsAmpFraction[iDigit] ;
    if (fEnergy>0 && ei>0) {
      Float_t w = TMath::Max( 0., logWeight + TMath::Log(ei/fEnergy) ) ;
      xMean+= xi * w ;
      zMean+= zi * w ;
      wtot += w ;
    }
    else
      AliError(Form("Wrong energy %f and/or amplitude %f\n", ei, fEnergy));
  }
  if (wtot>0) {
    xMean /= wtot ;
    zMean /= wtot ;
  }
  else
    AliError(Form("Wrong weight %f\n", wtot));


// Calculates the dispersion and second momenta
  Double_t d=0. ;
  Double_t dxx  = 0.;
  Double_t dzz  = 0.;
  Double_t dxz  = 0.;
  for(Int_t iDigit=0; iDigit < fNCells; iDigit++) {
    Float_t xi ;
    Float_t zi ;
    phosgeom->AbsToRelNumbering(fCellsAbsId[iDigit], relid) ;
    phosgeom->RelPosInModule(relid, xi, zi);
    Double_t ei=fCellsAmpFraction[iDigit] ;
    if (fEnergy>0 && ei>0) {
      Float_t w = TMath::Max( 0., logWeight + TMath::Log(ei/fEnergy) ) ;
      d += w*((xi-xMean)*(xi-xMean) + (zi-zMean)*(zi-zMean) ) ; 
      dxx  += w * xi * xi ;
      dzz  += w * zi * zi ;
      dxz  += w * xi * zi ; 
   }
    else
      AliError(Form("Wrong energy %f and/or amplitude %f\n", ei, fEnergy));
  }
  
  if (wtot>0) {
    d /= wtot ;
    dxx /= wtot ;
    dzz /= wtot ;
    dxz /= wtot ;
    dxx -= xMean * xMean ;
    dzz -= zMean * zMean ;
    dxz -= xMean * zMean ;
    fM02 =  0.5 * (dxx + dzz) + TMath::Sqrt( 0.25 * (dxx - dzz) * (dxx - dzz) + dxz * dxz )  ;
    fM20 =  0.5 * (dxx + dzz) - TMath::Sqrt( 0.25 * (dxx - dzz) * (dxx - dzz) + dxz * dxz )  ;
  }
  else{
    AliError(Form("Wrong weight %f\n", wtot));
    d=0. ;
    fM20=0. ;
    fM02=0. ;
  }

  if (d>=0)
    fDispersion = TMath::Sqrt(d) ;
  else    
    fDispersion = 0 ;


  // Correction for the depth of the shower starting point (TDR p 127)  
  Float_t para = 0.925 ; 
  Float_t parb = 6.52 ; 

  TVector3 vInc ;
  phosgeom->GetIncidentVector(vtx,phosMod,xMean,zMean,vInc) ;

  Float_t depthx = 0.; 
  Float_t depthz = 0.;
  if (fEnergy>0&&vInc.Y()!=0.) {
    depthx = ( para * TMath::Log(fEnergy) + parb ) * vInc.X()/TMath::Abs(vInc.Y()) ;
    depthz = ( para * TMath::Log(fEnergy) + parb ) * vInc.Z()/TMath::Abs(vInc.Y()) ;
  }
  else 
    AliError(Form("Wrong amplitude %f\n", fEnergy));

  xMean-= depthx  ;
  zMean-= depthz  ;

  //Go to the global system
  TVector3 gps ;
  phosgeom->Local2Global(phosMod, xMean, zMean, gps) ;
  fGlobalPos[0]=gps[0] ;
  fGlobalPos[1]=gps[1] ;  
  fGlobalPos[2]=gps[2] ;
}
 AliPHOSEsdCluster.cxx:1
 AliPHOSEsdCluster.cxx:2
 AliPHOSEsdCluster.cxx:3
 AliPHOSEsdCluster.cxx:4
 AliPHOSEsdCluster.cxx:5
 AliPHOSEsdCluster.cxx:6
 AliPHOSEsdCluster.cxx:7
 AliPHOSEsdCluster.cxx:8
 AliPHOSEsdCluster.cxx:9
 AliPHOSEsdCluster.cxx:10
 AliPHOSEsdCluster.cxx:11
 AliPHOSEsdCluster.cxx:12
 AliPHOSEsdCluster.cxx:13
 AliPHOSEsdCluster.cxx:14
 AliPHOSEsdCluster.cxx:15
 AliPHOSEsdCluster.cxx:16
 AliPHOSEsdCluster.cxx:17
 AliPHOSEsdCluster.cxx:18
 AliPHOSEsdCluster.cxx:19
 AliPHOSEsdCluster.cxx:20
 AliPHOSEsdCluster.cxx:21
 AliPHOSEsdCluster.cxx:22
 AliPHOSEsdCluster.cxx:23
 AliPHOSEsdCluster.cxx:24
 AliPHOSEsdCluster.cxx:25
 AliPHOSEsdCluster.cxx:26
 AliPHOSEsdCluster.cxx:27
 AliPHOSEsdCluster.cxx:28
 AliPHOSEsdCluster.cxx:29
 AliPHOSEsdCluster.cxx:30
 AliPHOSEsdCluster.cxx:31
 AliPHOSEsdCluster.cxx:32
 AliPHOSEsdCluster.cxx:33
 AliPHOSEsdCluster.cxx:34
 AliPHOSEsdCluster.cxx:35
 AliPHOSEsdCluster.cxx:36
 AliPHOSEsdCluster.cxx:37
 AliPHOSEsdCluster.cxx:38
 AliPHOSEsdCluster.cxx:39
 AliPHOSEsdCluster.cxx:40
 AliPHOSEsdCluster.cxx:41
 AliPHOSEsdCluster.cxx:42
 AliPHOSEsdCluster.cxx:43
 AliPHOSEsdCluster.cxx:44
 AliPHOSEsdCluster.cxx:45
 AliPHOSEsdCluster.cxx:46
 AliPHOSEsdCluster.cxx:47
 AliPHOSEsdCluster.cxx:48
 AliPHOSEsdCluster.cxx:49
 AliPHOSEsdCluster.cxx:50
 AliPHOSEsdCluster.cxx:51
 AliPHOSEsdCluster.cxx:52
 AliPHOSEsdCluster.cxx:53
 AliPHOSEsdCluster.cxx:54
 AliPHOSEsdCluster.cxx:55
 AliPHOSEsdCluster.cxx:56
 AliPHOSEsdCluster.cxx:57
 AliPHOSEsdCluster.cxx:58
 AliPHOSEsdCluster.cxx:59
 AliPHOSEsdCluster.cxx:60
 AliPHOSEsdCluster.cxx:61
 AliPHOSEsdCluster.cxx:62
 AliPHOSEsdCluster.cxx:63
 AliPHOSEsdCluster.cxx:64
 AliPHOSEsdCluster.cxx:65
 AliPHOSEsdCluster.cxx:66
 AliPHOSEsdCluster.cxx:67
 AliPHOSEsdCluster.cxx:68
 AliPHOSEsdCluster.cxx:69
 AliPHOSEsdCluster.cxx:70
 AliPHOSEsdCluster.cxx:71
 AliPHOSEsdCluster.cxx:72
 AliPHOSEsdCluster.cxx:73
 AliPHOSEsdCluster.cxx:74
 AliPHOSEsdCluster.cxx:75
 AliPHOSEsdCluster.cxx:76
 AliPHOSEsdCluster.cxx:77
 AliPHOSEsdCluster.cxx:78
 AliPHOSEsdCluster.cxx:79
 AliPHOSEsdCluster.cxx:80
 AliPHOSEsdCluster.cxx:81
 AliPHOSEsdCluster.cxx:82
 AliPHOSEsdCluster.cxx:83
 AliPHOSEsdCluster.cxx:84
 AliPHOSEsdCluster.cxx:85
 AliPHOSEsdCluster.cxx:86
 AliPHOSEsdCluster.cxx:87
 AliPHOSEsdCluster.cxx:88
 AliPHOSEsdCluster.cxx:89
 AliPHOSEsdCluster.cxx:90
 AliPHOSEsdCluster.cxx:91
 AliPHOSEsdCluster.cxx:92
 AliPHOSEsdCluster.cxx:93
 AliPHOSEsdCluster.cxx:94
 AliPHOSEsdCluster.cxx:95
 AliPHOSEsdCluster.cxx:96
 AliPHOSEsdCluster.cxx:97
 AliPHOSEsdCluster.cxx:98
 AliPHOSEsdCluster.cxx:99
 AliPHOSEsdCluster.cxx:100
 AliPHOSEsdCluster.cxx:101
 AliPHOSEsdCluster.cxx:102
 AliPHOSEsdCluster.cxx:103
 AliPHOSEsdCluster.cxx:104
 AliPHOSEsdCluster.cxx:105
 AliPHOSEsdCluster.cxx:106
 AliPHOSEsdCluster.cxx:107
 AliPHOSEsdCluster.cxx:108
 AliPHOSEsdCluster.cxx:109
 AliPHOSEsdCluster.cxx:110
 AliPHOSEsdCluster.cxx:111
 AliPHOSEsdCluster.cxx:112
 AliPHOSEsdCluster.cxx:113
 AliPHOSEsdCluster.cxx:114
 AliPHOSEsdCluster.cxx:115
 AliPHOSEsdCluster.cxx:116
 AliPHOSEsdCluster.cxx:117
 AliPHOSEsdCluster.cxx:118
 AliPHOSEsdCluster.cxx:119
 AliPHOSEsdCluster.cxx:120
 AliPHOSEsdCluster.cxx:121
 AliPHOSEsdCluster.cxx:122
 AliPHOSEsdCluster.cxx:123
 AliPHOSEsdCluster.cxx:124
 AliPHOSEsdCluster.cxx:125
 AliPHOSEsdCluster.cxx:126
 AliPHOSEsdCluster.cxx:127
 AliPHOSEsdCluster.cxx:128
 AliPHOSEsdCluster.cxx:129
 AliPHOSEsdCluster.cxx:130
 AliPHOSEsdCluster.cxx:131
 AliPHOSEsdCluster.cxx:132
 AliPHOSEsdCluster.cxx:133
 AliPHOSEsdCluster.cxx:134
 AliPHOSEsdCluster.cxx:135
 AliPHOSEsdCluster.cxx:136
 AliPHOSEsdCluster.cxx:137
 AliPHOSEsdCluster.cxx:138
 AliPHOSEsdCluster.cxx:139
 AliPHOSEsdCluster.cxx:140
 AliPHOSEsdCluster.cxx:141
 AliPHOSEsdCluster.cxx:142
 AliPHOSEsdCluster.cxx:143
 AliPHOSEsdCluster.cxx:144
 AliPHOSEsdCluster.cxx:145
 AliPHOSEsdCluster.cxx:146
 AliPHOSEsdCluster.cxx:147
 AliPHOSEsdCluster.cxx:148
 AliPHOSEsdCluster.cxx:149
 AliPHOSEsdCluster.cxx:150
 AliPHOSEsdCluster.cxx:151
 AliPHOSEsdCluster.cxx:152
 AliPHOSEsdCluster.cxx:153
 AliPHOSEsdCluster.cxx:154
 AliPHOSEsdCluster.cxx:155
 AliPHOSEsdCluster.cxx:156
 AliPHOSEsdCluster.cxx:157
 AliPHOSEsdCluster.cxx:158
 AliPHOSEsdCluster.cxx:159
 AliPHOSEsdCluster.cxx:160
 AliPHOSEsdCluster.cxx:161
 AliPHOSEsdCluster.cxx:162
 AliPHOSEsdCluster.cxx:163
 AliPHOSEsdCluster.cxx:164
 AliPHOSEsdCluster.cxx:165
 AliPHOSEsdCluster.cxx:166
 AliPHOSEsdCluster.cxx:167
 AliPHOSEsdCluster.cxx:168
 AliPHOSEsdCluster.cxx:169
 AliPHOSEsdCluster.cxx:170
 AliPHOSEsdCluster.cxx:171
 AliPHOSEsdCluster.cxx:172
 AliPHOSEsdCluster.cxx:173
 AliPHOSEsdCluster.cxx:174
 AliPHOSEsdCluster.cxx:175
 AliPHOSEsdCluster.cxx:176
 AliPHOSEsdCluster.cxx:177
 AliPHOSEsdCluster.cxx:178
 AliPHOSEsdCluster.cxx:179
 AliPHOSEsdCluster.cxx:180
 AliPHOSEsdCluster.cxx:181
 AliPHOSEsdCluster.cxx:182
 AliPHOSEsdCluster.cxx:183
 AliPHOSEsdCluster.cxx:184
 AliPHOSEsdCluster.cxx:185
 AliPHOSEsdCluster.cxx:186
 AliPHOSEsdCluster.cxx:187
 AliPHOSEsdCluster.cxx:188
 AliPHOSEsdCluster.cxx:189
 AliPHOSEsdCluster.cxx:190
 AliPHOSEsdCluster.cxx:191
 AliPHOSEsdCluster.cxx:192
 AliPHOSEsdCluster.cxx:193
 AliPHOSEsdCluster.cxx:194
 AliPHOSEsdCluster.cxx:195
 AliPHOSEsdCluster.cxx:196
 AliPHOSEsdCluster.cxx:197
 AliPHOSEsdCluster.cxx:198
 AliPHOSEsdCluster.cxx:199
 AliPHOSEsdCluster.cxx:200
 AliPHOSEsdCluster.cxx:201
 AliPHOSEsdCluster.cxx:202
 AliPHOSEsdCluster.cxx:203
 AliPHOSEsdCluster.cxx:204
 AliPHOSEsdCluster.cxx:205
 AliPHOSEsdCluster.cxx:206
 AliPHOSEsdCluster.cxx:207
 AliPHOSEsdCluster.cxx:208
 AliPHOSEsdCluster.cxx:209
 AliPHOSEsdCluster.cxx:210
 AliPHOSEsdCluster.cxx:211
 AliPHOSEsdCluster.cxx:212
 AliPHOSEsdCluster.cxx:213
 AliPHOSEsdCluster.cxx:214
 AliPHOSEsdCluster.cxx:215
 AliPHOSEsdCluster.cxx:216
 AliPHOSEsdCluster.cxx:217
 AliPHOSEsdCluster.cxx:218
 AliPHOSEsdCluster.cxx:219
 AliPHOSEsdCluster.cxx:220
 AliPHOSEsdCluster.cxx:221
 AliPHOSEsdCluster.cxx:222
 AliPHOSEsdCluster.cxx:223
 AliPHOSEsdCluster.cxx:224
 AliPHOSEsdCluster.cxx:225
 AliPHOSEsdCluster.cxx:226
 AliPHOSEsdCluster.cxx:227
 AliPHOSEsdCluster.cxx:228
 AliPHOSEsdCluster.cxx:229
 AliPHOSEsdCluster.cxx:230
 AliPHOSEsdCluster.cxx:231