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


////////////////////////////////////////////////
// Class to handle pairs of tracks
// Useful for resonance analysis
// Derives from AliVParticle => 
// usable in Correction Framework
////////////////////////////////////////////////
// author : renaud.vernet@cern.ch
////////////////////////////////////////////////

#include "AliCFPair.h"
#include "AliESDtrack.h"
#include "AliESDv0.h"
#include "AliESDEvent.h"
#include "TMath.h"
#include "AliAODv0.h"

ClassImp(AliCFPair)

AliCFPair::AliCFPair(AliVParticle* t1, AliVParticle* t2) :
  AliVParticle(),
  fIsV0(0),
  fTrackNeg(t1),
  fTrackPos(t2),
  fESDV0(0x0),
  fAODV0(0x0),
  fLabel(-1),
  fV0PDG(0),
  fMassNeg(0.),
  fMassPos(0.)
{
  //  
  // 2-track ctor
  //
}
AliCFPair::AliCFPair(AliESDv0* v0, AliESDEvent* esd) :
  AliVParticle(),
  fIsV0(1),
  fTrackNeg(esd->GetTrack(v0->GetNindex())),
  fTrackPos(esd->GetTrack(v0->GetPindex())),
  fESDV0(v0),
  fAODV0(0x0),
  fLabel(-1),
  fV0PDG(0),
  fMassNeg(0.),
  fMassPos(0.)
{
  //  
  // V0 ctor
  //
}
AliCFPair::AliCFPair(AliAODv0* v0) :
  AliVParticle(),
  fIsV0(1),
  fTrackNeg((AliVParticle*)v0->GetSecondaryVtx()->GetDaughter(1)),
  fTrackPos((AliVParticle*)v0->GetSecondaryVtx()->GetDaughter(0)),
  fESDV0(0x0),
  fAODV0(v0),
  fLabel(-1),
  fV0PDG(0),
  fMassNeg(0.),
  fMassPos(0.)
{
  //  
  // V0 ctor
  //
}
AliCFPair::AliCFPair(const AliCFPair& c) :
  AliVParticle(c),
  fIsV0(c.fIsV0),
  fTrackNeg(c.fTrackNeg),
  fTrackPos(c.fTrackPos),
  fESDV0(c.fESDV0),
  fAODV0(c.fAODV0),
  fLabel(c.fLabel),
  fV0PDG(c.fV0PDG),
  fMassNeg(c.fMassNeg),
  fMassPos(c.fMassPos)
{
  // 
  // Copy constructor.
  // 
}
AliCFPair& AliCFPair::operator=(const AliCFPair& c) {
  // 
  // assignment operator.
  // 
  
  if (this!=&c) {
    AliVParticle::operator=(c);
    fIsV0 = c.fIsV0;
    fTrackNeg = c.fTrackNeg ;
    fTrackPos = c.fTrackPos ;
    fESDV0 = c.fESDV0 ;
    fAODV0 = c.fAODV0 ;
    fLabel = c.fLabel ;
    fV0PDG = c.fV0PDG ;
    fMassNeg = c.fMassNeg ;
    fMassPos = c.fMassPos;
  }
  return *this;
}
Bool_t AliCFPair::PxPyPz(Double_t p[3]) const {
  //
  // sets pair total momentum in vector p
  //
  if (fIsV0) {
    if      (fESDV0) fESDV0->GetPxPyPz(p[0],p[1],p[2]);
    else if (fAODV0) fAODV0->PxPyPz(p);
    else Error("PxPyPz","Pointer to V0 not found");
  }
  else if (fTrackNeg && fTrackPos) {
    p[0]=fTrackNeg->Px()+fTrackPos->Px();
    p[1]=fTrackNeg->Py()+fTrackPos->Py();
    p[2]=fTrackNeg->Pz()+fTrackPos->Pz();
  }
  else Error("PxPyPz","Could not find V0 nor track pointers");
  return kTRUE;
}

