//this file looks like plain C, but it's actually -*- c++ -*-
#ifndef __TQ_NFCHAINLOADER__
#define __TQ_NFCHAINLOADER__

#include "QFramework/TQSampleFolder.h"
#include "QFramework/TQSampleDataReader.h"
#include "QFramework/TQMessageStream.h"
#include "QFramework/TQNFBase.h"
#include "TRandom3.h"
#include <iostream>
#include "TString.h"

#ifdef __CINT__ 
#define override
#endif
class TQNFChainloader : public TQNamedTaggable {
protected:
  TQSampleDataReader* fReader;
  TQTaggable fVariationTags;
  TQTaggable fCampaignTag;
  
  std::vector<TString> vNFconfig;
  std::vector<TQNFBase*> vNFcalc; //!
  std::vector<TQNFBase*> vNFpostCalc; //!
  std::map<TString,double> relativeVariationMap;
  std::map<TString,bool> targetNFpaths;
  std::map<TString,std::vector<double>> mNFvectors;
  TRandom3 rnd;
  int registerTargetPaths(const std::vector<TString>& vec);
  int collectNFs();
  int deployNFs();
  bool initialized = false;
 
public:
  enum Mode {
    Manual,
    NFCalculator,
    ABCD
  };
 
  int status;
  int verbosity;
 
  TQNFChainloader();
  TQNFChainloader(const std::vector<TString>& nfconfigs, TQSampleFolder* f);
  virtual ~TQNFChainloader();
 
  int addNFconfigs(const std::vector<TString>& nfconfigs);
  int setNFconfigs(const std::vector<TString>& nfconfigs);
  void setSampleFolder(TQSampleFolder* f);
  double getRelVariation(const TString& key, double value, double uncertainty);
 
  bool initialize();
  bool finalize();
 
  TList* getListOfFolders();

  int execute();
  
  int setVariationTags(const TQTaggable& tags);
  int setVariationTags(TQTaggable* tags);
  int setCampaignTag(TQTaggable* tag);

  ClassDefOverride(TQNFChainloader,1) // high-level class to manage multi-stage normalization factor computations
};

#endif
 TQNFChainloader.h:1
 TQNFChainloader.h:2
 TQNFChainloader.h:3
 TQNFChainloader.h:4
 TQNFChainloader.h:5
 TQNFChainloader.h:6
 TQNFChainloader.h:7
 TQNFChainloader.h:8
 TQNFChainloader.h:9
 TQNFChainloader.h:10
 TQNFChainloader.h:11
 TQNFChainloader.h:12
 TQNFChainloader.h:13
 TQNFChainloader.h:14
 TQNFChainloader.h:15
 TQNFChainloader.h:16
 TQNFChainloader.h:17
 TQNFChainloader.h:18
 TQNFChainloader.h:19
 TQNFChainloader.h:20
 TQNFChainloader.h:21
 TQNFChainloader.h:22
 TQNFChainloader.h:23
 TQNFChainloader.h:24
 TQNFChainloader.h:25
 TQNFChainloader.h:26
 TQNFChainloader.h:27
 TQNFChainloader.h:28
 TQNFChainloader.h:29
 TQNFChainloader.h:30
 TQNFChainloader.h:31
 TQNFChainloader.h:32
 TQNFChainloader.h:33
 TQNFChainloader.h:34
 TQNFChainloader.h:35
 TQNFChainloader.h:36
 TQNFChainloader.h:37
 TQNFChainloader.h:38
 TQNFChainloader.h:39
 TQNFChainloader.h:40
 TQNFChainloader.h:41
 TQNFChainloader.h:42
 TQNFChainloader.h:43
 TQNFChainloader.h:44
 TQNFChainloader.h:45
 TQNFChainloader.h:46
 TQNFChainloader.h:47
 TQNFChainloader.h:48
 TQNFChainloader.h:49
 TQNFChainloader.h:50
 TQNFChainloader.h:51
 TQNFChainloader.h:52
 TQNFChainloader.h:53
 TQNFChainloader.h:54
 TQNFChainloader.h:55
 TQNFChainloader.h:56
 TQNFChainloader.h:57
 TQNFChainloader.h:58
 TQNFChainloader.h:59
 TQNFChainloader.h:60
 TQNFChainloader.h:61
 TQNFChainloader.h:62
 TQNFChainloader.h:63
 TQNFChainloader.h:64
 TQNFChainloader.h:65
 TQNFChainloader.h:66
 TQNFChainloader.h:67