//____________________________________________________________________
//
// Cross-section class
// 
// This class is used to calculate the cross section and its error
//  
// Author: Umberto Prosperi Porta <mailto: umberto.prosperi@physik.hu-berlin.de>
// Update: $Id: HepCrossSectionTask.cxx,v 1.1 2011/08/22 04:19:28 kind Exp $
// Copyright: 2011 (C) Umberto Prosperi Porta
//
#ifndef HEP_HepCrossSectionTask
#include <HepCrossSectionTask.h>
#endif
#include <HepDataMCPlot.h>
#include <HepDataMCSample.h>
#include <TString.h>
#include <TFile.h>
#include <TList.h>
#include <TMath.h>
#include <TH1F.h>
#include <iostream>

using namespace std;

#ifndef __CINT__
ClassImp(HepCrossSectionTask);
#endif

//____________________________________________________________________

HepCrossSectionTask::HepCrossSectionTask(const char* name,
					 const char* title) : TTask(name, title) {
    //
    // Default constructor
    //
//     fInputFilename = new TString("");
//     fCutFlowName = new TString("");
//     fSignalName = new TString("");
    fCutFlowPlot = 0;
    signal_sample = 0;

    Nbins = 0;                 
    Ndata = 0;
    NdataErr = 0;
    Nevents_sig = 0;
    Nevents_sigErr = 0;
    Nevents_sig_gen = 0;       
    Nevents = 0;
    NeventsErr = 0;
    Nevents_bkg = 0;           
    Nevents_sig_data = 0;      
    Nevents_sig_dataErr = 0;  
    Acceptance = 0;            
    AcceptanceErr = 0;       
    AcceptanceStatErr = 0;   
    AcceptanceSystErr = 0;   
    Luminosity = 0;            
    LuminosityErr = 0;       
    Cross_Section = 0;         
    Cross_SectionErr = 0;    
    Cross_SectionErr_Syst_up = 0;
    Cross_SectionErr_Syst_down = 0;

    
}

//____________________________________________________________________

HepCrossSectionTask::~HepCrossSectionTask() {
    //
    // Default destructor
    //
    delete fInputFilename;
    delete fCutFlowName;
    if ( fCutFlowPlot != 0 ) {
	delete fCutFlowPlot;
	fCutFlowPlot = 0;
    }
    
if ( signal_sample != 0 ) {
	delete signal_sample;
	signal_sample = 0;
    }
    
    
}

//____________________________________________________________________

void HepCrossSectionTask::SetInputFilename(const char* InputFilename) {
    //
    // Set name of input file containing plots (including path)
    //

    fInputFilename.Remove(0);
    fInputFilename.Append(InputFilename);
}

//____________________________________________________________________

void HepCrossSectionTask::SetOutputFilename(const char* OutputFilename) {
    //
    // Set name of output file containing plots (including path)
    //

    fOutputFilename.Remove(0);
    fOutputFilename.Append(OutputFilename);
}





//____________________________________________________________________

void HepCrossSectionTask::SetCutFlowName(const char* CutFlowName) {
    //
    // Set name of cut-flow plot (including path)
    //
    fCutFlowName.Remove(0);
    fCutFlowName.Append(CutFlowName);
}

//____________________________________________________________________

void HepCrossSectionTask::SetSignalName(const char* SignalName) {
    //
    // Set name of signal 
    //
    fSignalName.Remove(0);
    fSignalName.Append(SignalName);
}



//____________________________________________________________________

