//____________________________________________________________________
//
// Top decay class
// 
//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
//
#ifndef HEP_HepTopDecay
#include <HepTopDecay.h>
#endif
#include <iostream>

using namespace std;

#ifndef __CINT__
ClassImp(HepTopDecay);
#endif

//____________________________________________________________________

HepTopDecay::HepTopDecay() {
    //
    // Default constructor
    //
    fWDecay   = new TRef;
    fBJetOrig = new TRef;
    fTruthTop = new TRef;
}

//____________________________________________________________________

HepTopDecay::HepTopDecay(Int_t Id, Float_t Px_T, Float_t Py_T, Float_t Pz_T,
			 Float_t E_T, HepWDecay *WDecay, HepJet *BJetOrig,
			 Float_t Px_j, Float_t Py_j, Float_t Pz_j,
			 Float_t E_j, ProductionMode mode) :
    HepDecayParticle(Id, Px_T, Py_T, Pz_T, E_T,
		     (WDecay->IsPositive()) ? 6 : -6) {
    //
    // Normal constructor
    //
    fWDecay   = new TRef;
    fBJetOrig = new TRef;
    fTruthTop = new TRef;
    *fWDecay   = (TObject*)WDecay;
    *fBJetOrig = (TObject*)BJetOrig;
    fP_BJet.SetPxPyPzE(Px_j, Py_j, Pz_j, E_j);
    fMode = mode;
}

//____________________________________________________________________

HepTopDecay::~HepTopDecay() {
    //
    // Default destructor
    //
    delete fWDecay;   fWDecay   = 0;
    delete fBJetOrig; fBJetOrig = 0;
    delete fTruthTop; fTruthTop = 0;
//    fP_BJet.SetPxPyPzE(0, 0, 1, 0);
}

//____________________________________________________________________

void HepTopDecay::Clear(Option_t *option) {
    //
    // Clear this object
    //
    HepDecayParticle::Clear(option);
    delete fWDecay;   fWDecay   = 0;
    delete fBJetOrig; fBJetOrig = 0;
    delete fTruthTop; fTruthTop = 0;
    fP_BJet.SetPxPyPzE(0, 0, 1, 0);
}

//____________________________________________________________________

void HepTopDecay::Print(Option_t *option) {
    //
    // Print object information
    //
    cout << endl << endl
	 << "Semi-leptonic t-quark decay #" << fId << endl
	 << "============================" << endl
	 << "Kinematic fit result: chi^2/NDoF = "
	 << fChi2 << " / " << fNDoF << "   Prob = " << fProb << endl << endl
	 << "Reconstructed top-quark:" << endl;
    HepParticle::Print();
    cout << endl
	 << "Outgoing B-jet:" << endl;
    GetBJetOrig()->Print();
    cout << "Improved B-jet 4-momentum: ";
    HepParticle::PrintLorentzVector(GetP_BJet());
    cout << "Reconstructed W-boson:" << endl;
    GetWDecay()->Print();
    cout << endl << endl;
}
    
//____________________________________________________________________

