//___________________________________________________________
//
// A++ Object Definition and Correction Tool for Run 2
//
// Select objects (currenly leptons and jets) according to
// user-defined criteria, and apply corrections to the
// simulation.
//

#include "AtlObjectsDefinitionToolR2.h"

#include <cassert>
#include <cmath>

#include <TCollection.h>
#include <TList.h>
#include <TLorentzVector.h>

#include "AtlElectron.h"
#include "AtlEvent.h"
#include "AtlEventHeader.h"
#include "AtlJet.h"
#include "AtlMuon.h"
#include "AtlScaleFactor.h"


namespace {

template<typename _SpecialT, typename _GenericT>
_SpecialT polymorphic_downcast(_GenericT * x) {
    assert(dynamic_cast<_SpecialT>(x) == x);
    return static_cast<_SpecialT>(x);
}

}

//___________________________________________________________

AtlObjectsDefinitionToolR2::AtlObjectsDefinitionToolR2(char const * name, char const * title)
    : AtlObjectsDefinitionTool(name, title)
    , fElectronPt_min(-INFINITY)
    , fMuonPt_min(-INFINITY)
    , fJetEta_max(INFINITY)
    , fJetPt_min(-INFINITY)
    , fJetsAuthor(AtlJet::kInvalidType)
    , fBtagger(AtlBTag::kInvalidTagger)
    , fBtaggingWorkingPoint(NAN)
    , fBtaggingNominalEfficiency(-1)
    , fWeights(kAllSF)

    , fLeptons(new TList())
    , fElectrons(new TList())
    , fMuons(new TList())
    , fJets(new TList())
    , fBJets(new TList())

    , fClean(kTRUE)
{
}

//___________________________________________________________

AtlObjectsDefinitionToolR2::~AtlObjectsDefinitionToolR2() {
    delete fBJets;
    delete fJets;
    delete fMuons;
    delete fElectrons;
    delete fLeptons;
}

//___________________________________________________________

void AtlObjectsDefinitionToolR2::Clear() {
    //
    // Clear the event (but not the configuration!).
    //
    fLeptons->Clear();
    fElectrons->Clear();
    fMuons->Clear();
    fJets->Clear();
    fBJets->Clear();
    fClean = kTRUE;
}

//___________________________________________________________

Bool_t AtlObjectsDefinitionToolR2::AnalyzeEvent() {

    /* check pre-conditions */
    assert(fClean);
    fClean = kFALSE;

    /* standard electron collection */
    for ( TIter next(fEvent->GetElectrons()); AtlElectron * lep = polymorphic_downcast<AtlElectron *>(next()); ) {
        if ( lep->P().Pt() >= fElectronPt_min ) {
            if ( lep->IsTight() ) {
                fElectrons->Add(lep);
                fLeptons->Add(lep);
            }
        }
    }

    /* standard lepton collection */
    for ( TIter next(fEvent->GetMuons()); AtlMuon * lep = polymorphic_downcast<AtlMuon *>(next()); ) {
        if ( lep->P().Pt() >= fMuonPt_min ) {
            if ( lep->IsTight() ) {
                fMuons->Add(lep);
                fLeptons->Add(lep);
            }
        }
    }

    /* standard (b-)jet collections */
    for ( TIter next(fEvent->GetJets(fJetsAuthor)); AtlJet * jet = polymorphic_downcast<AtlJet *>(next()); ) {
        TLorentzVector const & p = jet->P();
        if ( p.Pt() >= fJetPt_min && fabs(p.Eta()) < fJetEta_max ) {
            fJets->Add(jet);
            AtlBTag const * tag = (fBtagger != AtlBTag::kInvalidTagger ? jet->GetTag(fBtagger) : 0);
            if ( tag ) {
                if ( tag->GetWeight() > fBtaggingWorkingPoint ) {
                    fBJets->Add(jet);
                }
            }
        }
    }

    /* sort by transverse momentum */
    fMuons->Sort(kSortDescending);
    fElectrons->Sort(kSortDescending);
    fLeptons->Sort(kSortDescending);
    fJets->Sort(kSortDescending);
    fBJets->Sort(kSortDescending);

    /* do scale factors */
    AtlEventHeader & eventHeader = *fEvent->GetEventHeader();
    if ( eventHeader.IsMC() ) {
        double eventWeight = eventHeader.GetMCWeight();
        if ( (fWeights & kPileupSF) ) {
            eventWeight *= eventHeader.GetPileupWeight();
        }
        if ( (fWeights & kZVertexSF) ) {
            eventWeight *= eventHeader.GetZVtxWeight();
        }
        if ( (fWeights & kJetVertexSF) ) {
            eventWeight *= eventHeader.JetVertexWeight().GetValue();
        }
        if ( (fWeights & kLeptonSF) ) {
            if ( (fWeights & kLeptonSF) == kLeptonSF ) {
                eventWeight *= eventHeader.LeptonWeight().GetValue();
            }
            else {
                Fatal(__FUNCTION__, "Individual electron, muon and trigger weights are not supported -- use EWeights::kLepton.");
            }
        }
        eventHeader.SetPreTagEvtWeight(eventWeight);
        if ( (fWeights & kBtaggingSF) ) {
            eventWeight *= GetBtaggingSF().GetValue();
        }
        eventHeader.SetTagEvtWeight(eventWeight);
    }
    else {
        double eventWeight = 1.;
        eventHeader.SetPreTagEvtWeight(eventWeight);
        eventHeader.SetTagEvtWeight(eventWeight);
    }

    return kTRUE;
}

//___________________________________________________________

AtlScaleFactor const & AtlObjectsDefinitionToolR2::GetBtaggingSF() const {
    AtlEventHeader & eventHeader = *fEvent->GetEventHeader();
    switch ( fBtagger ) {

    case AtlBTag::kMV2c10_70:
        if ( fJetsAuthor == AtlJet::kAntiKt4TopoEM )
            return eventHeader.BtagWeight_MV2c10_70();
        break;

    case AtlBTag::kMV2c10_77:
        if ( fJetsAuthor == AtlJet::kAntiKt4TopoEM )
            return eventHeader.BtagWeight_MV2c10_77();
        break;

    case AtlBTag::kMV2c10_85:
        if ( fJetsAuthor == AtlJet::kAntiKt4TopoEM )
            return eventHeader.BtagWeight_MV2c10_85();
        break;

    case AtlBTag::kMV2c20:
        switch ( fJetsAuthor ) {

        case AtlJet::kAntiKt4TopoEM:
            switch ( fBtaggingNominalEfficiency ) {
            case 77: return eventHeader.BtagWeight_MV2c20_77();
            case 85: return eventHeader.BtagWeight_MV2c20_85();
            }
            break;

        }
        break;

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