void printCutflowData(string s) {
  TFile* f = TFile::Open(s.c_str());


  TList * AllKeys=f->GetListOfKeys();
  int NKeys = AllKeys->GetEntries();
  //cout << NKeys << endl;
  TIter next(AllKeys);
  TKey *key;
  vector<TKey* > cutflowKeys;
  for(int i =0 ; i < NKeys ; i++)
  {
    key=(TKey*)next();
    string name = key->GetTitle();
    if(name.find("CutFlow") != std::string::npos)
    {
      cutflowKeys.push_back(key);
      //cout << name << endl;
      
    }
  }
  TCanvas * c1 = new TCanvas;
  TH1F *h = (TH1F*)cutflowKeys[0]->ReadObj();
  for(int i=1; i<cutflowKeys.size();i++)
  {
    TH1F *temp = (TH1F*)cutflowKeys[i]->ReadObj();
    h->Add(temp);
  } 
  
  int Ndecimals = 2;
    enum CutEnum {
    NxAOD=0, NDxAOD=1, ALLEVTS=2, DUPLICATE=3, TRIGGER=4, GRL=5, DQ=6, VERTEX=7, TWO_LOOSE_GAM=8, AMBIGUITY=9,
    TRIG_MATCH=10, GAM_TIGHTID=11, GAM_ISOLATION=12, RELPTCUTS=13, MASSCUT=14, PASSALL=15 };

  TString format("  %-24s%10."); format+=Ndecimals; format+="f%11.2f%%%11.2f%%\n";
  int all_bin = h->FindBin(ALLEVTS);
  printf("  %-24s%10s%12s%12s\n","Event selection","Nevents","Cut rej.","Tot. eff.");
  for (int bin=1;bin<=h->GetNbinsX();++bin) {
    double ntot=h->GetBinContent(all_bin), n=h->GetBinContent(bin), nprev=h->GetBinContent(bin-1);
    TString cutName(h->GetXaxis()->GetBinLabel(bin));
    cutName.ReplaceAll("#it{m}_{#gamma#gamma}","m_yy");
    if (bin==1||nprev==0||n==nprev)
      printf(format.Data(),cutName.Data(),n,-1e-10,n/ntot*100);
    else // if the cut does something, print more information
      printf(format.Data(),cutName.Data(),n,(n-nprev)/nprev*100,n/ntot*100);
  }
}
void AddTask_GammaConvDalitzV1_pp(  Int_t trainConfig = 1,  //change different set of cuts
                                    Bool_t isMC   = kFALSE, //run MC
                                    TString fileNameInputForWeighting = "MCSpectraInput.root", // path to file for weigting input
                                    Int_t   enableMatBudWeightsPi0          = 0,              // 1 = three radial bins, 2 = 10 radial bins
                                    TString filenameMatBudWeights           = "MCInputFileMaterialBudgetWeights.root"
         ) {

  Int_t isHeavyIon = 0;

  // ================== GetAnalysisManager ===============================
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr) {
    Error(Form("AddTask_GammaConvDalitzV1_%i",trainConfig), "No analysis manager found.");
    return ;
  }

  // ================== GetInputEventHandler =============================
  AliVEventHandler *inputHandler=mgr->GetInputEventHandler();

  //========= Add PID Reponse to ANALYSIS manager ====
  if(!(AliPIDResponse*)mgr->GetTask("PIDResponseTask")){
    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDResponse.C");
    AddTaskPIDResponse(isMC);
  }

  //=========  Set Cutnumber for V0Reader ================================
  //TString cutnumber = "00000000000840010015000000";
  TString cutnumberPhoton = "06000008400100007500000000";
  TString cutnumberEvent  = "00000103";


  AliAnalysisDataContainer *cinput = mgr->GetCommonInputContainer();

  //========= Add V0 Reader to  ANALYSIS manager if not yet existent =====
  TString V0ReaderName = Form("V0ReaderV1_%s_%s",cutnumberEvent.Data(),cutnumberPhoton.Data());
  if( !(AliV0ReaderV1*)mgr->GetTask(V0ReaderName.Data()) ){

    AliV0ReaderV1 *fV0ReaderV1 = new AliV0ReaderV1(V0ReaderName.Data());

    fV0ReaderV1->SetUseOwnXYZCalculation(kTRUE);
    fV0ReaderV1->SetCreateAODs(kFALSE);// AOD Output
    fV0ReaderV1->SetUseAODConversionPhoton(kTRUE);

    AliConvEventCuts *fEventCuts=NULL;
    if(cutnumberEvent!=""){
      fEventCuts= new AliConvEventCuts(cutnumberEvent.Data(),cutnumberEvent.Data());
      fEventCuts->SetPreSelectionCutFlag(kTRUE);
      fEventCuts->SetV0ReaderName(V0ReaderName);
      if(fEventCuts->InitializeCutsFromCutString(cutnumberEvent.Data())){
        fV0ReaderV1->SetEventCuts(fEventCuts);
        fEventCuts->SetFillCutHistograms("",kTRUE);
      }
    }

    // Set AnalysisCut Number
    AliConversionPhotonCuts *fCuts=NULL;
    if(cutnumberPhoton!=""){
      fCuts= new AliConversionPhotonCuts(cutnumberPhoton.Data(),cutnumberPhoton.Data());
      fCuts->SetPreSelectionCutFlag(kTRUE);
      fCuts->SetIsHeavyIon(isHeavyIon);
      fCuts->SetV0ReaderName(V0ReaderName);
      if(fCuts->InitializeCutsFromCutString(cutnumberPhoton.Data())){
        fV0ReaderV1->SetConversionCuts(fCuts);
        fCuts->SetFillCutHistograms("",kTRUE);
      }
    }
    if(inputHandler->IsA()==AliAODInputHandler::Class()){
    // AOD mode
      fV0ReaderV1->AliV0ReaderV1::SetDeltaAODBranchName(Form("GammaConv_%s_gamma",cutnumberAODBranch.Data()));
    }
    fV0ReaderV1->Init();

    AliLog::SetGlobalLogLevel(AliLog::kInfo);

    //connect input V0Reader
    mgr->AddTask(fV0ReaderV1);
    mgr->ConnectInput(fV0ReaderV1,0,cinput);

  }


  if( !(AliDalitzElectronSelector*)mgr->GetTask("ElectronSelector") ){
    AliDalitzElectronSelector *fElectronSelector = new AliDalitzElectronSelector("ElectronSelector");
    //ConfigV0ReaderV1(fV0ReaderV1,ConvCutnumber,IsHeavyIon);
    // Set AnalysisCut Number
    AliDalitzElectronCuts *fElecCuts=0;
    TString ElecCuts = "30105400000003300000";

    if( ElecCuts!=""){
      fElecCuts= new AliDalitzElectronCuts(ElecCuts.Data(),ElecCuts.Data());
      if(fElecCuts->InitializeCutsFromCutString(ElecCuts.Data())){
        fElectronSelector->SetDalitzElectronCuts(fElecCuts);
        fElecCuts->SetFillCutHistograms("",kTRUE);
      }
    }

    fElectronSelector->Init();
    mgr->AddTask(fElectronSelector);
    //connect input fElectronSelector

    mgr->ConnectInput (fElectronSelector,0,cinput);
  }

  //================================================
  //========= Add task to the ANALYSIS manager =====
  //            find input container
  AliAnalysisTaskGammaConvDalitzV1 *task=NULL;
  task= new AliAnalysisTaskGammaConvDalitzV1(Form("GammaConvDalitzV1_%i",trainConfig));
  task->SetIsHeavyIon(0);
  task->SetIsMC(isMC);
  task->SetV0ReaderName(V0ReaderName);


  CutHandlerConvDalitz cuts;

  if(trainConfig == 1){
   	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "20475400253202221710"); // standard cut number for pp7TeV
	cuts.AddCut("00000113", "00200009360300007800004000", "0163103100900000", "20475400253202221710");
    // train configs 2 to 4 for estimation of systematics of standard cut number pp7TeV
  } else if (trainConfig == 2) {
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "10475400253202221710");
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "30475400253202221710");
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "20475400253201221710");
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "20475400253203221710");
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "20475400253202121710");
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "20475400253202321710");
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "20475400253302221710");

  } else if (trainConfig == 3) {
	cuts.AddCut("00000113", "00200009360300007900004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00000113", "00200009360300007200004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00000113", "00200009360300007100004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00000113", "00200009360300001800004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00000113", "00200009360300002800004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00000113", "00200049360300007800004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00000113", "00200019360300007800004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "20475400253202222710");

  } else if (trainConfig == 4) {
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "20575400253202221710");
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "20775400253202221710");
	cuts.AddCut("00000113", "00200009260300007800004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00000113", "00200009660300007800004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "20425400253202221710");
	cuts.AddCut("00000113", "00200009360300007800004000", "0263103100900000", "20407200253202221710");
	cuts.AddCut("00000113", "00200009320300007800004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00000113", "00200009305100007800004000", "0263103100900000", "20475400253202221710");
  } else if (trainConfig == 102) {
	cuts.AddCut("00010113", "00200009360300007800004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00010113", "00200009360300007800004000", "0263103100900000", "10475400253202221710");
	cuts.AddCut("00010113", "00200009360300007800004000", "0263103100900000", "30475400253202221710");
	cuts.AddCut("00010113", "00200009360300007800004000", "0263103100900000", "20475400253201221710");
	cuts.AddCut("00010113", "00200009360300007800004000", "0263103100900000", "20475400253203221710");
	cuts.AddCut("00010113", "00200009360300007800004000", "0263103100900000", "20475400253202121710");
	cuts.AddCut("00010113", "00200009360300007800004000", "0263103100900000", "20475400253202321710");
  } else if (trainConfig == 103) {
	cuts.AddCut("00010113", "00200009266300008854404000", "0263103100900000", "20475400253202321710");
	cuts.AddCut("00010113", "00200009266300008854404000", "0263103100900000", "20475400253202301710");
  } else if (trainConfig == 104) {  // to be used with MBW
	cuts.AddCut("00010113", "00200009266300008854404000", "0263103100900000", "20475400253202321710");
	cuts.AddCut("00010113", "00200009266300008854404000", "0263103100900000", "20475400253202301710");
  } else if (trainConfig == 202) {
	cuts.AddCut("00074113", "00200009360300007800004000", "0263103100900000", "20475400253202221710");
	cuts.AddCut("00074113", "00200009360300007800004000", "0263103100900000", "10475400253202221710");
	cuts.AddCut("00074113", "00200009360300007800004000", "0263103100900000", "30475400253202221710");
	cuts.AddCut("00074113", "00200009360300007800004000", "0263103100900000", "20475400253201221710");
	cuts.AddCut("00074113", "00200009360300007800004000", "0263103100900000", "20475400253203221710");
	cuts.AddCut("00074113", "00200009360300007800004000", "0263103100900000", "20475400253202121710");
	cuts.AddCut("00074113", "00200009360300007800004000", "0263103100900000", "20475400253202321710");


 } else {
    Error(Form("GammaConvV1_%i",trainConfig), "wrong trainConfig variable no cuts have been specified for the configuration");
    return;
  }

  if(!cuts.AreValid()){
    cout << "\n\n****************************************************" << endl;
    cout << "ERROR: No valid cuts stored in CutHandlerConvDalitz! Returning..." << endl;
    cout << "****************************************************\n\n" << endl;
    return;
  }

  Int_t numberOfCuts = cuts.GetNCuts();

  TList  *EventCutList = new TList();
  TList  *ConvCutList  = new TList();
  TList  *MesonCutList = new TList();
  TList  *ElecCutList  = new TList();

  TList *HeaderList = new TList();
  TObjString *Header2 = new TObjString("BOX");
  HeaderList->Add(Header2);

  EventCutList->SetOwner(kTRUE);
  AliConvEventCuts **analysisEventCuts   = new AliConvEventCuts*[numberOfCuts];
  ConvCutList->SetOwner(kTRUE);
  AliConversionPhotonCuts **analysisCuts   = new AliConversionPhotonCuts*[numberOfCuts];
  MesonCutList->SetOwner(kTRUE);
  AliConversionMesonCuts **analysisMesonCuts   = new AliConversionMesonCuts*[numberOfCuts];
  ElecCutList->SetOwner(kTRUE);
  AliDalitzElectronCuts **analysisElecCuts   = new AliDalitzElectronCuts*[numberOfCuts];
  Bool_t initializedMatBudWeigths_existing    = kFALSE;

  for(Int_t i = 0; i<numberOfCuts; i++){
    TString cutName( Form("%s_%s_%s_%s",(cuts.GetEventCut(i)).Data(),(cuts.GetPhotonCut(i)).Data(),(cuts.GetElecCut(i)).Data(),(cuts.GetMesonCut(i)).Data() ) );

    analysisEventCuts[i] = new AliConvEventCuts();
    analysisEventCuts[i]->SetV0ReaderName(V0ReaderName);
    analysisEventCuts[i]->InitializeCutsFromCutString((cuts.GetEventCut(i)).Data());
    EventCutList->Add(analysisEventCuts[i]);
    analysisEventCuts[i]->SetFillCutHistograms("",kFALSE);

    analysisCuts[i] = new AliConversionPhotonCuts();
    if (enableMatBudWeightsPi0 > 0){
        if (isMC > 0){
            if (analysisCuts[i]->InitializeMaterialBudgetWeights(enableMatBudWeightsPi0,filenameMatBudWeights)){
                initializedMatBudWeigths_existing = kTRUE;}
            else {cout << "ERROR The initialization of the materialBudgetWeights did not work out." << endl;}
        }
        else {cout << "ERROR 'enableMatBudWeightsPi0'-flag was set > 0 even though this is not a MC task. It was automatically reset to 0." << endl;}
    }
    analysisCuts[i]->SetV0ReaderName(V0ReaderName);
    analysisCuts[i]->InitializeCutsFromCutString((cuts.GetPhotonCut(i)).Data());
    ConvCutList->Add(analysisCuts[i]);
    analysisCuts[i]->SetFillCutHistograms("",kFALSE);

    analysisMesonCuts[i] = new AliConversionMesonCuts();
    analysisMesonCuts[i]->InitializeCutsFromCutString((cuts.GetMesonCut(i)).Data());
    MesonCutList->Add(analysisMesonCuts[i]);
    analysisMesonCuts[i]->SetFillCutHistograms("");

    analysisElecCuts[i] = new AliDalitzElectronCuts();
    analysisElecCuts[i]->InitializeCutsFromCutString((cuts.GetElecCut(i)).Data());
    ElecCutList->Add(analysisElecCuts[i]);
    analysisElecCuts[i]->SetFillCutHistograms("",kFALSE,cutName);

    analysisEventCuts[i]->SetAcceptedHeader(HeaderList);

  }

  task->SetEventCutList(numberOfCuts,EventCutList);
  task->SetConversionCutList(numberOfCuts,ConvCutList);
  task->SetMesonCutList(MesonCutList);
  task->SetElectronCutList(ElecCutList);
  task->SetMoveParticleAccordingToVertex(kTRUE);
  if (initializedMatBudWeigths_existing) {
      task->SetDoMaterialBudgetWeightingOfGammasForTrueMesons(kTRUE);
  }
  //task->SetDoMesonAnalysis(kTRUE);
  //if (enableQAMesonTask) task->SetDoMesonQA(kTRUE); //Attention new switch for Pi0 QA
  //if (enableQAMesonTask) task->SetDoPhotonQA(kTRUE);  //Attention new switch small for Photon QA

  //connect containers
  AliAnalysisDataContainer *coutput =
  mgr->CreateContainer(Form("GammaConvDalitzV1_%i",trainConfig), TList::Class(),
              AliAnalysisManager::kOutputContainer,Form("GammaConvDalitzV1_%i.root",trainConfig));

  mgr->AddTask(task);
  mgr->ConnectInput(task,0,cinput);
  mgr->ConnectOutput(task,1,coutput);

  return;

}