OscProb
Utils.h
Go to the documentation of this file.
1
2#include "colormod.h"
3
4#include "../tutorial/SetNiceStyle.C"
5
6#include "TMath.h"
7#include "TFile.h"
8
9#include "PMNS_OQS.h"
10#include "PMNS_LIV.h"
11#include "PMNS_Deco.h"
12#include "PMNS_Iter.h"
13#include "PMNS_NUNM.h"
14#include "PMNS_SNSI.h"
15#include "PMNS_Decay.h"
16#include "PMNS_Sterile.h"
17#include "PMNS_SiderealLIV.h"
18
19//.............................................................................
21
22 // Set to NuFIT 5.2 values (NO w/ SK)
23 p->SetDm(2, 7.41e-5);
24 p->SetDm(3, 2.507e-3);
25 p->SetAngle(1,2, asin(sqrt(0.303)));
26 p->SetAngle(1,3, asin(sqrt(0.02225)));
27 p->SetAngle(2,3, asin(sqrt(0.451)));
28 p->SetDelta(1,3, 232 * TMath::DegToRad());
29
30}
31
32//.............................................................................
33OscProb::PMNS_Fast* GetFast(bool is_nominal){
34
37 return p;
38
39}
40
41//.............................................................................
42OscProb::PMNS_Iter* GetIter(bool is_nominal){
43
46 return p;
47
48}
49
50//.............................................................................
51OscProb::PMNS_Deco* GetDeco(bool is_nominal){
52
55 if(!is_nominal){
56 p->SetGamma(2, 1e-23);
57 p->SetGamma(3, 1e-22);
58 }
59
60 return p;
61
62}
63
64//.............................................................................
65OscProb::PMNS_OQS* GetOQS(bool is_nominal){
66
69 if(!is_nominal){
70 p->SetDecoElement(3, sqrt(2e-23));
71 p->SetDecoElement(8, sqrt(4e-23));
72 p->SetDecoAngle(3,8, acos(0.5));
73 }
74
75 return p;
76
77}
78
79//.............................................................................
81
84 if(!is_nominal){
85 p->SetDm(4, 0.1);
86 p->SetAngle(1,4, 0.1);
87 p->SetAngle(2,4, 0.1);
88 p->SetAngle(3,4, 0.1);
89 }
90
91 return p;
92
93}
94
95//.............................................................................
96OscProb::PMNS_Decay* GetDecay(bool is_nominal){
97
100 if(!is_nominal){
101 p->SetAlpha3(1e-4);
102 }
103
104 return p;
105
106}
107
108//.............................................................................
109OscProb::PMNS_NSI* GetNSI(bool is_nominal){
110
113 if(!is_nominal){
114 p->SetEps(0,0, 0.1, 0);
115 p->SetEps(0,1, 0.2, 0);
116 p->SetEps(0,2, 0.3, 0);
117 p->SetEps(1,1, 0.4, 0);
118 p->SetEps(1,2, 0.5, 0);
119 p->SetEps(2,2, 0.6, 0);
120 }
121
122 return p;
123
124}
125
126//.............................................................................
127OscProb::PMNS_SNSI* GetSNSI(bool is_nominal){
128
131 if(!is_nominal){
132 p->SetEps(0,0, 0.1, 0);
133 p->SetEps(0,1, 0.2, 0);
134 p->SetEps(0,2, 0.3, 0);
135 p->SetEps(1,1, 0.4, 0);
136 p->SetEps(1,2, 0.5, 0);
137 p->SetEps(2,2, 0.6, 0);
138 }
139
140 return p;
141
142}
143
144//.............................................................................
145OscProb::PMNS_LIV* GetLIV(bool is_nominal){
146
149 if(!is_nominal){
150 p->SetaT(0,0, 0.1e-22, 0);
151 p->SetaT(0,1, 0.2e-22, 0);
152 p->SetaT(0,2, 0.3e-22, 0);
153 p->SetaT(1,1, 0.4e-22, 0);
154 p->SetaT(1,2, 0.5e-22, 0);
155 p->SetaT(2,2, 0.6e-22, 0);
156 p->SetcT(0,0, 0.1e-22, 0);
157 p->SetcT(0,1, 0.2e-22, 0);
158 p->SetcT(0,2, 0.3e-22, 0);
159 p->SetcT(1,1, 0.4e-22, 0);
160 p->SetcT(1,2, 0.5e-22, 0);
161 p->SetcT(2,2, 0.6e-22, 0);
162 }
163
164 return p;
165
166}
167
168//.............................................................................
170
173 if(!is_nominal){
174 p->SetA(0,0, 0, 0.1e-22);
175 p->SetA(0,1, 1, 0.2e-22);
176 p->SetA(0,2, 2, 0.3e-22);
177 p->SetA(1,1, 0, 0.4e-22);
178 p->SetA(1,2, 1, 0.5e-22);
179 p->SetA(2,2, 2, 0.6e-22);
180 p->SetC(0,0, 0,0, 0.1e-22);
181 p->SetC(0,1, 1,1, 0.2e-22);
182 p->SetC(0,2, 2,2, 0.3e-22);
183 p->SetC(1,1, 0,1, 0.4e-22);
184 p->SetC(1,2, 1,2, 0.5e-22);
185 p->SetC(2,2, 0,2, 0.6e-22);
186 p->SetColatitude(-89, -59, -24); // IceCube (South Pole)
187 p->SetNeutrinoDirection(57.3, 28.6); // ~1.0 rad, ~0.5 rad
188 p->SetTimeHours(6.0);
189 }
190
191 return p;
192
193}
194
195//.............................................................................
196OscProb::PMNS_NUNM* GetNUNM(bool is_nominal){
197
200 if(!is_nominal){
201 p->SetAlpha(0,0, 0.05, 0);
202 p->SetAlpha(1,0, 0.06, 0);
203 p->SetAlpha(2,0, 0.07, 0);
204 p->SetAlpha(1,1, 0.08, 0);
205 p->SetAlpha(2,1, 0.09, 0);
206 p->SetAlpha(2,2, 0.1, 0);
207 }
208
209 return p;
210
211}
212
213//.............................................................................
214OscProb::PMNS_Base* GetModel(string model, bool is_nominal = false){
215
216 if(model == "Iter") return GetIter(is_nominal);
217 if(model == "Deco") return GetDeco(is_nominal);
218 if(model == "Sterile") return GetSterile(is_nominal);
219 if(model == "Decay") return GetDecay(is_nominal);
220 if(model == "NSI") return GetNSI(is_nominal);
221 if(model == "LIV") return GetLIV(is_nominal);
222 if(model == "SNSI") return GetSNSI(is_nominal);
223 if(model == "NUNM") return GetNUNM(is_nominal);
224 if(model == "OQS") return GetOQS(is_nominal);
225 if(model == "SiderealLIV") return GetSiderealLIV(is_nominal);
226
227 return GetFast(is_nominal);
228
229}
230
231//.............................................................................
232vector<string> GetListOfModels(){
233
234 return {"Fast", "Iter", "Sterile", "NSI",
235 "Deco", "Decay", "LIV", "SNSI",
236 "NUNM", "OQS", "SiderealLIV"};
237
238}
239
240//.............................................................................
242
243 p->SetPath(1000, 2);
244 p->AddPath(1000, 4);
245 p->AddPath(1000, 2);
246
247}
248
249//.............................................................................
250void SaveTestFile(OscProb::PMNS_Base* p, TString filename){
251
252 SetTestPath(p);
253
254 int nbins = 100;
255 vector<double> xbins = GetLogAxis(nbins, 0.1, 10);
256 TH1D* h = 0;
257
258 TFile* f = new TFile("data/"+filename, "recreate");
259
260 for(int flvi=0; flvi<3; flvi++){
261 for(int flvf=0; flvf<3; flvf++){
262 for(int isnb=0; isnb<2; isnb++){
263 p->SetIsNuBar(isnb);
264 TString hname = TString::Format("h%d%d%d",flvi,flvf,isnb);
265 h = new TH1D(hname, "", nbins, &xbins[0]);
266 for(int i=1; i<=nbins; i++){
267 double energy = h->GetBinCenter(i);
268 double dE = h->GetBinWidth(i);
269 h->SetBinContent(i, p->AvgProb(flvi, flvf, energy, dE));
270 }
271 h->Write();
272 delete h;
273 }}}
274
275 f->Close();
276 cout << "Saved new test file: data/" + filename << endl;
277
278}
279
280//.............................................................................
281int CheckProb(OscProb::PMNS_Base* p, TString filename){
282
283 SetTestPath(p);
284
285 TFile* f = TFile::Open("data/"+filename, "read");
286
287 if(!f){
288 printf((Color::FAILED + " data/%s not found\n").c_str(), filename.Data());
289 return 1;
290 }
291
292 int ntests = 0;
293 int fails = 0;
294
295 TCanvas* c1 = 0;
296 TH1D* h0 = 0;
297 TH1D* h = 0;
298
299 for(int flvi=0; flvi<3; flvi++){
300 for(int flvf=0; flvf<3; flvf++){
301 for(int isnb=0; isnb<2; isnb++){
302 p->SetIsNuBar(isnb);
303 TString hname = TString::Format("h%d%d%d",flvi,flvf,isnb);
304 h0 = (TH1D*)f->Get(hname);
305 h = (TH1D*)h0->Clone();
306 bool plot = false;
307 for(int i=1; i<=h0->GetNbinsX(); i++){
308 double energy = h->GetBinCenter(i);
309 double dE = h->GetBinWidth(i);
310 double p0 = h0->GetBinContent(i);
311 double p1 = p->AvgProb(flvi, flvf, energy, dE);
312 ntests++;
313 if(abs(p0-p1)>1e-12){
314 plot = true;
315 fails++;
316 }
317 h->SetBinContent(i, p1);
318 }
319 if(plot){
320 c1 = new TCanvas();
321 c1->Divide(1,2);
322 c1->cd(1);
323 SetHist(h0, kBlue);
324 SetHist(h, kRed);
325 TString nu_lab = isnb ? "#bar{#nu}" : "#nu";
326 TString flv_lab[3] = {"e","#mu","#tau"};
327 TString ylab = "P(" + nu_lab + "_{" + flv_lab[flvi] +
328 "}#rightarrow" + nu_lab + "_{" + flv_lab[flvf] + "})";
329 h0->SetTitle(";Energy [GeV];"+ylab+";");
330 h->SetLineStyle(7);
331 double ymax = max(h->GetMaximum(),
332 h0->GetMaximum());
333 double ymin = min(h->GetMinimum(),
334 h0->GetMinimum());
335 h0->GetYaxis()->SetRangeUser(ymin, ymax);
336 h0->DrawCopy("hist");
337 h->DrawCopy("hist same");
338 SetTH1Margin();
339 gPad->SetLogx();
340 c1->cd(2);
341 h->SetTitle(";Energy [GeV];#Delta"+ylab+";");
342 h->Add(h0,-1);
343 h->SetLineStyle(1);
344 h->DrawCopy("hist");
345 SetTH1Margin();
346 gPad->SetLogx();
347 MiscText(0.55,0.8,0.1,filename,kGray,1);
348 c1->DrawClone();
349 TString pngfile = filename;
350 pngfile.ReplaceAll(".root",".png");
351 c1->SaveAs("plots/Failed_"+hname+"_"+pngfile);
352 delete c1;
353 }
354 if(h0) delete h0;
355 if(h) delete h;
356 }}}
357
358 if(fails>0){
359 printf((Color::FAILED + " Found %d differences in %d tests (%.3g%%) in %s\n").c_str(),
360 fails, ntests, 100.*fails/ntests, filename.Data());
361 }
362 else {
363 cout << Color::PASSED << " No differences found in " << filename << endl;
364 }
365
366 return fails;
367
368}
OscProb::PMNS_NUNM * GetNUNM(bool is_nominal)
Definition: Utils.h:196
OscProb::PMNS_LIV * GetLIV(bool is_nominal)
Definition: Utils.h:145
OscProb::PMNS_Fast * GetFast(bool is_nominal)
Definition: Utils.h:33
OscProb::PMNS_Deco * GetDeco(bool is_nominal)
Definition: Utils.h:51
OscProb::PMNS_Sterile * GetSterile(bool is_nominal)
Definition: Utils.h:80
vector< string > GetListOfModels()
Definition: Utils.h:232
void SetNominalPars(OscProb::PMNS_Base *p)
Definition: Utils.h:20
OscProb::PMNS_Iter * GetIter(bool is_nominal)
Definition: Utils.h:42
OscProb::PMNS_NSI * GetNSI(bool is_nominal)
Definition: Utils.h:109
OscProb::PMNS_SiderealLIV * GetSiderealLIV(bool is_nominal)
Definition: Utils.h:169
OscProb::PMNS_Base * GetModel(string model, bool is_nominal=false)
Definition: Utils.h:214
void SetTestPath(OscProb::PMNS_Base *p)
Definition: Utils.h:241
OscProb::PMNS_Decay * GetDecay(bool is_nominal)
Definition: Utils.h:96
void SaveTestFile(OscProb::PMNS_Base *p, TString filename)
Definition: Utils.h:250
OscProb::PMNS_SNSI * GetSNSI(bool is_nominal)
Definition: Utils.h:127
OscProb::PMNS_OQS * GetOQS(bool is_nominal)
Definition: Utils.h:65
int CheckProb(OscProb::PMNS_Base *p, TString filename)
Definition: Utils.h:281
Base class implementing general functions for computing neutrino oscillations.
Definition: PMNS_Base.h:26
virtual void SetDm(int j, double dm)
Set the mass-splitting dm_j1 in eV^2.
Definition: PMNS_Base.cxx:674
virtual void SetDelta(int i, int j, double delta)
Set the CP phase delta_ij.
Definition: PMNS_Base.cxx:602
virtual void SetIsNuBar(bool isNuBar)
Set the anti-neutrino flag.
Definition: PMNS_Base.cxx:243
virtual double AvgProb(vectorC nu_in, int flvf, double E, double dE=0)
Compute the average probability over a bin of energy.
Definition: PMNS_Base.cxx:1568
virtual void AddPath(NuPath p)
Add a path to the sequence.
Definition: PMNS_Base.cxx:307
virtual void SetPath(NuPath p)
Set a single path.
Definition: PMNS_Base.cxx:330
virtual void SetAngle(int i, int j, double th)
Set the mixing angle theta_ij.
Definition: PMNS_Base.cxx:539
Implementation of neutrino decay in a three-neutrino framework.
Definition: PMNS_Decay.h:30
virtual void SetAlpha3(double alpha3)
Definition: PMNS_Decay.cxx:62
Implementation of oscillations of neutrinos in matter in a three-neutrino framework with decoherence.
Definition: PMNS_Deco.h:27
virtual void SetGamma(int j, double val)
Set any given decoherence parameter.
Definition: PMNS_Deco.cxx:49
Implementation of oscillations of neutrinos in matter in a three-neutrino framework.
Definition: PMNS_Fast.h:40
Implementation of oscillations of neutrinos in matter in a three-neutrino framework.
Definition: PMNS_Iter.h:35
Implements oscillations with LIV as modelled by SME.
Definition: PMNS_LIV.h:28
virtual void SetaT(int flvi, int flvj, int dim, double val, double phase)
Definition: PMNS_LIV.cxx:68
virtual void SetcT(int flvi, int flvj, int dim, double val, double phase)
Definition: PMNS_LIV.cxx:120
Implementation of oscillations of neutrinos in matter in a three-neutrino framework with NSI.
Definition: PMNS_NSI.h:28
virtual void SetEps(int flvi, int flvj, double val, double phase)
Set any given NSI parameter.
Definition: PMNS_NSI.cxx:86
Implementation of oscillations of neutrinos in matter in a three-neutrino framework with Non unitary ...
Definition: PMNS_NUNM.h:30
virtual void SetAlpha(int i, int j, double val, double phase)
Set any given NUNM parameter.
Definition: PMNS_NUNM.cxx:95
Implements neutrino oscillations using an open quantum system approach.
Definition: PMNS_OQS.h:28
virtual void SetDecoAngle(int i, int j, double th)
Set mixing angle between two decoherence parameters a_i, a_j.
Definition: PMNS_OQS.cxx:75
virtual void SetDecoElement(int i, double val)
Set value of the a_i decoherence element in Gell-Mann basis.
Definition: PMNS_OQS.cxx:58
Implementation of oscillations of neutrinos in matter in a three-neutrino framework with scalar NSI.
Definition: PMNS_SNSI.h:26
Implements oscillations with Sidereal LIV as modelled by SME.
virtual void SetA(int flvi, int flvj, int coord, double val)
virtual void SetColatitude(double chi)
virtual void SetC(int flvi, int flvj, int coord1, int coord2, double val)
virtual void SetNeutrinoDirection(double zenith, double azimuth)
virtual void SetTimeHours(double hours)
Implementation of oscillations of neutrinos in matter in a N-neutrino framework.
Definition: PMNS_Sterile.h:34
static const string PASSED
Definition: colormod.h:23
static const string FAILED
Definition: colormod.h:22