//____________________________________________________________________
//
// Base jet class
// 
// Note for developers: Some often used values like Et, Eta etc. are
// stored as transient data members for fast access. Their computation
// from the persistent data members is either done in the normal ctor
// or in SetPtEtaPhiE(), or triggered by the fCompute flag in case of
// using the default ctor.
//
// !!! IMPORTANT: Do not access the transient data members directly, !!!
// !!! but use ALWAYS their corresponding access function like Pt(), !!!
// !!! Eta() etc. to ensure that the variables are computed properly.!!!
//
// !!! IMPORTANT: Do not use Et(), Pt(), Pmag(), Thetha(), Phi(),    !!!
// !!! Eta() in TTree::Draw() or TTree::Scan() since these functions !!!
// !!! make use of a cache which will NOT be updated when jumping    !!!
// !!! to the next event inside TTree::Draw() or TTree::Scan().      !!!
//
//
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: HepJet.cxx,v 1.11 2016/12/22 20:38:21 kind Exp $
// Copyright: 2008 (C) Oliver Maria Kind
//
#ifndef HEP_HepJet
#include <HepJet.h>
#endif
#include <HepParticle.h>
#include <iostream>

using namespace std;

#ifndef __CINT__
ClassImp(HepJet);
#endif

//____________________________________________________________________

HepJet::HepJet() {
    //
    // Default constructor
    //
    // The fCompute flag triggers the computation of the transient
    // member variables the next time one of them is accessed. This
    // mechanism is neccessary since the values of the persistent data
    // members needed for the computation are filles AFTER the call to
    // this ctor
    //
    fCompute = kTRUE;
}

//____________________________________________________________________

HepJet::HepJet(Int_t Id, Float_t E, Float_t Px, Float_t Py, Float_t Pz) :
    fId(Id) {
    //
    // Normal constructor
    //
    fP.SetPxPyPzE(Px, Py, Pz, E);
    ComputeTransientVars();
}

//____________________________________________________________________

HepJet::~HepJet() {
    //
    // Default destructor
    //
}

//____________________________________________________________________

void HepJet::Clear(Option_t *option) {
    //
    // Clear object
    //
    fId = 0;
    fP.SetPxPyPzE(0, 0, 1, 0);

    // Re-set cache
    fCompute = kTRUE;
}

//____________________________________________________________________

Int_t HepJet::Compare(const TObject *obj) const {
    //
    // Compares transverse energy of this jet with another.
    // Necessary for sorting
    //
    Float_t Pt = fP.Pt();
    if ( Pt <  ((HepJet*)obj)->Pt() ) return -1;
    if ( Pt == ((HepJet*)obj)->Pt() ) return  0;
    if ( Pt >  ((HepJet*)obj)->Pt() ) return  1;
    return 0;
}

//____________________________________________________________________

Float_t HepJet::DeltaPhi(HepParticle* prt) const {
    //
    // Compute azimuth difference between this jet and the given
    // particle in the range from -pi to +pi
    //
    return fP.DeltaPhi(prt->P());
}

//____________________________________________________________________

Float_t HepJet::DeltaPhi(HepJet *jet) const {
    //
    // Compute azimuth difference between this and the given jet in
    // the range from -pi to +pi
    //
    return fP.DeltaPhi(jet->P());
}

//____________________________________________________________________

Float_t HepJet::DeltaEta(HepParticle *prt) {
    //
    // Compute (signed) pseudo-rapidity difference between this jet
    // and the given particle
    //
    return Eta() - prt->Eta();
}

//____________________________________________________________________

Float_t HepJet::DeltaEta(HepJet *jet) {
    //
    // Compute (signed) pseudo-rapidity difference between this and
    // the given jet
    //
    return Eta() - jet->Eta();
}

//____________________________________________________________________

