//____________________________________________________________________
//
// Class for modelling systematics
//
// The variation of this systematics is computed as
//
//    Up/Down = Nominal +/- (up - down)/2
//
// where up and down are two histograms corresponding to a different
// model. The systematic is symmetrized around the nominal histogram.
//
// Atlernatively, a different nominal sample can be used then the
// systematic is computed as
//
//    Up/Down = Nominal + (up/down - syst_nom)
//
//  
// Author: Soeren Stamm <mailto: stamm@physik.hu-berlin.de>
// Update: $Id: AtlHistFactorySystModelPair.cxx,v 1.5 2016/04/19 07:51:21 stamm Exp $
// Copyright: 2015 (C) Soeren Stamm
//
#ifndef ATLAS_AtlHistFactorySystModelPair
#include <AtlHistFactorySystModelPair.h>
#endif
#include <TFile.h>
#include <HepDataMCPlot.h>
#include <iostream>

using namespace std;

#ifndef __CINT__
ClassImp(AtlHistFactorySystModelPair);
#endif

//____________________________________________________________________

AtlHistFactorySystModelPair::AtlHistFactorySystModelPair() {
    //
    // Default constructor
    //
}

//____________________________________________________________________

AtlHistFactorySystModelPair::AtlHistFactorySystModelPair(
    const char* systname,
    const char *systtitle,
    AtlTopLevelAnalysis::ESystematic SystUp,
    AtlTopLevelAnalysis::ESystematic SystDown,
    Bool_t useShape) :
    AtlHistFactorySystPair(systname, systtitle,
			   SystUp, SystDown, useShape) {
    //
    // Default constructor
    //

    fPlotterFileNom = 0;
    fPlotterFileSystNom = 0;
    fHistsNom = 0;
    fHistsSystNom = 0;

    fNominal  = AtlTopLevelAnalysis::kNOMINAL;
    fSystNom  = AtlTopLevelAnalysis::kNOMINAL;
}

//____________________________________________________________________

AtlHistFactorySystModelPair::~AtlHistFactorySystModelPair() {
    //
    // Default destructor
    //
    if ( fPlotterFileNom  != 0 ) delete fPlotterFileNom;
    if ( fPlotterFileSystNom != 0 ) delete fPlotterFileSystNom;
    if ( fHistsNom != 0 ) {
	// fHistsNom->Delete();
	delete fHistsNom;
    }    
    if ( fHistsSystNom != 0 ) {
	// fHistsSystNom->Delete();
	delete fHistsSystNom;
    }
}

//____________________________________________________________________

void AtlHistFactorySystModelPair::Initialize(const char* BaseDir,
					     const char* scheme) {
    //
    // Initialize for MCPlotter files
    //
    // Set the MCPlotter files for the systematic and nominal.
    //
    // The file directory is
    // 'BaseDir' + 'systname' + "plots_datamc/MCPlotter.root"
    //
    // Get the list of templates from the HepDataMCPlots
    //
    
    if ( fPlotterFileNom != 0 ) delete fPlotterFileNom;
    fPlotterFileNom = TFile::Open(Form("%s/%s/%s/MCPlotter.root",
				       BaseDir,
				       AtlTopLevelAnalysis::fgSystematicNames[fNominal],
				       scheme));

    if ( fPlotterFileNom == 0 ) {
	Error("Initialize",
	      "Could not find nominal MCPlotter file. Abort!");
	gSystem->Abort();
    }

    if ( fNominal != fSystNom ) {
	if ( fPlotterFileSystNom != 0 ) delete fPlotterFileSystNom;
	fPlotterFileSystNom = TFile::Open(Form("%s/%s/%s/MCPlotter.root",
					       BaseDir,
					       AtlTopLevelAnalysis::fgSystematicNames[fSystNom],
					       scheme));
	if ( fPlotterFileSystNom == 0 ) {
	    Error("Initialize",
		  "Could not find MCPlotter files. Abort!");
	    gSystem->Abort();
	}
    }

    if ( fDiscriminant == 0 ) {
	Error("Initialize",
	      "Discriminant not set. Please use SetDiscriminant(..). Abort!");
	gSystem->Abort();
    }
    
    HepDataMCPlot *HepNom = (HepDataMCPlot*) fPlotterFileNom->Get(fDiscriminant->Data());
    
    if ( HepNom == 0 ) {
	Error("Initialize",
	      "Could not find discriminant '%s' in file.",
	      fDiscriminant->Data());
	Error("Initialize", "File is:\n%s",
	      fPlotterFileNom->GetName());
	gSystem->Abort();
    }

    HepDataMCPlot *HepSystNom = 0;
    if ( fSystNom != fNominal ) {
	HepSystNom = (HepDataMCPlot*) fPlotterFileSystNom->Get(fDiscriminant->Data());
	if ( HepSystNom == 0 ) {
	    Error("Initialize",
		  "Could not find discriminant '%s' in file.",
		  fDiscriminant->Data());
	    Error("Initialize", "File is:\n%s",
		  fPlotterFileSystNom->GetName());
	    gSystem->Abort();
	}
	fHistsSystNom = HepSystNom->GetListOfMCTemplates(AtlTopLevelAnalysis::fgSystematicNames[fSystNom]);
    }

    fHistsNom  = HepNom->GetListOfMCTemplates(AtlTopLevelAnalysis::fgSystematicNames[fNominal]);

    // Get Systematic Files using SystPair functionality
    AtlHistFactorySystPair::Initialize(BaseDir, scheme);
}

