//___________________________________________________________
//
//  Top QCD estimation Tool
//
//  This tool is used to estimate the QCD background with the Matrix
//  Method for muons and electrons.
// 
// Author: Umberto Prosperi Porta<mailto: oreste@physik.hu-berlin.de.de>
// Update: $Id: AtlQCDMMTool.cxx,v 1.25 2018/01/15 16:03:03 kaphle Exp $
// Copyright: 2011 (C) Umberto Prosperi Porta 
//
//
//
//
#ifndef ATLAS_AtlQCDMMTool
#include <AtlQCDMMTool.h>
#endif
#include <AtlEvent.h>
#include <TString.h>
#include <TMath.h>
#include <TF1.h>
#include <TH1F.h>
#include <AtlElectron.h>
#include <AtlMuon.h>
#include <iostream>
#include <fstream>

using namespace std;

#ifndef __CINT__
ClassImp(AtlQCDMMTool);
#endif

//___________________________________________________________

AtlQCDMMTool::AtlQCDMMTool(const char* name, const char* title) : 
    AtlAnalysisTool(name, title) {
    //
    // Default constructor
    //
    fHistMMWeight_nominal = 0;
    fHistMMWeight_e_nominal = 0;
    fHistMMWeight_mu_nominal = 0;
    fHistMMEff_fake = 0;
    fHistMMEff_e_fake = 0;
    fHistMMEff_mu_fake = 0;
    fHistMMEff_real = 0;
    fHistMMEff_e_real = 0;
    fHistMMEff_mu_real = 0;
    fObjTool = 0;
    SetCutDefaults();
    
    // Fake weights
    fFakeWeightEJets = new FakesWeights();
    fFakeWeightMuJets = new FakesWeights();
    fEfficiencyPath2015 = TString("$APP_HOME/external/TopFakes/data/20p7/2015");
    fEfficiencyPath2016 = TString("$APP_HOME/external/TopFakes/data/20p7/2016");
    fYear = TString("0000"); 
    // fFakeParamString_fake = TString("NS:pt:dPhi:nbtag");
    // fFakeParamString_real = TString("NS:pt:dR");
    fParamString_fake2015 = TString("2015Test:NS:jetpt:eta:dR");
    fParamString_fake2016 = TString("2016Test:NS:jetpt:eta:dR");
    fParamString_real2015 = TString("2015Test:NS:jetpt:eta:dR");
    fParamString_real2016 = TString("2016Test:NS:jetpt:eta:dR");
    fBTagger = AtlBTag::kInvalidTagger;
}

//___________________________________________________________

AtlQCDMMTool::~AtlQCDMMTool() {
    //
    // Default destructor
    //
    if ( fHistMMWeight_nominal != 0 ) delete fHistMMWeight_nominal;
    if ( fHistMMWeight_e_nominal != 0 )  delete fHistMMWeight_e_nominal;
    if ( fHistMMWeight_mu_nominal != 0 )  delete fHistMMWeight_mu_nominal;
    if ( fHistMMEff_fake != 0 )  delete fHistMMEff_fake;
    if ( fHistMMEff_e_fake != 0 )  delete fHistMMEff_e_fake;
    if ( fHistMMEff_mu_fake != 0 )  delete fHistMMEff_mu_fake;
    if ( fHistMMEff_real != 0 )  delete fHistMMEff_real;
    if ( fHistMMEff_e_real != 0 )  delete fHistMMEff_e_real;
    if ( fHistMMEff_mu_real != 0 )  delete fHistMMEff_mu_real;
    if ( fFakeWeightEJets != 0 )  delete fFakeWeightEJets;
    if ( fFakeWeightMuJets != 0 )  delete fFakeWeightMuJets;
}

//___________________________________________________________

void AtlQCDMMTool::SetBranchStatus() {
    //
    // Switch on needed branches
    //
    fTree->SetBranchStatus("fEventHeader*", kTRUE);
}

//___________________________________________________________

void AtlQCDMMTool::SetCutDefaults() {
    //
    // Selection cut defaults
    //
    fProcessMode = kPreAnalysis;
}

//___________________________________________________________

