//____________________________________________________________________
//
// Atlas electron class
// 
// Note that the electron container contains different kind of
// electrons reconstructed with different algorithms
// (authors). Information about the algorithm used is stored in the
// fAuthor datamember and can be tested with the member functions
// IsHighPtElectron(), IsSoftElectron(), IsForwardElectron(),
// IsPhotoConversion(). Details about the reconstruction can be found
// on the Atlas Twiki pages at
// BEGIN_HTML
// https://twiki.cern.ch/twiki/bin/view/AtlasProtected/ElectronReconstruction
// END_HTML
//
//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: AtlElectron.cxx,v 1.43 2016/11/29 18:05:18 kind Exp $
// Copyright: 2008 (C) Oliver Maria Kind
//
#ifndef ATLAS_AtlElectron
#include <AtlElectron.h>
#endif
#include <TSystem.h>
#include <iostream>

using namespace std;

#ifndef __CINT__
ClassImp(AtlElectron);
#endif

//____________________________________________________________________

AtlElectron::AtlElectron() {
    //
    // Default constructor
    //
    fTrackEMRefit = new HepTrackHelix;
    fIDTrack = new TRef;
}

//____________________________________________________________________

AtlElectron::AtlElectron(Int_t Id, Float_t Px, Float_t Py, Float_t Pz,
			 Float_t E, Bool_t IsPositron, 
                         Float_t EMWeight, Float_t BkgWeight,
			 UInt_t OQFlag, 
			 UInt_t IsEMBitField, EIsEM IsEM, EAuthor Author, 
			 TLorentzVector PCluster) :
    HepElectron(Id, Px, Py, Pz, E, IsPositron),
    AtlEMShower(Author, 
		IsEMBitField, IsEM, EMWeight, BkgWeight, OQFlag,
		PCluster) {
    //
    // Normal constructor
    //
    fTrackEMRefit = new HepTrackHelix;
    fIDTrack = new TRef;
}

//____________________________________________________________________

AtlElectron::~AtlElectron() {
    //
    // Default destructor
    //
    delete fTrackEMRefit;
    delete fIDTrack; fIDTrack = 0;
}


//____________________________________________________________________

void AtlElectron::Clear(Option_t *option) {
    //
    // Clear object
    //
    HepElectron::Clear(option);
    AtlEMShower::Clear(option);
    AtlTriggerMatch::Clear(option);    
    delete fTrackEMRefit; fTrackEMRefit = 0;
    delete fIDTrack; fIDTrack = 0;
    fPtCone30  = 0.;
    fPCluster.SetPxPyPzE(0, 0, 1., 0); // unit-vector in Pz direction
    fMCTruthClassifier.Clear(option);
}

//_____________________________________________________________

UInt_t AtlElectron::IsGoodOQ() {
    //
    // OQ decision
    //
    // 0: is good OQ
    // 1: is bad OQ
    //
    return ( (fOQFlag & 1446) == 0 ) ? 0 : 1;
}

//_____________________________________________________________

void AtlElectron::Print(Option_t *option) {
    //
    // Print electron information
    //
    // Note that in the standard view only the main authors and
    // quality flags are being displayed.
    //
    // Options available:
    //   "nohead" - No header containing the variable names is
    //              displayed. Useful when printing a whole table
    //              for a list of electrons
    //
    TString opt = option;
    opt.ToLower();
    
    // 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(3);  cout << (( IsPositive() ) ? "+" : "-");
    cout.width(10); cout << Pt();
    cout.width(9); cout << E();
    cout.precision(6);
    cout.width(11); cout << M("REC");
    cout.precision(3);
    cout.width(9); cout << Theta()*180/TMath::Pi();
    cout.width(9); cout << Phi()*180/TMath::Pi();
    cout.width(7); cout << Eta();
    cout.width(9); cout << GetEtCone20();
    cout << "  ";
    if ( HasInvalidIsEM() ) {
	cout << "e";
    } else {
	cout << "-";
    }
    if ( IsLoose() ) {
	cout << "l";
    } else {
	cout << "-";
    }
    if ( IsMedium() || IsMediumIso() ) {
	cout << "m";
    } else {
	cout << "-";
    }
    if ( IsTight() || IsTightIso() ) {
	cout << "t";
    } else {
	cout << "-";
    }
    if ( IsMediumIso() || IsTightIso() ) {
	cout << "i";
    } else {
	cout << "-";
    }
    cout << "  ";
    if ( HasInvalidAuthor() ) {
	cout << "i";
    } else {
	cout << "-";
    }
    if ( IsHighPtElectron() ) {
	cout << "h";
    } else {
	cout << "-";
    }
    if ( IsSoftElectron() ) {
	cout << "s";
    } else {
	cout << "-";
    }
    if ( IsForwardElectron() ) {
	cout << "f";
    } else {
	cout << "-";
    }
    cout << "        " << IsGoodOQ();
    cout << endl;

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

//____________________________________________________________________

void AtlElectron::PrintHeader() {
    //
    // Print information header
    //
    cout << "---------------------------------------------------------------------------------------------"
	 << endl
	 << " Id  Chg Pt (GeV) E (GeV)  Minv (GeV)    Theta      Phi    Eta EtCone20  IsEM  Author   OQ   "
	 << endl
	 << "---------------------------------------------------------------------------------------------"
	 << endl;
}

//____________________________________________________________________

void AtlElectron::PrintFooter() {
    //
    // Print footer
    //
    cout << "   e=invalid l=loose m=medium t=tight i=isolated h=highPt s=soft f=forward" << endl
	 << "---------------------------------------------------------------------------------------------"
	 << endl;
}

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