Double32_t AliCFPair::P() const {
  //
  // returns pair total momentum norm
  //
  Double32_t mom[3];
  PxPyPz(mom);
  return TMath::Sqrt(mom[0]*mom[0]+mom[1]*mom[1]+mom[2]*mom[2]);
}

Double32_t AliCFPair::Px() const {
  //
  // returns pair X-projected momentum
  //
  Double32_t mom[3];
  PxPyPz(mom);
  return mom[0];
}
Double32_t AliCFPair::Py() const {
  //
  // returns pair Y-projected momentum
  //
  Double32_t mom[3];
  PxPyPz(mom);
  return mom[1];
}
Double32_t AliCFPair::Pz() const {
  //
  // returns pair Z-projected momentum
  //
  Double32_t mom[3];
  PxPyPz(mom);
  return mom[2];
}
Double32_t AliCFPair::Pt() const {
  //
  // returns pair transverse (XY) momentum
  //
  Double32_t mom[3];
  PxPyPz(mom);
  return sqrt(mom[0]*mom[0]+mom[1]*mom[1]);
}
Double32_t AliCFPair::E() const {
  //
  // returns pair total energy according to ESD-calculated mass
  //
  Double32_t mom[3];
  PxPyPz(mom);
  Double32_t mass=M() ;
  return TMath::Sqrt(mass*mass + mom[0]*mom[0]+ mom[1]*mom[1]+ mom[2]*mom[2]);
}
Bool_t AliCFPair::XvYvZv(Double_t x[3]) const {
  //
  // sets pair position to x
  // since this class is designed for resonances, the assumed pair position
  // should be the same for both tracks. neg track position is kept here
  //
  
  if (fIsV0) {
    if      (fESDV0) fESDV0->GetXYZ(x[0],x[1],x[2]);
    else if (fAODV0) fAODV0->XvYvZv(x);
    else Error("PxPyPz","Pointer to V0 not found");
  }
  else if (fTrackNeg) fTrackNeg->PxPyPz(x);
  else Error("PxPyPz","Could not find V0 nor track pointers");

  return kTRUE;
}
Double32_t AliCFPair::Xv() const {
  //
  // returns pair X-projected position
  //
  Double32_t pos[3];
  XvYvZv(pos);
  return pos[0];
}
Double32_t AliCFPair::Yv() const {
  //
  // returns pair Y-projected position
  //
  Double32_t pos[3];
  XvYvZv(pos);
  return pos[1];
}
Double32_t AliCFPair::Zv() const {
  //
  // returns pair Z-projected position
  //
  Double32_t pos[3];
  XvYvZv(pos);
  return pos[2];
}
Double32_t AliCFPair::Phi() const {
  //
  // returns pair phi angle (in transverse plane)
  //
  return TMath::Pi()+TMath::ATan2(-Py(),-Px()); 
}
Double32_t AliCFPair::Theta() const { 
  //
  // returns pair theta angle (in YZ plane)
  //
  return (Pz()==0)?TMath::PiOver2():TMath::ACos(Pz()/P());
}
Double32_t AliCFPair::Eta() const {
  //
  // returns pair pseudo-rapidity
  //
  Double32_t pmom = P();
  Double32_t pz = Pz();
  if (pmom != TMath::Abs(pz)) return 0.5*TMath::Log((pmom+pz)/(pmom-pz));
  else                        return 999;
}
Double32_t AliCFPair::Y() const {
  //
  // returns pair rapidity
  //
  Double32_t e  = E();
  Double32_t pz = Pz();

  if (e == pz || e == -pz) {
    printf("GetRapidity : ERROR : rapidity for 4-vector with E = Pz -- infinite result");
    return 999;
  }
  if (e < pz) {
    printf("GetRapidity : ERROR : rapidity for 4-vector with E = Pz -- infinite result");
    return 999;
  }
  Double32_t y = 0.5 * log((e + pz) / (e - pz));
  return y;
} 
Double32_t AliCFPair::M() const {
  //
  // returns pair invariant mass
  // in case of a V0, returns the current mass hypothesis
  // otherwise returns ESD-calculated mass
  //

  Double32_t minv = 0. ;

  if (fIsV0) {
    if      (fESDV0) {
      fESDV0->ChangeMassHypothesis(fV0PDG);
      minv = (Double32_t)fESDV0->GetEffMass();
    }
    else if (fAODV0) {
      switch (fV0PDG) {
      case 310  : minv = fAODV0->MassK0Short()    ; break ;
      case 3122 : minv = fAODV0->MassLambda()     ; break ;
      case -3122: minv = fAODV0->MassAntiLambda() ; break ;
      default:    minv = -1.              ; break ;
      }
    }
    else Error("PxPyPz","Pointer to V0 not found");
  }
  else if (fTrackNeg && fTrackPos) {
    Double32_t p  = P() ;
    Double32_t e =0. ;
    if (fMassNeg==0. && fMassPos==0.) {
      e = fTrackNeg->E() + fTrackPos->E() ;
    }
    else {
      e = 
	TMath::Sqrt(TMath::Power(fTrackNeg->P(),2)+TMath::Power(fMassNeg,2)) + 
	TMath::Sqrt(TMath::Power(fTrackPos->P(),2)+TMath::Power(fMassPos,2)) ;
    }
    minv = TMath::Sqrt(e*e-p*p);
  }
  else Error("M","Could not find V0 nor track pointers");
  
  return minv ;
}
 AliCFPair.cxx:1
 AliCFPair.cxx:2
 AliCFPair.cxx:3
 AliCFPair.cxx:4
 AliCFPair.cxx:5
 AliCFPair.cxx:6
 AliCFPair.cxx:7
 AliCFPair.cxx:8
 AliCFPair.cxx:9
 AliCFPair.cxx:10
 AliCFPair.cxx:11
 AliCFPair.cxx:12
 AliCFPair.cxx:13
 AliCFPair.cxx:14
 AliCFPair.cxx:15
 AliCFPair.cxx:16
 AliCFPair.cxx:17
 AliCFPair.cxx:18
 AliCFPair.cxx:19
 AliCFPair.cxx:20
 AliCFPair.cxx:21
 AliCFPair.cxx:22
 AliCFPair.cxx:23
 AliCFPair.cxx:24
 AliCFPair.cxx:25
 AliCFPair.cxx:26
 AliCFPair.cxx:27
 AliCFPair.cxx:28
 AliCFPair.cxx:29
 AliCFPair.cxx:30
 AliCFPair.cxx:31
 AliCFPair.cxx:32
 AliCFPair.cxx:33
 AliCFPair.cxx:34
 AliCFPair.cxx:35
 AliCFPair.cxx:36
 AliCFPair.cxx:37
 AliCFPair.cxx:38
 AliCFPair.cxx:39
 AliCFPair.cxx:40
 AliCFPair.cxx:41
 AliCFPair.cxx:42
 AliCFPair.cxx:43
 AliCFPair.cxx:44
 AliCFPair.cxx:45
 AliCFPair.cxx:46
 AliCFPair.cxx:47
 AliCFPair.cxx:48
 AliCFPair.cxx:49
 AliCFPair.cxx:50
 AliCFPair.cxx:51
 AliCFPair.cxx:52
 AliCFPair.cxx:53
 AliCFPair.cxx:54
 AliCFPair.cxx:55
 AliCFPair.cxx:56
 AliCFPair.cxx:57
 AliCFPair.cxx:58
 AliCFPair.cxx:59
 AliCFPair.cxx:60
 AliCFPair.cxx:61
 AliCFPair.cxx:62
 AliCFPair.cxx:63
 AliCFPair.cxx:64
 AliCFPair.cxx:65
 AliCFPair.cxx:66
 AliCFPair.cxx:67
 AliCFPair.cxx:68
 AliCFPair.cxx:69
 AliCFPair.cxx:70
 AliCFPair.cxx:71
 AliCFPair.cxx:72
 AliCFPair.cxx:73
 AliCFPair.cxx:74
 AliCFPair.cxx:75
 AliCFPair.cxx:76
 AliCFPair.cxx:77
 AliCFPair.cxx:78
 AliCFPair.cxx:79
 AliCFPair.cxx:80
 AliCFPair.cxx:81
 AliCFPair.cxx:82
 AliCFPair.cxx:83
 AliCFPair.cxx:84
 AliCFPair.cxx:85
 AliCFPair.cxx:86
 AliCFPair.cxx:87
 AliCFPair.cxx:88
 AliCFPair.cxx:89
 AliCFPair.cxx:90
 AliCFPair.cxx:91
 AliCFPair.cxx:92
 AliCFPair.cxx:93
 AliCFPair.cxx:94
 AliCFPair.cxx:95
 AliCFPair.cxx:96
 AliCFPair.cxx:97
 AliCFPair.cxx:98
 AliCFPair.cxx:99
 AliCFPair.cxx:100
 AliCFPair.cxx:101
 AliCFPair.cxx:102
 AliCFPair.cxx:103
 AliCFPair.cxx:104
 AliCFPair.cxx:105
 AliCFPair.cxx:106
 AliCFPair.cxx:107
 AliCFPair.cxx:108
 AliCFPair.cxx:109
 AliCFPair.cxx:110
 AliCFPair.cxx:111
 AliCFPair.cxx:112
 AliCFPair.cxx:113
 AliCFPair.cxx:114
 AliCFPair.cxx:115
 AliCFPair.cxx:116
 AliCFPair.cxx:117
 AliCFPair.cxx:118
 AliCFPair.cxx:119
 AliCFPair.cxx:120
 AliCFPair.cxx:121
 AliCFPair.cxx:122
 AliCFPair.cxx:123
 AliCFPair.cxx:124
 AliCFPair.cxx:125
 AliCFPair.cxx:126
 AliCFPair.cxx:127
 AliCFPair.cxx:128
 AliCFPair.cxx:129
 AliCFPair.cxx:130
 AliCFPair.cxx:131
 AliCFPair.cxx:132
 AliCFPair.cxx:133
 AliCFPair.cxx:134
 AliCFPair.cxx:135
 AliCFPair.cxx:136
 AliCFPair.cxx:137
 AliCFPair.cxx:138
 AliCFPair.cxx:139
 AliCFPair.cxx:140
 AliCFPair.cxx:141
 AliCFPair.cxx:142
 AliCFPair.cxx:143
 AliCFPair.cxx:144
 AliCFPair.cxx:145
 AliCFPair.cxx:146
 AliCFPair.cxx:147
 AliCFPair.cxx:148
 AliCFPair.cxx:149
 AliCFPair.cxx:150
 AliCFPair.cxx:151
 AliCFPair.cxx:152
 AliCFPair.cxx:153
 AliCFPair.cxx:154
 AliCFPair.cxx:155
 AliCFPair.cxx:156
 AliCFPair.cxx:157
 AliCFPair.cxx:158
 AliCFPair.cxx:159
 AliCFPair.cxx:160
 AliCFPair.cxx:161
 AliCFPair.cxx:162
 AliCFPair.cxx:163
 AliCFPair.cxx:164
 AliCFPair.cxx:165
 AliCFPair.cxx:166
 AliCFPair.cxx:167
 AliCFPair.cxx:168
 AliCFPair.cxx:169
 AliCFPair.cxx:170
 AliCFPair.cxx:171
 AliCFPair.cxx:172
 AliCFPair.cxx:173
 AliCFPair.cxx:174
 AliCFPair.cxx:175
 AliCFPair.cxx:176
 AliCFPair.cxx:177
 AliCFPair.cxx:178
 AliCFPair.cxx:179
 AliCFPair.cxx:180
 AliCFPair.cxx:181
 AliCFPair.cxx:182
 AliCFPair.cxx:183
 AliCFPair.cxx:184
 AliCFPair.cxx:185
 AliCFPair.cxx:186
 AliCFPair.cxx:187
 AliCFPair.cxx:188
 AliCFPair.cxx:189
 AliCFPair.cxx:190
 AliCFPair.cxx:191
 AliCFPair.cxx:192
 AliCFPair.cxx:193
 AliCFPair.cxx:194
 AliCFPair.cxx:195
 AliCFPair.cxx:196
 AliCFPair.cxx:197
 AliCFPair.cxx:198
 AliCFPair.cxx:199
 AliCFPair.cxx:200
 AliCFPair.cxx:201
 AliCFPair.cxx:202
 AliCFPair.cxx:203
 AliCFPair.cxx:204
 AliCFPair.cxx:205
 AliCFPair.cxx:206
 AliCFPair.cxx:207
 AliCFPair.cxx:208
 AliCFPair.cxx:209
 AliCFPair.cxx:210
 AliCFPair.cxx:211
 AliCFPair.cxx:212
 AliCFPair.cxx:213
 AliCFPair.cxx:214
 AliCFPair.cxx:215
 AliCFPair.cxx:216
 AliCFPair.cxx:217
 AliCFPair.cxx:218
 AliCFPair.cxx:219
 AliCFPair.cxx:220
 AliCFPair.cxx:221
 AliCFPair.cxx:222
 AliCFPair.cxx:223
 AliCFPair.cxx:224
 AliCFPair.cxx:225
 AliCFPair.cxx:226
 AliCFPair.cxx:227
 AliCFPair.cxx:228
 AliCFPair.cxx:229
 AliCFPair.cxx:230
 AliCFPair.cxx:231
 AliCFPair.cxx:232
 AliCFPair.cxx:233
 AliCFPair.cxx:234
 AliCFPair.cxx:235
 AliCFPair.cxx:236
 AliCFPair.cxx:237
 AliCFPair.cxx:238
 AliCFPair.cxx:239
 AliCFPair.cxx:240
 AliCFPair.cxx:241
 AliCFPair.cxx:242
 AliCFPair.cxx:243
 AliCFPair.cxx:244
 AliCFPair.cxx:245
 AliCFPair.cxx:246
 AliCFPair.cxx:247
 AliCFPair.cxx:248
 AliCFPair.cxx:249
 AliCFPair.cxx:250
 AliCFPair.cxx:251
 AliCFPair.cxx:252
 AliCFPair.cxx:253
 AliCFPair.cxx:254
 AliCFPair.cxx:255
 AliCFPair.cxx:256
 AliCFPair.cxx:257
 AliCFPair.cxx:258
 AliCFPair.cxx:259
 AliCFPair.cxx:260
 AliCFPair.cxx:261
 AliCFPair.cxx:262
 AliCFPair.cxx:263
 AliCFPair.cxx:264
 AliCFPair.cxx:265
 AliCFPair.cxx:266
 AliCFPair.cxx:267
 AliCFPair.cxx:268
 AliCFPair.cxx:269
 AliCFPair.cxx:270
 AliCFPair.cxx:271
 AliCFPair.cxx:272
 AliCFPair.cxx:273
 AliCFPair.cxx:274
 AliCFPair.cxx:275
 AliCFPair.cxx:276
 AliCFPair.cxx:277
 AliCFPair.cxx:278
 AliCFPair.cxx:279
 AliCFPair.cxx:280
 AliCFPair.cxx:281
 AliCFPair.cxx:282
 AliCFPair.cxx:283
 AliCFPair.cxx:284
 AliCFPair.cxx:285
 AliCFPair.cxx:286
 AliCFPair.cxx:287
 AliCFPair.cxx:288
 AliCFPair.cxx:289
 AliCFPair.cxx:290
 AliCFPair.cxx:291
 AliCFPair.cxx:292
 AliCFPair.cxx:293
 AliCFPair.cxx:294
 AliCFPair.cxx:295
 AliCFPair.cxx:296
 AliCFPair.cxx:297
 AliCFPair.cxx:298
 AliCFPair.cxx:299
 AliCFPair.cxx:300
 AliCFPair.cxx:301
 AliCFPair.cxx:302
 AliCFPair.cxx:303
 AliCFPair.cxx:304
 AliCFPair.cxx:305
 AliCFPair.cxx:306