//  
// Author: Sebastian Beumler <mailto: beumler@physik.hu-berlin.de>
// Update: $Id: Hep2BodyDecay.cxx,v 1.7 2011/01/16 21:30:46 schade Exp $
// Copyright: 2010 (C) Sebastian Beumler
//

#ifndef HEP_Hep2BodyDecay
#include <Hep2BodyDecay.h>
#endif
#ifndef HEP_HepVtxTrackHelix
#include <HepVtxTrackHelix.h>
#endif
#include <HepVertex.h>

#ifndef __CINT__
ClassImp(Hep2BodyDecay);
#endif

//____________________________________________________________________

Hep2BodyDecay::Hep2BodyDecay() {
    //
    // Default constructor
    //
    fDaughter1 = new TRef;
    fDaughter2 = new TRef;
    fVtx       = new TRef;
}

//____________________________________________________________________

Hep2BodyDecay::Hep2BodyDecay(Int_t Id, Float_t Px, Float_t Py, Float_t Pz,
			 Float_t E, TObject *Daughter1, TObject *Daughter2,
			 HepVertex *DecayVtx, HepVertex *PrimaryVtx,
			 HepParticle ReFitDaughter1, HepParticle ReFitDaughter2) :
    HepDecayParticle(Id, Px, Py, Pz, E, 0) {
    //
    // Normal constructor
    //
    fDaughter1 = new TRef; *fDaughter1 = Daughter1;
    fDaughter2 = new TRef; *fDaughter2 = Daughter2;
    fVtx       = new TRef; *fVtx       = (TObject*)DecayVtx;
    fReFitDaughter1 = ReFitDaughter1;
    fReFitDaughter2 = ReFitDaughter2;
    fHasSharedTracks = kFALSE;

    // calculate decay length
    TVector3 d = PrimaryVtx->GetPos() - DecayVtx->GetPos();
    fDecayLength = d.Mag();
    // save transverse decay length
    fTransvDecayLength = d.Perp();
    // calculate angle between particle origin and primary vertex
    TLorentzVector p = ReFitDaughter1.P() + ReFitDaughter2.P();
    TVector3 o = DecayVtx->GetPos() - PrimaryVtx->GetPos();
    fAngleToPrim = p.Angle(o);
    
    // calculate opening angle between outgoing tracks in lab frame
    /*
    HepVtxTrackHelix *trk1 = (HepVtxTrackHelix*)Daughter1;
    HepVtxTrackHelix *trk2 = (HepVtxTrackHelix*)Daughter2;
    fOpeningAngle = trk1->P().Angle(trk2->P());
    */
    
    // calculate opening angle between outgoing tracks in lab frame
    fOpeningAngle = ReFitDaughter1.P().Angle(ReFitDaughter2.P().Vect());
    
    // calculate decay angle between outgoing tracks in rest frame
    // (mass hypothesis must be stored in ReFitDaughter
    TLorentzVector PDaughter1 = ReFitDaughter1.P();
    PDaughter1.Boost(-P().BoostVector()); // boost daughter momentum to mother's restframe
    fDecayAngle = P().Angle(PDaughter1.Vect());
}

//____________________________________________________________________

Hep2BodyDecay::~Hep2BodyDecay() {
    //
    // Default destructor
    //
    delete fDaughter1;
    delete fDaughter2;
    delete fVtx;
}

//____________________________________________________________________

void Hep2BodyDecay::Clear(Option_t *option) {
    //
    // Clear this object
    //
    HepDecayParticle::Clear(option);
    delete fDaughter1; fDaughter1 = 0;
    delete fDaughter2; fDaughter2 = 0;
    delete fVtx;       fVtx       = 0;
    fDecayLength = 0.;
    fTransvDecayLength = 0;
    fReFitDaughter1.Clear();
    fReFitDaughter2.Clear();
    
}

//____________________________________________________________________