void HepCrossSectionTask::Exec(Option_t *option) {
    //
    // Execute task
    //    Step 1: Acceptance calculation
    //    Step 2: Cross-section calculation
    //    Step 3: Cross-section analysis


  
    AcceptanceCalc();
    XsecCalc();
    Print();
 

    gDirectory->cd();
    gDirectory->mkdir("XsecHistograms");
    gDirectory->cd("XsecHistograms");
    
    fHistXsecErrors = new TH1F("h_XsecErrors","Cross Section Errors",3,0,3);
    fHistXsecErrors->SetYTitle("Cross Section (pb)");

    
    fHistXsecErrors->SetBinContent(1,Cross_Section);
    fHistXsecErrors->SetBinError(1,Cross_SectionErr);

  
    fHistXsecErrors->SetBinContent(2,Cross_Section + Cross_SectionErr_Syst_up);
    fHistXsecErrors->SetBinContent(3,Cross_Section - Cross_SectionErr_Syst_down);


    fHistXsecErrors->GetXaxis()->SetBinLabel(1, "#sigma #pm #Delta#sigma_{stat.}");
    fHistXsecErrors->GetXaxis()->SetBinLabel(2, "#sigma + L_{up}");
    fHistXsecErrors->GetXaxis()->SetBinLabel(3, "#sigma + L_{down}");

    fHistXsecErrors->GetYaxis()->SetLimits(0,23);



    
    fHistXsecErrors->SetMarkerColor(8);
    fHistXsecErrors->SetMarkerStyle(8);
    fHistXsecErrors->SetMarkerSize(2);

    
    fHistXsecErrors->SetLineColor(1);



    
    f_output = new TFile(fOutputFilename,"RECREATE");
    fHistXsecErrors->Write();
    
    gDirectory->cd("..");
    
}

//____________________________________________________________________
void HepCrossSectionTask::Print() {
    
    
    cout<<
	endl
	<<"Nevents_sig gen       = "<< Nevents_sig_gen  <<endl
	<<"Nevents               = "<< Nevents          <<endl
	<<"Nevents_sig           = "<< Nevents_sig      <<endl
	<<"Nevents_bkg           = "<< Nevents_bkg      <<endl
	
	<<"Ndata                 = "<< Ndata <<endl
	<<"Nevents_sig_data      = "<< Nevents_sig_data << endl

	<<"Acceptance            = "<< Acceptance       <<endl
	<<"Acceptance Error      = "<< AcceptanceErr    <<endl
	
	<<"Luminosity            = "<< Luminosity   << " pb^-1 " <<endl<<endl
	<<"Luminosity Error      = "<< LuminosityErr    <<endl
	
	<<"Cross Section         = "<< Cross_Section<<    " pb "    << endl
	<<"CS Statistical Error  = "<< Cross_SectionErr<< " pb "    << endl
    
	<<"CS Systematic Error(+)= "<< Cross_SectionErr_Syst_up<< " pb "    << endl
	<<"CS Systematic Error(-)= "<< Cross_SectionErr_Syst_down<< " pb "    << endl;

    
    
}
//____________________________________________________________________


void HepCrossSectionTask::AcceptanceCalc() {
    //
    //Compute acceptance from MC-DATA of cut-flow plots
    //
    
    f_input = new TFile(fInputFilename,"READ");
    
    if (!f_input) cout << endl <<
	"ERROR: Cannot find MCPlotter file..." << endl;
    cout<<"test file : "<<f_input<<endl;
    cout<<"test hist : "<<fCutFlowName<<endl;
    
    h_cutflow =  (HepDataMCPlot*)f_input->Get(fCutFlowName);
    
    Nbins = h_cutflow->GetHistDATA()->GetNbinsX() + 1;
    Ndata = h_cutflow->GetHistDATA()->GetBinContent(Nbins-1);
    signal = ((HepDataMCFolder*)(h_cutflow->GetMCFolders())->FindObject(fSignalName))->GetMCSamples();

    signal_sample = (HepDataMCSample*)signal->At(0);

    
    
    Nevents_sig     = signal_sample->GetHistogram()->GetBinContent(Nbins-1);
    Nevents_sig_gen = signal_sample->GetHistogram()->GetBinContent(1);
   


    Acceptance = Nevents_sig / Nevents_sig_gen;
    AcceptanceStatErr = (TMath::Sqrt(Acceptance*Acceptance*Nevents_sig_gen+Nevents_sig*(1-2*Acceptance)))/Nevents_sig_gen;


    AcceptanceErr = AcceptanceStatErr + AcceptanceSystErr;
    
}

