//____________________________________________________________________
//
// DOCUMENT ME
// 
//  
// Author: Soeren Stamm <mailto: stamm@physik.hu-berlin.de>
// Update: $Id: AtlHistFactoryBreakdownEntry.cxx,v 1.8 2015/10/07 12:43:49 stamm Exp $
// Copyright: 2015 (C) Soeren Stamm
//
#ifndef ATLAS_AtlHistFactoryBreakdownEntry
#include <AtlHistFactoryBreakdownEntry.h>
#endif
#include <AtlHistFactoryMeasurement.h>
#include <RooAbsData.h>
#include <RooAbsPdf.h>
#include <RooFitResult.h>
#include <RooRealVar.h>
#include <RooWorkspace.h>
#include <RooStats/ModelConfig.h>
#include <RooStats/ProfileLikelihoodTestStat.h>
#include <Math/ProbFunc.h>
#include <TFile.h>
#include <TMath.h>
#include <TStopwatch.h>
#include <TSystem.h>
#include <iostream>

using namespace std;
using namespace RooStats;
using namespace HistFactory;
using namespace RooFit;

#ifndef __CINT__
ClassImp(AtlHistFactoryBreakdownEntry);
#endif

//____________________________________________________________________

AtlHistFactoryBreakdownEntry::AtlHistFactoryBreakdownEntry(const char* name,
							   const char* title,
							   const char* par)
    : AtlHistFactoryTask(name, title), fParameter(par) {
    //
    // Default constructor
    //

    fBatchNodeAll = kTRUE;
}

//____________________________________________________________________

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

//____________________________________________________________________

