00001 #ifndef HZZ2L2NU_INCLUDE_BTAGWEIGHT_H_ 00002 #define HZZ2L2NU_INCLUDE_BTAGWEIGHT_H_ 00003 00004 #include <WeightBase.h> 00005 00006 #include <array> 00007 #include <memory> 00008 #include <string> 00009 00010 #include <TH2F.h> 00011 #include <TTreeReaderArray.h> 00012 00013 #include <BTagger.h> 00014 #include <Dataset.h> 00015 #include <EventCache.h> 00016 #include <JetBuilder.h> 00017 #include <Options.h> 00018 #include <PhysicsObjects.h> 00019 00020 00021 class BTagCalibrationReader; 00022 00023 00030 class BTagWeight : public WeightBase { 00031 public: 00043 BTagWeight(Dataset &dataset, Options const &options, BTagger const *bTagger, 00044 JetBuilder const *jetBuilder); 00045 00046 ~BTagWeight() noexcept; 00047 00048 virtual double NominalWeight() const override { 00049 if (cache_.IsUpdated()) 00050 Update(); 00051 return weights_[0]; 00052 } 00053 00054 virtual int NumVariations() const override { 00055 return 4; 00056 } 00057 00058 virtual double operator()() const override { 00059 if (cache_.IsUpdated()) 00060 Update(); 00061 return weights_[int(defaultVariation_)]; 00062 } 00063 00064 virtual double RelWeight(int variation) const override { 00065 if (cache_.IsUpdated()) 00066 Update(); 00067 return weights_[variation + 1] / weights_[0]; 00068 } 00069 00070 virtual std::string_view VariationName(int variation) const override; 00071 00072 private: 00078 enum class Variation : int { 00079 kNominal = 0, 00080 kTagUp = 1, 00081 kTagDown = 2, 00082 kMistagUp = 3, 00083 kMistagDown = 4 00084 }; 00085 00087 double ComputeWeight(Variation variation) const; 00088 00090 void LoadEffTables(); 00091 00093 double GetEfficiency(double pt, double eta, int flavour) const; 00094 00096 double GetScaleFactor(double pt, double eta, int flavour, 00097 Variation variation) const; 00098 00100 void Update() const; 00101 00106 BTagger const *bTagger_; 00107 00109 JetBuilder const *jetBuilder_; 00110 00112 std::filesystem::path const effTablesPath_; 00113 00115 std::map<std::string, std::unique_ptr<TH2F>> effTables_; 00116 00118 std::unique_ptr<BTagCalibrationReader> scaleFactorReader_; 00119 00121 Variation defaultVariation_; 00122 00123 EventCache cache_; 00124 00130 mutable std::array<double, 5> weights_; 00131 }; 00132 00133 #endif // HZZ2L2NU_INCLUDE_BTAGWEIGHT_H_ 00134