//____________________________________________________________________
//
// Event writer for MemNtupls used by AtlSelector
// 
//
//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: AtlEvtWriterMem.cxx,v 1.4 2013/08/22 13:35:26 stamm Exp $
// Copyright: 2013 (C) Oliver Maria Kind
//
#ifndef ATLAS_AtlEvtWriterMem
#include <AtlEvtWriterMem.h>
#endif
#include <AtlBTag.h>

#ifndef __CINT__
ClassImp(AtlEvtWriterMem);
#endif

//____________________________________________________________________

AtlEvtWriterMem::AtlEvtWriterMem() {
    //
    // Default constructor
    //
    fElectrons = 0;
    fMuons     = 0;
    fJets      = 0;;
    fBJets     = 0;;
}

//____________________________________________________________________

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

//____________________________________________________________________

void AtlEvtWriterMem::BookTree(TTree *tree, AtlEvent *evt) {
    //
    // Book output MemNtuple
    //
    fTree  = tree;
    fEvent = evt;

    // ===============
    // Create branches
    // ===============

    // Evt header
    fTree->Branch("run_nr",     &fRunNr,       "run_nr/I");
    fTree->Branch("evt_nr",     &fEventNr,     "evt_nr/I");
    fTree->Branch("evt_weight", &fEventWeight, "evt_weight/F");

    // Missng Et
    fTree->Branch("met_et",  &fMET_Et,  "met_et/F");
    fTree->Branch("met_phi", &fMET_Phi, "met_phi/F");
    
    // Electrons
    fTree->Branch("el_n",  &fElectronN,   "el_n/I");
    fTree->Branch("el_e",   fElectronE,   "el_e[el_n]/F");
    fTree->Branch("el_pt",  fElectronPt,  "el_pt[el_n]/F");
    fTree->Branch("el_eta", fElectronEta, "el_eta[el_n]/F");
    fTree->Branch("el_phi", fElectronPhi, "el_phi[el_n]/F");
    fTree->Branch("el_chg", fElectronChg, "el_chg[el_n]/I");

    // Muons
    fTree->Branch("mu_n",  &fMuonN,   "mu_n/I");
    fTree->Branch("mu_e",   fMuonE,   "mu_e[mu_n]/F");
    fTree->Branch("mu_pt",  fMuonPt,  "mu_pt[mu_n]/F");
    fTree->Branch("mu_eta", fMuonEta, "mu_eta[mu_n]/F");
    fTree->Branch("mu_phi", fMuonPhi, "mu_phi[mu_n]/F");
    fTree->Branch("mu_chg", fMuonChg, "mu_chg[mu_n]/I");

    // Jets
    fTree->Branch("jet_n",      &fJetN,          "jet_n/I");
    fTree->Branch("jet_e",       fJetE,          "jet_e[jet_n]/F");
    fTree->Branch("jet_pt",      fJetPt,         "jet_pt[jet_n]/F");
    fTree->Branch("jet_eta",     fJetEta,        "jet_eta[jet_n]/F");
    fTree->Branch("jet_phi",     fJetPhi,        "jet_phi[jet_n]/F");
    fTree->Branch("jet_btagged", fJetBTagged,    "jet_btagged[jet_n]/O");
    fTree->Branch("jet_btagw",   fJetBTagWeight, "jet_btagw[jet_n]/F");
    fTree->Branch("jet_flav",    fJetFlav,       "jet_flav[jet_n]/B");
}

//____________________________________________________________________

void AtlEvtWriterMem::WriteEvent() {
    //
    // Write event
    //

    // =============
    // Fill branches
    // =============

    // Evt header
    fRunNr       = fEvent->RunNr();
    fEventNr     = fEvent->EventNr();
    fEventWeight = fEvent->GetTagEvtWeight();
    
    // Electrons
    TIter next_el(fElectrons);
    AtlElectron *el = 0;
    fElectronN = 0;
    while ( (el =  (AtlElectron*)next_el()) ) {
	fElectronE[fElectronN]   = el->E();
	fElectronPt[fElectronN]  = el->Pt();
	fElectronEta[fElectronN] = el->Eta();
	fElectronPhi[fElectronN] = el->Phi();
	fElectronChg[fElectronN] = ( el->IsPositive() ) ? 1 : -1;
	fElectronN++;
    }

    // Muons
    TIter next_mu(fMuons);
    AtlMuon *mu = 0;
    fMuonN = 0;
    while ( (mu =  (AtlMuon*)next_mu()) ) {
	fMuonE[fMuonN]   = mu->E();
	fMuonPt[fMuonN]  = mu->Pt();
	fMuonEta[fMuonN] = mu->Eta();
	fMuonPhi[fMuonN] = mu->Phi();
	fMuonChg[fMuonN] = ( mu->IsPositive() ) ? 1 : -1;
	fMuonN++;
    }

    // Jets
    TIter next_jet(fJets);
    AtlJet *jet = 0;
    AtlJet::EFlavour flavour = AtlJet::kUnknownFlavour;
    fJetN = 0;
    while ( (jet =  (AtlJet*)next_jet()) ) {
	fJetE[fJetN]          = jet->E();
	fJetPt[fJetN]         = jet->Pt();
	fJetEta[fJetN]        = jet->Eta();
	fJetPhi[fJetN]        = jet->Phi();
	fJetBTagWeight[fJetN] = jet->GetTag(fBTagger)->GetWeight();
	fJetBTagged[fJetN]    = ( fBJets->Contains(jet) );
	flavour = jet->GetTruthFlavour();
	switch ( flavour ) {
	    case AtlJet::kUnknownFlavour:
		fJetFlav[fJetN] = 'u';
		break;
	    case AtlJet::kLightFlavoured:
		fJetFlav[fJetN] = 'l';
		break;
	    case AtlJet::kCharm:
		fJetFlav[fJetN] = 'c';
		break;
	    case AtlJet::kBeauty:
		fJetFlav[fJetN] = 'b';
		break;
	    case AtlJet::kTau:
		fJetFlav[fJetN] = 't';
		break;
	    default:
		Error("WriteEvent", "Unknown jet truth flavour. Abort!");
		gSystem->Abort(1);
	}
	fJetN++;
    }
    
    // Missing Et
    fMET_Et  = fEvent->GetEnergySum()->MissingEt_Mag();
    fMET_Phi = fEvent->GetEnergySum()->MissingEt_Phi();
    
    // ===================
    // Write event to tree
    // ===================
    fTree->Fill();
}

//____________________________________________________________________

void AtlEvtWriterMem::SetElectrons(TList *electrons) {
    //
    // Set list of selected electrons
    //
    fElectrons = electrons;
}

//____________________________________________________________________

void AtlEvtWriterMem::SetMuons(TList *muons) {
    //
    // Set list selected muons
    //
    fMuons = muons;
}

//____________________________________________________________________

void AtlEvtWriterMem::SetJets(TList *jets, TList *bjets) {
    //
    // Set list of selected jets and b-jets
    //
    fJets  = jets;
    fBJets = bjets;
}

//____________________________________________________________________

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