00001 #ifndef HZZ2L2NU_INCLUDE_GENWEIGHT_H_ 00002 #define HZZ2L2NU_INCLUDE_GENWEIGHT_H_ 00003 00004 #include <array> 00005 #include <map> 00006 #include <optional> 00007 #include <tuple> 00008 #include <utility> 00009 00010 #include <TTreeReaderArray.h> 00011 00012 #include <Dataset.h> 00013 #include <Options.h> 00014 #include <WeightBase.h> 00015 00016 00028 class GenWeight : public WeightBase { 00029 public: 00031 enum class Var { 00032 Nominal, 00033 Up, 00034 Down 00035 }; 00036 00037 GenWeight(Dataset &dataset, Options const &options); 00038 00052 double EnvelopeMEScale(Var direction) const; 00053 00060 double NominalWeight() const override; 00061 00062 int NumVariations() const override { 00063 return availableVariations_.size(); 00064 } 00065 00066 double operator()() const override { 00067 if (defaultVariationIndex_ == -1) 00068 return NominalWeight(); 00069 else 00070 return NominalWeight() * RelWeight(defaultVariationIndex_); 00071 } 00072 00083 double RelWeight(int variation) const override; 00084 00090 double RelWeightAlphaS(Var direction) const; 00091 00093 double RelWeightMEScale(Var renorm, Var factor) const; 00094 00103 double RelWeightPdf(Var direction) const; 00104 00105 std::string_view VariationName(int variation) const override { 00106 return availableVariations_.at(variation); 00107 } 00108 00109 private: 00111 enum class PdfVarType { 00112 Hessian, 00113 MC 00114 }; 00115 00116 void InitializeLheScale(Dataset &dataset); 00117 void InitializePdf(Dataset &dataset); 00118 00120 static std::tuple<PdfVarType, std::optional<std::array<int, 2>>, double> 00121 LookUpPdfSet(int lhapdf); 00122 00129 double datasetWeight_; 00130 00132 bool lheScaleWeightsPresent_; 00133 00139 std::map<std::pair<Var, Var>, int> meScaleIndices_; 00140 00142 bool pdfWeightsPresent_; 00143 00151 std::pair<int, int> pdfWeightsIndices_; 00152 00154 PdfVarType pdfVarType_; 00155 00157 bool alphaSWeightsPresent_; 00158 00166 std::array<int, 2> alphaSWeightsIndices_; 00167 00169 double alphaSVarScaleFactor_; 00170 00172 std::vector<std::string> availableVariations_; 00173 00180 int defaultVariationIndex_; 00181 00182 mutable TTreeReaderValue<float> srcLheNominalWeight_; 00183 mutable TTreeReaderValue<float> srcGenNominalWeight_; 00184 mutable TTreeReaderArray<float> srcScaleWeights_; 00185 mutable TTreeReaderArray<float> srcPdfWeights_; 00186 }; 00187 00188 #endif // HZZ2L2NU_INCLUDE_GENWEIGHT_H_