//_____________________________________________________________________
void HepCrossSectionTask::XsecCalc() {

    for (int i = 0; i < h_cutflow->GetMCHistStack()->GetHists()->GetEntries(); i++) {
	Nevents += ((TH1F*)h_cutflow->GetMCHistStack()->GetHists()->At(i))->GetBinContent(Nbins-1);
    }
    
    //Nevents = h_cutflow->GetMCHistStack()->GetHistogram()->GetBinContent(Nbins-1);

    Nevents_bkg = Nevents - Nevents_sig;

    Nevents_sig_data = Ndata - Nevents + Nevents_sig;

    Luminosity = h_cutflow->GetLumiDATA();
    Cross_Section = (Nevents_sig_data)/(Luminosity*Acceptance);

    cout<<"lumi f = "<<Luminosity<<endl;
    cout<<"lumi p = "<<h_cutflow->GetLumiDATA()<<endl;
    NdataErr = h_cutflow->GetHistDATA()->GetBinError(Nbins-1);
    NeventsErr = h_cutflow->GetMCHistStack()->GetHistogram()->GetBinError(Nbins-1);
    Nevents_sigErr = signal_sample->GetHistogram()->GetBinError(Nbins-1);
    
    Nevents_sig_dataErr = TMath::Sqrt(NdataErr*NdataErr+NeventsErr*NeventsErr+Nevents_sigErr*Nevents_sigErr);
    
    LuminosityErr = Luminosity*0.045;

    
    Cross_SectionErr = Cross_Section*(TMath::Sqrt( (

							 (TMath::Power(AcceptanceErr/Acceptance,2))+
							 (TMath::Power(Nevents_sig_dataErr/Nevents_sig_data,2))
						       )  )         );


    Cross_SectionErr_Syst_up = (Nevents_sig_data/Acceptance)*(LuminosityErr/(TMath::Power(Luminosity+LuminosityErr,2)));
    Cross_SectionErr_Syst_down = (Nevents_sig_data/Acceptance)*(LuminosityErr/(TMath::Power(Luminosity-LuminosityErr,2)));



    // if(Cross_SectionErr>Cross_SectionErr_Syst_up)   Cross_SectionErr_Syst_up     = 0;
    // if(Cross_SectionErr>Cross_SectionErr_Syst_down) Cross_SectionErr_Syst_down   = 0;

    
    
}




    
 HepCrossSectionTask.cxx:1
 HepCrossSectionTask.cxx:2
 HepCrossSectionTask.cxx:3
 HepCrossSectionTask.cxx:4
 HepCrossSectionTask.cxx:5
 HepCrossSectionTask.cxx:6
 HepCrossSectionTask.cxx:7
 HepCrossSectionTask.cxx:8
 HepCrossSectionTask.cxx:9
 HepCrossSectionTask.cxx:10
 HepCrossSectionTask.cxx:11
 HepCrossSectionTask.cxx:12
 HepCrossSectionTask.cxx:13
 HepCrossSectionTask.cxx:14
 HepCrossSectionTask.cxx:15
 HepCrossSectionTask.cxx:16
 HepCrossSectionTask.cxx:17
 HepCrossSectionTask.cxx:18
 HepCrossSectionTask.cxx:19
 HepCrossSectionTask.cxx:20
 HepCrossSectionTask.cxx:21
 HepCrossSectionTask.cxx:22
 HepCrossSectionTask.cxx:23
 HepCrossSectionTask.cxx:24
 HepCrossSectionTask.cxx:25
 HepCrossSectionTask.cxx:26
 HepCrossSectionTask.cxx:27
 HepCrossSectionTask.cxx:28
 HepCrossSectionTask.cxx:29
 HepCrossSectionTask.cxx:30
 HepCrossSectionTask.cxx:31
 HepCrossSectionTask.cxx:32
 HepCrossSectionTask.cxx:33
 HepCrossSectionTask.cxx:34
 HepCrossSectionTask.cxx:35
 HepCrossSectionTask.cxx:36
 HepCrossSectionTask.cxx:37
 HepCrossSectionTask.cxx:38
 HepCrossSectionTask.cxx:39
 HepCrossSectionTask.cxx:40
 HepCrossSectionTask.cxx:41
 HepCrossSectionTask.cxx:42
 HepCrossSectionTask.cxx:43
 HepCrossSectionTask.cxx:44
 HepCrossSectionTask.cxx:45
 HepCrossSectionTask.cxx:46
 HepCrossSectionTask.cxx:47
 HepCrossSectionTask.cxx:48
 HepCrossSectionTask.cxx:49
 HepCrossSectionTask.cxx:50
 HepCrossSectionTask.cxx:51
 HepCrossSectionTask.cxx:52
 HepCrossSectionTask.cxx:53
 HepCrossSectionTask.cxx:54
 HepCrossSectionTask.cxx:55
 HepCrossSectionTask.cxx:56
 HepCrossSectionTask.cxx:57
 HepCrossSectionTask.cxx:58
 HepCrossSectionTask.cxx:59
 HepCrossSectionTask.cxx:60
 HepCrossSectionTask.cxx:61
 HepCrossSectionTask.cxx:62
 HepCrossSectionTask.cxx:63
 HepCrossSectionTask.cxx:64
 HepCrossSectionTask.cxx:65
 HepCrossSectionTask.cxx:66
 HepCrossSectionTask.cxx:67
 HepCrossSectionTask.cxx:68
 HepCrossSectionTask.cxx:69
 HepCrossSectionTask.cxx:70
 HepCrossSectionTask.cxx:71
 HepCrossSectionTask.cxx:72
 HepCrossSectionTask.cxx:73
 HepCrossSectionTask.cxx:74
 HepCrossSectionTask.cxx:75
 HepCrossSectionTask.cxx:76
 HepCrossSectionTask.cxx:77
 HepCrossSectionTask.cxx:78
 HepCrossSectionTask.cxx:79
 HepCrossSectionTask.cxx:80
 HepCrossSectionTask.cxx:81
 HepCrossSectionTask.cxx:82
 HepCrossSectionTask.cxx:83
 HepCrossSectionTask.cxx:84
 HepCrossSectionTask.cxx:85
 HepCrossSectionTask.cxx:86
 HepCrossSectionTask.cxx:87
 HepCrossSectionTask.cxx:88
 HepCrossSectionTask.cxx:89
 HepCrossSectionTask.cxx:90
 HepCrossSectionTask.cxx:91
 HepCrossSectionTask.cxx:92
 HepCrossSectionTask.cxx:93
 HepCrossSectionTask.cxx:94
 HepCrossSectionTask.cxx:95
 HepCrossSectionTask.cxx:96
 HepCrossSectionTask.cxx:97
 HepCrossSectionTask.cxx:98
 HepCrossSectionTask.cxx:99
 HepCrossSectionTask.cxx:100
 HepCrossSectionTask.cxx:101
 HepCrossSectionTask.cxx:102
 HepCrossSectionTask.cxx:103
 HepCrossSectionTask.cxx:104
 HepCrossSectionTask.cxx:105
 HepCrossSectionTask.cxx:106
 HepCrossSectionTask.cxx:107
 HepCrossSectionTask.cxx:108
 HepCrossSectionTask.cxx:109
 HepCrossSectionTask.cxx:110
 HepCrossSectionTask.cxx:111
 HepCrossSectionTask.cxx:112
 HepCrossSectionTask.cxx:113
 HepCrossSectionTask.cxx:114
 HepCrossSectionTask.cxx:115
 HepCrossSectionTask.cxx:116
 HepCrossSectionTask.cxx:117
 HepCrossSectionTask.cxx:118
 HepCrossSectionTask.cxx:119
 HepCrossSectionTask.cxx:120
 HepCrossSectionTask.cxx:121
 HepCrossSectionTask.cxx:122
 HepCrossSectionTask.cxx:123
 HepCrossSectionTask.cxx:124
 HepCrossSectionTask.cxx:125
 HepCrossSectionTask.cxx:126
 HepCrossSectionTask.cxx:127
 HepCrossSectionTask.cxx:128
 HepCrossSectionTask.cxx:129
 HepCrossSectionTask.cxx:130
 HepCrossSectionTask.cxx:131
 HepCrossSectionTask.cxx:132
 HepCrossSectionTask.cxx:133
 HepCrossSectionTask.cxx:134
 HepCrossSectionTask.cxx:135
 HepCrossSectionTask.cxx:136
 HepCrossSectionTask.cxx:137
 HepCrossSectionTask.cxx:138
 HepCrossSectionTask.cxx:139
 HepCrossSectionTask.cxx:140
 HepCrossSectionTask.cxx:141
 HepCrossSectionTask.cxx:142
 HepCrossSectionTask.cxx:143
 HepCrossSectionTask.cxx:144
 HepCrossSectionTask.cxx:145
 HepCrossSectionTask.cxx:146
 HepCrossSectionTask.cxx:147
 HepCrossSectionTask.cxx:148
 HepCrossSectionTask.cxx:149
 HepCrossSectionTask.cxx:150
 HepCrossSectionTask.cxx:151
 HepCrossSectionTask.cxx:152
 HepCrossSectionTask.cxx:153
 HepCrossSectionTask.cxx:154
 HepCrossSectionTask.cxx:155
 HepCrossSectionTask.cxx:156
 HepCrossSectionTask.cxx:157
 HepCrossSectionTask.cxx:158
 HepCrossSectionTask.cxx:159
 HepCrossSectionTask.cxx:160
 HepCrossSectionTask.cxx:161
 HepCrossSectionTask.cxx:162
 HepCrossSectionTask.cxx:163
 HepCrossSectionTask.cxx:164
 HepCrossSectionTask.cxx:165
 HepCrossSectionTask.cxx:166
 HepCrossSectionTask.cxx:167
 HepCrossSectionTask.cxx:168
 HepCrossSectionTask.cxx:169
 HepCrossSectionTask.cxx:170
 HepCrossSectionTask.cxx:171
 HepCrossSectionTask.cxx:172
 HepCrossSectionTask.cxx:173
 HepCrossSectionTask.cxx:174
 HepCrossSectionTask.cxx:175
 HepCrossSectionTask.cxx:176
 HepCrossSectionTask.cxx:177
 HepCrossSectionTask.cxx:178
 HepCrossSectionTask.cxx:179
 HepCrossSectionTask.cxx:180
 HepCrossSectionTask.cxx:181
 HepCrossSectionTask.cxx:182
 HepCrossSectionTask.cxx:183
 HepCrossSectionTask.cxx:184
 HepCrossSectionTask.cxx:185
 HepCrossSectionTask.cxx:186
 HepCrossSectionTask.cxx:187
 HepCrossSectionTask.cxx:188
 HepCrossSectionTask.cxx:189
 HepCrossSectionTask.cxx:190
 HepCrossSectionTask.cxx:191
 HepCrossSectionTask.cxx:192
 HepCrossSectionTask.cxx:193
 HepCrossSectionTask.cxx:194
 HepCrossSectionTask.cxx:195
 HepCrossSectionTask.cxx:196
 HepCrossSectionTask.cxx:197
 HepCrossSectionTask.cxx:198
 HepCrossSectionTask.cxx:199
 HepCrossSectionTask.cxx:200
 HepCrossSectionTask.cxx:201
 HepCrossSectionTask.cxx:202
 HepCrossSectionTask.cxx:203
 HepCrossSectionTask.cxx:204
 HepCrossSectionTask.cxx:205
 HepCrossSectionTask.cxx:206
 HepCrossSectionTask.cxx:207
 HepCrossSectionTask.cxx:208
 HepCrossSectionTask.cxx:209
 HepCrossSectionTask.cxx:210
 HepCrossSectionTask.cxx:211
 HepCrossSectionTask.cxx:212
 HepCrossSectionTask.cxx:213
 HepCrossSectionTask.cxx:214
 HepCrossSectionTask.cxx:215
 HepCrossSectionTask.cxx:216
 HepCrossSectionTask.cxx:217
 HepCrossSectionTask.cxx:218
 HepCrossSectionTask.cxx:219
 HepCrossSectionTask.cxx:220
 HepCrossSectionTask.cxx:221
 HepCrossSectionTask.cxx:222
 HepCrossSectionTask.cxx:223
 HepCrossSectionTask.cxx:224
 HepCrossSectionTask.cxx:225
 HepCrossSectionTask.cxx:226
 HepCrossSectionTask.cxx:227
 HepCrossSectionTask.cxx:228
 HepCrossSectionTask.cxx:229
 HepCrossSectionTask.cxx:230
 HepCrossSectionTask.cxx:231
 HepCrossSectionTask.cxx:232
 HepCrossSectionTask.cxx:233
 HepCrossSectionTask.cxx:234
 HepCrossSectionTask.cxx:235
 HepCrossSectionTask.cxx:236
 HepCrossSectionTask.cxx:237
 HepCrossSectionTask.cxx:238
 HepCrossSectionTask.cxx:239
 HepCrossSectionTask.cxx:240
 HepCrossSectionTask.cxx:241
 HepCrossSectionTask.cxx:242
 HepCrossSectionTask.cxx:243
 HepCrossSectionTask.cxx:244
 HepCrossSectionTask.cxx:245
 HepCrossSectionTask.cxx:246
 HepCrossSectionTask.cxx:247
 HepCrossSectionTask.cxx:248
 HepCrossSectionTask.cxx:249
 HepCrossSectionTask.cxx:250
 HepCrossSectionTask.cxx:251
 HepCrossSectionTask.cxx:252
 HepCrossSectionTask.cxx:253
 HepCrossSectionTask.cxx:254
 HepCrossSectionTask.cxx:255
 HepCrossSectionTask.cxx:256
 HepCrossSectionTask.cxx:257
 HepCrossSectionTask.cxx:258
 HepCrossSectionTask.cxx:259
 HepCrossSectionTask.cxx:260
 HepCrossSectionTask.cxx:261
 HepCrossSectionTask.cxx:262
 HepCrossSectionTask.cxx:263
 HepCrossSectionTask.cxx:264
 HepCrossSectionTask.cxx:265
 HepCrossSectionTask.cxx:266
 HepCrossSectionTask.cxx:267
 HepCrossSectionTask.cxx:268
 HepCrossSectionTask.cxx:269
 HepCrossSectionTask.cxx:270
 HepCrossSectionTask.cxx:271
 HepCrossSectionTask.cxx:272
 HepCrossSectionTask.cxx:273
 HepCrossSectionTask.cxx:274
 HepCrossSectionTask.cxx:275
 HepCrossSectionTask.cxx:276
 HepCrossSectionTask.cxx:277
 HepCrossSectionTask.cxx:278
 HepCrossSectionTask.cxx:279
 HepCrossSectionTask.cxx:280
 HepCrossSectionTask.cxx:281
 HepCrossSectionTask.cxx:282
 HepCrossSectionTask.cxx:283
 HepCrossSectionTask.cxx:284
 HepCrossSectionTask.cxx:285
 HepCrossSectionTask.cxx:286
 HepCrossSectionTask.cxx:287
 HepCrossSectionTask.cxx:288
 HepCrossSectionTask.cxx:289
 HepCrossSectionTask.cxx:290
 HepCrossSectionTask.cxx:291
 HepCrossSectionTask.cxx:292
 HepCrossSectionTask.cxx:293
 HepCrossSectionTask.cxx:294
 HepCrossSectionTask.cxx:295
 HepCrossSectionTask.cxx:296
 HepCrossSectionTask.cxx:297
 HepCrossSectionTask.cxx:298
 HepCrossSectionTask.cxx:299
 HepCrossSectionTask.cxx:300
 HepCrossSectionTask.cxx:301
 HepCrossSectionTask.cxx:302
 HepCrossSectionTask.cxx:303
 HepCrossSectionTask.cxx:304
 HepCrossSectionTask.cxx:305
 HepCrossSectionTask.cxx:306
 HepCrossSectionTask.cxx:307
 HepCrossSectionTask.cxx:308
 HepCrossSectionTask.cxx:309
 HepCrossSectionTask.cxx:310