LDMX Software
EventWeights.h
1//
2// Created by Wesley Ketchum on 4/27/24.
3//
4
5#ifndef SIMCORE_EventWeights_H
6#define SIMCORE_EventWeights_H
7
8#include <map>
9#include <vector>
10
11#include "TObject.h"
12
13namespace ldmx {
14
16 public:
17 // Enum to define
18 enum VariationType {
19 kINVALID = -1,
20 kUNKNOWN = 0,
21
22 kGENIE_GENERIC = 1000,
23 kGENIE_INukeTwkDial = kGENIE_GENERIC + 100,
24 kGENIE_INukeTwkDial_MFP_pi = kGENIE_INukeTwkDial + 1,
25 kGENIE_INukeTwkDial_MFP_N = kGENIE_INukeTwkDial + 2,
26 kGENIE_INukeTwkDial_FrCEx_pi = kGENIE_INukeTwkDial + 3,
27 kGENIE_INukeTwkDial_FrInel_pi = kGENIE_INukeTwkDial + 4,
28 kGENIE_INukeTwkDial_FrAbs_pi = kGENIE_INukeTwkDial + 5,
29 kGENIE_INukeTwkDial_FrPiProd_pi = kGENIE_INukeTwkDial + 6,
30 kGENIE_INukeTwkDial_FrCEx_N = kGENIE_INukeTwkDial + 7,
31 kGENIE_INukeTwkDial_FrInel_N = kGENIE_INukeTwkDial + 8,
32 kGENIE_INukeTwkDial_FrAbs_N = kGENIE_INukeTwkDial + 9,
33 kGENIE_INukeTwkDial_FrPiProd_N = kGENIE_INukeTwkDial + 10,
34
35 kGENIE_HadrNuclTwkDial = kGENIE_GENERIC + 150,
36 kGENIE_HadrNuclTwkDial_FormZone = kGENIE_HadrNuclTwkDial + 1
37 };
38
39 EventWeights() = default;
40 virtual ~EventWeights() = default;
41
42 // constructor where variation map is declared
43 EventWeights(std::map<VariationType, std::vector<double> > var_map)
44 : variations_map_(var_map) {}
45
46 void clear();
47
48 friend std::ostream &operator<<(std::ostream &o, const EventWeights &ew);
49
50 std::vector<double> getWeights() const { return weights_; }
51 std::map<VariationType, std::vector<double> > getVariations() const {
52 return variations_map_;
53 }
54
55 size_t getNumWeights() const { return weights_.size(); }
56 size_t getNumVariationTypes() const { return variations_map_.size(); }
57
58 double getNthWeight(size_t i_w) const { return weights_.at(i_w); }
59
60 std::map<VariationType, double> getVariationsNthWeight(size_t i_w) const;
61
62 void addWeight(double w) { weights_.push_back(w); }
63 void setWeight(size_t i_w, double w) { weights_[i_w] = w; }
64
65 private:
66 // set of event weights (n weights per event)
67 std::vector<double> weights_;
68
69 // map of the variations used: key is variation type, value is list of
70 // variation values (n per event)
71 std::map<VariationType, std::vector<double> > variations_map_;
72
73 public:
74 inline static std::string variationTypeToString(const VariationType &vtype) {
75 switch (vtype) {
76 case VariationType::kINVALID:
77 return "INVALID";
78 case VariationType::kUNKNOWN:
79 return "UNKNOWN";
80 case VariationType::kGENIE_GENERIC:
81 return "GENIE_GENERIC";
82 case VariationType::kGENIE_INukeTwkDial:
83 return "GENIE_INukeTwkDial";
84 case VariationType::kGENIE_INukeTwkDial_MFP_pi:
85 return "GENIE_INukeTwkDial_MFP_pi";
86 case VariationType::kGENIE_INukeTwkDial_MFP_N:
87 return "GENIE_INukeTwkDial_MFP_N";
88 case VariationType::kGENIE_INukeTwkDial_FrCEx_pi:
89 return "GENIE_INukeTwkDial_FrCEx_pi";
90 case VariationType::kGENIE_INukeTwkDial_FrInel_pi:
91 return "GENIE_INukeTwkDial_FrInel_pi";
92 case VariationType::kGENIE_INukeTwkDial_FrAbs_pi:
93 return "GENIE_INukeTwkDial_FrAbs_pi";
94 case VariationType::kGENIE_INukeTwkDial_FrPiProd_pi:
95 return "GENIE_INukeTwkDial_FrPiProd_pi";
96 case VariationType::kGENIE_INukeTwkDial_FrCEx_N:
97 return "GENIE_INukeTwkDial_FrCEx_N";
98 case VariationType::kGENIE_INukeTwkDial_FrInel_N:
99 return "GENIE_INukeTwkDial_FrInel_N";
100 case VariationType::kGENIE_INukeTwkDial_FrAbs_N:
101 return "GENIE_INukeTwkDial_FrAbs_N";
102 case VariationType::kGENIE_INukeTwkDial_FrPiProd_N:
103 return "GENIE_INukeTwkDial_FrPiProd_N";
104 case VariationType ::kGENIE_HadrNuclTwkDial:
105 return "GENIE_HadrNuclTwkDial";
106 case VariationType ::kGENIE_HadrNuclTwkDial_FormZone:
107 return "GENIE_HadrNuclTwkDial_FormZone";
108 }
109 return "UNKNOWN";
110 }
111 inline static VariationType stringToVariationType(
112 const std::string &typestring) {
113 if (typestring == "UNKNOWN")
114 return VariationType::kUNKNOWN;
115 else if (typestring == "INVALID")
116 return VariationType::kINVALID;
117 else if (typestring == "GENIE_GENERIC")
118 return VariationType::kGENIE_GENERIC;
119 else if (typestring == "GENIE_INukeTwkDial")
120 return VariationType::kGENIE_INukeTwkDial;
121 else if (typestring == "GENIE_INukeTwkDial_MFP_pi")
122 return VariationType::kGENIE_INukeTwkDial_MFP_pi;
123 else if (typestring == "GENIE_INukeTwkDial_MFP_N")
124 return VariationType::kGENIE_INukeTwkDial_MFP_N;
125 else if (typestring == "GENIE_INukeTwkDial_FrCEx_pi")
126 return VariationType::kGENIE_INukeTwkDial_FrCEx_pi;
127 else if (typestring == "GENIE_INukeTwkDial_FrInel_pi")
128 return VariationType::kGENIE_INukeTwkDial_FrInel_pi;
129 else if (typestring == "GENIE_INukeTwkDial_FrAbs_pi")
130 return VariationType::kGENIE_INukeTwkDial_FrAbs_pi;
131 else if (typestring == "GENIE_INukeTwkDial_FrPiProd_pi")
132 return VariationType::kGENIE_INukeTwkDial_FrPiProd_pi;
133 else if (typestring == "GENIE_INukeTwkDial_FrCEx_N")
134 return VariationType::kGENIE_INukeTwkDial_FrCEx_N;
135 else if (typestring == "GENIE_INukeTwkDial_FrInel_N")
136 return VariationType::kGENIE_INukeTwkDial_FrInel_N;
137 else if (typestring == "GENIE_INukeTwkDial_FrAbs_N")
138 return VariationType::kGENIE_INukeTwkDial_FrAbs_N;
139 else if (typestring == "GENIE_INukeTwkDial_FrPiProd_N")
140 return VariationType::kGENIE_INukeTwkDial_FrPiProd_N;
141 else if (typestring == "GENIE_HadrNuclTwkDial")
142 return VariationType::kGENIE_HadrNuclTwkDial;
143 else if (typestring == "GENIE_HadrNuclTwkDial_FormZone")
144 return VariationType::kGENIE_HadrNuclTwkDial_FormZone;
145
146 return VariationType::kUNKNOWN;
147 }
148};
149} // namespace ldmx
150
151#endif // SIMCORE_EventWeights_H