Float_t HepJet::DeltaR(HepParticle *prt) {
    //
    // Compute distance in eta-phi plane between this jet and the
    // given particle
    //
    Float_t dEta = Eta() - prt->Eta();
    Float_t dPhi = fP.DeltaPhi(prt->P());
    return TMath::Sqrt(dEta*dEta + dPhi*dPhi);
}

//____________________________________________________________________

Float_t HepJet::DeltaR(HepJet *jet) {
    //
    // Compute distance in eta-phi plane between this and the given
    // jet
    //
    Float_t dEta = Eta() - jet->Eta();
    Float_t dPhi = fP.DeltaPhi(jet->P());
    return TMath::Sqrt(dEta*dEta + dPhi*dPhi);
}

//____________________________________________________________________

Float_t HepJet::DeltaPtFrac(HepParticle *prt) {
    //
    // DeltaPtFrac = (Pt_1 - Pt_2)/Pt_1
    // 
    // Pt difference, unsigned, for better checking systematic errors, 
    // normalized to the first entry. The second term is a HepParticle  
    // object.
    //
  Float_t pt = Pt();
  if( pt>0. ){  return ( (pt - prt->Pt() ) / pt ); }
  return 10e10;
}

//____________________________________________________________________

Float_t HepJet::DeltaPtFrac(HepJet *jet) {
    //
    // DeltaPtFrac = (Pt_1 - Pt_2)/Pt_1
    // 
    // Pt difference, unsigned, for better checking systematic errors, 
    // normalized to the first entry. The second term is a HepJet  
    // object.  
    // 
  Float_t pt = Pt();
  if( pt>0. ){  return ( (pt - jet->Pt() ) / pt ); }
  return 10e10;
}

//____________________________________________________________________

Float_t HepJet::DeltaEtFrac(HepParticle *prt) {
    //
    // DeltaEtFrac = (Et_1 - Et_2)/Et_1
    // 
    // Et difference, unsigned, for better checking systematic errors, 
    // normalized to the first entry. The second term is a HepParticle  
    // object.
    //
  Float_t et = Et();
  if( et>0. ){  return ( (et - prt->Et() ) / et ); }
  return 10e10;
}

//____________________________________________________________________

Float_t HepJet::DeltaEtFrac(HepJet *jet) {
    //
    // DeltaEtFrac = (Et_1 - Et_2)/Et_1
    // 
    // Et difference, unsigned, for better checking systematic errors, 
    // normalized to the first entry. The second term is a HepJet  
    // object.  
    // 
  Float_t et = Et();
  if( et>0. ){  return ( (et - jet->Et() ) / et ); }
  return 10e10;
}

//____________________________________________________________________

Float_t HepJet::InvDeltaPtFrac(HepParticle *prt) {
    //
    // An "Inverse" DeltaPtFrac is needed, due to Multiple Scattering in 
    // the Inner Detector
    // InvDeltaPtFrac = ( 1/Pt_1 - 1/Pt_2)*Pt_1
    //
    // Unsigned again, for better checking systematic errors 
    // I dont know yet if I can write the same algorithm for the jets
    //
  Float_t pt1 = Pt();
  Float_t pt2 = prt->Pt();
  if( (pt1>0.) && (pt2>0.) ) {
    return ( ( 1/pt1 - 1/pt2 ) * pt1 );
  }
  return 10e10; 
}

//____________________________________________________________________

Double_t HepJet::PtRel(HepParticle* prt) {
    //
    // Computes the relative traverse momentum between the given
    // particle and this jet
    //
    //   Pt_rel = |P_prt x P_jet|
    //
    TVector3 jetdir = P3();
    return prt->P().Perp(jetdir);
} 

//____________________________________________________________________

void HepJet::ComputeTransientVars() {
    //
    // Compute transient variables like Et, Theta, Eta etc. for fast
    // access
    //
    fCompute = kFALSE;
    
    fEt = fP.Et();
    fPt = fP.Perp();
    fTheta = fP.Theta();
    fCosTheta = fP.CosTheta();
    fPhi = fP.Phi();
    // Suppress Root warning when computing eta
    if ( fPt != 0. ) {
	fEta = fP.Eta();
    } else {
	fEta = ( Pz() > 0. ) ? 10e10 : -10e10;
    }
}

