//____________________________________________________________________
//
// MEM Ntuple production
// 
//
//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: AtlMemNtupleProduction.cxx,v 1.7 2014/02/05 21:30:04 kind Exp $
// Copyright: 2013 (C) Oliver Maria Kind
//
#ifndef SINGLETOP_AtlMemNtupleProduction
#include <AtlMemNtupleProduction.h>
#endif
#include <AtlEvtWriterMem.h>
#include <TList.h>
#include <iostream>

using namespace std;

#ifndef __CINT__
ClassImp(AtlMemNtupleProduction);
#endif

//____________________________________________________________________

AtlMemNtupleProduction::AtlMemNtupleProduction(const char* OutputFile) :
    AtlSelector(OutputFile) {
    //
    // Default constructor
    //
    fElectrons = 0;
    fMuons     = 0;
    fJets      = 0;
    fBJets     = 0;

    fObjTool   = 0;
    fSFTool    = 0;
    
    // Cut defaults
    fMET_min    = 0.;
    fMtW_min    = 0.;
    fNBTags_min = 0;
    fNBTags_max = 999;
    fLeadingJetIsBTagged = kFALSE;
}

//____________________________________________________________________

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

//____________________________________________________________________

void AtlMemNtupleProduction::Clear(Option_t *option) {
    //
    // Clears the dynamically allocated objects
    //
}

//____________________________________________________________________

void AtlMemNtupleProduction::BookHistograms() {
    //
    // Get analysis object from tool and set pointers to lists of
    // selected objects and select b-tagger.
    //
	
    // Get ObjectSelection Tool + pointers to analysis objects
    fObjTool = 
	(AtlObjectsToolD3PDSgTop*)GetTool("AtlObjectsToolD3PDSgTop"
					  ,"",kTRUE);
    fElectrons = fObjTool->GetElectrons();
    fMuons     = fObjTool->GetMuons();
    fLeptons   = fObjTool->GetLeptons();
    fJets      = fObjTool->GetJets();
    fBJets     = fObjTool->GetBJets();

    // Provide tools with pointers to analysis objects
    fSFTool = 
	(AtlObjRecoScaleFactorTool*)GetTool("AtlObjRecoScaleFactorTool"
					    ,"",kTRUE);
    fSFTool->SetLeptons(fLeptons);
    fSFTool->SetJets(fJets);

    // Set pointers to MemNtuple event writer
    if ( fOutputMode == kMemNtuple ) {
	((AtlEvtWriterMem*)fEvtWriter)->SetElectrons(fElectrons);
	((AtlEvtWriterMem*)fEvtWriter)->SetMuons(fMuons);
	((AtlEvtWriterMem*)fEvtWriter)->SetJets(fJets, fBJets);
	((AtlEvtWriterMem*)fEvtWriter)->SetBTagger(fObjTool->GetBTagger());
    }
}

//____________________________________________________________________

void AtlMemNtupleProduction::FillHistograms() {
    //
    // Fill histograms
    //    
}

//____________________________________________________________________

Bool_t AtlMemNtupleProduction::ProcessCut() {
    //
    // Event selection
    //

    // Missing Et
    if ( fEvent->GetEnergySum()->MissingEt_Mag() < fMET_min )
	return kFALSE;

    // Transverse W mass
    if ( fEvent->W_Mperp((HepParticle*)fLeptons->At(0)) < fMtW_min )
	return kFALSE;

    // Count no. of pre-tagged events
    fPreTaggedEvents++;
    fPreTaggedEventsW += fEvent->GetPreTagEvtWeight();
    
    // No. of b-tagged jets
    if ( fBJets->GetEntries() < fNBTags_min
	 || fBJets->GetEntries() > fNBTags_max) return kFALSE;

    // Require the leading jet to be b-tagged ?
    if ( fLeadingJetIsBTagged == kTRUE
	 && fBJets->At(0) != fJets->At(0) ) return kFALSE;    

    // Accept event
    return kTRUE;
}

//____________________________________________________________________

