//____________________________________________________________________
//
// Atlas tau class
// 
// For details on the Tau reconstruction look at the Tau working group wiki page
// BEGIN_HTML
// <a href="https://twiki.cern.ch/twiki/bin/view/AtlasProtected/TauWG">
// https://twiki.cern.ch/twiki/bin/view/AtlasProtected/TauWG</a>
// END_HTML
//
//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: AtlTau.cxx,v 1.9 2015/04/22 22:22:27 stamm Exp $
// Copyright: 2008 (C) Oliver Maria Kind
//
#ifndef ATLAS_AtlTau
#include <AtlTau.h>
#endif
#include <TSystem.h>
#include <iostream>

using namespace std;

#ifndef __CINT__
ClassImp(AtlTau);
#endif

const Int_t AtlTau::fgNAuthors = 3;
const char* AtlTau::fgAuthorNames[] = {
    "Invalid", "TauRec", "Tau1P3P" 
};
const Int_t AtlTau::fgNTauFlags = 20;
const char* AtlTau::fgTauFlagNames[] = {
    "Invalid", "TauCutLoose", "TauCutMedium", "TauCutTight",
    "ElectronVeto", "MuonVeto", "TauLlhTight", "TauLlhMedium",
    "TauLlhLoose", "TauRecOld", "Tau1P3POld", "TauCutSafeLoose",
    "TauCutSafeMedium", "TauCutSafeTight", "TauCutSafeCaloLoose",
    "TauCutSafeCaloMedium", "TauCutSafeCaloTight", "ElectronVetoLoose",
    "ElectronVetoMedium", "ElectronVetoTight"
};

//____________________________________________________________________

AtlTau::AtlTau() {
  //
  // Default constructor
  //
}

//____________________________________________________________________

AtlTau::AtlTau(Int_t Id, Float_t Px, Float_t Py, Float_t Pz,
	       Float_t E, Bool_t IsTauPlus, 
	       EAuthor Author, ETauFlag TauFlag):
    HepTau(Id, Px, Py, Pz, E, IsTauPlus), fAuthor(Author),
    fTauFlag(TauFlag) {
    //
    // Normal constructor
    //
  
}

//____________________________________________________________________

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

//____________________________________________________________________

void AtlTau::Clear(Option_t *option) {
    //
    // Clear object
    //
    HepTau::Clear(option);
    AtlTriggerMatch::Clear(option);
    fAuthor  = kInvalidAuthor;
    fTauFlag = kInvalidTauFlag;
}

//_____________________________________________________________