Bool_t AtlQCDMMTool::Notify() {
    //
    // This function is called every time when a new input file is
    // opened.
    //

    TDirectory *savdir = gDirectory;

    // Fetch efficiency histograms for the matrix method (run-2 only)
    TString fname(fParent->GetCurrentTree()->GetCurrentFile()->GetName());
    Int_t pos = fname.Index(".data");
    TString year = fname(pos+5, 2);

    if ( year.EqualTo("15") || year.EqualTo("16") ) {
	year.Prepend("20");
	if ( year.EqualTo(fYear) ) {
	    // don't setup weighter again if year was already correct
	    return kTRUE;
	}
	fYear = year;
	TString eff_path;
	TString eff_fake;
	TString eff_real;
	if ( year.EqualTo("2015") ) {
	    fFakeWeightEJets->SetPeriod(1);
	    fFakeWeightMuJets->SetPeriod(1);
	    eff_path = fEfficiencyPath2015;
	    eff_fake = fParamString_fake2015;
	    eff_real = fParamString_real2015;
	    eff_fake.ReplaceAll("/TR", ""); // somehow this does not work otherwise
	    eff_real.ReplaceAll("/TR", "");
	} else {
	    fFakeWeightEJets->SetPeriod(2);
	    fFakeWeightMuJets->SetPeriod(2);
	    eff_path = fEfficiencyPath2016;
	    eff_fake = fParamString_fake2016;
	    eff_real = fParamString_real2016;
	}
	Info(__FUNCTION__, "Load MM efficiency files from %s", eff_path.Data());
	fFakeWeightEJets->SetDataPath(eff_path.Data());
	fFakeWeightEJets->SetupWeighter(FakesWeights::EJETS, eff_fake.Data(), eff_real.Data());
	fFakeWeightMuJets->SetDataPath(eff_path.Data());
	fFakeWeightMuJets->SetupWeighter(FakesWeights::MUJETS, eff_fake.Data(), eff_real.Data());
    } else {
	Error(__FUNCTION__, "Input data file is neither 2015 nor 2016. Abort!");
	gSystem->Abort(1);
    }

    savdir->cd();

    return kTRUE;
}

//___________________________________________________________

void AtlQCDMMTool::BookHistograms() {
    //
    // Book histograms
    //
    if ( fObjTool == 0 ) {
	fObjTool = (AtlObjectsToolD3PDSgTop*)
	    GetTool("AtlObjectsToolD3PDSgTop", "",kTRUE);
	fBTagger = fObjTool->GetBTagger();
    }

    fHistMMWeight_nominal = new TH1F("h_MMWeight_nominal",
    				      "QCDMM nominal weight",
    				      30, -1., 2.);
    fHistMMWeight_nominal->SetXTitle("QCDMM weight nominal");
    fHistMMWeight_nominal->SetYTitle("Number of Entries");

    fHistMMWeight_e_nominal = new TH1F("h_MMWeight_e_nominal",
				       "QCDMM nominal weight for electrons",
    				      30, -1., 2.);
    fHistMMWeight_e_nominal->SetXTitle("QCDMM weight nominal");
    fHistMMWeight_e_nominal->SetYTitle("Number of Entries");

    fHistMMWeight_mu_nominal = new TH1F("h_MMWeight_mu_nominal",
    				      "QCDMM nominal weight for muons",
    				      30, -1., 2.);
    fHistMMWeight_mu_nominal->SetXTitle("QCDMM weight nominal");
    fHistMMWeight_mu_nominal->SetYTitle("Number of Entries");

    // Fake Efficiency l,e,nu
    fHistMMEff_fake = new TH1F("h_MMEff_fake",
			       "QCDMM fake efficiency",
			       30, -1., 2.);
    fHistMMEff_fake->SetXTitle("QCDMM fake efficiency");
    fHistMMEff_fake->SetYTitle("Number of Entries");
    fHistMMEff_e_fake = new TH1F("h_MMEff_e_fake",
			       "QCDMM fake efficiency",
			       30, -1., 2.);
    fHistMMEff_e_fake->SetXTitle("QCDMM fake efficiency");
    fHistMMEff_e_fake->SetYTitle("Number of Entries");
    fHistMMEff_mu_fake = new TH1F("h_MMEff_mu_fake",
			       "QCDMM fake efficiency",
			       30, -1., 2.);
    fHistMMEff_mu_fake->SetXTitle("QCDMM fake efficiency");
    fHistMMEff_mu_fake->SetYTitle("Number of Entries");

    // Real Efficiency l,e,nu
    fHistMMEff_real = new TH1F("h_MMEff_real",
			       "QCDMM real efficiency",
			       30, -1., 2.);
    fHistMMEff_real->SetXTitle("QCDMM real efficiency");
    fHistMMEff_real->SetYTitle("Number of Entries");
    fHistMMEff_e_real = new TH1F("h_MMEff_e_real",
			       "QCDMM real efficiency",
			       30, -1., 2.);
    fHistMMEff_e_real->SetXTitle("QCDMM real efficiency");
    fHistMMEff_e_real->SetYTitle("Number of Entries");
    fHistMMEff_mu_real = new TH1F("h_MMEff_mu_real",
			       "QCDMM real efficiency",
			       30, -1., 2.);
    fHistMMEff_mu_real->SetXTitle("QCDMM real efficiency");
    fHistMMEff_mu_real->SetYTitle("Number of Entries");
}

//___________________________________________________________

void AtlQCDMMTool::InitEvent() {
    //
    // Definition of event with determination of physical objects
    //
}

//___________________________________________________________