//____________________________________________________________________

void AtlHistFactorySystModelPair::ComputeUpDownVariation(const char* process) {
    //
    // Compute the up var. and down variation for this modelling
    // systematic pair
    //

    // Modelling uncertainty is
    //
    // Up/Down = Nominal +/- (up - down)/2
    //
    // --> Up   = Nominal + up/2 - down/2
    // --> Down = Nominal - up/2 + down/2
    //

    // Get up and down histograms
    AtlHistFactorySystPair::ComputeUpDownVariation(process);

    TH1 *h_nom  = (TH1*) fHistsNom->FindObject(Form("%s_%s",
						    process,
						    AtlTopLevelAnalysis::fgSystematicNames[fNominal]));

    TH1 *h_systnom = 0;
    if ( fSystNom != fNominal ) {
	h_systnom = (TH1*) fHistsSystNom->FindObject(Form("%s_%s",
							  process,
							  AtlTopLevelAnalysis::fgSystematicNames[fSystNom]));
    }
    
    // reassign pointers from up/down histograms
    TH1 *h_up   = fHistUp;
    TH1 *h_down = fHistDown;


    if ( fSystNom != fNominal ) {
	//    Up/Down = Nominal + (up/down - syst_nom)
	fHistUp   = (TH1*) h_nom->Clone(Form("%s_%s_up",
					     process,
					     GetName() ));
	fHistUp->Add(h_up, +1.);
	fHistUp->Add(h_systnom, -1.);
	
	fHistDown = (TH1*) h_nom->Clone(Form("%s_%s_down",
					     process,
					     GetName() ));
	fHistDown->Add(h_down, +1.);
	fHistDown->Add(h_systnom, -1.);
	
    } else {
	//    Up/Down = Nominal +/- (up - down)/2
	fHistUp   = (TH1*) h_nom->Clone(Form("%s_%s_up",
					     process,
					     GetName() ));
	fHistUp->Add(h_up,   +0.5);
	fHistUp->Add(h_down, -0.5);
	
	fHistDown = (TH1*) h_nom->Clone(Form("%s_%s_down",
					     process,
					     GetName() ));
	fHistDown->Add(h_up,   -0.5);
	fHistDown->Add(h_down, +0.5);
    }
}

//____________________________________________________________________

void AtlHistFactorySystModelPair::Clear(Option_t *option) {
    //
    // Close MCPlotter files
    // - Do not close the template file. The class does not own this
    //   file. The owner of this file is responsible of closing it.
    //

    if ( fPlotterFileNom != 0 ) {
	fPlotterFileNom->Close();
	delete fPlotterFileNom;
	fPlotterFileNom = 0;
    }

    if ( fHistsNom != 0 ) {
	// fHistsNom->Delete();
	delete fHistsNom;
	fHistsNom = 0;
    }

    if ( fSystNom != fNominal ) {
        if ( fPlotterFileSystNom != 0 ) {
	    fPlotterFileSystNom->Close();
	    delete fPlotterFileSystNom;
	    fPlotterFileSystNom = 0;
	}
	if ( fHistsSystNom != 0 ) {
	    // fHistsSystNom->Delete();
	    delete fHistsSystNom;
	    fHistsSystNom = 0;
	}
    }

    AtlHistFactorySystPair::Clear();
}