void AtlHistFactoryBreakdownEntry::RunEntry(const char* inputfile,
					    const char* outputfile,
					    const char* dataset,
					    const char* param,
					    Double_t precision) {
    //
    // Static function to compute the breakdown entry for
    // given parameter(s).
    //
    // All NPs, which name contains 'par', will be set constant
    // at their unconstrained MLE value
    //
    
    // Create directory
    TString breakdownfile = TString(outputfile);

    TString *ws_filename = new TString(inputfile);
    
    // Open workspace file
    TFile *f_ws = TFile::Open(ws_filename->Data());
    
    // Get infos for fit
    RooWorkspace *wSpace = (RooWorkspace*) f_ws->Get("combined");
    RooAbsData   *data   = wSpace->data(dataset);

    ModelConfig *model = (ModelConfig*) wSpace->obj("ModelConfig");
    RooAbsPdf   *pdf   = model->GetPdf();

    RooRealVar  *par   = 0;

    // do a fit first to get unconstrained MLE
	const RooArgSet *poiSet = model->GetParametersOfInterest();
	RooRealVar      *rrvPOI = (RooRealVar*)poiSet->first();
	cout << "Initial POI value = " << rrvPOI->getVal() << endl;
    RooFitResult *fitResult = pdf->fitTo(*data,
										 RooFit::SumW2Error(kFALSE),
										 RooFit::Minimizer("Minuit", "Migrad"),
										 RooFit::Offset(true),
										 RooFit::Extended(true),
										 RooFit::Save(true));
    fitResult->Print();
	
	// Save best fit value of the poi as a snapshot of the signal model
	model->SetSnapshot(*model->GetParametersOfInterest());
	cout << "Snapshot of S+B Model " << model->GetName() 
		 << " is set to the best fit value of the poi = " << rrvPOI->getVal() << endl;
	
    // Book Histograms for breakdown Info
    TFile *fout = new TFile(breakdownfile.Data(),"RECREATE");
    
    TH1F *h_breakdown      = new TH1F("h_breakdown", "Central value for breakdown", 1., 0., 1.);
    TH1F *h_breakdown_up   = new TH1F("h_breakdown_up", "Up value for breakdown", 1., 0., 1.);
    TH1F *h_breakdown_down = new TH1F("h_breakdown_down", "Down value for breakdown", 1., 0., 1.);
    
    // Nuisance parameters
    RooArgSet *nuis = (RooArgSet*)model->GetNuisanceParameters();
    TIterator *next_nuis = nuis->createIterator();

    // Disable all parameters, which contain the string 'param'
    while ((par = (RooRealVar*)next_nuis->Next())) {
	TString par_name = par->GetName();
	if ( par_name.Contains(param) ) {
	    cout << "Set parameter " << par_name.Data()
		 << " constant at val = " << par->getVal() << endl;
	     par->setConstant(kTRUE);
	}
	
	// Data stats
	TString par_check = param;
	if ( par_check.Contains("data_stat") ) {
	    cout << "Set parameter " << par_name.Data()
		 << " constant at val = " << par->getVal() << endl;
	     par->setConstant(kTRUE);
	}
	
	// All JES components
	if ( par_check == "JES" && IsJesComponent(par) ) {
	    cout << "Set parameter " << par_name.Data()
		 << " constant at val = " << par->getVal() << endl;
	     par->setConstant(kTRUE);
	}
	
	// All Lepton components
	if ( par_check == "LEP" && IsLepComponent(par) ) {
	    cout << "Set parameter " << par_name.Data()
		 << " constant at val = " << par->getVal() << endl;
	     par->setConstant(kTRUE);
	}
	
    }
    
    // First case:
    // -----------
    TStopwatch w;
    w.Start();

    //
    // Scan mu interval
    //
    
    // Setup test statistic
    ProfileLikelihoodTestStat ProfllTestStat(*pdf);
    
    ROOT::Math::MinimizerOptions::SetDefaultMinimizer("Minuit", "Migrad");
    std::string minimizerType = ROOT::Math::MinimizerOptions::DefaultMinimizerType();
    ProfllTestStat.SetMinimizer(minimizerType.c_str());
    ProfllTestStat.SetPrintLevel(0);
    ProfllTestStat.SetReuseNLL(true);
    ProfllTestStat.SetStrategy(0);
    ProfllTestStat.SetLOffset(true);
    ProfllTestStat.SetOneSided(false);

    Double_t mu_min = 0.;
    Double_t mu_max = 2.;

    Int_t Neval = TMath::CeilNint((mu_max - mu_min)/precision);
    if ( Neval % 2 == 0 ) // avoid even numbers
	Neval += 1;       // (causes problems if mu == 1 if used
                          //  with likelihood offset)
    
    Double_t mu_int  = (mu_max - mu_min)/Neval;
    
    Double_t p_value = 0.;
    Double_t q_mu    = 0.;

    // Current point of graph
    Int_t i = 0;

    // Store p-value can results
    TGraph *g = new TGraph(Neval);
    
    for ( Double_t mu = mu_min; mu <= mu_max; mu += mu_int ) {
	
	RooRealVar *MuModel = (RooRealVar*) model->GetParametersOfInterest()->first();
	MuModel->setVal(mu);
	
	RooArgSet MuModelTmp(*MuModel);

	// -2.*ln(llh-ratio)
	q_mu = ProfllTestStat.Evaluate(*data, MuModelTmp);
	q_mu = 2.*q_mu;

	// Asymptotic formulae for p-value, given that
	// q_mu follows a chi2 distr. with ndf = 1
	// http://arxiv.org/abs/1007.1727
	p_value = 2.*ROOT::Math::normal_cdf_c(TMath::Sqrt(q_mu), 1.);
	
	g->SetPoint(i, mu, p_value);
	i++;
    }

    w.Stop();
    w.Print();

    // Find x-values close to y = 0.317
    Double_t pvalue = (1.-ROOT::Math::gaussian_cdf(1))*2; // 68.3% CL --> pvalue ~ 0.317
    Double_t x1 = -1.;
    Double_t x2 = -1.;
    Double_t y1, y2;
    Int_t p1 = -1, p2 = -1;
    
    for ( Int_t i = 0; i < g->GetN() - 1; i++ ) {
	g->GetPoint(i, x1, y1);
	g->GetPoint(i+1, x2, y2);

	if ( y1 < pvalue && pvalue < y2 )
	    p1 = i;
	
	if ( y1 > pvalue && pvalue > y2 )
	    p2 = i;
    }

    if ( p1 < 0 || p2 < 0 ) {
	cout << "x1 = " << x1 << "   x2 = " << x2 << endl;
	cout << "Error: x1 or x2 below 0. Abort." << endl;
	gSystem->Abort();
    }

    // Linear interpolation close to 0.16
    // y = a*x + b

    Double_t xmin, xmax, ymin, ymax;
    Double_t a, b;

    // lower part
    g->GetPoint(p1, xmin, ymin);
    g->GetPoint(p1+1, xmax, ymax);

    a = (ymax - ymin)/(xmax - xmin);
    b = ymin - a*xmin;

    Double_t mu_low = (pvalue - b)/a;

    // upper part
    g->GetPoint(p2, xmin, ymin);
    g->GetPoint(p2+1, xmax, ymax);

    a = (ymax - ymin)/(xmax - xmin);
    b = ymin - a*xmin;

    Double_t mu_high = (pvalue - b)/a;

    cout << "mu high = " << mu_high << endl;
    cout << "mu low  = " << mu_low  << endl;
    
    // Store result:
    // ToDo: Divide by initial best fit value for poi
    RooRealVar *poi = (RooRealVar*) model->GetParametersOfInterest()->first();
    Double_t v_poi = ((RooRealVar*) fitResult->floatParsFinal().find(poi->GetName()))->getVal();
    cout << "v_poi = " << v_poi << endl;
    
    h_breakdown_up->Fill(param, (mu_high - v_poi)/v_poi);
    h_breakdown_down->Fill(param, (v_poi - mu_low)/v_poi);
    h_breakdown->Fill(param, (mu_high - mu_low)/(2.*v_poi));

    g->SetName(Form("g_%s", param));
    g->Write();
    
    fout->Write();
}

