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

#include "QFramework/TQTable.h"
#include "QFramework/TQSample.h"
#include "TObjArray.h"

#ifdef __CINT__
typedef double Unit; // EXCLUDE
#endif

class TQXSecParser : public TQTable {
protected:
  TQSampleFolder* fSampleFolder; //!
  TObjArray* fPathVariants;
  std::set<TString> fKeysToExport;

public:
  TQXSecParser(const TString& filename);
  TQXSecParser();
  TQXSecParser(TQTable& tab);
  TQXSecParser(TQTable* tab);
  TQXSecParser(TQXSecParser& parser);
  TQXSecParser(TQXSecParser* parser);
  TQXSecParser(TQSampleFolder* sf, const TString& xsecfilename);
  TQXSecParser(TQSampleFolder* sf);
  ~TQXSecParser();

  typedef double Unit; // EXCLUDE
  #ifndef __CINT__
  class Units { // nested
  public:
    static constexpr TQXSecParser::Unit millibarn = 1e9;
    static constexpr TQXSecParser::Unit microbarn = 1e6;
    static constexpr TQXSecParser::Unit nanobarn = 1e3;
    static constexpr TQXSecParser::Unit picobarn = 1;
    static constexpr TQXSecParser::Unit femtobarn = 1e-3;
    static constexpr TQXSecParser::Unit attobarn = 1e-6;
    static constexpr TQXSecParser::Unit UNKNOWN = std::numeric_limits<double>::quiet_NaN();
  };
  #endif
  static Unit unit(const TString& in);
  static TString unitName(Unit in);
  static double convertUnit(double in, const TString& inUnit, const TString& outUnit);
  static double convertUnit(double in, Unit inUnit, Unit outUnit);
  static void selectFirstColumn(std::vector<TString>* lines);

  int writeMappingToColumn (const TString& colname = "path");
  int readMappingFromColumn(const TString& colname = "path");
  int readFilePatternFromColumn(const TString& colname = "matchingName");

  int disableSamplesWithColumnStringMatch(const TString& colname, const TString& pattern, bool verbose = false);
  int enableSamplesWithColumnStringMatch(const TString& colname, const TString& pattern, bool verbose = false);
  void cloneSettingsFrom(TQXSecParser* parser);

  int enableSamplesWithPriorityLessThan (const TString& colname = "priority", int val = 2, bool verbose=false);
  int disableSamplesWithPriorityLessThan (const TString& colname = "priority", int val = 2, bool verbose=false);
  int enableSamplesWithPriorityGreaterThan (const TString& colname = "priority", int val = 1, bool verbose=false);
  int disableSamplesWithPriorityGreaterThan (const TString& colname = "priority", int val = 1, bool verbose=false);
  int enableAllSamples();
  int disableAllSamples();

  int applyWhitelist(const TString& filename);
  int applyWhitelist(std::vector<TString>* lines);
  int applyBlacklist(const TString& filename);
  int applyBlacklist(std::vector<TString>* lines);

  void addPathVariant(const TString& replacements);
  void addPathVariant(const TString& key, const TString& value);
  void printPathVariants();
  void clearPathVariants();
  bool isGood();

  int readMapping(const TString& filename, bool print=false);
  int readMapping(TQTable& tmp);
  bool hasCompleteMapping(bool requireEnabled = true);

  void addTagKeyToExport(const TString& key);
  bool removeTagKeyToExport(const TString& key);
  const std::set<TString>& getTagKeysToExport() const;
  void clearTagKeysToExport();

  int addAllSamples(bool requireEnabled = true, bool requirePath = true);
  int addAllEnabledSamples();
  int addAllMappedSamples();
  int addAllListedSamples();
  int addAllSamplesFromPath(const TString& filesystempath, const TString& folderpath = "data", const TString& namefilter = "*.root", const TString& pathfilter = "*", const TString& tagstring = "generator='ATLAS', processinfo='p-p-collisions'");
  int addAllSamplesFromFolder(TQFolder* f, const TString& folderpath = "data", const TString& namefilter = "*.root", const TString& pathfilter = "./*", const TString& tagstring = "generator='ATLAS', processinfo='p-p-collisions'");
  int addAllSamplesFromList(const TString& inputfile, const TString& folderpath = "data", const TString& tagstring = "generator='ATLAS', processinfo='p-p-collisions'");

  TQSampleFolder* getSampleFolder();
  void setSampleFolder(TQSampleFolder* sf);

  ClassDefOverride(TQXSecParser,3) // parser for cross section files
};

#endif
 TQXSecParser.h:1
 TQXSecParser.h:2
 TQXSecParser.h:3
 TQXSecParser.h:4
 TQXSecParser.h:5
 TQXSecParser.h:6
 TQXSecParser.h:7
 TQXSecParser.h:8
 TQXSecParser.h:9
 TQXSecParser.h:10
 TQXSecParser.h:11
 TQXSecParser.h:12
 TQXSecParser.h:13
 TQXSecParser.h:14
 TQXSecParser.h:15
 TQXSecParser.h:16
 TQXSecParser.h:17
 TQXSecParser.h:18
 TQXSecParser.h:19
 TQXSecParser.h:20
 TQXSecParser.h:21
 TQXSecParser.h:22
 TQXSecParser.h:23
 TQXSecParser.h:24
 TQXSecParser.h:25
 TQXSecParser.h:26
 TQXSecParser.h:27
 TQXSecParser.h:28
 TQXSecParser.h:29
 TQXSecParser.h:30
 TQXSecParser.h:31
 TQXSecParser.h:32
 TQXSecParser.h:33
 TQXSecParser.h:34
 TQXSecParser.h:35
 TQXSecParser.h:36
 TQXSecParser.h:37
 TQXSecParser.h:38
 TQXSecParser.h:39
 TQXSecParser.h:40
 TQXSecParser.h:41
 TQXSecParser.h:42
 TQXSecParser.h:43
 TQXSecParser.h:44
 TQXSecParser.h:45
 TQXSecParser.h:46
 TQXSecParser.h:47
 TQXSecParser.h:48
 TQXSecParser.h:49
 TQXSecParser.h:50
 TQXSecParser.h:51
 TQXSecParser.h:52
 TQXSecParser.h:53
 TQXSecParser.h:54
 TQXSecParser.h:55
 TQXSecParser.h:56
 TQXSecParser.h:57
 TQXSecParser.h:58
 TQXSecParser.h:59
 TQXSecParser.h:60
 TQXSecParser.h:61
 TQXSecParser.h:62
 TQXSecParser.h:63
 TQXSecParser.h:64
 TQXSecParser.h:65
 TQXSecParser.h:66
 TQXSecParser.h:67
 TQXSecParser.h:68
 TQXSecParser.h:69
 TQXSecParser.h:70
 TQXSecParser.h:71
 TQXSecParser.h:72
 TQXSecParser.h:73
 TQXSecParser.h:74
 TQXSecParser.h:75
 TQXSecParser.h:76
 TQXSecParser.h:77
 TQXSecParser.h:78
 TQXSecParser.h:79
 TQXSecParser.h:80
 TQXSecParser.h:81
 TQXSecParser.h:82
 TQXSecParser.h:83
 TQXSecParser.h:84
 TQXSecParser.h:85
 TQXSecParser.h:86
 TQXSecParser.h:87
 TQXSecParser.h:88
 TQXSecParser.h:89
 TQXSecParser.h:90
 TQXSecParser.h:91
 TQXSecParser.h:92
 TQXSecParser.h:93
 TQXSecParser.h:94
 TQXSecParser.h:95
 TQXSecParser.h:96
 TQXSecParser.h:97
 TQXSecParser.h:98