ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2006, 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.                  *
 **************************************************************************/

/////////////////////////////////////////////////////////////
//
// class used to extract and store reco info of calo cluster
//
// Author: H-S. Zhu, hongsheng.zhu@cern.ch
//                   hszhu@iopp.ccnu.edu.cn
/////////////////////////////////////////////////////////////

#include <iostream>
#include <TParticle.h>

#include "AliStack.h"
#include "AliESDEvent.h"
#include "AliAODTrack.h"
#include "AliESDtrack.h"
#include "AliVCluster.h"
#include "AliAODCaloCluster.h"
#include "AliESDCaloCluster.h"
#include "AliCaloClusterInfo.h"

class TObject;

ClassImp(AliCaloClusterInfo) 

//-------------------------------------------------------------------------------------------
AliCaloClusterInfo::AliCaloClusterInfo():
  TObject(), fLorentzVector(), fModule(0), fTRUNumber(0), fNCells(0), fPIDBit(0x0),
  fLabels(0), fDistToBad(0.), fM02(0.), fM20(0.), fTOF(0.)
{
  //
  // Default constructor
  //
} 

//-------------------------------------------------------------------------------------------
AliCaloClusterInfo::AliCaloClusterInfo(AliVCluster* const clust, Int_t relID[4]):
  TObject(), fLorentzVector(), fModule(0), fTRUNumber(0), fNCells(0), fPIDBit(0x0),
  fLabels(0), fDistToBad(0.), fM02(0.), fM20(0.), fTOF(0.)
{
  //
  // constructor
  //
  this->FillCaloClusterInfo(clust, relID);
} 

//-------------------------------------------------------------------------------------------
AliCaloClusterInfo::AliCaloClusterInfo(const AliCaloClusterInfo &src):
  TObject(src), fLorentzVector(src.fLorentzVector), fModule(src.fModule), fTRUNumber(src.fTRUNumber),fNCells(src.fNCells), fPIDBit(src.fPIDBit),
  fLabels(src.fLabels), fDistToBad(src.fDistToBad), fM02(src.fM02), fM20(src.fM20), fTOF(src.fTOF)
{
  //
  // copy constructor
  //
} 

//-------------------------------------------------------------------------------------------
AliCaloClusterInfo& AliCaloClusterInfo::operator=(const AliCaloClusterInfo &src)
{
  //
  // assignment constructor
  //
  if(&src==this) return *this;

  fLorentzVector   = src.fLorentzVector;
  fModule          = src.fModule;
  fTRUNumber       = src.fTRUNumber;
  fNCells          = src.fNCells;
  fPIDBit          = src.fPIDBit;
  fLabels          = src.fLabels;
  fDistToBad       = src.fDistToBad;
  fM02             = src.fM02;
  fM20             = src.fM20;
  fTOF             = src.fTOF;

  return *this;
} 

//-------------------------------------------------------------------------------------------
AliCaloClusterInfo::~AliCaloClusterInfo()
{
  //
  // destructor
  //
}

//-----------------------------------------------------------------------------
void AliCaloClusterInfo::FillCaloClusterInfo(AliVCluster* const clust, Int_t relID[4])
{
  // extract information of calo clusters

  fModule         = relID[0];
  fTRUNumber      = GetTRUNumber(relID[2], relID[3]);
  fNCells         = clust->GetNCells();
  fDistToBad      = clust->GetDistanceToBadChannel();
  fM02            = clust->GetM02();
  fM20            = clust->GetM20();
  fTOF            = clust->GetTOF();

  Double_t cpv  = clust->GetEmcCpvDistance(); // Distance in sigmas filled by tender
  Double_t disp = TestDisp();                 // Dispersion in sigmas filled by tender
  if (cpv  > 2.)      this->SetPIDBit(BIT(0));
  if (cpv  > 4.)      this->SetPIDBit(BIT(2));
  if (disp < 2.5*2.5) this->SetPIDBit(BIT(1));
  if (disp < 1.5*1.5) this->SetPIDBit(BIT(3));

  return;
}

//-----------------------------------------------------------------------------
Bool_t AliCaloClusterInfo::IsInFiducialRegion(Int_t cellX, Int_t cellZ)
{
  const Int_t edgeX = 2;
  const Int_t edgeZ = 2;
  if (cellX >edgeX && cellX<(65-edgeX) && cellZ>edgeZ && cellZ <(57-edgeZ)) return kTRUE;

  return kFALSE;
}

//-----------------------------------------------------------------------------
Bool_t AliCaloClusterInfo::IsMergedClusterFromPi0(AliStack* const stack, Int_t &pi0Indx)
{
  pi0Indx = -1;
  if (GetNLabels()>1) {
    Int_t pi0Indx1 = -1, pi0Indx2 = -2;
    if (IsClusterFromPi0(stack, GetLabelAt(0), pi0Indx1) &&
        IsClusterFromPi0(stack, GetLabelAt(1), pi0Indx2) && pi0Indx1 == pi0Indx2) {
      pi0Indx = pi0Indx1;
      return kTRUE;
    } else return kFALSE;
  } else return kFALSE;
}