//____________________________________________________________________

void AtlHistFactoryBreakdownEntry::CreateRunScript(Option_t *option) {
    //
    // Create Run Script
    //

    ofstream out;
    out.open(fRunScript->Data());
    out << "#!/bin/sh" << endl
	<< "# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl
	<< "# !!! This is an automatically generated file !!!" << endl
	<< "# !!! D O   N O T   E D I T                   !!!" << endl
	<< "# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl
	<< "#" << endl
	<< "# Run script for A++ analysis job submission" << endl
	<< "#" << endl << endl
	<< "# Set environment" << endl;

    // Platform
    if ( gSystem->Getenv("ARCH_TYPE") != 0 ) {
	out << "export ARCH_TYPE=" << gSystem->Getenv("ARCH_TYPE") << endl;
    } else {
	Error("CreateRunScript", "Environment variable ARCH_TYPE not set. Abort!");
	gSystem->Abort(0);
    }

    if ( !WriteEnvSetup(out) ) {

    // ROOT
    out << "export ROOTSYS=" << gSystem->Getenv("ROOTSYS") << endl
	<< "export PATH=${ROOTSYS}/bin:${PATH}" << endl
	<< "export LD_LIBRARY_PATH=${ROOTSYS}/lib:${LD_LIBRARY_PATH}" << endl;

    // A++ and user-defined libraries
    TList *UserEnvs = new TList();
    UserEnvs->Add(new TNamed("LIBHEPEVENT",""));
    UserEnvs->Add(new TNamed("LIBATLASRUN",""));
    UserEnvs->Add(new TNamed("LIBATLASEVENT",""));
    UserEnvs->Add(new TNamed("LIBATLASANALYSIS",""));
    
    TIter next_lib(UserEnvs);
    TNamed *env = 0;
    while ( (env = (TNamed*)next_lib()) ) {
	if ( gSystem->Getenv(env->GetName()) != 0 ) {
	    out << "export " << env->GetName() << "="
		<< gSystem->Getenv(env->GetName()) << endl
		<< "export LD_LIBRARY_PATH=${"
		<< env->GetName() << "}/lib/${ARCH_TYPE}:${LD_LIBRARY_PATH}"
		<< endl;
	} else {
	    Error("CreateRunScript", "Environment variable %s not set. Abort!",
		  env->GetName());
	    gSystem->Abort(0);
	}
    }

    }
	
	out	<< endl << endl
		<< "# Job execution" << endl
		<< "JOBHOME=" << fJobHome->Data() << endl
		<< "cd $JOBHOME" << endl	
		<< "root -q -l -b run_entry.C > " << fLogFilePath->Data()
		<< " 2>&1" << endl;
	out.close();
}

//____________________________________________________________________

Bool_t AtlHistFactoryBreakdownEntry::ExecBatchJob(Option_t*) {
    //
    // Exec batch job
    //

    // cout << "JobHome: " << fJobHome->Data() << endl;
    // cout << "RunScript: " << fRunScript->Data() << endl;
    // cout << "Outputfile: " << fOutputFileName->Data() << endl;
    // cout << "Logfile: " << fLogFilePath->Data() << endl;

    //
    // Create short C macro
    //
    TString root_macro = TString(fJobHome->Data());
    root_macro.Append("/run_entry.C");
    root_macro.ReplaceAll("//","/");
    
    ofstream out;
    out.open(root_macro.Data());
    out << "{" << endl
	<< "AtlHistFactoryBreakdownEntry::RunEntry("
	<< "\"" << fMeasurement->GetModelFileName()->Data() << "\"," << endl
	<< "\"" << fOutputFileName->Data() << "\"," << endl
	<< "\"" << (fMeasurement->GetUseAsimovData() ? "asimovData" : "obsData") << "\"," << endl
	<< "\"" << fParameter.Data() << "\"," << endl
	<< 0.01 << ");" << endl
	<< "}" << endl;
    out.close();    

    
    return SubmitBatchJob();
}

//____________________________________________________________________

Bool_t AtlHistFactoryBreakdownEntry::IsJesComponent(const RooRealVar* par) {
    //
    // Decide wether the given parameter is a jet energy scale
	// uncertainty component
    //
	TString pName = par->GetName();
	return ( pName.Contains("Jes") ||
			 pName.Contains("EtaIntercalibration") ||
			 pName.Contains("Pileup") ||
			 pName.Contains("PunchThrough") ||
			 pName.Contains("flavor_comp") ||
			 pName.Contains("flavor_response") ||
			 pName.Contains("SinglePart") );
}

//____________________________________________________________________

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