Taumodel.cc
1 #include "vector.hh"
2 #include "Settings.h"
3 #include "vector.hh"
4 #include "position.hh"
5 #include "signal.hh"
6 #include "Primaries.h"
7 #include "secondaries.hh"
8 #include "icemodel.hh"
9 #include "Tools.h"
10 #include <sstream>
11 #include <iostream>
12 #include <fstream>
13 #include <cmath>
14 #include <vector>
15 
16 #include "TH1F.h"
17 #include "Constants.h"
18 #include "Settings.h"
19 #include "TTreeIndex.h"
20 #include "TChain.h"
21 #include "TF1.h"
22 #include "TF2.h"
23 #include "TFile.h"
24 #include "TTree.h"
25 #include "TLegend.h"
26 #include "TLine.h"
27 #include "TROOT.h"
28 #include "TPostScript.h"
29 #include "TCanvas.h"
30 #include "TH2F.h"
31 #include "TText.h"
32 #include "TProfile.h"
33 #include "TGraphErrors.h"
34 #include "TStyle.h"
35 #include "TMath.h"
36 #include <unistd.h>
37 #include "TVector3.h"
38 #include "TRotation.h"
39 #include "TSpline.h"
40 #include "Taumodel.hh"
41 #include "icemc_random.h"
42 using std::cout;
43 using std::stringstream;
44 using std::setprecision;
45 using std::accumulate;
46 using std::max_element;
47 using std::partial_sum;
48 using std::max;
49 
54 
57  B0=1.2*pow(10.,-7);
59  B1=0.16*pow(10.,-7);
60  E0=pow(10.,19);
61  mT=1.777E9;
62  cT=0.00008693;
63  Mn=1.672622E-24;
65  A=1.;
66 
68  mydensityvector.clear();
69  myavgdensityvector.clear();
70  myenergyvector.clear();
71  myPsurvvector.clear();
72  etaufarray.clear();
73  PDFarray.clear();
74 
75 }//
76 
77 //-------------------------------------------------------------
78 
82 double Taumodel::GetTauWeight(Primaries *primary1, Settings *settings1,IceModel *antarctica1,Interaction *interaction1, double pnu, int nu_nubar, double& ptauf, int& crust_entered){ // 1 or 0
83  // int& mantle_entered, // 1 or 0
84  // int& core_entered){//add secondaries?
85 
86  Vector chord3;
87  Vector nchord;
88 
89 
91  int currentint = interaction1->currentint;
92  const Position earth_in = interaction1->r_in;
93  double TauWeight = 0;
94  const Position r_enterice = interaction1->r_enterice;
95  const Position nuexitice = interaction1->nuexitice;
96  int inu=4;
97  //cout<<"inu is "<<inu<<"\n";
98 
99 
101  chord3 = nuexitice - earth_in;
102  double Distance=chord3.Mag();
103  nchord = chord3 / Distance;
104 
105 
106  double Etaui,Etau_final;
107  double y=0;
108  double yweight;
109 
110  double zdistance=0; //m
111  TauWeight=0;
112  double TauWeight_tmp=0;
113  double prob_at_z=0;
114 
115 
116  double Prob_Nu_Surv;
117 
118  double tau_surv;
119  double sigma = 0;
120  double len_int_kgm2 =0;
121 
122  primary1->GetSigma(pnu,sigma,len_int_kgm2,settings1,nu_nubar,currentint);
123 
124  double step=Tools::dMin(len_int_kgm2/densities[1]/10,25);
125 
127  Position posnunow;
128  double avgdensity=0;
129 
130  // double Etau_now;//=Etau_final;
131  double Emin=1E15;
132 
133  int i=0;
134 
135  double taudensity=0;
136  double dEtauidEtauf=0;
137 
138  int etauint =0;
139  double startingz=0;
140 
141  double totaltaudistance=0;
142  int totalnusteps=0;
143  Vector nchord1;
144  double enter_ice_mag = r_enterice.Distance(earth_in);
145 
146  mydensityvector.clear();
147  myavgdensityvector.clear();
148  this->GetDensityVectors(antarctica1,interaction1,nchord,step,Distance,totalnusteps, crust_entered);
149 
150 
151  for(double logEtau_final=log10(Emin);logEtau_final<=log10(pnu);logEtau_final+=.01){//integral over energy (in log space?)
152  Etau_final= pow(10,logEtau_final);
153  i=0;
154  int totalsteps=0;
155  TauWeight_tmp=0;
156  // Etau_now=Etau_final;
157  double gamma = Etau_final/mT;
158 
159  //calculate the initial energy needed at the step so the tau will end at the correct final energy
160 
161  this->GetEnergyVector(Etau_final,step,totalnusteps,totalsteps,totaltaudistance, pnu);
162 
163  this->GetTauSurvVector(step,totalsteps);
164 
165  startingz = Distance-totaltaudistance;
166  if(inu==7857){
167  //cout<<"total nu steps is "<<totalnusteps<<"\n";
168  //cout<<"density_Vector is "<<mydensityvector[mydensityvector.size()-1]<<"\n";
169  // cout<<"Distance is "<<Distance<<"\n";
170  //cout<<"total nu steps is "<<totalnusteps<<"\n";
171  //cout<<"vector size is "<<myenergyvector.size()<<"\n";
172  //cout<<"totaltaudistance is "<<totaltaudistance<<"\n";
173  //cout<<"crust, mantle, core are "<<crust_entered<<","<<mantle_entered<<","<<core_entered<<"\n";
174  //cout<<"*********************************************************************************************** \n";
175  }
177  for(zdistance = startingz; zdistance<=Distance; zdistance +=step){
178  int nustep = (int)(zdistance/step);
179  int tauenergystep=totalsteps-i;
180 
181  nchord1 = zdistance*nchord;
182  posnunow = earth_in + nchord1;
183 
184  avgdensity = myavgdensityvector[nustep];
185  taudensity=mydensityvector[nustep];
186  Etaui=myenergyvector[tauenergystep];
187  tau_surv = myPsurvvector[i];
188  y=1.-Etaui/pnu;
189 
190  if(zdistance >=enter_ice_mag){
191  tau_surv=1;
192  }
193 
194  if (Etaui>=pnu || Etaui<Etau_final || Etaui!=Etaui){//to catch anything that might make it through. Precaution
195  prob_at_z =0;
196  }
197  else{
198  yweight=primary1->Getyweight(pnu,y,nu_nubar,currentint);
199  Prob_Nu_Surv = avgdensity/len_int_kgm2*exp(-zdistance*avgdensity*1./len_int_kgm2);
200  dEtauidEtauf = exp(B1*taudensity*(Distance-zdistance))*Etaui/Etau_final;
201  prob_at_z = Prob_Nu_Surv*yweight*1./pnu*dEtauidEtauf*step*tau_surv;
202  /* if(i==100 && Etaui > 1E18){
203  cout<<"Prob_Nu_Surv is "<<Prob_Nu_Surv<<"\n";
204  cout<<"avgdensity is "<<avgdensity<<"\n";
205  cout<<"len_int_kgm2 is "<<len_int_kgm2<<"\n";
206  cout<<"zdistance is "<<zdistance<<"\n";
207  cout<<"yweight is "<<yweight<<"\n";
208  cout<<"dE is "<<dEtauidEtauf<<"\n";
209  cout<<"prob at z is "<<prob_at_z<<"\n";
210  cout<<"TauWeight_tmp is "<<TauWeight_tmp<<"\n";
211 
212  }*/
213  if(zdistance<=enter_ice_mag){
214  prob_at_z*=1.-exp(-1.*(r_enterice.Distance(nuexitice)/(gamma*cT)));
215  }
216  else if(zdistance>enter_ice_mag){
217  prob_at_z*=1.-exp(-1.*(posnunow.Distance(nuexitice)/(gamma*cT)));
218  }
219  TauWeight_tmp+=prob_at_z;
220  //cout<<"prob at z is "<<prob_at_z<<"\n";
221 
222  i++;
223  }//etaui<pnu
224  }//zdist loop
225 
226 
227  TauWeight_tmp*=log(10)*Etau_final;
228  TauWeight_tmp*=.01;
229 
230  TauWeight+=TauWeight_tmp;
231  // cout<<"TauWeight_tmp is "<<TauWeight_tmp<<" at Etau_final is "<<Etau_final<<"\n";
232  //prob_at_z_vector.push_back(row);
233  etaufarray.push_back(Etau_final);
234  PDFarray.push_back(TauWeight);
235  etauint++;
236 
237  }//Etau_final loop
238 
239  // }//xloop
241  double xrandom= TauWeight*getRNG(RNG_XRNDM)->Rndm();
242 
243  //cout<<"TauWeight is "<<TauWeight<<" xrandom is "<<xrandom<<"\n";
244  for(size_t loopthrough =0; loopthrough<=PDFarray.size();loopthrough++){
245  if(xrandom >PDFarray[loopthrough] && xrandom <PDFarray[loopthrough+1]){
246  ptauf=etaufarray[loopthrough];
247  break;
248  }//if xrandom
249 
250  }//loopthrough
251  //cout<<"ptauf is "<<ptauf<<"\n";
252  weight_tau_prob = TauWeight;
253  return 1;
254 } //GetTauWeight
255 
256 
261 void Taumodel::GetDensityVectors(IceModel *antarctica1,Interaction *interaction1, Vector nchord, double step, double Distance, int &totalnusteps,int &crust_entered){
262 
263  Vector nchord1;
264  double avgdensity =0;//initilize average density.
265  double density_total=0;//initilize running sum
266  double density_now=0;//density at this step
267  Position posnunow;
268  Position postaunow;
269  double altitude_tau;
270  double lat_tau;
271  const Position earth_in = interaction1->r_in;
272  ofstream myNewFile;
273 
274 
275  for(double taudistance=0;taudistance<=Distance;taudistance+=step){
276  nchord1=taudistance*nchord;
277  postaunow=earth_in+nchord1;
278  lat_tau=postaunow.Lat();
279  altitude_tau = postaunow.Mag()-antarctica1->Geoid(lat_tau);
280  density_now=antarctica1->GetDensity(altitude_tau,postaunow,crust_entered);
281  mydensityvector.push_back(density_now);
282 
283  density_total+=density_now;
284  avgdensity=density_total/(totalnusteps+1);
285  myavgdensityvector.push_back(avgdensity);
286  totalnusteps++;
287 
288  }
289 
290 }//Get Density Vectors
291 
295 void Taumodel::GetEnergyVector(double Etau_final, double step,int totalnusteps, int &totalsteps, double &totaltaudistance, double pnu){
296 
297  myenergyvector.clear();
298  myenergyvector.push_back(Etau_final);
299  double Etau_now=Etau_final;
300  double density_now;
301  ofstream myNewFile_1;
302 
303  // double pnu;//SET UP EVENT CLASS
305  for(int energysteps=totalnusteps-1;energysteps>0;energysteps--){
306  density_now=mydensityvector[energysteps];
307 
308  Etau_now=Etau_now + (B0+B1*log(Etau_now/E0))*density_now*Etau_now*step;
309 
310  if(Etau_now <=pnu){
311  totaltaudistance=(totalnusteps-energysteps)*step;
312  totalsteps++;
313  myenergyvector.push_back(Etau_now);
314  }//Etau_now<=pnu
315  else if(Etau_now >pnu){
316  break;
317  }
318 
319  } //energy steps
320 
321 
322 }//energy vector
323 
328 void Taumodel::GetTauSurvVector(double step, int totalsteps){
329  myPsurvvector.clear();
330  double Etau_now;
331  double tau_surv;
332  for(int k1=totalsteps;k1>=0;k1--){
333  tau_surv=1;
334  for(int k2=k1-1;k2>=0;k2--){
335  Etau_now=myenergyvector[k2];
336  if (Etau_now >0)
337  tau_surv=tau_surv*(1-step*mT/(cT*Etau_now));
338  else
339  tau_surv = 0;
340  }
341  myPsurvvector.push_back(tau_surv);
342  }//tau surv
343 
344 }//Tau surv vector
int currentint
Ditto - Stephen.
Definition: Primaries.h:224
int GetSigma(double pnu, double &sigma, double &len_int_kgm2, Settings *settings1, int nu_nubar, int currentint)
Neutrino-nucleon cross-sections using model chosen.
Definition: Primaries.cc:159
double weight_tau_prob
Weight for tau neutrino to interact, create a tau, tau survives and decays in the ice...
Definition: Taumodel.hh:72
Reads in and stores input settings for the run.
Definition: Settings.h:35
double Lat() const
Returns latitude, where the +z direction is at 0 latitude.
Definition: position.cc:47
Functions you need to generate a primary interaction including cross sections and picking charged cur...
Definition: Primaries.h:83
This class is a 3-vector that represents a position on the Earth&#39;s surface.
Definition: position.hh:26
Taumodel()
Definition: Taumodel.cc:50
Stores everything about a particular neutrino interaction. Interaction.
Definition: Primaries.h:136
double GetTauWeight(Primaries *primary1, Settings *settings1, IceModel *antarctica1, Interaction *interaction1, double pnu, int nu_nubar, double &ptauf, int &crust_entered)
GetTauWeight is the function that will calculate the probability that a tau neutrino will interact al...
Definition: Taumodel.cc:82
double Getyweight(double pnu, double y, int nu_nubar, int currentint)
in case you choose y from a flat distribution, this is the weight you should give it according to Con...
Definition: Primaries.cc:136
Position r_in
position where neutrino enters the earth
Definition: Primaries.h:194
Position nuexitice
place where neutrino would have left the ice
Definition: Primaries.h:197
This class represents a three-vector. Operators are overloaded to provide for the familiar operations...
Definition: vector.hh:27
double ptauf
Final energy of the tau.
Definition: Taumodel.hh:71
double Distance(const Position &second) const
Returns chord distance (direct distance between two vectors)
Definition: position.cc:37
Position r_enterice
position where neutrino enters the ice
Definition: Primaries.h:195
Ice thicknesses and water depth.
Definition: icemodel.hh:88