Int_t HepTopDecay::Compare(const TObject *obj) const {
    //
    // Compare invariant mass of top decays
    //
    // Return values:
    //    +1 = invariant mass of this decay is closer to the pole-mass of
    //         172.5GeV than the given decay
    //     0 = both invariant masses are equal
    //    -1 = invariant mass of the compared decay is closer to the
    //         pole-mass than this decay
    //
    static const Double_t m_top = 172.5;
    if ( TMath::Abs(M("rec") - m_top)
	 < TMath::Abs(((HepTopDecay*)obj)->M("rec") - m_top) ) return  1;
    if ( TMath::Abs(M("rec") - m_top)
	 > TMath::Abs(((HepTopDecay*)obj)->M("rec") - m_top) ) return -1;
    return 0;
}

 HepTopDecay.cxx:1
 HepTopDecay.cxx:2
 HepTopDecay.cxx:3
 HepTopDecay.cxx:4
 HepTopDecay.cxx:5
 HepTopDecay.cxx:6
 HepTopDecay.cxx:7
 HepTopDecay.cxx:8
 HepTopDecay.cxx:9
 HepTopDecay.cxx:10
 HepTopDecay.cxx:11
 HepTopDecay.cxx:12
 HepTopDecay.cxx:13
 HepTopDecay.cxx:14
 HepTopDecay.cxx:15
 HepTopDecay.cxx:16
 HepTopDecay.cxx:17
 HepTopDecay.cxx:18
 HepTopDecay.cxx:19
 HepTopDecay.cxx:20
 HepTopDecay.cxx:21
 HepTopDecay.cxx:22
 HepTopDecay.cxx:23
 HepTopDecay.cxx:24
 HepTopDecay.cxx:25
 HepTopDecay.cxx:26
 HepTopDecay.cxx:27
 HepTopDecay.cxx:28
 HepTopDecay.cxx:29
 HepTopDecay.cxx:30
 HepTopDecay.cxx:31
 HepTopDecay.cxx:32
 HepTopDecay.cxx:33
 HepTopDecay.cxx:34
 HepTopDecay.cxx:35
 HepTopDecay.cxx:36
 HepTopDecay.cxx:37
 HepTopDecay.cxx:38
 HepTopDecay.cxx:39
 HepTopDecay.cxx:40
 HepTopDecay.cxx:41
 HepTopDecay.cxx:42
 HepTopDecay.cxx:43
 HepTopDecay.cxx:44
 HepTopDecay.cxx:45
 HepTopDecay.cxx:46
 HepTopDecay.cxx:47
 HepTopDecay.cxx:48
 HepTopDecay.cxx:49
 HepTopDecay.cxx:50
 HepTopDecay.cxx:51
 HepTopDecay.cxx:52
 HepTopDecay.cxx:53
 HepTopDecay.cxx:54
 HepTopDecay.cxx:55
 HepTopDecay.cxx:56
 HepTopDecay.cxx:57
 HepTopDecay.cxx:58
 HepTopDecay.cxx:59
 HepTopDecay.cxx:60
 HepTopDecay.cxx:61
 HepTopDecay.cxx:62
 HepTopDecay.cxx:63
 HepTopDecay.cxx:64
 HepTopDecay.cxx:65
 HepTopDecay.cxx:66
 HepTopDecay.cxx:67
 HepTopDecay.cxx:68
 HepTopDecay.cxx:69
 HepTopDecay.cxx:70
 HepTopDecay.cxx:71
 HepTopDecay.cxx:72
 HepTopDecay.cxx:73
 HepTopDecay.cxx:74
 HepTopDecay.cxx:75
 HepTopDecay.cxx:76
 HepTopDecay.cxx:77
 HepTopDecay.cxx:78
 HepTopDecay.cxx:79
 HepTopDecay.cxx:80
 HepTopDecay.cxx:81
 HepTopDecay.cxx:82
 HepTopDecay.cxx:83
 HepTopDecay.cxx:84
 HepTopDecay.cxx:85
 HepTopDecay.cxx:86
 HepTopDecay.cxx:87
 HepTopDecay.cxx:88
 HepTopDecay.cxx:89
 HepTopDecay.cxx:90
 HepTopDecay.cxx:91
 HepTopDecay.cxx:92
 HepTopDecay.cxx:93
 HepTopDecay.cxx:94
 HepTopDecay.cxx:95
 HepTopDecay.cxx:96
 HepTopDecay.cxx:97
 HepTopDecay.cxx:98
 HepTopDecay.cxx:99
 HepTopDecay.cxx:100
 HepTopDecay.cxx:101
 HepTopDecay.cxx:102
 HepTopDecay.cxx:103
 HepTopDecay.cxx:104
 HepTopDecay.cxx:105
 HepTopDecay.cxx:106
 HepTopDecay.cxx:107
 HepTopDecay.cxx:108
 HepTopDecay.cxx:109
 HepTopDecay.cxx:110
 HepTopDecay.cxx:111
 HepTopDecay.cxx:112
 HepTopDecay.cxx:113
 HepTopDecay.cxx:114
 HepTopDecay.cxx:115
 HepTopDecay.cxx:116
 HepTopDecay.cxx:117
 HepTopDecay.cxx:118