ROOT logo
#ifndef ALIDIELECTRONPAIR_H
#define ALIDIELECTRONPAIR_H
/* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

//#############################################################
//#                                                           # 
//#                  AliDielectronPair                        #
//#               Class to store pair information             #
//#                                                           #
//#                                                           #
//#  Authors:                                                 #
//#   Anton     Andronic, GSI / A.Andronic@gsi.de             #
//#   Ionut C.  Arsene,   GSI / I.C.Arsene@gsi.de             #
//#   Julian    Book,     Uni Ffm / Julian.Book@cern.ch       #
//#   Frederick Kramer,   Uni Ffm, / Frederick.Kramer@cern.ch #
//#   Magnus    Mager,    CERN / Magnus.Mager@cern.ch         #
//#   WooJin J. Park,     GSI / W.J.Park@gsi.de               #
//#   Jens      Wiechula, Uni HD / Jens.Wiechula@cern.ch      #
//#                                                           #
//#############################################################

#include <TMath.h>
#include <TRef.h>
#include <TLorentzVector.h>

#include <AliKFParticle.h>
#include <AliVParticle.h>
#include <AliVEvent.h>

class AliVVertex;
class AliVTrack;

//TODO
//TODO: Should we inherit from AliVTrack in order to built another AliDielectronPair of KF with it?
//TODO
class AliDielectronPair : public AliVParticle {
public:
  AliDielectronPair();
  virtual ~AliDielectronPair();
  
  AliDielectronPair(AliVTrack * const particle1, Int_t pid1,
                    AliVTrack * const particle2, Int_t pid2, Char_t type);

  AliDielectronPair(const AliKFParticle * const particle1,
                    const AliKFParticle * const particle2,
                    AliVTrack * const refParticle1,
                    AliVTrack * const refParticle2,
                    Char_t type);
  
//TODO:  copy constructor + assignment operator
  
  void SetTracks(AliVTrack * const particle1, Int_t pid1,
                 AliVTrack * const particle2, Int_t pid2);

  void SetGammaTracks(AliVTrack * const particle1, Int_t pid1,
		      AliVTrack * const particle2, Int_t pid2);


  void SetTracks(const AliKFParticle * const particle1,
                 const AliKFParticle * const particle2,
                 AliVTrack * const refParticle1,
                 AliVTrack * const refParticle2);
    
  //AliVParticle interface
  // kinematics
  virtual Double_t Px() const { return fPair.GetPx(); }
  virtual Double_t Py() const { return fPair.GetPy(); }
  virtual Double_t Pz() const { return fPair.GetPz(); }
  virtual Double_t Pt() const { return fPair.GetPt(); }
  virtual Double_t P() const  { return fPair.GetP();  }
  virtual Bool_t   PxPyPz(Double_t p[3]) const { p[0]=Px(); p[1]=Py(); p[2]=Pz(); return kTRUE; }
  
  virtual Double_t Xv() const { return fPair.GetX(); }
  virtual Double_t Yv() const { return fPair.GetY(); }
  virtual Double_t Zv() const { return fPair.GetZ(); }
  virtual Bool_t   XvYvZv(Double_t x[3]) const { x[0]=Xv(); x[1]=Yv(); x[2]=Zv(); return kTRUE; }
  
  virtual Double_t OneOverPt() const { return Pt()>0.?1./Pt():0.; }  //TODO: check
  virtual Double_t Phi()       const { return fPair.GetPhi();}
  virtual Double_t Theta()     const { return Pz()!=0?TMath::ATan(Pt()/Pz()):0.; } //TODO: check
  
  
  virtual Double_t E() const { return fPair.GetE();    }
  virtual Double_t M() const { return fPair.GetMass(); }
  
  virtual Double_t Eta() const { return fPair.GetEta();}
  virtual Double_t Y()  const  { 
    if((E()*E()-Px()*Px()-Py()*Py()-Pz()*Pz())>0.) return TLorentzVector(Px(),Py(),Pz(),E()).Rapidity();
    else return -1111.;
  }
  
  virtual Short_t Charge() const    { return fPair.GetQ();}
  virtual Int_t   GetLabel() const  { return fLabel;      }
  // PID
  virtual const Double_t *PID() const { return 0;} //TODO: check

  //
  // Double_t GetLXY(const AliVVertex * const vtx) const;
  // Double_t GetPseudoProperTime(const AliVVertex * const vtx) const;


  UChar_t GetType() const { return fType; }
  void SetType(Char_t type) { fType=type; }
  static void SetBeamEnergy(AliVEvent *ev, Double_t beamEbyHand=-1.);

  // MC information
  void SetLabel(Int_t label) {fLabel=label;}
  void SetPdgCode(Int_t pdgCode) { fPdgCode=pdgCode; }
  Int_t PdgCode() const {return fPdgCode;}

  void SetProductionVertex(const AliKFParticle &Vtx) { fPair.SetProductionVertex(Vtx); }
  
  //inter leg information
  Double_t GetKFChi2()            const { return fPair.GetChi2();                               }
  Int_t    GetKFNdf()             const { return fPair.GetNDF();                                }
  Double_t OpeningAngle()         const { return fD1.GetAngle(fD2);                             }
  Double_t DistanceDaughters()    const { return fD1.GetDistanceFromParticle(fD2);              }
  Double_t DistanceDaughtersXY()  const { return fD1.GetDistanceFromParticleXY(fD2);            }
  Double_t DeviationDaughters()   const { return fD1.GetDeviationFromParticle(fD2);             }
  Double_t DeviationDaughtersXY() const { return fD1.GetDeviationFromParticleXY(fD2);           }
  Double_t DeltaEta()             const { return TMath::Abs(fD1.GetEta()-fD2.GetEta());         }
//   Double_t DeltaPhi()             const { Double_t dphi=TMath::Abs(fD1.GetPhi()-fD2.GetPhi());
//                                           return (dphi>TMath::Pi())?dphi-TMath::Pi():dphi;      }
  Double_t DeltaPhi()             const { return fD1.GetAngleXY(fD2);     }

  // calculate cos(theta*) and phi* in HE and CS pictures
  void GetThetaPhiCM(Double_t &thetaHE, Double_t &phiHE, Double_t &thetaCS, Double_t &phiCS) const;
  

  Double_t ThetaPhiCM(Bool_t isHE, Bool_t isTheta) const;
  static Double_t ThetaPhiCM(const AliVParticle* d1, const AliVParticle* d2, 
			                       Bool_t isHE, Bool_t isTheta);

  Double_t PsiPair(Double_t MagField)const; //Angle cut w.r.t. to magnetic field
  Double_t PhivPair(Double_t MagField)const; //Angle of ee plane w.r.t. to magnetic field

  //Calculate the angle between ee decay plane and variables
  Double_t GetPairPlaneAngle(Double_t kv0CrpH2, Int_t VariNum) const;

  Double_t GetCosPointingAngle(const AliVVertex *primVtx) const;
  Double_t GetArmAlpha() const;
  Double_t GetArmPt()    const;
  void GetDCA(const AliVVertex *primVtx, Double_t d0z0[2]) const;

  // Calculate inner product of strong magnetic field and ee plane
  Double_t PairPlaneMagInnerProduct(Double_t ZDCrpH1) const;


  // internal KF particle
  const AliKFParticle& GetKFParticle()       const { return fPair; }
  const AliKFParticle& GetKFFirstDaughter()  const { return fD1;   }
  const AliKFParticle& GetKFSecondDaughter() const { return fD2;   }
  
  // daughter references
  void SetRefFirstDaughter(AliVParticle * const track)  {fRefD1 = track;}
  void SetRefSecondDaughter(AliVParticle * const track) {fRefD2 = track;}
  
  AliVParticle* GetFirstDaughterP()   const { return dynamic_cast<AliVParticle*>(fRefD1.GetObject()); }
  AliVParticle* GetSecondDaughterP()  const { return dynamic_cast<AliVParticle*>(fRefD2.GetObject()); }

  void SetKFUsage(Bool_t KFUsage) {fKFUsage = KFUsage;}
  Bool_t GetKFUsage() const {return fKFUsage;}


  
private:
  Char_t   fType;         // type of the pair e.g. like sign SE, unlike sign SE, ... see AliDielectron
  Int_t    fLabel;        // MC label
  Int_t    fPdgCode;      // pdg code in case it is a MC particle
  static Double_t fBeamEnergy; //!beam energy
  
  AliKFParticle fPair;   // KF particle internally used for pair calculation
  AliKFParticle fD1;     // KF particle first daughter
  AliKFParticle fD2;     // KF particle1 second daughter
  
  TRef fRefD1;           // Reference to first daughter
  TRef fRefD2;           // Reference to second daughter

  Bool_t fKFUsage;       // Use KF for vertexing
  
  ClassDef(AliDielectronPair,5)
};

#endif

 AliDielectronPair.h:1
 AliDielectronPair.h:2
 AliDielectronPair.h:3
 AliDielectronPair.h:4
 AliDielectronPair.h:5
 AliDielectronPair.h:6
 AliDielectronPair.h:7
 AliDielectronPair.h:8
 AliDielectronPair.h:9
 AliDielectronPair.h:10
 AliDielectronPair.h:11
 AliDielectronPair.h:12
 AliDielectronPair.h:13
 AliDielectronPair.h:14
 AliDielectronPair.h:15
 AliDielectronPair.h:16
 AliDielectronPair.h:17
 AliDielectronPair.h:18
 AliDielectronPair.h:19
 AliDielectronPair.h:20
 AliDielectronPair.h:21
 AliDielectronPair.h:22
 AliDielectronPair.h:23
 AliDielectronPair.h:24
 AliDielectronPair.h:25
 AliDielectronPair.h:26
 AliDielectronPair.h:27
 AliDielectronPair.h:28
 AliDielectronPair.h:29
 AliDielectronPair.h:30
 AliDielectronPair.h:31
 AliDielectronPair.h:32
 AliDielectronPair.h:33
 AliDielectronPair.h:34
 AliDielectronPair.h:35
 AliDielectronPair.h:36
 AliDielectronPair.h:37
 AliDielectronPair.h:38
 AliDielectronPair.h:39
 AliDielectronPair.h:40
 AliDielectronPair.h:41
 AliDielectronPair.h:42
 AliDielectronPair.h:43
 AliDielectronPair.h:44
 AliDielectronPair.h:45
 AliDielectronPair.h:46
 AliDielectronPair.h:47
 AliDielectronPair.h:48
 AliDielectronPair.h:49
 AliDielectronPair.h:50
 AliDielectronPair.h:51
 AliDielectronPair.h:52
 AliDielectronPair.h:53
 AliDielectronPair.h:54
 AliDielectronPair.h:55
 AliDielectronPair.h:56
 AliDielectronPair.h:57
 AliDielectronPair.h:58
 AliDielectronPair.h:59
 AliDielectronPair.h:60
 AliDielectronPair.h:61
 AliDielectronPair.h:62
 AliDielectronPair.h:63
 AliDielectronPair.h:64
 AliDielectronPair.h:65
 AliDielectronPair.h:66
 AliDielectronPair.h:67
 AliDielectronPair.h:68
 AliDielectronPair.h:69
 AliDielectronPair.h:70
 AliDielectronPair.h:71
 AliDielectronPair.h:72
 AliDielectronPair.h:73
 AliDielectronPair.h:74
 AliDielectronPair.h:75
 AliDielectronPair.h:76
 AliDielectronPair.h:77
 AliDielectronPair.h:78
 AliDielectronPair.h:79
 AliDielectronPair.h:80
 AliDielectronPair.h:81
 AliDielectronPair.h:82
 AliDielectronPair.h:83
 AliDielectronPair.h:84
 AliDielectronPair.h:85
 AliDielectronPair.h:86
 AliDielectronPair.h:87
 AliDielectronPair.h:88
 AliDielectronPair.h:89
 AliDielectronPair.h:90
 AliDielectronPair.h:91
 AliDielectronPair.h:92
 AliDielectronPair.h:93
 AliDielectronPair.h:94
 AliDielectronPair.h:95
 AliDielectronPair.h:96
 AliDielectronPair.h:97
 AliDielectronPair.h:98
 AliDielectronPair.h:99
 AliDielectronPair.h:100
 AliDielectronPair.h:101
 AliDielectronPair.h:102
 AliDielectronPair.h:103
 AliDielectronPair.h:104
 AliDielectronPair.h:105
 AliDielectronPair.h:106
 AliDielectronPair.h:107
 AliDielectronPair.h:108
 AliDielectronPair.h:109
 AliDielectronPair.h:110
 AliDielectronPair.h:111
 AliDielectronPair.h:112
 AliDielectronPair.h:113
 AliDielectronPair.h:114
 AliDielectronPair.h:115
 AliDielectronPair.h:116
 AliDielectronPair.h:117
 AliDielectronPair.h:118
 AliDielectronPair.h:119
 AliDielectronPair.h:120
 AliDielectronPair.h:121
 AliDielectronPair.h:122
 AliDielectronPair.h:123
 AliDielectronPair.h:124
 AliDielectronPair.h:125
 AliDielectronPair.h:126
 AliDielectronPair.h:127
 AliDielectronPair.h:128
 AliDielectronPair.h:129
 AliDielectronPair.h:130
 AliDielectronPair.h:131
 AliDielectronPair.h:132
 AliDielectronPair.h:133
 AliDielectronPair.h:134
 AliDielectronPair.h:135
 AliDielectronPair.h:136
 AliDielectronPair.h:137
 AliDielectronPair.h:138
 AliDielectronPair.h:139
 AliDielectronPair.h:140
 AliDielectronPair.h:141
 AliDielectronPair.h:142
 AliDielectronPair.h:143
 AliDielectronPair.h:144
 AliDielectronPair.h:145
 AliDielectronPair.h:146
 AliDielectronPair.h:147
 AliDielectronPair.h:148
 AliDielectronPair.h:149
 AliDielectronPair.h:150
 AliDielectronPair.h:151
 AliDielectronPair.h:152
 AliDielectronPair.h:153
 AliDielectronPair.h:154
 AliDielectronPair.h:155
 AliDielectronPair.h:156
 AliDielectronPair.h:157
 AliDielectronPair.h:158
 AliDielectronPair.h:159
 AliDielectronPair.h:160
 AliDielectronPair.h:161
 AliDielectronPair.h:162
 AliDielectronPair.h:163
 AliDielectronPair.h:164
 AliDielectronPair.h:165
 AliDielectronPair.h:166
 AliDielectronPair.h:167
 AliDielectronPair.h:168
 AliDielectronPair.h:169
 AliDielectronPair.h:170
 AliDielectronPair.h:171
 AliDielectronPair.h:172
 AliDielectronPair.h:173
 AliDielectronPair.h:174
 AliDielectronPair.h:175
 AliDielectronPair.h:176
 AliDielectronPair.h:177
 AliDielectronPair.h:178
 AliDielectronPair.h:179
 AliDielectronPair.h:180
 AliDielectronPair.h:181
 AliDielectronPair.h:182
 AliDielectronPair.h:183
 AliDielectronPair.h:184
 AliDielectronPair.h:185
 AliDielectronPair.h:186