Bool_t AtlQCDMMTool::AnalyzeEvent() {
    //
    // Invocation of tool, computes the event weights
    // in order to estimate QCD
    //
    if ( gDebug > 0 )
	Info(__FUNCTION__, "Beginning function");
    Bool_t is_electron;
    Bool_t is_tight;

    // Obtain weight
    if ( fEvent->IsRun1() ) {
	fMMWeight = fEvent->GetMMWeightNominal();
    } else if ( fEvent->IsRun2() ) {
	// apply pT cut on loose leptons first
	fObjTool->ApplyLooseLeptonPtCut();
	// skip (weight=0) if not exactly 1 electron/muon
	fMMWeight = 0.;
	HepParticle *lepton;
	if ( fObjTool->GetLeptons()->GetEntries() +
	     fObjTool->GetLooseLeptons()->GetEntries() == 1 ) {
	    if ( fObjTool->GetLeptons()->GetEntries() == 1 ) {
		// tight
		is_tight = kTRUE;
		lepton = (HepParticle*)fObjTool->GetLeptons()->First();
		if ( lepton->IsElectron() ) {
		    is_electron = kTRUE;
		} else if ( lepton->IsMuon() ) {
		    is_electron = kFALSE;
		} else {
		    Warning(__FUNCTION__, "Lepton has invalid ID of %d",
			    lepton->GetPdgCode());
		}
	    } else {
		// loose
		is_tight = kFALSE;
		lepton = (HepParticle*)fObjTool->GetLooseLeptons()->First();
		if ( lepton->IsElectron() ) {
		    is_electron = kTRUE;
		} else if ( lepton->IsMuon() ) {
		    is_electron = kFALSE;
		} else {
		    // ??
		    Error(__FUNCTION__, "Lepton has invalid ID of %d",
			  lepton->GetPdgCode());
		}
	    } 
	    
	    // set up trigger variable
	    //   The trigger split is defined in MMEffSet::AddTriggerSplit()
	    //     and it is accessed in MMEffSet::TriggerValue().
	    //   Trigger information available in the ntuples can be found
	    //     in any logfile when running a sample.
	    // TO DO: use trigger match or trigger pass?
	    int trigmatch = 0;
	    if ( is_electron && fYear.EqualTo("2015") ) {
		; // no trigger split available in eff files and MMEffSet
	    }
	    if ( is_electron && fYear.EqualTo("2016") ) {
		// no big influence; first trigger with e26 instead of e24
		if ( fEvent->HasPassedHLT("HLT_e26_lhtight_nod0_ivarloose") )
		    trigmatch |= 0x1 << 0;
		if ( fEvent->HasPassedHLT("HLT_e60_lhmedium_nod0") )
		    trigmatch |= 0x1 << 1;
	    	if ( fEvent->HasPassedHLT("HLT_e24_lhmedium_L1EM20VH") )
		    trigmatch  |= 0x1 << 2;
	    }
	    if ( !is_electron && fYear.EqualTo("2015") ) {
		// third trigger not available in ntuple
	    	if ( fEvent->HasPassedHLT("HLT_mu20_iloose_L1MU15") )
		    trigmatch |= 0x1 << 0;
	    	if ( fEvent->HasPassedHLT("HLT_mu50") )
		    trigmatch |= 0x1 << 1;
	    	// if ( fEvent->HasPassedHLT("HLT_mu20_L1MU15") )
		//     trigmatch  |= 0x1 << 2;
	    }
	    if ( !is_electron && fYear.EqualTo("2016") ) {
		// third trigger not available; first with mu24->mu26 
	    	if ( fEvent->HasPassedHLT("HLT_mu26_ivarmedium") )
		    trigmatch |= 0x1 << 0;
	    	if ( fEvent->HasPassedHLT("HLT_mu50") )
		    trigmatch |= 0x1 << 1;
	    	// if ( fEvent->HasPassedHLT("HLT_mu24") )
		//     trigmatch  |= 0x1 << 2;
	    }

	    // build MMLepton with:
	    // - pt of the lepton
	    // - eta of the lepton, use the cluster eta for electrons!
	    // - distance between the lepton and the closest jet
	    // - deltaPhi between lepton and ETmiss
	    // - trigger only for muons (TO DO: look into this)
	    Float_t met_phi = fEvent->GetEnergySum()->MissingEt_Phi();
	    TIter next_jet(fObjTool->GetJets());
	    AtlJet *jet = 0;
	    Float_t lowest_dR = 10.;
	    while ( (jet = (AtlJet*)next_jet()) ) {
		Float_t dR = jet->DeltaR(lepton);
		if ( dR < lowest_dR ) {
		    lowest_dR = dR;
		}
	    }
	    MMLepton mmlepton;
	    mmlepton.pt = lepton->Pt();
	    mmlepton.eta = lepton->Eta();
	    mmlepton.dR = lowest_dR;
	    mmlepton.dPhi = TVector2::Phi_mpi_pi(lepton->Phi()-met_phi);
	    mmlepton.trigger = trigmatch;
	    // build MMEvent
	    // - jet multiplicity
	    // - b-jet multiplicity // default tagger: same as in fObjTool
	    // - pt of the leading jet
	    Int_t ntag = 0;
	    TIter next_bjet(fObjTool->GetBJets());
	    AtlJet *bjet = 0;
	    while ( (bjet = (AtlJet*)next_bjet()) ) {
		if ( bjet->GetTag(fBTagger) ) { ntag++; }
	    }
	    MMEvent mmevent;
	    mmevent.njets = fObjTool->GetJets()->GetEntries();
	    mmevent.ntag = ntag;
	    mmevent.jetpt = ((HepParticle*)fObjTool->GetJets()->At(0))->Pt();

	    // debugging
	    if ( gDebug > 1 ) {
		Info(__FUNCTION__, "is_electron      = %d", is_electron);
		Info(__FUNCTION__, "MMLepton.pt      = %f", mmlepton.pt);
		Info(__FUNCTION__, "MMLepton.eta     = %f", mmlepton.eta);
		Info(__FUNCTION__, "MMLepton.dR      = %f", mmlepton.dR);
		Info(__FUNCTION__, "MMLepton.dPhi    = %f", mmlepton.dPhi);
		Info(__FUNCTION__, "MMLepton.trigger = %i", mmlepton.trigger);
		Info(__FUNCTION__, "MMEvent.njets    = %i", mmevent.njets);
		Info(__FUNCTION__, "MMEvent.ntag     = %i", mmevent.ntag);
		Info(__FUNCTION__, "MMEvent.jetpt    = %f", mmevent.jetpt);
	    }

	    // get weight
	    Double_t fake_eff = -1.;
	    Double_t real_eff = -1.;
	    if ( is_electron ) {
		fFakeWeightEJets->SetLepton(mmevent, mmlepton);
		fMMWeight = fFakeWeightEJets->GetFakesWeightLJets(is_tight);
		fake_eff = fFakeWeightEJets->GetFakeEff();
		real_eff = fFakeWeightEJets->GetRealEff();
		fHistMMEff_e_fake->Fill(fake_eff);
		fHistMMEff_e_real->Fill(real_eff);
		fHistMMWeight_e_nominal->Fill(fMMWeight);
	    } else {
		fFakeWeightMuJets->SetLepton(mmevent, mmlepton);
		fMMWeight = fFakeWeightMuJets->GetFakesWeightLJets(is_tight);
		fake_eff = fFakeWeightMuJets->GetFakeEff();
		real_eff = fFakeWeightMuJets->GetRealEff();
		fHistMMEff_mu_fake->Fill(fake_eff);
		fHistMMEff_mu_real->Fill(real_eff);
		fHistMMWeight_mu_nominal->Fill(fMMWeight);
	    }

	    fHistMMEff_fake->Fill(fake_eff);
	    fHistMMEff_real->Fill(real_eff);
	    
	    fEvent->GetEventHeader()->SetMMWeightNominal(fMMWeight);
	}
    } else {
	Error(__FUNCTION__, "Unknown run phase given. Abort!");
	gSystem->Abort(1);
    }

    // Set event weights
    fEvent->SetPreTagEvtWeight(fMMWeight*GetPreTagEvtWeight());
    fEvent->SetTagEvtWeight(fMMWeight*GetTagEvtWeight());

    // fill histograms
    fHistMMWeight_nominal->Fill(fMMWeight);
    
    return kTRUE;
}