Float_t Hep2BodyDecay::GetLifeTime() {
    //
    // Compute life-time (in ps)
    //
    Double_t BetaGamma = Pmag()/M("pdg");
    return GetDecayLength()/(BetaGamma*TMath::Ccgs())*1.e12;
}
 Hep2BodyDecay.cxx:1
 Hep2BodyDecay.cxx:2
 Hep2BodyDecay.cxx:3
 Hep2BodyDecay.cxx:4
 Hep2BodyDecay.cxx:5
 Hep2BodyDecay.cxx:6
 Hep2BodyDecay.cxx:7
 Hep2BodyDecay.cxx:8
 Hep2BodyDecay.cxx:9
 Hep2BodyDecay.cxx:10
 Hep2BodyDecay.cxx:11
 Hep2BodyDecay.cxx:12
 Hep2BodyDecay.cxx:13
 Hep2BodyDecay.cxx:14
 Hep2BodyDecay.cxx:15
 Hep2BodyDecay.cxx:16
 Hep2BodyDecay.cxx:17
 Hep2BodyDecay.cxx:18
 Hep2BodyDecay.cxx:19
 Hep2BodyDecay.cxx:20
 Hep2BodyDecay.cxx:21
 Hep2BodyDecay.cxx:22
 Hep2BodyDecay.cxx:23
 Hep2BodyDecay.cxx:24
 Hep2BodyDecay.cxx:25
 Hep2BodyDecay.cxx:26
 Hep2BodyDecay.cxx:27
 Hep2BodyDecay.cxx:28
 Hep2BodyDecay.cxx:29
 Hep2BodyDecay.cxx:30
 Hep2BodyDecay.cxx:31
 Hep2BodyDecay.cxx:32
 Hep2BodyDecay.cxx:33
 Hep2BodyDecay.cxx:34
 Hep2BodyDecay.cxx:35
 Hep2BodyDecay.cxx:36
 Hep2BodyDecay.cxx:37
 Hep2BodyDecay.cxx:38
 Hep2BodyDecay.cxx:39
 Hep2BodyDecay.cxx:40
 Hep2BodyDecay.cxx:41
 Hep2BodyDecay.cxx:42
 Hep2BodyDecay.cxx:43
 Hep2BodyDecay.cxx:44
 Hep2BodyDecay.cxx:45
 Hep2BodyDecay.cxx:46
 Hep2BodyDecay.cxx:47
 Hep2BodyDecay.cxx:48
 Hep2BodyDecay.cxx:49
 Hep2BodyDecay.cxx:50
 Hep2BodyDecay.cxx:51
 Hep2BodyDecay.cxx:52
 Hep2BodyDecay.cxx:53
 Hep2BodyDecay.cxx:54
 Hep2BodyDecay.cxx:55
 Hep2BodyDecay.cxx:56
 Hep2BodyDecay.cxx:57
 Hep2BodyDecay.cxx:58
 Hep2BodyDecay.cxx:59
 Hep2BodyDecay.cxx:60
 Hep2BodyDecay.cxx:61
 Hep2BodyDecay.cxx:62
 Hep2BodyDecay.cxx:63
 Hep2BodyDecay.cxx:64
 Hep2BodyDecay.cxx:65
 Hep2BodyDecay.cxx:66
 Hep2BodyDecay.cxx:67
 Hep2BodyDecay.cxx:68
 Hep2BodyDecay.cxx:69
 Hep2BodyDecay.cxx:70
 Hep2BodyDecay.cxx:71
 Hep2BodyDecay.cxx:72
 Hep2BodyDecay.cxx:73
 Hep2BodyDecay.cxx:74
 Hep2BodyDecay.cxx:75
 Hep2BodyDecay.cxx:76
 Hep2BodyDecay.cxx:77
 Hep2BodyDecay.cxx:78
 Hep2BodyDecay.cxx:79
 Hep2BodyDecay.cxx:80
 Hep2BodyDecay.cxx:81
 Hep2BodyDecay.cxx:82
 Hep2BodyDecay.cxx:83
 Hep2BodyDecay.cxx:84
 Hep2BodyDecay.cxx:85
 Hep2BodyDecay.cxx:86
 Hep2BodyDecay.cxx:87
 Hep2BodyDecay.cxx:88
 Hep2BodyDecay.cxx:89
 Hep2BodyDecay.cxx:90
 Hep2BodyDecay.cxx:91
 Hep2BodyDecay.cxx:92
 Hep2BodyDecay.cxx:93
 Hep2BodyDecay.cxx:94
 Hep2BodyDecay.cxx:95
 Hep2BodyDecay.cxx:96
 Hep2BodyDecay.cxx:97
 Hep2BodyDecay.cxx:98
 Hep2BodyDecay.cxx:99
 Hep2BodyDecay.cxx:100
 Hep2BodyDecay.cxx:101
 Hep2BodyDecay.cxx:102
 Hep2BodyDecay.cxx:103
 Hep2BodyDecay.cxx:104
 Hep2BodyDecay.cxx:105
 Hep2BodyDecay.cxx:106
 Hep2BodyDecay.cxx:107
 Hep2BodyDecay.cxx:108
 Hep2BodyDecay.cxx:109
 Hep2BodyDecay.cxx:110