void AtlTau::Print(Option_t *option) {
    //
    // Print tau information
    //
    // Options available:
    //   "nohead" - No header containing the variable names is
    //              displayed. Useful when printing a whole table
    //              for a list of taus
    //   "flag"   - Print settings of the tau particle id flag
    //
    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(12); cout << Pt();
    cout.width(12); cout << E();
    cout.precision(6);
    cout.width(12); cout << M("REC");
    cout.precision(3);
    cout.width(12);
    cout.width(12); cout << Theta()*180/TMath::Pi();
    cout.width(12); cout << Phi()*180/TMath::Pi();
    cout.width(12); cout << Eta();
    cout.width(14);
    cout << NameOfAuthor();
    cout << endl;

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

//____________________________________________________________________

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

//____________________________________________________________________

void AtlTau::PrintFooter() {
    //
    // Print footer
    //
    cout << "------------------------------------------------------------------------------------------------"
	 << endl;
}

//____________________________________________________________________

const char* AtlTau::NameOfAuthor() {
  //                                                                                                                                                                           
  // Return name(s) of reconstruction algorithm used                                                                                                                           
  //                                                                                                                                                                           
  TString author("");
  if ( IsInvalidAuthor() ) {
    if ( author.Length() > 0 ) author.Append(",");
    author.Append("invalid");
  }
  if ( IsTauRec() ) {
    if ( author.Length() > 0 ) author.Append(",");
    author.Append("rec");
  }
  if ( IsTau1P3P() ) {
    if ( author.Length() > 0 ) author.Append(",");
    author.Append("1P3P");
  }

  return author.Data();
}


//____________________________________________________________________

void AtlTau::PrintTauFlag() {
    //
    // Print reconstruction flags
    //
    cout << endl
	 << "==========================" << endl
	 << " Tau reconstruction" << endl
	 << "--------------------------" << endl
	 << "Invalid                 " << IsInvalidTauFlag() << endl
	 << "MuonVeto                " << IsMuonVeto() << endl
	 << "ElectronVetoLoose       " << IsElectronVetoLoose() << endl
	 << "ElectronVetoMedium      " << IsElectronVetoMedium() << endl
	 << "ElectronVetoTight       " << IsElectronVetoTight() << endl
	 << "JetVetoLoose            " << IsJetVetoLoose() << endl
	 << "JetVetoMedium           " << IsJetVetoMedium() << endl
	 << "JetVetoTight            " << IsJetVetoTight() << endl
	 << "==========================" << endl << endl;
}
 AtlTau.cxx:1
 AtlTau.cxx:2
 AtlTau.cxx:3
 AtlTau.cxx:4
 AtlTau.cxx:5
 AtlTau.cxx:6
 AtlTau.cxx:7
 AtlTau.cxx:8
 AtlTau.cxx:9
 AtlTau.cxx:10
 AtlTau.cxx:11
 AtlTau.cxx:12
 AtlTau.cxx:13
 AtlTau.cxx:14
 AtlTau.cxx:15
 AtlTau.cxx:16
 AtlTau.cxx:17
 AtlTau.cxx:18
 AtlTau.cxx:19
 AtlTau.cxx:20
 AtlTau.cxx:21
 AtlTau.cxx:22
 AtlTau.cxx:23
 AtlTau.cxx:24
 AtlTau.cxx:25
 AtlTau.cxx:26
 AtlTau.cxx:27
 AtlTau.cxx:28
 AtlTau.cxx:29
 AtlTau.cxx:30
 AtlTau.cxx:31
 AtlTau.cxx:32
 AtlTau.cxx:33
 AtlTau.cxx:34
 AtlTau.cxx:35
 AtlTau.cxx:36
 AtlTau.cxx:37
 AtlTau.cxx:38
 AtlTau.cxx:39
 AtlTau.cxx:40
 AtlTau.cxx:41
 AtlTau.cxx:42
 AtlTau.cxx:43
 AtlTau.cxx:44
 AtlTau.cxx:45
 AtlTau.cxx:46
 AtlTau.cxx:47
 AtlTau.cxx:48
 AtlTau.cxx:49
 AtlTau.cxx:50
 AtlTau.cxx:51
 AtlTau.cxx:52
 AtlTau.cxx:53
 AtlTau.cxx:54
 AtlTau.cxx:55
 AtlTau.cxx:56
 AtlTau.cxx:57
 AtlTau.cxx:58
 AtlTau.cxx:59
 AtlTau.cxx:60
 AtlTau.cxx:61
 AtlTau.cxx:62
 AtlTau.cxx:63
 AtlTau.cxx:64
 AtlTau.cxx:65
 AtlTau.cxx:66
 AtlTau.cxx:67
 AtlTau.cxx:68
 AtlTau.cxx:69
 AtlTau.cxx:70
 AtlTau.cxx:71
 AtlTau.cxx:72
 AtlTau.cxx:73
 AtlTau.cxx:74
 AtlTau.cxx:75
 AtlTau.cxx:76
 AtlTau.cxx:77
 AtlTau.cxx:78
 AtlTau.cxx:79
 AtlTau.cxx:80
 AtlTau.cxx:81
 AtlTau.cxx:82
 AtlTau.cxx:83
 AtlTau.cxx:84
 AtlTau.cxx:85
 AtlTau.cxx:86
 AtlTau.cxx:87
 AtlTau.cxx:88
 AtlTau.cxx:89
 AtlTau.cxx:90
 AtlTau.cxx:91
 AtlTau.cxx:92
 AtlTau.cxx:93
 AtlTau.cxx:94
 AtlTau.cxx:95
 AtlTau.cxx:96
 AtlTau.cxx:97
 AtlTau.cxx:98
 AtlTau.cxx:99
 AtlTau.cxx:100
 AtlTau.cxx:101
 AtlTau.cxx:102
 AtlTau.cxx:103
 AtlTau.cxx:104
 AtlTau.cxx:105
 AtlTau.cxx:106
 AtlTau.cxx:107
 AtlTau.cxx:108
 AtlTau.cxx:109
 AtlTau.cxx:110
 AtlTau.cxx:111
 AtlTau.cxx:112
 AtlTau.cxx:113
 AtlTau.cxx:114
 AtlTau.cxx:115
 AtlTau.cxx:116
 AtlTau.cxx:117
 AtlTau.cxx:118
 AtlTau.cxx:119
 AtlTau.cxx:120
 AtlTau.cxx:121
 AtlTau.cxx:122
 AtlTau.cxx:123
 AtlTau.cxx:124
 AtlTau.cxx:125
 AtlTau.cxx:126
 AtlTau.cxx:127
 AtlTau.cxx:128
 AtlTau.cxx:129
 AtlTau.cxx:130
 AtlTau.cxx:131
 AtlTau.cxx:132
 AtlTau.cxx:133
 AtlTau.cxx:134
 AtlTau.cxx:135
 AtlTau.cxx:136
 AtlTau.cxx:137
 AtlTau.cxx:138
 AtlTau.cxx:139
 AtlTau.cxx:140
 AtlTau.cxx:141
 AtlTau.cxx:142
 AtlTau.cxx:143
 AtlTau.cxx:144
 AtlTau.cxx:145
 AtlTau.cxx:146
 AtlTau.cxx:147
 AtlTau.cxx:148
 AtlTau.cxx:149
 AtlTau.cxx:150
 AtlTau.cxx:151
 AtlTau.cxx:152
 AtlTau.cxx:153
 AtlTau.cxx:154
 AtlTau.cxx:155
 AtlTau.cxx:156
 AtlTau.cxx:157
 AtlTau.cxx:158
 AtlTau.cxx:159
 AtlTau.cxx:160
 AtlTau.cxx:161
 AtlTau.cxx:162
 AtlTau.cxx:163
 AtlTau.cxx:164
 AtlTau.cxx:165
 AtlTau.cxx:166
 AtlTau.cxx:167
 AtlTau.cxx:168
 AtlTau.cxx:169
 AtlTau.cxx:170
 AtlTau.cxx:171
 AtlTau.cxx:172
 AtlTau.cxx:173
 AtlTau.cxx:174
 AtlTau.cxx:175
 AtlTau.cxx:176
 AtlTau.cxx:177
 AtlTau.cxx:178
 AtlTau.cxx:179
 AtlTau.cxx:180
 AtlTau.cxx:181
 AtlTau.cxx:182
 AtlTau.cxx:183
 AtlTau.cxx:184
 AtlTau.cxx:185
 AtlTau.cxx:186
 AtlTau.cxx:187
 AtlTau.cxx:188
 AtlTau.cxx:189
 AtlTau.cxx:190
 AtlTau.cxx:191
 AtlTau.cxx:192
 AtlTau.cxx:193