//___________________________________________________________

void AtlQCDMMTool::FillHistogramsNoEvtSel() {
    //
    // Method for filling histograms, without any selection cuts
    // applied
    //
    // fHistMMWeight_nominal->Fill(fMMWeight);
}

//___________________________________________________________

void AtlQCDMMTool::FillHistograms() {
    //
    // Method for filling histograms, only events that survive 
    // AnalyzeEvent() are taken into account
    //
}

//___________________________________________________________

void AtlQCDMMTool::Print() const {
    //
    // Print tool configuration
    //
    cout << endl
         << "========================================================" << endl
         << "  QCDMM Tool \"" << GetName() << "\"" << endl
         << "========================================================"
	 << endl << endl;
    AtlAnalysisTool::Print();
    cout << endl
         << "========================================================" << endl
	 << endl;
}

//___________________________________________________________

void AtlQCDMMTool::Terminate() {
    //
    // Executed at the end of the tool
    //
}

 AtlQCDMMTool.cxx:1
 AtlQCDMMTool.cxx:2
 AtlQCDMMTool.cxx:3
 AtlQCDMMTool.cxx:4
 AtlQCDMMTool.cxx:5
 AtlQCDMMTool.cxx:6
 AtlQCDMMTool.cxx:7
 AtlQCDMMTool.cxx:8
 AtlQCDMMTool.cxx:9
 AtlQCDMMTool.cxx:10
 AtlQCDMMTool.cxx:11
 AtlQCDMMTool.cxx:12
 AtlQCDMMTool.cxx:13
 AtlQCDMMTool.cxx:14
 AtlQCDMMTool.cxx:15
 AtlQCDMMTool.cxx:16
 AtlQCDMMTool.cxx:17
 AtlQCDMMTool.cxx:18
 AtlQCDMMTool.cxx:19
 AtlQCDMMTool.cxx:20
 AtlQCDMMTool.cxx:21
 AtlQCDMMTool.cxx:22
 AtlQCDMMTool.cxx:23
 AtlQCDMMTool.cxx:24
 AtlQCDMMTool.cxx:25
 AtlQCDMMTool.cxx:26
 AtlQCDMMTool.cxx:27
 AtlQCDMMTool.cxx:28
 AtlQCDMMTool.cxx:29
 AtlQCDMMTool.cxx:30
 AtlQCDMMTool.cxx:31
 AtlQCDMMTool.cxx:32
 AtlQCDMMTool.cxx:33
 AtlQCDMMTool.cxx:34
 AtlQCDMMTool.cxx:35
 AtlQCDMMTool.cxx:36
 AtlQCDMMTool.cxx:37
 AtlQCDMMTool.cxx:38
 AtlQCDMMTool.cxx:39
 AtlQCDMMTool.cxx:40
 AtlQCDMMTool.cxx:41
 AtlQCDMMTool.cxx:42
 AtlQCDMMTool.cxx:43
 AtlQCDMMTool.cxx:44
 AtlQCDMMTool.cxx:45
 AtlQCDMMTool.cxx:46
 AtlQCDMMTool.cxx:47
 AtlQCDMMTool.cxx:48
 AtlQCDMMTool.cxx:49
 AtlQCDMMTool.cxx:50
 AtlQCDMMTool.cxx:51
 AtlQCDMMTool.cxx:52
 AtlQCDMMTool.cxx:53
 AtlQCDMMTool.cxx:54
 AtlQCDMMTool.cxx:55
 AtlQCDMMTool.cxx:56
 AtlQCDMMTool.cxx:57
 AtlQCDMMTool.cxx:58
 AtlQCDMMTool.cxx:59
 AtlQCDMMTool.cxx:60
 AtlQCDMMTool.cxx:61
 AtlQCDMMTool.cxx:62
 AtlQCDMMTool.cxx:63
 AtlQCDMMTool.cxx:64
 AtlQCDMMTool.cxx:65
 AtlQCDMMTool.cxx:66
 AtlQCDMMTool.cxx:67
 AtlQCDMMTool.cxx:68
 AtlQCDMMTool.cxx:69
 AtlQCDMMTool.cxx:70
 AtlQCDMMTool.cxx:71
 AtlQCDMMTool.cxx:72
 AtlQCDMMTool.cxx:73
 AtlQCDMMTool.cxx:74
 AtlQCDMMTool.cxx:75
 AtlQCDMMTool.cxx:76
 AtlQCDMMTool.cxx:77
 AtlQCDMMTool.cxx:78
 AtlQCDMMTool.cxx:79
 AtlQCDMMTool.cxx:80
 AtlQCDMMTool.cxx:81
 AtlQCDMMTool.cxx:82
 AtlQCDMMTool.cxx:83
 AtlQCDMMTool.cxx:84
 AtlQCDMMTool.cxx:85
 AtlQCDMMTool.cxx:86
 AtlQCDMMTool.cxx:87
 AtlQCDMMTool.cxx:88
 AtlQCDMMTool.cxx:89
 AtlQCDMMTool.cxx:90
 AtlQCDMMTool.cxx:91
 AtlQCDMMTool.cxx:92
 AtlQCDMMTool.cxx:93
 AtlQCDMMTool.cxx:94
 AtlQCDMMTool.cxx:95
 AtlQCDMMTool.cxx:96
 AtlQCDMMTool.cxx:97
 AtlQCDMMTool.cxx:98
 AtlQCDMMTool.cxx:99
 AtlQCDMMTool.cxx:100
 AtlQCDMMTool.cxx:101
 AtlQCDMMTool.cxx:102
 AtlQCDMMTool.cxx:103
 AtlQCDMMTool.cxx:104
 AtlQCDMMTool.cxx:105
 AtlQCDMMTool.cxx:106
 AtlQCDMMTool.cxx:107
 AtlQCDMMTool.cxx:108
 AtlQCDMMTool.cxx:109
 AtlQCDMMTool.cxx:110
 AtlQCDMMTool.cxx:111
 AtlQCDMMTool.cxx:112
 AtlQCDMMTool.cxx:113
 AtlQCDMMTool.cxx:114
 AtlQCDMMTool.cxx:115
 AtlQCDMMTool.cxx:116
 AtlQCDMMTool.cxx:117
 AtlQCDMMTool.cxx:118
 AtlQCDMMTool.cxx:119
 AtlQCDMMTool.cxx:120
 AtlQCDMMTool.cxx:121
 AtlQCDMMTool.cxx:122
 AtlQCDMMTool.cxx:123
 AtlQCDMMTool.cxx:124
 AtlQCDMMTool.cxx:125
 AtlQCDMMTool.cxx:126
 AtlQCDMMTool.cxx:127
 AtlQCDMMTool.cxx:128
 AtlQCDMMTool.cxx:129
 AtlQCDMMTool.cxx:130
 AtlQCDMMTool.cxx:131
 AtlQCDMMTool.cxx:132
 AtlQCDMMTool.cxx:133
 AtlQCDMMTool.cxx:134
 AtlQCDMMTool.cxx:135
 AtlQCDMMTool.cxx:136
 AtlQCDMMTool.cxx:137
 AtlQCDMMTool.cxx:138
 AtlQCDMMTool.cxx:139
 AtlQCDMMTool.cxx:140
 AtlQCDMMTool.cxx:141
 AtlQCDMMTool.cxx:142
 AtlQCDMMTool.cxx:143
 AtlQCDMMTool.cxx:144
 AtlQCDMMTool.cxx:145
 AtlQCDMMTool.cxx:146
 AtlQCDMMTool.cxx:147
 AtlQCDMMTool.cxx:148
 AtlQCDMMTool.cxx:149
 AtlQCDMMTool.cxx:150
 AtlQCDMMTool.cxx:151
 AtlQCDMMTool.cxx:152
 AtlQCDMMTool.cxx:153
 AtlQCDMMTool.cxx:154
 AtlQCDMMTool.cxx:155
 AtlQCDMMTool.cxx:156
 AtlQCDMMTool.cxx:157
 AtlQCDMMTool.cxx:158
 AtlQCDMMTool.cxx:159
 AtlQCDMMTool.cxx:160
 AtlQCDMMTool.cxx:161
 AtlQCDMMTool.cxx:162
 AtlQCDMMTool.cxx:163
 AtlQCDMMTool.cxx:164
 AtlQCDMMTool.cxx:165
 AtlQCDMMTool.cxx:166
 AtlQCDMMTool.cxx:167
 AtlQCDMMTool.cxx:168
 AtlQCDMMTool.cxx:169
 AtlQCDMMTool.cxx:170
 AtlQCDMMTool.cxx:171
 AtlQCDMMTool.cxx:172
 AtlQCDMMTool.cxx:173
 AtlQCDMMTool.cxx:174
 AtlQCDMMTool.cxx:175
 AtlQCDMMTool.cxx:176
 AtlQCDMMTool.cxx:177
 AtlQCDMMTool.cxx:178
 AtlQCDMMTool.cxx:179
 AtlQCDMMTool.cxx:180
 AtlQCDMMTool.cxx:181
 AtlQCDMMTool.cxx:182
 AtlQCDMMTool.cxx:183
 AtlQCDMMTool.cxx:184
 AtlQCDMMTool.cxx:185
 AtlQCDMMTool.cxx:186
 AtlQCDMMTool.cxx:187
 AtlQCDMMTool.cxx:188
 AtlQCDMMTool.cxx:189
 AtlQCDMMTool.cxx:190
 AtlQCDMMTool.cxx:191
 AtlQCDMMTool.cxx:192
 AtlQCDMMTool.cxx:193
 AtlQCDMMTool.cxx:194
 AtlQCDMMTool.cxx:195
 AtlQCDMMTool.cxx:196
 AtlQCDMMTool.cxx:197
 AtlQCDMMTool.cxx:198
 AtlQCDMMTool.cxx:199
 AtlQCDMMTool.cxx:200
 AtlQCDMMTool.cxx:201
 AtlQCDMMTool.cxx:202
 AtlQCDMMTool.cxx:203
 AtlQCDMMTool.cxx:204
 AtlQCDMMTool.cxx:205
 AtlQCDMMTool.cxx:206
 AtlQCDMMTool.cxx:207
 AtlQCDMMTool.cxx:208
 AtlQCDMMTool.cxx:209
 AtlQCDMMTool.cxx:210
 AtlQCDMMTool.cxx:211
 AtlQCDMMTool.cxx:212
 AtlQCDMMTool.cxx:213
 AtlQCDMMTool.cxx:214
 AtlQCDMMTool.cxx:215
 AtlQCDMMTool.cxx:216
 AtlQCDMMTool.cxx:217
 AtlQCDMMTool.cxx:218
 AtlQCDMMTool.cxx:219
 AtlQCDMMTool.cxx:220
 AtlQCDMMTool.cxx:221
 AtlQCDMMTool.cxx:222
 AtlQCDMMTool.cxx:223
 AtlQCDMMTool.cxx:224
 AtlQCDMMTool.cxx:225
 AtlQCDMMTool.cxx:226
 AtlQCDMMTool.cxx:227
 AtlQCDMMTool.cxx:228
 AtlQCDMMTool.cxx:229
 AtlQCDMMTool.cxx:230
 AtlQCDMMTool.cxx:231
 AtlQCDMMTool.cxx:232
 AtlQCDMMTool.cxx:233
 AtlQCDMMTool.cxx:234
 AtlQCDMMTool.cxx:235
 AtlQCDMMTool.cxx:236
 AtlQCDMMTool.cxx:237
 AtlQCDMMTool.cxx:238
 AtlQCDMMTool.cxx:239
 AtlQCDMMTool.cxx:240
 AtlQCDMMTool.cxx:241
 AtlQCDMMTool.cxx:242
 AtlQCDMMTool.cxx:243
 AtlQCDMMTool.cxx:244
 AtlQCDMMTool.cxx:245
 AtlQCDMMTool.cxx:246
 AtlQCDMMTool.cxx:247
 AtlQCDMMTool.cxx:248
 AtlQCDMMTool.cxx:249
 AtlQCDMMTool.cxx:250
 AtlQCDMMTool.cxx:251
 AtlQCDMMTool.cxx:252
 AtlQCDMMTool.cxx:253
 AtlQCDMMTool.cxx:254
 AtlQCDMMTool.cxx:255
 AtlQCDMMTool.cxx:256
 AtlQCDMMTool.cxx:257
 AtlQCDMMTool.cxx:258
 AtlQCDMMTool.cxx:259
 AtlQCDMMTool.cxx:260
 AtlQCDMMTool.cxx:261
 AtlQCDMMTool.cxx:262
 AtlQCDMMTool.cxx:263
 AtlQCDMMTool.cxx:264
 AtlQCDMMTool.cxx:265
 AtlQCDMMTool.cxx:266
 AtlQCDMMTool.cxx:267
 AtlQCDMMTool.cxx:268
 AtlQCDMMTool.cxx:269
 AtlQCDMMTool.cxx:270
 AtlQCDMMTool.cxx:271
 AtlQCDMMTool.cxx:272
 AtlQCDMMTool.cxx:273
 AtlQCDMMTool.cxx:274
 AtlQCDMMTool.cxx:275
 AtlQCDMMTool.cxx:276
 AtlQCDMMTool.cxx:277
 AtlQCDMMTool.cxx:278
 AtlQCDMMTool.cxx:279
 AtlQCDMMTool.cxx:280
 AtlQCDMMTool.cxx:281
 AtlQCDMMTool.cxx:282
 AtlQCDMMTool.cxx:283
 AtlQCDMMTool.cxx:284
 AtlQCDMMTool.cxx:285
 AtlQCDMMTool.cxx:286
 AtlQCDMMTool.cxx:287
 AtlQCDMMTool.cxx:288
 AtlQCDMMTool.cxx:289
 AtlQCDMMTool.cxx:290
 AtlQCDMMTool.cxx:291
 AtlQCDMMTool.cxx:292
 AtlQCDMMTool.cxx:293
 AtlQCDMMTool.cxx:294
 AtlQCDMMTool.cxx:295
 AtlQCDMMTool.cxx:296
 AtlQCDMMTool.cxx:297
 AtlQCDMMTool.cxx:298
 AtlQCDMMTool.cxx:299
 AtlQCDMMTool.cxx:300
 AtlQCDMMTool.cxx:301
 AtlQCDMMTool.cxx:302
 AtlQCDMMTool.cxx:303
 AtlQCDMMTool.cxx:304
 AtlQCDMMTool.cxx:305
 AtlQCDMMTool.cxx:306
 AtlQCDMMTool.cxx:307
 AtlQCDMMTool.cxx:308
 AtlQCDMMTool.cxx:309
 AtlQCDMMTool.cxx:310
 AtlQCDMMTool.cxx:311
 AtlQCDMMTool.cxx:312
 AtlQCDMMTool.cxx:313
 AtlQCDMMTool.cxx:314
 AtlQCDMMTool.cxx:315
 AtlQCDMMTool.cxx:316
 AtlQCDMMTool.cxx:317
 AtlQCDMMTool.cxx:318
 AtlQCDMMTool.cxx:319
 AtlQCDMMTool.cxx:320
 AtlQCDMMTool.cxx:321
 AtlQCDMMTool.cxx:322
 AtlQCDMMTool.cxx:323
 AtlQCDMMTool.cxx:324
 AtlQCDMMTool.cxx:325
 AtlQCDMMTool.cxx:326
 AtlQCDMMTool.cxx:327
 AtlQCDMMTool.cxx:328
 AtlQCDMMTool.cxx:329
 AtlQCDMMTool.cxx:330
 AtlQCDMMTool.cxx:331
 AtlQCDMMTool.cxx:332
 AtlQCDMMTool.cxx:333
 AtlQCDMMTool.cxx:334
 AtlQCDMMTool.cxx:335
 AtlQCDMMTool.cxx:336
 AtlQCDMMTool.cxx:337
 AtlQCDMMTool.cxx:338
 AtlQCDMMTool.cxx:339
 AtlQCDMMTool.cxx:340
 AtlQCDMMTool.cxx:341
 AtlQCDMMTool.cxx:342
 AtlQCDMMTool.cxx:343
 AtlQCDMMTool.cxx:344
 AtlQCDMMTool.cxx:345
 AtlQCDMMTool.cxx:346
 AtlQCDMMTool.cxx:347
 AtlQCDMMTool.cxx:348
 AtlQCDMMTool.cxx:349
 AtlQCDMMTool.cxx:350
 AtlQCDMMTool.cxx:351
 AtlQCDMMTool.cxx:352
 AtlQCDMMTool.cxx:353
 AtlQCDMMTool.cxx:354
 AtlQCDMMTool.cxx:355
 AtlQCDMMTool.cxx:356
 AtlQCDMMTool.cxx:357
 AtlQCDMMTool.cxx:358
 AtlQCDMMTool.cxx:359
 AtlQCDMMTool.cxx:360
 AtlQCDMMTool.cxx:361
 AtlQCDMMTool.cxx:362
 AtlQCDMMTool.cxx:363
 AtlQCDMMTool.cxx:364
 AtlQCDMMTool.cxx:365
 AtlQCDMMTool.cxx:366
 AtlQCDMMTool.cxx:367
 AtlQCDMMTool.cxx:368
 AtlQCDMMTool.cxx:369
 AtlQCDMMTool.cxx:370
 AtlQCDMMTool.cxx:371
 AtlQCDMMTool.cxx:372
 AtlQCDMMTool.cxx:373
 AtlQCDMMTool.cxx:374
 AtlQCDMMTool.cxx:375
 AtlQCDMMTool.cxx:376
 AtlQCDMMTool.cxx:377
 AtlQCDMMTool.cxx:378
 AtlQCDMMTool.cxx:379
 AtlQCDMMTool.cxx:380
 AtlQCDMMTool.cxx:381
 AtlQCDMMTool.cxx:382
 AtlQCDMMTool.cxx:383
 AtlQCDMMTool.cxx:384
 AtlQCDMMTool.cxx:385
 AtlQCDMMTool.cxx:386
 AtlQCDMMTool.cxx:387
 AtlQCDMMTool.cxx:388
 AtlQCDMMTool.cxx:389
 AtlQCDMMTool.cxx:390
 AtlQCDMMTool.cxx:391
 AtlQCDMMTool.cxx:392
 AtlQCDMMTool.cxx:393
 AtlQCDMMTool.cxx:394
 AtlQCDMMTool.cxx:395
 AtlQCDMMTool.cxx:396
 AtlQCDMMTool.cxx:397
 AtlQCDMMTool.cxx:398
 AtlQCDMMTool.cxx:399
 AtlQCDMMTool.cxx:400
 AtlQCDMMTool.cxx:401
 AtlQCDMMTool.cxx:402
 AtlQCDMMTool.cxx:403
 AtlQCDMMTool.cxx:404
 AtlQCDMMTool.cxx:405
 AtlQCDMMTool.cxx:406
 AtlQCDMMTool.cxx:407
 AtlQCDMMTool.cxx:408
 AtlQCDMMTool.cxx:409
 AtlQCDMMTool.cxx:410
 AtlQCDMMTool.cxx:411
 AtlQCDMMTool.cxx:412
 AtlQCDMMTool.cxx:413
 AtlQCDMMTool.cxx:414
 AtlQCDMMTool.cxx:415
 AtlQCDMMTool.cxx:416
 AtlQCDMMTool.cxx:417
 AtlQCDMMTool.cxx:418
 AtlQCDMMTool.cxx:419
 AtlQCDMMTool.cxx:420
 AtlQCDMMTool.cxx:421
 AtlQCDMMTool.cxx:422
 AtlQCDMMTool.cxx:423
 AtlQCDMMTool.cxx:424
 AtlQCDMMTool.cxx:425
 AtlQCDMMTool.cxx:426
 AtlQCDMMTool.cxx:427
 AtlQCDMMTool.cxx:428
 AtlQCDMMTool.cxx:429
 AtlQCDMMTool.cxx:430
 AtlQCDMMTool.cxx:431
 AtlQCDMMTool.cxx:432
 AtlQCDMMTool.cxx:433
 AtlQCDMMTool.cxx:434
 AtlQCDMMTool.cxx:435
 AtlQCDMMTool.cxx:436
 AtlQCDMMTool.cxx:437
 AtlQCDMMTool.cxx:438
 AtlQCDMMTool.cxx:439
 AtlQCDMMTool.cxx:440
 AtlQCDMMTool.cxx:441
 AtlQCDMMTool.cxx:442
 AtlQCDMMTool.cxx:443
 AtlQCDMMTool.cxx:444
 AtlQCDMMTool.cxx:445
 AtlQCDMMTool.cxx:446
 AtlQCDMMTool.cxx:447
 AtlQCDMMTool.cxx:448
 AtlQCDMMTool.cxx:449
 AtlQCDMMTool.cxx:450
 AtlQCDMMTool.cxx:451
 AtlQCDMMTool.cxx:452
 AtlQCDMMTool.cxx:453
 AtlQCDMMTool.cxx:454
 AtlQCDMMTool.cxx:455