//-----------------------------------------------------------------------------
Bool_t AliCaloClusterInfo::IsClusterFromCvtedPi0(AliStack* const stack, Bool_t &isConverted, Int_t &pi0Indx)
{

  if (IsClusterFromPi0Pure(stack, GetLabel(), pi0Indx))
    return kTRUE;
  else { 
    isConverted = IsClusterFromPi0Converted(stack, GetLabel(), pi0Indx);
    if (isConverted) return kTRUE;
    else return kFALSE;
  }
}

//-----------------------------------------------------------------------------
Bool_t AliCaloClusterInfo::IsClusterFromPi0(AliStack* const stack, Int_t label, Int_t &pi0Indx)
{
  if (IsClusterFromPi0Pure(stack, label, pi0Indx))
    return kTRUE;
  else if (IsClusterFromPi0Converted(stack, label, pi0Indx)) 
    return kTRUE;
  else return kFALSE;
}

//-----------------------------------------------------------------------------
Bool_t AliCaloClusterInfo::IsClusterFromPi0Pure(AliStack* const stack, Int_t label, Int_t &pi0Indx)
{
  if (label>-1) {
    TParticle* track = stack->Particle(label);
    if (track->GetPdgCode() == 22) {
      pi0Indx = track->GetFirstMother();
      if (pi0Indx>-1 && ((TParticle*)stack->Particle(pi0Indx))->GetPdgCode() == 111)
        return kTRUE;
      else return kFALSE;
    }
    else return kFALSE;
  } else return kFALSE;
}

//-----------------------------------------------------------------------------
Bool_t AliCaloClusterInfo::IsClusterFromPi0Converted(AliStack* const stack, Int_t label, Int_t &pi0Indx)
{
  if (label>-1) {
    TParticle* track = stack->Particle(label);
    if (TMath::Abs(track->GetPdgCode()) == 11)
      if (track->GetFirstMother()>-1 && ((TParticle*)stack->Particle(track->GetFirstMother()))->GetPdgCode() == 22) {
        TParticle *gamma = stack->Particle(track->GetFirstMother());
        pi0Indx = gamma->GetFirstMother();
        if (pi0Indx>-1 && ((TParticle*)stack->Particle(pi0Indx))->GetPdgCode() == 111) {
          Int_t e1 = gamma->GetFirstDaughter();
          Int_t e2 = gamma->GetLastDaughter();
          if (label == (((TParticle*)stack->Particle(e1))->Pt()>((TParticle*)stack->Particle(e2))->Pt() ? e1 : e2))
            return kTRUE;
          else return kFALSE;
        } else return kFALSE;
      } else return kFALSE;
    else return kFALSE;
  } else return kFALSE;
}

//-----------------------------------------------------------------------------
Double_t AliCaloClusterInfo::TestDisp()
{
  Double_t pt = fLorentzVector.E();
  Double_t l0 = fM02;
  Double_t l1 = fM20;

  Double_t l0Mean  = 1.53126+9.50835e+06/(1.+1.08728e+07*pt+1.73420e+06*pt*pt);
  Double_t l1Mean  = 1.12365+0.123770*TMath::Exp(-pt*0.246551)+5.30000e-03*pt;
  Double_t l0Sigma = 6.48260e-02+7.60261e+10/(1.+1.53012e+11*pt+5.01265e+05*pt*pt)+9.00000e-03*pt;
  Double_t l1Sigma = 4.44719e-04+6.99839e-01/(1.+1.22497e+00*pt+6.78604e-07*pt*pt)+9.00000e-03*pt;
  Double_t c       =-0.35-0.550*TMath::Exp(-0.390730*pt);
  Double_t R2      = 0.5*(l1-l1Mean)*(l1-l1Mean)/l1Sigma/l1Sigma +
                     0.5*(l0-l0Mean)*(l0-l0Mean)/l0Sigma/l0Sigma +
                     0.5*c*(l1-l1Mean)*(l0-l0Mean)/l1Sigma/l0Sigma;

  return R2;
}

//-----------------------------------------------------------------------------
Int_t AliCaloClusterInfo::GetTRUNumber(Int_t cellX, Int_t cellZ)
{
  // Return TRU region number for given cell.
  // cellX: [1-64], cellZ: [1-56]
  
  // RCU0: TRU 1,2
  if (0<cellX && cellX<17) {
    if (0<cellZ && cellZ<29) return 2;
    else                     return 1;
  }

  // RCU1: TRU 3,4
  if (16<cellX && cellX<33) {
    if (0<cellZ && cellZ<29) return 4;
    else                     return 3;
  }

  // RCU2: TRU 5,6
  if (32<cellX && cellX<49) {
    if (0<cellZ && cellZ<29) return 6;
    else                     return 5;
  }

  // RCU3: TRU 7,8
  if (48<cellX && cellX<65) {
    if (0<cellZ && cellZ<29) return 8;
    else                     return 7;
  }

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