//____________________________________________________________________
//
// Class for a pair of systematics
//
// The 'standard' case for most of the systematics. There exist two
// variations, up and down which will be used as variation templates.
// No computation needed.
// 
//  
// Author: Soeren Stamm <mailto: stamm@physik.hu-berlin.de>
// Update: $Id: AtlHistFactorySystPair.cxx,v 1.5 2016/04/19 07:46:16 stamm Exp $
// Copyright: 2015 (C) Soeren Stamm
//
#ifndef ATLAS_AtlHistFactorySystPair
#include <AtlHistFactorySystPair.h>
#endif
#include <TFile.h>
#include <HepDataMCPlot.h>
#include <iostream>

using namespace std;

#ifndef __CINT__
ClassImp(AtlHistFactorySystPair);
#endif

//____________________________________________________________________

AtlHistFactorySystPair::AtlHistFactorySystPair() {
    //
    // Default constructor for TObject Clone
    //
}

//____________________________________________________________________

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

    fSystUp   = SystUp;
    fSystDown = SystDown;

    fPlotterFileUp   = 0;
    fPlotterFileDown = 0;

    fHistsUp = 0;
    fHistsDown = 0;
}

//____________________________________________________________________

AtlHistFactorySystPair::~AtlHistFactorySystPair() {
    //
    // Default destructor
    //
    
    if ( fPlotterFileUp   != 0 ) delete fPlotterFileUp;
    if ( fPlotterFileDown != 0 ) delete fPlotterFileDown;

    if ( fHistsUp != 0 ) {
	fHistsUp->Delete();
	delete fHistsUp;
    }
    if ( fHistsDown != 0 ) {
	fHistsDown->Delete();
	delete fHistsDown;
    }    
}

//____________________________________________________________________

void AtlHistFactorySystPair::Initialize(const char* BaseDir,
					const char* scheme) {
    //
    // Initialize for MCPlotter files
    //
    // Set the MCPlotter files for the up-var. and down variation.
    //
    // The file directory is
    // 'BaseDir' + 'systname' + "%s/MCPlotter.root"
    //
    // Get the list of templates from the HepDataMCPlots
    //

    if ( fPlotterFileUp != 0 ) delete fPlotterFileUp;
    fPlotterFileUp = TFile::Open(Form("%s/%s/%s/MCPlotter.root",
				      BaseDir,
				      AtlTopLevelAnalysis::fgSystematicNames[fSystUp],
				      scheme));
    
    if ( fPlotterFileDown != 0 ) delete fPlotterFileDown;
    fPlotterFileDown = TFile::Open(Form("%s/%s/%s/MCPlotter.root",
					BaseDir,
					AtlTopLevelAnalysis::fgSystematicNames[fSystDown],
					scheme));

    if ( fPlotterFileUp == 0 || fPlotterFileDown == 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 *HepUp = (HepDataMCPlot*) fPlotterFileUp->Get(fDiscriminant->Data());
    HepDataMCPlot *HepDown = (HepDataMCPlot*) fPlotterFileDown->Get(fDiscriminant->Data());

    if ( HepUp == 0 || HepDown == 0 ) {
	Error("Initialize",
	      "Could not find discriminant '%s' in file.",
	      fDiscriminant->Data());
	Error("Initialize", "Files are:\n%s\n%s",
	      fPlotterFileUp->GetName(),
	      fPlotterFileDown->GetName());
	gSystem->Abort();
    }

    fHistsUp = HepUp->GetListOfMCTemplates(AtlTopLevelAnalysis::fgSystematicNames[fSystUp]);
    fHistsDown = HepDown->GetListOfMCTemplates(AtlTopLevelAnalysis::fgSystematicNames[fSystDown]);
}

//____________________________________________________________________

void AtlHistFactorySystPair::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",
					     process,
					     AtlTopLevelAnalysis::fgSystematicNames[fSystUp]));
    fHistDown = (TH1*) fTemplateFile->Get(Form("%s_%s",
					       process,
					       AtlTopLevelAnalysis::fgSystematicNames[fSystDown]));
}

//____________________________________________________________________

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

    // No need to compute anything, just take the histograms
    // from the plotter files
    fHistUp = (TH1*) fHistsUp->FindObject(Form("%s_%s",
					       process,
					       AtlTopLevelAnalysis::fgSystematicNames[fSystUp]));
    fHistDown = (TH1*) fHistsDown->FindObject(Form("%s_%s",
						   process,
						   AtlTopLevelAnalysis::fgSystematicNames[fSystDown]));
}

//____________________________________________________________________

void AtlHistFactorySystPair::Clear(Option_t *option) {
    //
    // Close MCPlottr 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 ( fPlotterFileUp != 0 ) {
	fPlotterFileUp->Close();
	delete fPlotterFileUp;
	fPlotterFileUp = 0;
    }

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

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

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

    // Question: Why can we not delete fHistsDown? Are the pointers in the list gone
    //           when we close the MCPlotter file...?
    
    // Delete the pointer?
    // - Problem with SaveTemplate()?
    fHistUp = 0;
    fHistDown = 0;

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