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.                  *
 **************************************************************************/

//_________________________________________________________________________
//  AliAODCaloCluster 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 "AliPHOSAodCluster.h" 
#include "AliPHOSCalibData.h"
#include "AliAODCaloCells.h"

ClassImp(AliPHOSAodCluster)

//____________________________________________________________________________
AliPHOSAodCluster::AliPHOSAodCluster() : 
  AliAODCaloCluster(),fRecalibrated(0)
{
  // ctor
}
//____________________________________________________________________________
AliPHOSAodCluster::AliPHOSAodCluster(const AliAODCaloCluster & clu) : 
  AliAODCaloCluster(clu),fRecalibrated(0)
{
  // cpy ctor
}

//____________________________________________________________________________
AliPHOSAodCluster::~AliPHOSAodCluster()
{
  // dtor
}
//____________________________________________________________________________
void AliPHOSAodCluster::Recalibrate(AliPHOSCalibData * calibData,AliAODCaloCells *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") ;
	
  Double32_t * cellsAmpFraction = GetCellsAmplitudeFraction(); 
	
  for(Int_t i=0; i < GetNCells(); i++){
    Int_t relId[4];
    phosgeom->AbsToRelNumbering(GetCellAbsId(i),relId) ;
    Int_t   module = relId[0];
    Int_t   column = relId[3];
    Int_t   row    = relId[2];
    Double_t energy = phsCells->GetCellAmplitude(GetCellAbsId(i)) ;
    cellsAmpFraction[i]*=energy*calibData->GetADCchannelEmc(module,column,row);
  }
	
  SetCellsAmplitudeFraction(cellsAmpFraction);
  fRecalibrated=kTRUE; 
}
//____________________________________________________________________________
void  AliPHOSAodCluster::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 AliPHOSAodCluster::EvalEnergy(){
  if(!fRecalibrated) // no need to recalibrate
    return ;
    
  Float_t energy=0. ;
  for(Int_t iDigit=0; iDigit < GetNCells(); iDigit++) {
    energy+=GetCellAmplitudeFraction(iDigit) ;
  }
  
  SetE(energy);
  //Correct for nonlinearity later
   
}
//____________________________________________________________________________
void AliPHOSAodCluster::EnergyCorrection(){
  //apply nonlinearity correction same as in AliPHOSPIDv1.
  SetE(AliPHOSReconstructor::CorrectNonlinearity(E())) ;
}
//____________________________________________________________________________
void AliPHOSAodCluster::EvalPID(AliPHOSPIDv1 * /*pid*/){           
  //re-evaluate identification parameters
//  pid->CalculatePID(E(),GetDispersion(),GetEmcCpvDistance(),GetTOF(),GetPID()) ;  
//  pid->CalculatePID(E(),GetDispersion(),GetM20(),GetM02(),GetEmcCpvDistance(),GetTOF(),GetPID()) ;
}
//____________________________________________________________________________
void AliPHOSAodCluster::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 < GetNCells(); iDigit++) {
    Float_t xi ;
    Float_t zi ;
    phosgeom->AbsToRelNumbering(GetCellAbsId(iDigit), relid) ;
    phosgeom->RelPosInModule(relid, xi, zi);
    phosMod=relid[0] ;
    Double_t ei=GetCellAmplitudeFraction(iDigit) ;
    if (E() > 0 && ei > 0) {
      Float_t w = TMath::Max( 0., logWeight + TMath::Log(ei/E()) ) ;
      xMean+= xi * w ;
      zMean+= zi * w ;
      wtot += w ;
    }
    else
      AliError(Form("Wrong energy %f and/or amplitude %f\n", ei, E()));
  }
  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 < GetNCells(); iDigit++) {
    Float_t xi ;
    Float_t zi ;
    phosgeom->AbsToRelNumbering(GetCellAbsId(iDigit), relid) ;
    phosgeom->RelPosInModule(relid, xi, zi);
    Double_t ei=GetCellAmplitudeFraction(iDigit) ;
    if (E() > 0 && ei > 0) {
      Float_t w = TMath::Max( 0., logWeight + TMath::Log(ei/E()) ) ;
      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, E()));
  }
  
  if (wtot>0) {
    d /= wtot ;
    dxx /= wtot ;
    dzz /= wtot ;
    dxz /= wtot ;
    dxx -= xMean * xMean ;
    dzz -= zMean * zMean ;
    dxz -= xMean * zMean ;
    SetM02(0.5 * (dxx + dzz) + TMath::Sqrt( 0.25 * (dxx - dzz) * (dxx - dzz) + dxz * dxz )) ;
    SetM20(0.5 * (dxx + dzz) - TMath::Sqrt( 0.25 * (dxx - dzz) * (dxx - dzz) + dxz * dxz ));
  }
  else{
    AliError(Form("Wrong weight %f\n", wtot));
    d=0. ;
    SetM20(0.) ;
    SetM02(0.) ;
  }

  if (d>=0)
    SetDispersion(TMath::Sqrt(d)) ;
  else    
    SetDispersion(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 (E()>0&&vInc.Y()!=0.) {
    depthx = ( para * TMath::Log(E()) + parb ) * vInc.X()/TMath::Abs(vInc.Y()) ;
    depthz = ( para * TMath::Log(E()) + parb ) * vInc.Z()/TMath::Abs(vInc.Y()) ;
  }
  else 
    AliError(Form("Wrong amplitude %f\n", E()));

  xMean-= depthx  ;
  zMean-= depthz  ;

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