//____________________________________________________________________

void AtlHistFactorySystModelPair::GetHistsFromFile(const char* process) {
    //
    // Change the process and load the corresponding informations
    // into the class data members.
    //
    
    // we get the histos directly from the template file
    fHistUp = (TH1*) fTemplateFile->Get(Form("%s_%s_up",
					     process,
					     GetName() ));
    fHistDown = (TH1*) fTemplateFile->Get(Form("%s_%s_down",
					       process,
					       GetName() ));
    
    if ( fHistUp == 0 ) {
	Error("GetHistsFromFile",
	      "Could not find up histogram for systematic '%s'",
	      GetName());
    }
    if ( fHistDown == 0 ) {
	Error("GetHistsFromFile",
	      "Could not find down histogram for systematic '%s'",
	      GetName());
    }
}
 AtlHistFactorySystModelPair.cxx:1
 AtlHistFactorySystModelPair.cxx:2
 AtlHistFactorySystModelPair.cxx:3
 AtlHistFactorySystModelPair.cxx:4
 AtlHistFactorySystModelPair.cxx:5
 AtlHistFactorySystModelPair.cxx:6
 AtlHistFactorySystModelPair.cxx:7
 AtlHistFactorySystModelPair.cxx:8
 AtlHistFactorySystModelPair.cxx:9
 AtlHistFactorySystModelPair.cxx:10
 AtlHistFactorySystModelPair.cxx:11
 AtlHistFactorySystModelPair.cxx:12
 AtlHistFactorySystModelPair.cxx:13
 AtlHistFactorySystModelPair.cxx:14
 AtlHistFactorySystModelPair.cxx:15
 AtlHistFactorySystModelPair.cxx:16
 AtlHistFactorySystModelPair.cxx:17
 AtlHistFactorySystModelPair.cxx:18
 AtlHistFactorySystModelPair.cxx:19
 AtlHistFactorySystModelPair.cxx:20
 AtlHistFactorySystModelPair.cxx:21
 AtlHistFactorySystModelPair.cxx:22
 AtlHistFactorySystModelPair.cxx:23
 AtlHistFactorySystModelPair.cxx:24
 AtlHistFactorySystModelPair.cxx:25
 AtlHistFactorySystModelPair.cxx:26
 AtlHistFactorySystModelPair.cxx:27
 AtlHistFactorySystModelPair.cxx:28
 AtlHistFactorySystModelPair.cxx:29
 AtlHistFactorySystModelPair.cxx:30
 AtlHistFactorySystModelPair.cxx:31
 AtlHistFactorySystModelPair.cxx:32
 AtlHistFactorySystModelPair.cxx:33
 AtlHistFactorySystModelPair.cxx:34
 AtlHistFactorySystModelPair.cxx:35
 AtlHistFactorySystModelPair.cxx:36
 AtlHistFactorySystModelPair.cxx:37
 AtlHistFactorySystModelPair.cxx:38
 AtlHistFactorySystModelPair.cxx:39
 AtlHistFactorySystModelPair.cxx:40
 AtlHistFactorySystModelPair.cxx:41
 AtlHistFactorySystModelPair.cxx:42
 AtlHistFactorySystModelPair.cxx:43
 AtlHistFactorySystModelPair.cxx:44
 AtlHistFactorySystModelPair.cxx:45
 AtlHistFactorySystModelPair.cxx:46
 AtlHistFactorySystModelPair.cxx:47
 AtlHistFactorySystModelPair.cxx:48
 AtlHistFactorySystModelPair.cxx:49
 AtlHistFactorySystModelPair.cxx:50
 AtlHistFactorySystModelPair.cxx:51
 AtlHistFactorySystModelPair.cxx:52
 AtlHistFactorySystModelPair.cxx:53
 AtlHistFactorySystModelPair.cxx:54
 AtlHistFactorySystModelPair.cxx:55
 AtlHistFactorySystModelPair.cxx:56
 AtlHistFactorySystModelPair.cxx:57
 AtlHistFactorySystModelPair.cxx:58
 AtlHistFactorySystModelPair.cxx:59
 AtlHistFactorySystModelPair.cxx:60
 AtlHistFactorySystModelPair.cxx:61
 AtlHistFactorySystModelPair.cxx:62
 AtlHistFactorySystModelPair.cxx:63
 AtlHistFactorySystModelPair.cxx:64
 AtlHistFactorySystModelPair.cxx:65
 AtlHistFactorySystModelPair.cxx:66
 AtlHistFactorySystModelPair.cxx:67
 AtlHistFactorySystModelPair.cxx:68
 AtlHistFactorySystModelPair.cxx:69
 AtlHistFactorySystModelPair.cxx:70
 AtlHistFactorySystModelPair.cxx:71
 AtlHistFactorySystModelPair.cxx:72
 AtlHistFactorySystModelPair.cxx:73
 AtlHistFactorySystModelPair.cxx:74
 AtlHistFactorySystModelPair.cxx:75
 AtlHistFactorySystModelPair.cxx:76
 AtlHistFactorySystModelPair.cxx:77
 AtlHistFactorySystModelPair.cxx:78
 AtlHistFactorySystModelPair.cxx:79
 AtlHistFactorySystModelPair.cxx:80
 AtlHistFactorySystModelPair.cxx:81
 AtlHistFactorySystModelPair.cxx:82
 AtlHistFactorySystModelPair.cxx:83
 AtlHistFactorySystModelPair.cxx:84
 AtlHistFactorySystModelPair.cxx:85
 AtlHistFactorySystModelPair.cxx:86
 AtlHistFactorySystModelPair.cxx:87
 AtlHistFactorySystModelPair.cxx:88
 AtlHistFactorySystModelPair.cxx:89
 AtlHistFactorySystModelPair.cxx:90
 AtlHistFactorySystModelPair.cxx:91
 AtlHistFactorySystModelPair.cxx:92
 AtlHistFactorySystModelPair.cxx:93
 AtlHistFactorySystModelPair.cxx:94
 AtlHistFactorySystModelPair.cxx:95
 AtlHistFactorySystModelPair.cxx:96
 AtlHistFactorySystModelPair.cxx:97
 AtlHistFactorySystModelPair.cxx:98
 AtlHistFactorySystModelPair.cxx:99
 AtlHistFactorySystModelPair.cxx:100
 AtlHistFactorySystModelPair.cxx:101
 AtlHistFactorySystModelPair.cxx:102
 AtlHistFactorySystModelPair.cxx:103
 AtlHistFactorySystModelPair.cxx:104
 AtlHistFactorySystModelPair.cxx:105
 AtlHistFactorySystModelPair.cxx:106
 AtlHistFactorySystModelPair.cxx:107
 AtlHistFactorySystModelPair.cxx:108
 AtlHistFactorySystModelPair.cxx:109
 AtlHistFactorySystModelPair.cxx:110
 AtlHistFactorySystModelPair.cxx:111
 AtlHistFactorySystModelPair.cxx:112
 AtlHistFactorySystModelPair.cxx:113
 AtlHistFactorySystModelPair.cxx:114
 AtlHistFactorySystModelPair.cxx:115
 AtlHistFactorySystModelPair.cxx:116
 AtlHistFactorySystModelPair.cxx:117
 AtlHistFactorySystModelPair.cxx:118
 AtlHistFactorySystModelPair.cxx:119
 AtlHistFactorySystModelPair.cxx:120
 AtlHistFactorySystModelPair.cxx:121
 AtlHistFactorySystModelPair.cxx:122
 AtlHistFactorySystModelPair.cxx:123
 AtlHistFactorySystModelPair.cxx:124
 AtlHistFactorySystModelPair.cxx:125
 AtlHistFactorySystModelPair.cxx:126
 AtlHistFactorySystModelPair.cxx:127
 AtlHistFactorySystModelPair.cxx:128
 AtlHistFactorySystModelPair.cxx:129
 AtlHistFactorySystModelPair.cxx:130
 AtlHistFactorySystModelPair.cxx:131
 AtlHistFactorySystModelPair.cxx:132
 AtlHistFactorySystModelPair.cxx:133
 AtlHistFactorySystModelPair.cxx:134
 AtlHistFactorySystModelPair.cxx:135
 AtlHistFactorySystModelPair.cxx:136
 AtlHistFactorySystModelPair.cxx:137
 AtlHistFactorySystModelPair.cxx:138
 AtlHistFactorySystModelPair.cxx:139
 AtlHistFactorySystModelPair.cxx:140
 AtlHistFactorySystModelPair.cxx:141
 AtlHistFactorySystModelPair.cxx:142
 AtlHistFactorySystModelPair.cxx:143
 AtlHistFactorySystModelPair.cxx:144
 AtlHistFactorySystModelPair.cxx:145
 AtlHistFactorySystModelPair.cxx:146
 AtlHistFactorySystModelPair.cxx:147
 AtlHistFactorySystModelPair.cxx:148
 AtlHistFactorySystModelPair.cxx:149
 AtlHistFactorySystModelPair.cxx:150
 AtlHistFactorySystModelPair.cxx:151
 AtlHistFactorySystModelPair.cxx:152
 AtlHistFactorySystModelPair.cxx:153
 AtlHistFactorySystModelPair.cxx:154
 AtlHistFactorySystModelPair.cxx:155
 AtlHistFactorySystModelPair.cxx:156
 AtlHistFactorySystModelPair.cxx:157
 AtlHistFactorySystModelPair.cxx:158
 AtlHistFactorySystModelPair.cxx:159
 AtlHistFactorySystModelPair.cxx:160
 AtlHistFactorySystModelPair.cxx:161
 AtlHistFactorySystModelPair.cxx:162
 AtlHistFactorySystModelPair.cxx:163
 AtlHistFactorySystModelPair.cxx:164
 AtlHistFactorySystModelPair.cxx:165
 AtlHistFactorySystModelPair.cxx:166
 AtlHistFactorySystModelPair.cxx:167
 AtlHistFactorySystModelPair.cxx:168
 AtlHistFactorySystModelPair.cxx:169
 AtlHistFactorySystModelPair.cxx:170
 AtlHistFactorySystModelPair.cxx:171
 AtlHistFactorySystModelPair.cxx:172
 AtlHistFactorySystModelPair.cxx:173
 AtlHistFactorySystModelPair.cxx:174
 AtlHistFactorySystModelPair.cxx:175
 AtlHistFactorySystModelPair.cxx:176
 AtlHistFactorySystModelPair.cxx:177
 AtlHistFactorySystModelPair.cxx:178
 AtlHistFactorySystModelPair.cxx:179
 AtlHistFactorySystModelPair.cxx:180
 AtlHistFactorySystModelPair.cxx:181
 AtlHistFactorySystModelPair.cxx:182
 AtlHistFactorySystModelPair.cxx:183
 AtlHistFactorySystModelPair.cxx:184
 AtlHistFactorySystModelPair.cxx:185
 AtlHistFactorySystModelPair.cxx:186
 AtlHistFactorySystModelPair.cxx:187
 AtlHistFactorySystModelPair.cxx:188
 AtlHistFactorySystModelPair.cxx:189
 AtlHistFactorySystModelPair.cxx:190
 AtlHistFactorySystModelPair.cxx:191
 AtlHistFactorySystModelPair.cxx:192
 AtlHistFactorySystModelPair.cxx:193
 AtlHistFactorySystModelPair.cxx:194
 AtlHistFactorySystModelPair.cxx:195
 AtlHistFactorySystModelPair.cxx:196
 AtlHistFactorySystModelPair.cxx:197
 AtlHistFactorySystModelPair.cxx:198
 AtlHistFactorySystModelPair.cxx:199
 AtlHistFactorySystModelPair.cxx:200
 AtlHistFactorySystModelPair.cxx:201
 AtlHistFactorySystModelPair.cxx:202
 AtlHistFactorySystModelPair.cxx:203
 AtlHistFactorySystModelPair.cxx:204
 AtlHistFactorySystModelPair.cxx:205
 AtlHistFactorySystModelPair.cxx:206
 AtlHistFactorySystModelPair.cxx:207
 AtlHistFactorySystModelPair.cxx:208
 AtlHistFactorySystModelPair.cxx:209
 AtlHistFactorySystModelPair.cxx:210
 AtlHistFactorySystModelPair.cxx:211
 AtlHistFactorySystModelPair.cxx:212
 AtlHistFactorySystModelPair.cxx:213
 AtlHistFactorySystModelPair.cxx:214
 AtlHistFactorySystModelPair.cxx:215
 AtlHistFactorySystModelPair.cxx:216
 AtlHistFactorySystModelPair.cxx:217
 AtlHistFactorySystModelPair.cxx:218
 AtlHistFactorySystModelPair.cxx:219
 AtlHistFactorySystModelPair.cxx:220
 AtlHistFactorySystModelPair.cxx:221
 AtlHistFactorySystModelPair.cxx:222
 AtlHistFactorySystModelPair.cxx:223
 AtlHistFactorySystModelPair.cxx:224
 AtlHistFactorySystModelPair.cxx:225
 AtlHistFactorySystModelPair.cxx:226
 AtlHistFactorySystModelPair.cxx:227
 AtlHistFactorySystModelPair.cxx:228
 AtlHistFactorySystModelPair.cxx:229
 AtlHistFactorySystModelPair.cxx:230
 AtlHistFactorySystModelPair.cxx:231
 AtlHistFactorySystModelPair.cxx:232
 AtlHistFactorySystModelPair.cxx:233
 AtlHistFactorySystModelPair.cxx:234
 AtlHistFactorySystModelPair.cxx:235
 AtlHistFactorySystModelPair.cxx:236
 AtlHistFactorySystModelPair.cxx:237
 AtlHistFactorySystModelPair.cxx:238
 AtlHistFactorySystModelPair.cxx:239
 AtlHistFactorySystModelPair.cxx:240
 AtlHistFactorySystModelPair.cxx:241
 AtlHistFactorySystModelPair.cxx:242
 AtlHistFactorySystModelPair.cxx:243
 AtlHistFactorySystModelPair.cxx:244
 AtlHistFactorySystModelPair.cxx:245
 AtlHistFactorySystModelPair.cxx:246
 AtlHistFactorySystModelPair.cxx:247
 AtlHistFactorySystModelPair.cxx:248
 AtlHistFactorySystModelPair.cxx:249
 AtlHistFactorySystModelPair.cxx:250
 AtlHistFactorySystModelPair.cxx:251
 AtlHistFactorySystModelPair.cxx:252
 AtlHistFactorySystModelPair.cxx:253
 AtlHistFactorySystModelPair.cxx:254
 AtlHistFactorySystModelPair.cxx:255
 AtlHistFactorySystModelPair.cxx:256
 AtlHistFactorySystModelPair.cxx:257
 AtlHistFactorySystModelPair.cxx:258
 AtlHistFactorySystModelPair.cxx:259
 AtlHistFactorySystModelPair.cxx:260
 AtlHistFactorySystModelPair.cxx:261
 AtlHistFactorySystModelPair.cxx:262
 AtlHistFactorySystModelPair.cxx:263
 AtlHistFactorySystModelPair.cxx:264
 AtlHistFactorySystModelPair.cxx:265
 AtlHistFactorySystModelPair.cxx:266
 AtlHistFactorySystModelPair.cxx:267
 AtlHistFactorySystModelPair.cxx:268
 AtlHistFactorySystModelPair.cxx:269
 AtlHistFactorySystModelPair.cxx:270
 AtlHistFactorySystModelPair.cxx:271
 AtlHistFactorySystModelPair.cxx:272
 AtlHistFactorySystModelPair.cxx:273
 AtlHistFactorySystModelPair.cxx:274
 AtlHistFactorySystModelPair.cxx:275
 AtlHistFactorySystModelPair.cxx:276
 AtlHistFactorySystModelPair.cxx:277
 AtlHistFactorySystModelPair.cxx:278
 AtlHistFactorySystModelPair.cxx:279
 AtlHistFactorySystModelPair.cxx:280
 AtlHistFactorySystModelPair.cxx:281
 AtlHistFactorySystModelPair.cxx:282
 AtlHistFactorySystModelPair.cxx:283
 AtlHistFactorySystModelPair.cxx:284
 AtlHistFactorySystModelPair.cxx:285
 AtlHistFactorySystModelPair.cxx:286
 AtlHistFactorySystModelPair.cxx:287
 AtlHistFactorySystModelPair.cxx:288
 AtlHistFactorySystModelPair.cxx:289