//____________________________________________________________________
//
// DOCUMENT ME
// 
//  
// Author: Soeren Stamm <mailto: stamm@physik.hu-berlin.de>
// Update: $Id: AtlHistFactoryBreakdownTask.cxx,v 1.1 2015/07/24 09:53:08 stamm Exp $
// Copyright: 2015 (C) Soeren Stamm
//
#ifndef ATLAS_AtlHistFactoryBreakdownTask
#include <AtlHistFactoryBreakdownTask.h>
#endif
#include <AtlHistFactoryBreakdownEntry.h>
#include <AtlHistFactoryMeasurement.h>
#include <RooAbsData.h>
#include <RooWorkspace.h>
#include <RooStats/ProfileLikelihoodTestStat.h>
#include <TFile.h>
#include <TString.h>
#include <iostream>

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


#ifndef __CINT__
ClassImp(AtlHistFactoryBreakdownTask);
#endif

//____________________________________________________________________

AtlHistFactoryBreakdownTask::AtlHistFactoryBreakdownTask(const char* name,
							 const char* title,
							 AtlHistFactoryMeasurement *meas)
    : TTask(name, title) {
    //
    // Default constructor
    //

    fMeasurement = meas;

    // Check if file for combined analysis exists
    TString *filename = fMeasurement->GetModelFileName();
    TFile *f = new TFile(filename->Data());

    if ( f->IsZombie() ) {
	Info("AtlHistFactoryBreakdownTask",
	     "Model file %s does not exist or is corrupted. Deactivate task.",
	     filename->Data());
	Info("AtlHistFactoryBreakdownTask",
	     "Please create a model file first and then recreate this task");
	SetActive(kFALSE);
    } else {
	Info("AtlHistFactoryBreakdownTask",
	     "Model file %s found. Activate task.",
	     filename->Data());
	SetActive(kTRUE);

	Initialize();
    }
}

//____________________________________________________________________

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

//____________________________________________________________________

void AtlHistFactoryBreakdownTask::Initialize() {
    //
    // Create breakdown entries
    //

    Info("Initialize",
	 "Create tasks for breakdown table.");

    TString *ws_filename = fMeasurement->GetModelFileName();
    
    // Open workspace file
    TFile *f_ws = TFile::Open(ws_filename->Data());
    if ( f_ws == 0 ) {
	Error("CreateSystBreakdown", "Couldn't find file with name: %s",
	      ws_filename->Data());
    }
    
    // Get infos for fit
    RooWorkspace *wSpace = (RooWorkspace*) f_ws->Get("combined");

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

    RooRealVar *par = 0;
    
    // Nuisance parameters
    RooArgSet *nuis = (RooArgSet*)model->GetNuisanceParameters();
    TIterator *next_nuis = nuis->createIterator();


    //
    // Start creation of breakdown entries
    //

    TString jobhome = (fMeasurement->GetOutputDir())->Data();
    jobhome.Append("/breakdown_config/");
    jobhome.ReplaceAll("//", "/");

    TString outdir = (fMeasurement->GetOutputDir())->Data();
    outdir.Append("/breakdown/");
    outdir.ReplaceAll("//", "/");

    TString dataset = fMeasurement->GetUseAsimovData() ? "asimovData" : "obsData";

    //
    // 1. All systematics turned on (aka nominal fit)
    //
    
    AtlHistFactoryBreakdownEntry *entry = new AtlHistFactoryBreakdownEntry("Total", "Total",
									   "TotalUncertainty");
    entry->SetMeasurement(fMeasurement);
    entry->SetJobHome(Form("%s/%s/%s", jobhome.Data(), "Total", dataset.Data()));
    entry->SetOutputFile(Form("%s/%s/breakdown_%s_%s.root",
			      outdir.Data(),
			      fMeasurement->GetUseAsimovData() ? "asimovData" : "obsData",
			      "combined",
			      "TotalUncertainty"));
    Add(entry);

    //
    // 2. Only data statistics (keyword is 'data_stat')
    //
    entry = new AtlHistFactoryBreakdownEntry("Data_stat", "Data stat.",
					     "data_stat");
    entry->SetMeasurement(fMeasurement);
    entry->SetJobHome(Form("%s/%s/%s", jobhome.Data(), "data_stat", dataset.Data()));
    entry->SetOutputFile(Form("%s/%s/breakdown_%s_%s.root",
			      outdir.Data(),
			      fMeasurement->GetUseAsimovData() ? "asimovData" : "obsData",
			      "combined",
			      "Datastat"));
    Add(entry);

    //
    // 3. MC statistics only
    //
    entry = new AtlHistFactoryBreakdownEntry("MC_stat", "MC stat.",
					     "gamma_stat");
    entry->SetMeasurement(fMeasurement);
    entry->SetJobHome(Form("%s/%s/%s", jobhome.Data(), "gamma_stat", dataset.Data()));
    entry->SetOutputFile(Form("%s/%s/breakdown_%s_%s.root",
			      outdir.Data(),
			      fMeasurement->GetUseAsimovData() ? "asimovData" : "obsData",
			      "combined",
			      "MCstat"));
    Add(entry);

    //
    // 4. All other NPs
    //
    while ((par = (RooRealVar*)next_nuis->Next())) {
	TString parname = par->GetName();

	// Special config for MC parameters needed
	if ( parname.Contains("gamma_stat") )
	    continue;
	
	entry = new AtlHistFactoryBreakdownEntry(Form("Syst_%s", parname.Data()),
						 Form("Syst_%s", parname.Data()),
						 parname.Data());
	entry->SetMeasurement(fMeasurement);
	entry->SetJobHome(Form("%s/%s/%s", jobhome.Data(), parname.Data(), dataset.Data()));
	entry->SetOutputFile(Form("%s/%s/breakdown_%s_%s.root",
				  outdir.Data(),
				  fMeasurement->GetUseAsimovData() ? "asimovData" : "obsData",
				  "combined",
				  parname.Data()));
				     
	Add(entry);
    }
}



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