GRSISort "v4.0.0.5"
An extension of the ROOT analysis Framework
Loading...
Searching...
No Matches
EfficiencyHelper.cxx
Go to the documentation of this file.
1#include "EfficiencyHelper.hh"
2
3// Coincidences Gates
4double promptLow = -250.;
5double promptHigh = 250.;
7{ // Griffin-Griffin
8 return promptLow <= h2->GetTime() - h1->GetTime() && h2->GetTime() - h1->GetTime() <= promptHigh;
9}
10double bgLow = 500.;
11double bgHigh = 1500.;
13{
14 return (bgLow <= std::fabs(h1->GetTime() - h2->GetTime()) && std::fabs(h1->GetTime() - h2->GetTime()) <= bgHigh);
15}
16
18{
19 // some variables to easily change range and binning for multiple histograms at once
20 int energyBins = 10000;
21 int energyBins2D = 2000;
22 double lowEnergy = 0.;
23 double highEnergy = 2000.;
24
25 // five histograms for each type: 1D singles, coincident and time random 2D matrix (unsuppressed on y-axis for suppressed data)
26 // and coincident and time random E_1 vs E_1+E_2, all 2D histograms are at 180 degree
27 // 180 degree means for addback that the detectors are opposite, so the crystal angles are 158 degrees and larger!
28 // (for 145 mm distance)
29
30 // unsuppressed spectra
31 fH1[slot]["griffinE"] = new TH1F("griffinE", Form("Unsuppressed griffin energy;energy [keV];counts/%.1f keV", (highEnergy - lowEnergy) / energyBins), energyBins, lowEnergy, highEnergy);
32 fH2[slot]["griffinGriffinE180Coinc"] = new TH2F("griffinGriffinE180Coinc", "Unsuppressed griffin-griffin energy @ 180^{o};energy [keV];energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
33 fH2[slot]["griffinGriffinE180Bg"] = new TH2F("griffinGriffinE180Bg", "Unsuppressed griffin-griffin energy @ 180^{o};energy [keV];energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
34 fH2[slot]["griffinGriffinESum180Coinc"] = new TH2F("griffinGriffinESum180Coinc", "Unsuppressed griffin energy vs griffin sum energy @ 180^{o};energy [keV];energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
35 fH2[slot]["griffinGriffinESum180Bg"] = new TH2F("griffinGriffinESum180Bg", "Unsuppressed griffin energy vs griffin sum energy @ 180^{o};energy [keV];energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
36 // suppressed spectra
37 fH1[slot]["griffinESupp"] = new TH1F("griffinESupp", Form("Suppressed griffin energy;energy [keV];counts/%.1f keV", (highEnergy - lowEnergy) / energyBins), energyBins, lowEnergy, highEnergy);
38 fH2[slot]["griffinGriffinESuppSum180Coinc"] = new TH2F("griffinGriffinESuppSum180Coinc", "Suppressed griffin energy vs griffin sum energy @ 180^{o};energy [keV];energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
39 fH2[slot]["griffinGriffinESuppSum180Bg"] = new TH2F("griffinGriffinESuppSum180Bg", "Suppressed griffin energy vs griffin sum energy @ 180^{o};energy [keV];energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
40 fH2[slot]["griffinGriffinEMixed180Coinc"] = new TH2F("griffinGriffinEMixed180Coinc", "Unsuppressed/suppressed griffin-griffin energy @ 180^{o};suppressed energy [keV];unsuppressed energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
41 fH2[slot]["griffinGriffinEMixed180Bg"] = new TH2F("griffinGriffinEMixed180Bg", "Unsuppressed/suppressed griffin-griffin energy @ 180^{o};suppressed energy [keV];unsuppressed energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
42 // unsuppressed addback spectra
43 fH1[slot]["griffinEAddback"] = new TH1F("griffinEAddback", Form("Unsuppressed griffin addback energy;energy [keV];counts/%.1f keV", (highEnergy - lowEnergy) / energyBins), energyBins, lowEnergy, highEnergy);
44 fH2[slot]["griffinGriffinEAddback180Coinc"] = new TH2F("griffinGriffinEAddback180Coinc", "Unsuppressed griffin-griffin addback @ 180^{o};energy [keV];energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
45 fH2[slot]["griffinGriffinEAddback180Bg"] = new TH2F("griffinGriffinEAddback180Bg", "Unsuppressed griffin-griffin addback @ 180^{o};energy [keV];energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
46 fH2[slot]["griffinGriffinEAddbackSum180Coinc"] = new TH2F("griffinGriffinEAddbackSum180Coinc", "Unsuppressed griffin addback vs griffin sum energy @ 180^{o};energy [keV];energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
47 fH2[slot]["griffinGriffinEAddbackSum180Bg"] = new TH2F("griffinGriffinEAddbackSum180Bg", "Unsuppressed griffin addback vs griffin sum energy @ 180^{o};energy [keV];energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
48 // suppressed addback spectra
49 fH1[slot]["griffinESuppAddback"] = new TH1F("griffinESuppAddback", Form("Suppressed griffin addback energy;energy [keV];counts/%.1f keV", (highEnergy - lowEnergy) / energyBins), energyBins, lowEnergy, highEnergy);
50 fH2[slot]["griffinGriffinESuppAddbackSum180Coinc"] = new TH2F("griffinGriffinESuppAddbackSum180Coinc", "Suppressed griffin addback vs sum energy @ 180^{o};energy [keV];energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
51 fH2[slot]["griffinGriffinESuppAddbackSum180Bg"] = new TH2F("griffinGriffinESuppAddbackSum180Bg", "Suppressed griffin addback vs sum energy @ 180^{o};energy [keV];energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
52 fH2[slot]["griffinGriffinEMixedAddback180Coinc"] = new TH2F("griffinGriffinEMixedAddback180Coinc", "Unsuppressed/suppressed griffin-griffin addback @ 180^{o};suppressed energy [keV];unsuppressed energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
53 fH2[slot]["griffinGriffinEMixedAddback180Bg"] = new TH2F("griffinGriffinEMixedAddback180Bg", "Unsuppressed/suppressed griffin-griffin addback @ 180^{o};suppressed energy [keV];unsuppressed energy [keV]", energyBins2D, lowEnergy, highEnergy, energyBins2D, lowEnergy, highEnergy);
54}
55
56void EfficiencyHelper::Exec(unsigned int slot, TGriffin& grif, TGriffinBgo& grifBgo)
57{
58 // we use .at() here instead of [] so that we get meaningful error message if a histogram we try to fill wasn't created
59 // e.g. because of a typo
60
61 // loop over unsuppressed griffin hits
62 for(int g = 0; g < grif.GetMultiplicity(); ++g) {
63 auto grif1 = grif.GetGriffinHit(g);
64 fH1[slot].at("griffinE")->Fill(grif1->GetEnergy());
65 for(int g2 = g + 1; g2 < grif.GetMultiplicity(); ++g2) {
66 auto grif2 = grif.GetGriffinHit(g2);
67 if(grif1->GetPosition().Angle(grif2->GetPosition()) * 180. > 179.) {
68 if(PromptCoincidence(grif1, grif2)) {
69 fH2[slot].at("griffinGriffinE180Coinc")->Fill(grif1->GetEnergy(), grif2->GetEnergy());
70 fH2[slot].at("griffinGriffinE180Coinc")->Fill(grif2->GetEnergy(), grif1->GetEnergy());
71 fH2[slot].at("griffinGriffinESum180Coinc")->Fill(grif1->GetEnergy() + grif2->GetEnergy(), grif1->GetEnergy());
72 } else if(TimeRandom(grif1, grif2)) {
73 fH2[slot].at("griffinGriffinE180Bg")->Fill(grif1->GetEnergy(), grif2->GetEnergy());
74 fH2[slot].at("griffinGriffinE180Bg")->Fill(grif2->GetEnergy(), grif1->GetEnergy());
75 fH2[slot].at("griffinGriffinESum180Bg")->Fill(grif1->GetEnergy() + grif2->GetEnergy(), grif1->GetEnergy());
76 }
77 }
78 }
79 }
80
81 // loop over suppressed griffin hits
82 for(int g = 0; g < grif.GetSuppressedMultiplicity(&grifBgo); ++g) {
83 auto grif1 = grif.GetSuppressedHit(g);
84 fH1[slot].at("griffinESupp")->Fill(grif1->GetEnergy());
85 for(int g2 = g + 1; g2 < grif.GetSuppressedMultiplicity(&grifBgo); ++g2) {
86 auto grif2 = grif.GetSuppressedHit(g2);
87 if(grif1->GetPosition().Angle(grif2->GetPosition()) * 180. > 179.) {
88 if(PromptCoincidence(grif1, grif2)) {
89 fH2[slot].at("griffinGriffinESuppSum180Coinc")->Fill(grif1->GetEnergy() + grif2->GetEnergy(), grif1->GetEnergy());
90 } else if(TimeRandom(grif1, grif2)) {
91 fH2[slot].at("griffinGriffinESuppSum180Bg")->Fill(grif1->GetEnergy() + grif2->GetEnergy(), grif1->GetEnergy());
92 }
93 }
94 }
95 for(int g2 = 0; g2 < grif.GetMultiplicity(); ++g2) {
96 if(g == g2) continue;
97 auto grif2 = grif.GetGriffinHit(g2);
98 if(grif1->GetPosition().Angle(grif2->GetPosition()) * 180. > 179.) {
99 if(PromptCoincidence(grif1, grif2)) {
100 fH2[slot].at("griffinGriffinEMixed180Coinc")->Fill(grif1->GetEnergy(), grif2->GetEnergy());
101 } else if(TimeRandom(grif1, grif2)) {
102 fH2[slot].at("griffinGriffinEMixed180Bg")->Fill(grif1->GetEnergy(), grif2->GetEnergy());
103 }
104 }
105 }
106 }
107
108 // loop over unsuppressed griffin addback hits
109 for(int g = 0; g < grif.GetAddbackMultiplicity(); ++g) {
110 auto grif1 = grif.GetAddbackHit(g);
111 fH1[slot].at("griffinEAddback")->Fill(grif1->GetEnergy());
112 for(int g2 = g + 1; g2 < grif.GetAddbackMultiplicity(); ++g2) {
113 auto grif2 = grif.GetAddbackHit(g2);
114 if(grif1->GetPosition().Angle(grif2->GetPosition()) * 180. > 157.) {
115 if(PromptCoincidence(grif1, grif2)) {
116 fH2[slot].at("griffinGriffinEAddback180Coinc")->Fill(grif1->GetEnergy(), grif2->GetEnergy());
117 fH2[slot].at("griffinGriffinEAddback180Coinc")->Fill(grif2->GetEnergy(), grif1->GetEnergy());
118 fH2[slot].at("griffinGriffinEAddbackSum180Coinc")->Fill(grif1->GetEnergy() + grif2->GetEnergy(), grif1->GetEnergy());
119 } else if(TimeRandom(grif1, grif2)) {
120 fH2[slot].at("griffinGriffinEAddback180Bg")->Fill(grif1->GetEnergy(), grif2->GetEnergy());
121 fH2[slot].at("griffinGriffinEAddback180Bg")->Fill(grif2->GetEnergy(), grif1->GetEnergy());
122 fH2[slot].at("griffinGriffinEAddbackSum180Bg")->Fill(grif1->GetEnergy() + grif2->GetEnergy(), grif1->GetEnergy());
123 }
124 }
125 }
126 }
127
128 // loop over suppressed griffin addback hits
129 for(int g = 0; g < grif.GetSuppressedAddbackMultiplicity(&grifBgo); ++g) {
130 auto grif1 = grif.GetSuppressedAddbackHit(g);
131 fH1[slot].at("griffinESuppAddback")->Fill(grif1->GetEnergy());
132 for(int g2 = g + 1; g2 < grif.GetSuppressedAddbackMultiplicity(&grifBgo); ++g2) {
133 auto grif2 = grif.GetSuppressedAddbackHit(g2);
134 if(grif1->GetPosition().Angle(grif2->GetPosition()) * 180. > 157.) {
135 if(PromptCoincidence(grif1, grif2)) {
136 fH2[slot].at("griffinGriffinESuppAddbackSum180Coinc")->Fill(grif1->GetEnergy() + grif2->GetEnergy(), grif1->GetEnergy());
137 } else if(TimeRandom(grif1, grif2)) {
138 fH2[slot].at("griffinGriffinESuppAddbackSum180Bg")->Fill(grif1->GetEnergy() + grif2->GetEnergy(), grif1->GetEnergy());
139 }
140 }
141 }
142 for(int g2 = 0; g2 < grif.GetAddbackMultiplicity(); ++g2) {
143 if(g == g2) continue;
144 auto grif2 = grif.GetAddbackHit(g2);
145 if(grif1->GetPosition().Angle(grif2->GetPosition()) * 180. > 157.) {
146 if(PromptCoincidence(grif1, grif2)) {
147 fH2[slot].at("griffinGriffinEMixedAddback180Coinc")->Fill(grif1->GetEnergy(), grif2->GetEnergy());
148 } else if(TimeRandom(grif1, grif2)) {
149 fH2[slot].at("griffinGriffinEMixedAddback180Bg")->Fill(grif1->GetEnergy(), grif2->GetEnergy());
150 }
151 }
152 }
153 }
154}
155
156void EfficiencyHelper::EndOfSort(std::shared_ptr<std::map<std::string, TList>>& list)
157{
158 std::cout << std::endl;
159 for(auto obj : list->at("")) {
160 std::string name = obj->GetName();
161 size_t coinc = name.rfind("Coinc");
162 if(coinc == name.length() - 5) {
163 auto timeRandom = static_cast<TH2*>(list->at("").FindObject(name.replace(coinc, 5, "Bg").c_str()));
164 if(timeRandom == nullptr) {
165 std::cout << "Failed to find \"" << name.replace(coinc, 5, "Bg") << "\" after finding \"" << name << "\" in list:" << std::endl;
166 list->at("").Print();
167 continue;
168 }
169 double factor = (promptHigh - promptLow) / (2. * (bgHigh - bgLow)); // factor two for BG window because we use absolute time here, might be wrong for asymmetric histograms?
170 std::cout << "Found \"" << timeRandom->GetName() << "\" after finding \"" << obj->GetName() << "\", creating corrected spectrum using factor " << factor << std::endl;
171 auto corrected = static_cast<TH2*>(obj->Clone(name.replace(coinc, 5, "Corr").c_str()));
172 corrected->Add(timeRandom, -factor);
173 list->at("").Add(corrected);
174 }
175 }
176}
bool PromptCoincidence(TGriffinHit *one, TGriffinHit *two)
bool TimeRandom(TGriffinHit *h1, TGriffinHit *h2)
bool TimeRandom(TGriffinHit *h1, TGriffinHit *h2)
bool PromptCoincidence(TGriffinHit *h1, TGriffinHit *h2)
double promptLow
double bgLow
double promptHigh
double bgHigh
void EndOfSort(std::shared_ptr< std::map< std::string, TList > > &list) override
This method gets called at the end of Finalize()
void CreateHistograms(unsigned int slot) override
Virtual helper function that the user uses to create their histograms.
void Exec(unsigned int slot, TGriffin &grif, TGriffinBgo &grifBgo)
virtual Double_t GetTime(const ETimeFlag &correct_flag=ETimeFlag::kAll, Option_t *opt="") const
Returns a time value to the nearest nanosecond!
std::vector< TGRSIMap< std::string, TH2 * > > fH2
Definition TGRSIHelper.h:49
std::vector< TGRSIMap< std::string, TH1 * > > fH1
Definition TGRSIHelper.h:48
TGriffinHit * GetAddbackHit(const int &i)
Definition TGriffin.h:87
Short_t GetAddbackMultiplicity()
Definition TGriffin.h:84
TGriffinHit * GetSuppressedAddbackHit(const int &i)
Definition TGriffin.h:122
Short_t GetSuppressedMultiplicity(const TBgo *bgo)
Definition TGriffin.h:111
Short_t GetSuppressedAddbackMultiplicity(const TBgo *bgo)
Definition TGriffin.h:119
Short_t GetMultiplicity() const override
Definition TGriffin.h:52
TGriffinHit * GetSuppressedHit(const int &i)
!
Definition TGriffin.h:108
TGriffinHit * GetGriffinHit(const int &i)
!
Definition TGriffin.h:47