//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
//
#ifndef HEP_HepTopDecay
#define HEP_HepTopDecay
#ifndef ROOT_TClass
#include <TClass.h>
#endif
#ifndef HEP_HepDecayParticle
#include <HepDecayParticle.h>
#endif
#ifndef HEP_HepJet
#include <HepJet.h>
#endif
#ifndef HEP_HepWDecay
#include <HepWDecay.h>
#endif
#ifndef HEP_HepMCParticle
#include <HepMCParticle.h>
#endif
class HepTopDecay : public HepDecayParticle {

  public:
    enum ProductionMode { kTTBar,
			  kSgTop_tChannel,
			  kSgTop_sChannel,
			  kSgTop_WtChannel,
			  kOther };
    
  protected:
    TRef     *fWDecay;      // W decay object associated to this top decay
    TRef     *fBJetOrig;    // Outgoing original B-jet of this top decay before fit
    TRef     *fTruthTop;    //Truth Top of reconstructed Top
    TLorentzVector fP_BJet; // Improved 4-momentum of outgoing B-jet after fit
    ProductionMode fMode;   // Production process of this top quark 
    
  public:
    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);
    virtual ~HepTopDecay();
    virtual void Clear(Option_t *option = "");
    virtual Int_t Compare(const TObject *obj) const;
    virtual void Print(Option_t *option = "");

    inline virtual Bool_t IsSortable() const { return kTRUE; }
    inline Bool_t IsTTBar() {
	if ( fMode == kTTBar ) return kTRUE;
	return kFALSE;
    }
    inline Bool_t IsSgTop_tChannel() {
	if ( fMode == kSgTop_tChannel ) return kTRUE;
	return kFALSE;
    }
    inline Bool_t IsSgTop_sChannel() {
	if ( fMode == kSgTop_sChannel ) return kTRUE;
	return kFALSE;
    }
    inline Bool_t IsSgTop_WtChannel() {
	if ( fMode == kSgTop_WtChannel ) return kTRUE;
	return kFALSE;
    }
    inline HepWDecay* GetWDecay() const {
	// Return associated W decay object
	return (HepWDecay*)fWDecay->GetObject();
    }
    inline HepJet* GetBJetOrig() const {
	//
	// Return unchanged b-jet connected to this top decay
	//
	return (HepJet*)fBJetOrig->GetObject();
    }
    inline TLorentzVector GetP_BJet() const {
	//
	// Return improved 4-momentum of b-jet associated to this top decay 
	//
	return fP_BJet;
    }
    inline Bool_t IsHadronicDecay() const {
	// W has decayed hadronically ?
	return GetWDecay()->IsHadronicDecay();
    }
    inline Bool_t IsSemiLeptonicDecay() const {
	// W has decayed leptonically ?
	return GetWDecay()->IsLeptonicDecay();
    }
    inline HepMCParticle* GetTruthTop() const { 
	// Get truth top-quark of reconstructed top. Pointer is zero if no
	// truth top exists
	return (HepMCParticle*)fTruthTop->GetObject();
    } 
    inline void SetTruthTop(HepMCParticle *TruthTop)
    { *fTruthTop = (TObject*)TruthTop;}
    inline void SetMode(ProductionMode mode) { fMode = mode; }
    
    ClassDef(HepTopDecay,6) // Top quark decay class
};
#endif
 HepTopDecay.h:1
 HepTopDecay.h:2
 HepTopDecay.h:3
 HepTopDecay.h:4
 HepTopDecay.h:5
 HepTopDecay.h:6
 HepTopDecay.h:7
 HepTopDecay.h:8
 HepTopDecay.h:9
 HepTopDecay.h:10
 HepTopDecay.h:11
 HepTopDecay.h:12
 HepTopDecay.h:13
 HepTopDecay.h:14
 HepTopDecay.h:15
 HepTopDecay.h:16
 HepTopDecay.h:17
 HepTopDecay.h:18
 HepTopDecay.h:19
 HepTopDecay.h:20
 HepTopDecay.h:21
 HepTopDecay.h:22
 HepTopDecay.h:23
 HepTopDecay.h:24
 HepTopDecay.h:25
 HepTopDecay.h:26
 HepTopDecay.h:27
 HepTopDecay.h:28
 HepTopDecay.h:29
 HepTopDecay.h:30
 HepTopDecay.h:31
 HepTopDecay.h:32
 HepTopDecay.h:33
 HepTopDecay.h:34
 HepTopDecay.h:35
 HepTopDecay.h:36
 HepTopDecay.h:37
 HepTopDecay.h:38
 HepTopDecay.h:39
 HepTopDecay.h:40
 HepTopDecay.h:41
 HepTopDecay.h:42
 HepTopDecay.h:43
 HepTopDecay.h:44
 HepTopDecay.h:45
 HepTopDecay.h:46
 HepTopDecay.h:47
 HepTopDecay.h:48
 HepTopDecay.h:49
 HepTopDecay.h:50
 HepTopDecay.h:51
 HepTopDecay.h:52
 HepTopDecay.h:53
 HepTopDecay.h:54
 HepTopDecay.h:55
 HepTopDecay.h:56
 HepTopDecay.h:57
 HepTopDecay.h:58
 HepTopDecay.h:59
 HepTopDecay.h:60
 HepTopDecay.h:61
 HepTopDecay.h:62
 HepTopDecay.h:63
 HepTopDecay.h:64
 HepTopDecay.h:65
 HepTopDecay.h:66
 HepTopDecay.h:67
 HepTopDecay.h:68
 HepTopDecay.h:69
 HepTopDecay.h:70
 HepTopDecay.h:71
 HepTopDecay.h:72
 HepTopDecay.h:73
 HepTopDecay.h:74
 HepTopDecay.h:75
 HepTopDecay.h:76
 HepTopDecay.h:77
 HepTopDecay.h:78
 HepTopDecay.h:79
 HepTopDecay.h:80
 HepTopDecay.h:81
 HepTopDecay.h:82
 HepTopDecay.h:83
 HepTopDecay.h:84
 HepTopDecay.h:85
 HepTopDecay.h:86
 HepTopDecay.h:87
 HepTopDecay.h:88
 HepTopDecay.h:89
 HepTopDecay.h:90
 HepTopDecay.h:91
 HepTopDecay.h:92
 HepTopDecay.h:93
 HepTopDecay.h:94
 HepTopDecay.h:95
 HepTopDecay.h:96
 HepTopDecay.h:97
 HepTopDecay.h:98
 HepTopDecay.h:99
 HepTopDecay.h:100