//____________________________________________________________________

void HepJet::Print(Option_t *option) {
    //
    // Print jet information
    //
    //   "nohead" - No header containing the variable names is
    //              displayed. Useful when printing a whole table
    //              for a list of jets
    //
    TString opt = option;
    opt.ToLower();

    // =======
    // General
    // =======

    // Print header
    if ( !opt.Contains("nohead") ) PrintHeader();
    
    // Print
    cout.setf(ios::showpoint | ios::fixed, ios::floatfield);
    cout.precision(3);
    cout.width(4);  cout << fId;
    cout.width(12); cout << Et();
    cout.width(12); cout << M();
    cout.width(12); cout << Theta()*180/TMath::Pi();
    cout.width(12); cout << Phi()*180/TMath::Pi();
    cout.width(12); cout << Eta();
    cout << endl;

    // Print footer
    if ( !opt.Contains("nohead") ) PrintFooter();
}

//____________________________________________________________________

void HepJet::PrintHeader() {
    //
    // Print information header
    //
    cout
	<<"----------------------------------------------------------------"
	<< endl
	<< " Id         Et          M         Theta         Phi         Eta"
	<< endl
	<< "---------------------------------------------------------------"
	<< endl;
}

//____________________________________________________________________

void HepJet::PrintFooter() {
    //
    // Print footer
    //
    cout
	<< "---------------------------------------------------------------"
	<< endl;
}
 HepJet.cxx:1
 HepJet.cxx:2
 HepJet.cxx:3
 HepJet.cxx:4
 HepJet.cxx:5
 HepJet.cxx:6
 HepJet.cxx:7
 HepJet.cxx:8
 HepJet.cxx:9
 HepJet.cxx:10
 HepJet.cxx:11
 HepJet.cxx:12
 HepJet.cxx:13
 HepJet.cxx:14
 HepJet.cxx:15
 HepJet.cxx:16
 HepJet.cxx:17
 HepJet.cxx:18
 HepJet.cxx:19
 HepJet.cxx:20
 HepJet.cxx:21
 HepJet.cxx:22
 HepJet.cxx:23
 HepJet.cxx:24
 HepJet.cxx:25
 HepJet.cxx:26
 HepJet.cxx:27
 HepJet.cxx:28
 HepJet.cxx:29
 HepJet.cxx:30
 HepJet.cxx:31
 HepJet.cxx:32
 HepJet.cxx:33
 HepJet.cxx:34
 HepJet.cxx:35
 HepJet.cxx:36
 HepJet.cxx:37
 HepJet.cxx:38
 HepJet.cxx:39
 HepJet.cxx:40
 HepJet.cxx:41
 HepJet.cxx:42
 HepJet.cxx:43
 HepJet.cxx:44
 HepJet.cxx:45
 HepJet.cxx:46
 HepJet.cxx:47
 HepJet.cxx:48
 HepJet.cxx:49
 HepJet.cxx:50
 HepJet.cxx:51
 HepJet.cxx:52
 HepJet.cxx:53
 HepJet.cxx:54
 HepJet.cxx:55
 HepJet.cxx:56
 HepJet.cxx:57
 HepJet.cxx:58
 HepJet.cxx:59
 HepJet.cxx:60
 HepJet.cxx:61
 HepJet.cxx:62
 HepJet.cxx:63
 HepJet.cxx:64
 HepJet.cxx:65
 HepJet.cxx:66
 HepJet.cxx:67
 HepJet.cxx:68
 HepJet.cxx:69
 HepJet.cxx:70
 HepJet.cxx:71
 HepJet.cxx:72
 HepJet.cxx:73
 HepJet.cxx:74
 HepJet.cxx:75
 HepJet.cxx:76
 HepJet.cxx:77
 HepJet.cxx:78
 HepJet.cxx:79
 HepJet.cxx:80
 HepJet.cxx:81
 HepJet.cxx:82
 HepJet.cxx:83
 HepJet.cxx:84
 HepJet.cxx:85
 HepJet.cxx:86
 HepJet.cxx:87
 HepJet.cxx:88
 HepJet.cxx:89
 HepJet.cxx:90
 HepJet.cxx:91
 HepJet.cxx:92
 HepJet.cxx:93
 HepJet.cxx:94
 HepJet.cxx:95
 HepJet.cxx:96
 HepJet.cxx:97
 HepJet.cxx:98
 HepJet.cxx:99
 HepJet.cxx:100
 HepJet.cxx:101
 HepJet.cxx:102
 HepJet.cxx:103
 HepJet.cxx:104
 HepJet.cxx:105
 HepJet.cxx:106
 HepJet.cxx:107
 HepJet.cxx:108
 HepJet.cxx:109
 HepJet.cxx:110
 HepJet.cxx:111
 HepJet.cxx:112
 HepJet.cxx:113
 HepJet.cxx:114
 HepJet.cxx:115
 HepJet.cxx:116
 HepJet.cxx:117
 HepJet.cxx:118
 HepJet.cxx:119
 HepJet.cxx:120
 HepJet.cxx:121
 HepJet.cxx:122
 HepJet.cxx:123
 HepJet.cxx:124
 HepJet.cxx:125
 HepJet.cxx:126
 HepJet.cxx:127
 HepJet.cxx:128
 HepJet.cxx:129
 HepJet.cxx:130
 HepJet.cxx:131
 HepJet.cxx:132
 HepJet.cxx:133
 HepJet.cxx:134
 HepJet.cxx:135
 HepJet.cxx:136
 HepJet.cxx:137
 HepJet.cxx:138
 HepJet.cxx:139
 HepJet.cxx:140
 HepJet.cxx:141
 HepJet.cxx:142
 HepJet.cxx:143
 HepJet.cxx:144
 HepJet.cxx:145
 HepJet.cxx:146
 HepJet.cxx:147
 HepJet.cxx:148
 HepJet.cxx:149
 HepJet.cxx:150
 HepJet.cxx:151
 HepJet.cxx:152
 HepJet.cxx:153
 HepJet.cxx:154
 HepJet.cxx:155
 HepJet.cxx:156
 HepJet.cxx:157
 HepJet.cxx:158
 HepJet.cxx:159
 HepJet.cxx:160
 HepJet.cxx:161
 HepJet.cxx:162
 HepJet.cxx:163
 HepJet.cxx:164
 HepJet.cxx:165
 HepJet.cxx:166
 HepJet.cxx:167
 HepJet.cxx:168
 HepJet.cxx:169
 HepJet.cxx:170
 HepJet.cxx:171
 HepJet.cxx:172
 HepJet.cxx:173
 HepJet.cxx:174
 HepJet.cxx:175
 HepJet.cxx:176
 HepJet.cxx:177
 HepJet.cxx:178
 HepJet.cxx:179
 HepJet.cxx:180
 HepJet.cxx:181
 HepJet.cxx:182
 HepJet.cxx:183
 HepJet.cxx:184
 HepJet.cxx:185
 HepJet.cxx:186
 HepJet.cxx:187
 HepJet.cxx:188
 HepJet.cxx:189
 HepJet.cxx:190
 HepJet.cxx:191
 HepJet.cxx:192
 HepJet.cxx:193
 HepJet.cxx:194
 HepJet.cxx:195
 HepJet.cxx:196
 HepJet.cxx:197
 HepJet.cxx:198
 HepJet.cxx:199
 HepJet.cxx:200
 HepJet.cxx:201
 HepJet.cxx:202
 HepJet.cxx:203
 HepJet.cxx:204
 HepJet.cxx:205
 HepJet.cxx:206
 HepJet.cxx:207
 HepJet.cxx:208
 HepJet.cxx:209
 HepJet.cxx:210
 HepJet.cxx:211
 HepJet.cxx:212
 HepJet.cxx:213
 HepJet.cxx:214
 HepJet.cxx:215
 HepJet.cxx:216
 HepJet.cxx:217
 HepJet.cxx:218
 HepJet.cxx:219
 HepJet.cxx:220
 HepJet.cxx:221
 HepJet.cxx:222
 HepJet.cxx:223
 HepJet.cxx:224
 HepJet.cxx:225
 HepJet.cxx:226
 HepJet.cxx:227
 HepJet.cxx:228
 HepJet.cxx:229
 HepJet.cxx:230
 HepJet.cxx:231
 HepJet.cxx:232
 HepJet.cxx:233
 HepJet.cxx:234
 HepJet.cxx:235
 HepJet.cxx:236
 HepJet.cxx:237
 HepJet.cxx:238
 HepJet.cxx:239
 HepJet.cxx:240
 HepJet.cxx:241
 HepJet.cxx:242
 HepJet.cxx:243
 HepJet.cxx:244
 HepJet.cxx:245
 HepJet.cxx:246
 HepJet.cxx:247
 HepJet.cxx:248
 HepJet.cxx:249
 HepJet.cxx:250
 HepJet.cxx:251
 HepJet.cxx:252
 HepJet.cxx:253
 HepJet.cxx:254
 HepJet.cxx:255
 HepJet.cxx:256
 HepJet.cxx:257
 HepJet.cxx:258
 HepJet.cxx:259
 HepJet.cxx:260
 HepJet.cxx:261
 HepJet.cxx:262
 HepJet.cxx:263
 HepJet.cxx:264
 HepJet.cxx:265
 HepJet.cxx:266
 HepJet.cxx:267
 HepJet.cxx:268
 HepJet.cxx:269
 HepJet.cxx:270
 HepJet.cxx:271
 HepJet.cxx:272
 HepJet.cxx:273
 HepJet.cxx:274
 HepJet.cxx:275
 HepJet.cxx:276
 HepJet.cxx:277
 HepJet.cxx:278
 HepJet.cxx:279
 HepJet.cxx:280
 HepJet.cxx:281
 HepJet.cxx:282
 HepJet.cxx:283
 HepJet.cxx:284
 HepJet.cxx:285
 HepJet.cxx:286
 HepJet.cxx:287
 HepJet.cxx:288
 HepJet.cxx:289
 HepJet.cxx:290
 HepJet.cxx:291
 HepJet.cxx:292
 HepJet.cxx:293
 HepJet.cxx:294
 HepJet.cxx:295
 HepJet.cxx:296
 HepJet.cxx:297
 HepJet.cxx:298
 HepJet.cxx:299
 HepJet.cxx:300
 HepJet.cxx:301
 HepJet.cxx:302
 HepJet.cxx:303
 HepJet.cxx:304
 HepJet.cxx:305
 HepJet.cxx:306
 HepJet.cxx:307
 HepJet.cxx:308
 HepJet.cxx:309
 HepJet.cxx:310
 HepJet.cxx:311
 HepJet.cxx:312
 HepJet.cxx:313
 HepJet.cxx:314
 HepJet.cxx:315
 HepJet.cxx:316
 HepJet.cxx:317
 HepJet.cxx:318
 HepJet.cxx:319
 HepJet.cxx:320
 HepJet.cxx:321
 HepJet.cxx:322
 HepJet.cxx:323
 HepJet.cxx:324
 HepJet.cxx:325
 HepJet.cxx:326
 HepJet.cxx:327
 HepJet.cxx:328
 HepJet.cxx:329
 HepJet.cxx:330
 HepJet.cxx:331
 HepJet.cxx:332
 HepJet.cxx:333
 HepJet.cxx:334
 HepJet.cxx:335