void AtlMemNtupleProduction::Print(Option_t *option) const {
    //
    // Print user analysis configuration
    //
    cout << endl
	 << "========================================================" << endl
	 << "  Mem Ntuple Production                                 " << endl
	 << "========================================================" << endl
	 << endl
	 << "  fMET_min             = " << fMET_min << " GeV" << endl
	 << "  fMtW_min             = " << fMtW_min << " GeV" << endl
	 << "  fNBTags_min          = " << fNBTags_min << endl
	 << "  fNBTags_max          = " << fNBTags_max << endl
	 << "  fLeadingJetIsBTagged = "
	 << ( (fLeadingJetIsBTagged) ? "true" : "false" ) << endl << endl
	 << "========================================================" << endl
	 << endl;
}
 AtlMemNtupleProduction.cxx:1
 AtlMemNtupleProduction.cxx:2
 AtlMemNtupleProduction.cxx:3
 AtlMemNtupleProduction.cxx:4
 AtlMemNtupleProduction.cxx:5
 AtlMemNtupleProduction.cxx:6
 AtlMemNtupleProduction.cxx:7
 AtlMemNtupleProduction.cxx:8
 AtlMemNtupleProduction.cxx:9
 AtlMemNtupleProduction.cxx:10
 AtlMemNtupleProduction.cxx:11
 AtlMemNtupleProduction.cxx:12
 AtlMemNtupleProduction.cxx:13
 AtlMemNtupleProduction.cxx:14
 AtlMemNtupleProduction.cxx:15
 AtlMemNtupleProduction.cxx:16
 AtlMemNtupleProduction.cxx:17
 AtlMemNtupleProduction.cxx:18
 AtlMemNtupleProduction.cxx:19
 AtlMemNtupleProduction.cxx:20
 AtlMemNtupleProduction.cxx:21
 AtlMemNtupleProduction.cxx:22
 AtlMemNtupleProduction.cxx:23
 AtlMemNtupleProduction.cxx:24
 AtlMemNtupleProduction.cxx:25
 AtlMemNtupleProduction.cxx:26
 AtlMemNtupleProduction.cxx:27
 AtlMemNtupleProduction.cxx:28
 AtlMemNtupleProduction.cxx:29
 AtlMemNtupleProduction.cxx:30
 AtlMemNtupleProduction.cxx:31
 AtlMemNtupleProduction.cxx:32
 AtlMemNtupleProduction.cxx:33
 AtlMemNtupleProduction.cxx:34
 AtlMemNtupleProduction.cxx:35
 AtlMemNtupleProduction.cxx:36
 AtlMemNtupleProduction.cxx:37
 AtlMemNtupleProduction.cxx:38
 AtlMemNtupleProduction.cxx:39
 AtlMemNtupleProduction.cxx:40
 AtlMemNtupleProduction.cxx:41
 AtlMemNtupleProduction.cxx:42
 AtlMemNtupleProduction.cxx:43
 AtlMemNtupleProduction.cxx:44
 AtlMemNtupleProduction.cxx:45
 AtlMemNtupleProduction.cxx:46
 AtlMemNtupleProduction.cxx:47
 AtlMemNtupleProduction.cxx:48
 AtlMemNtupleProduction.cxx:49
 AtlMemNtupleProduction.cxx:50
 AtlMemNtupleProduction.cxx:51
 AtlMemNtupleProduction.cxx:52
 AtlMemNtupleProduction.cxx:53
 AtlMemNtupleProduction.cxx:54
 AtlMemNtupleProduction.cxx:55
 AtlMemNtupleProduction.cxx:56
 AtlMemNtupleProduction.cxx:57
 AtlMemNtupleProduction.cxx:58
 AtlMemNtupleProduction.cxx:59
 AtlMemNtupleProduction.cxx:60
 AtlMemNtupleProduction.cxx:61
 AtlMemNtupleProduction.cxx:62
 AtlMemNtupleProduction.cxx:63
 AtlMemNtupleProduction.cxx:64
 AtlMemNtupleProduction.cxx:65
 AtlMemNtupleProduction.cxx:66
 AtlMemNtupleProduction.cxx:67
 AtlMemNtupleProduction.cxx:68
 AtlMemNtupleProduction.cxx:69
 AtlMemNtupleProduction.cxx:70
 AtlMemNtupleProduction.cxx:71
 AtlMemNtupleProduction.cxx:72
 AtlMemNtupleProduction.cxx:73
 AtlMemNtupleProduction.cxx:74
 AtlMemNtupleProduction.cxx:75
 AtlMemNtupleProduction.cxx:76
 AtlMemNtupleProduction.cxx:77
 AtlMemNtupleProduction.cxx:78
 AtlMemNtupleProduction.cxx:79
 AtlMemNtupleProduction.cxx:80
 AtlMemNtupleProduction.cxx:81
 AtlMemNtupleProduction.cxx:82
 AtlMemNtupleProduction.cxx:83
 AtlMemNtupleProduction.cxx:84
 AtlMemNtupleProduction.cxx:85
 AtlMemNtupleProduction.cxx:86
 AtlMemNtupleProduction.cxx:87
 AtlMemNtupleProduction.cxx:88
 AtlMemNtupleProduction.cxx:89
 AtlMemNtupleProduction.cxx:90
 AtlMemNtupleProduction.cxx:91
 AtlMemNtupleProduction.cxx:92
 AtlMemNtupleProduction.cxx:93
 AtlMemNtupleProduction.cxx:94
 AtlMemNtupleProduction.cxx:95
 AtlMemNtupleProduction.cxx:96
 AtlMemNtupleProduction.cxx:97
 AtlMemNtupleProduction.cxx:98
 AtlMemNtupleProduction.cxx:99
 AtlMemNtupleProduction.cxx:100
 AtlMemNtupleProduction.cxx:101
 AtlMemNtupleProduction.cxx:102
 AtlMemNtupleProduction.cxx:103
 AtlMemNtupleProduction.cxx:104
 AtlMemNtupleProduction.cxx:105
 AtlMemNtupleProduction.cxx:106
 AtlMemNtupleProduction.cxx:107
 AtlMemNtupleProduction.cxx:108
 AtlMemNtupleProduction.cxx:109
 AtlMemNtupleProduction.cxx:110
 AtlMemNtupleProduction.cxx:111
 AtlMemNtupleProduction.cxx:112
 AtlMemNtupleProduction.cxx:113
 AtlMemNtupleProduction.cxx:114
 AtlMemNtupleProduction.cxx:115
 AtlMemNtupleProduction.cxx:116
 AtlMemNtupleProduction.cxx:117
 AtlMemNtupleProduction.cxx:118
 AtlMemNtupleProduction.cxx:119
 AtlMemNtupleProduction.cxx:120
 AtlMemNtupleProduction.cxx:121
 AtlMemNtupleProduction.cxx:122
 AtlMemNtupleProduction.cxx:123
 AtlMemNtupleProduction.cxx:124
 AtlMemNtupleProduction.cxx:125
 AtlMemNtupleProduction.cxx:126
 AtlMemNtupleProduction.cxx:127
 AtlMemNtupleProduction.cxx:128
 AtlMemNtupleProduction.cxx:129
 AtlMemNtupleProduction.cxx:130
 AtlMemNtupleProduction.cxx:131
 AtlMemNtupleProduction.cxx:132
 AtlMemNtupleProduction.cxx:133
 AtlMemNtupleProduction.cxx:134
 AtlMemNtupleProduction.cxx:135
 AtlMemNtupleProduction.cxx:136
 AtlMemNtupleProduction.cxx:137
 AtlMemNtupleProduction.cxx:138
 AtlMemNtupleProduction.cxx:139
 AtlMemNtupleProduction.cxx:140
 AtlMemNtupleProduction.cxx:141
 AtlMemNtupleProduction.cxx:142
 AtlMemNtupleProduction.cxx:143
 AtlMemNtupleProduction.cxx:144
 AtlMemNtupleProduction.cxx:145
 AtlMemNtupleProduction.cxx:146
 AtlMemNtupleProduction.cxx:147
 AtlMemNtupleProduction.cxx:148
 AtlMemNtupleProduction.cxx:149
 AtlMemNtupleProduction.cxx:150
 AtlMemNtupleProduction.cxx:151
 AtlMemNtupleProduction.cxx:152
 AtlMemNtupleProduction.cxx:153
 AtlMemNtupleProduction.cxx:154
 AtlMemNtupleProduction.cxx:155