secondaries.cc
1 #include "vector.hh"
2 #include "Settings.h"
3 #include "vector.hh"
4 #include "position.hh"
5 #include "Primaries.h"
6 #include "secondaries.hh"
7 #include "icemodel.hh"
8 #include "Tools.h"
9 #include <sstream>
10 #include <iostream>
11 #include <fstream>
12 #include <cmath>
13 
14 #include "TH1F.h"
15 #include "Constants.h"
16 #include "Settings.h"
17 #include "TTreeIndex.h"
18 #include "TChain.h"
19 #include "TF1.h"
20 #include "TF2.h"
21 #include "TFile.h"
22 #include "TTree.h"
23 #include "TLegend.h"
24 #include "TLine.h"
25 #include "TROOT.h"
26 #include "TPostScript.h"
27 #include "TCanvas.h"
28 #include "TH2F.h"
29 #include "TText.h"
30 #include "TProfile.h"
31 #include "TGraphErrors.h"
32 #include "TStyle.h"
33 #include "TMath.h"
34 #include <unistd.h>
35 #include "TVector3.h"
36 #include "TRotation.h"
37 #include "TSpline.h"
38 #include "icemc_random.h"
39 
40 #include "EnvironmentVariable.h"
41 
42 const string ICEMC_SRC_DIR=EnvironmentVariable::ICEMC_SRC_DIR();
43 const string ICEMC_SECONDARY_DIR=ICEMC_SRC_DIR+"/secondary/";
44 
45 
46 
47 using std::cout;
48 using std::stringstream;
49 using std::setprecision;
50 using std::accumulate;
51 using std::max_element;
52 using std::partial_sum;
53 using std::max;
54 
55  Secondaries::Secondaries() {
56  //For Total Tau Survival probability equation
57  //n.b. not in SI units.
59  //Equation 16 & used in Equation 30.
61  B0=1.2*std::pow(10.,-7.); //| m^2/kg |
62  B1=0.16*std::pow(10.,-7.);//| m^2/kg | }parameterization using a logarithmic dependence on energy for B,
63  E0=std::pow(10.,10.); //| GeV | the tau elecromagnetic energy loss parameter.
64  mT=1.777; //| GeV |Mass of Tau
65  cT=0.00008693; //| m |Tau Decay length (86.93 microMeters)
66  //| |
67  Mn=1.672622E-24; //| g |nucleon/ proton mass in grams,also equal to 0.938 GeV.
68  A=1.; //| none |constant that sets the total probability to unity
69  //these last two constanst from Connolly Calc 2011, used in d_dzPsurvNu().
70 
71  flavors[0]="nue";
72  flavors[1]="numu";
73  flavors[2]="nutau"; // the gps path of the anita-lite flight
74 
75  SECONDARIES=1; // include secondary interactions
76  TAUDECAY=1; // include secondary interactions
77  // This is just the initialization, it is set in ReadInputs
78 
79 
80  // reading in tauola data file for tau decays
81  tauolainfile.open((ICEMC_SRC_DIR+"/data/tau_decay_tauola.dat").c_str(),ifstream::in);
82  InitTauola();
83 
84  TAUFRAC=.5; //fraction of tau neutrino-cc current events where the primare interaction point is the first bang
85 
86 
87 
88 
89  count_nfb=0;
90  secondary_e_noncons=0;
91 
92  for (int i=0;i<7;i++) {
93  Tools::Zero(dsdy_muon_brems[i],NPROB_MAX);
94  Tools::Zero(dsdy_muon_epair[i],NPROB_MAX);
95  Tools::Zero(dsdy_muon_pn[i],NPROB_MAX);
96 
97  Tools::Zero(y_muon_brems[i],NPROB_MAX);
98  Tools::Zero(y_muon_epair[i],NPROB_MAX);
99  Tools::Zero(y_muon_pn[i],NPROB_MAX);
100 
101  Tools::Zero(dsdy_tauon_brems[i],NPROB_MAX);
102  Tools::Zero(dsdy_tauon_epair[i],NPROB_MAX);
103  Tools::Zero(dsdy_tauon_pn[i],NPROB_MAX);
104  Tools::Zero(dsdy_tauon_hadrdecay[i],NPROB_MAX);
105  Tools::Zero(dsdy_tauon_edecay[i],NPROB_MAX);
106  Tools::Zero(dsdy_tauon_mudecay[i],NPROB_MAX);
107 
108 
109 
110  Tools::Zero(y_tauon_brems[i],NPROB_MAX);
111  Tools::Zero(y_tauon_epair[i],NPROB_MAX);
112  Tools::Zero(y_tauon_pn[i],NPROB_MAX);
113  Tools::Zero(y_tauon_hadrdecay[i],NPROB_MAX);
114  Tools::Zero(y_tauon_edecay[i],NPROB_MAX);
115  Tools::Zero(y_tauon_mudecay[i],NPROB_MAX);
116  } //for (Tools::Zeroing)
117 
118  Tools::Zero(int_muon_brems,7);
119  Tools::Zero(int_muon_epair,7);
120  Tools::Zero(int_muon_pn,7);
121 
122  Tools::Zero(int_tauon_brems,7);
123  Tools::Zero(int_tauon_epair,7);
124  Tools::Zero(int_tauon_pn,7);
125  Tools::Zero(int_tauon_hadrdecay,7);
126  Tools::Zero(int_tauon_edecay,7);
127  Tools::Zero(int_tauon_mudecay,7);
128 
129  // Read probability distributions for secondary interactions
130 
131  ReadSecondaries();
132 
133 
134 
135 }//Secondaries Constructor
136 
137  void Secondaries::readData(string nuflavor,string secndryType, double (*y)[NPROB_MAX], double (*dsdy)[NPROB_MAX])
138 {
139 
140  stringstream senergy;
141 
142  ifstream ifile;
143  string suffix=".vec";
144  if(nuflavor=="tauon")
145  suffix="_tau.vec";
146 
147  for(int index=0;index<7;index++)
148  {senergy.str("");
149  double energy=18+0.5*index;
150  int precision=(index%2==0)?2:3;
151  senergy << setprecision(precision) << energy;
152  string path=ICEMC_SECONDARY_DIR+"/"+nuflavor+"/dsdy_"+secndryType+"_1e"+senergy.str()+suffix;
153  //cout << "openning file " << path.c_str() << endl;
154  ifile.open(path.c_str());
155  NPROB=0;
156  while(!ifile.eof())
157  {
158  ifile >> y[index][NPROB] >> dsdy[index][NPROB];
159  NPROB++;
160  if(NPROB>=NPROB_MAX)
161  {
162  // cerr << " ERROR in reading in y_muon_brem. \n";
163  break;
164  }
165 
166  }
167  ifile.close();
168  }
169 
170 }
171 
172  void Secondaries::ReadSecondaries() {
173  // reading in data for secondary interactions
174 
175  cout<<"Reading in data on secondary interactions.\n";
176 
177  readData("muons","brems",y_muon_brems,dsdy_muon_brems);
178  readData("muons","epair",y_muon_epair,dsdy_muon_epair);
179  readData("muons","pn",y_muon_pn,dsdy_muon_pn);
180  readData("tauon","brems",y_tauon_brems,dsdy_tauon_brems);
181  readData("tauon","epair",y_tauon_epair,dsdy_tauon_epair);
182  readData("tauon","pn",y_tauon_pn,dsdy_tauon_pn);
183  readData("tauon","hadrdecay",y_tauon_hadrdecay,dsdy_tauon_hadrdecay);
184  readData("tauon","edecay",y_tauon_edecay,dsdy_tauon_edecay);
185  readData("tauon","mudecay",y_tauon_mudecay,dsdy_tauon_mudecay);
186  //cout << "NPROB=" << NPROB << ", NPROB_MAX=" << NPROB_MAX << endl;
187  for(int j=0;j<7;j++) {
188  // integrating prob. distributions.
189  int_muon_brems[j]=accumulate(dsdy_muon_brems[j],dsdy_muon_brems[j]+NPROB_MAX,0.);//very important to keep the initial value the same type as the elements type
190  int_muon_epair[j]=accumulate(dsdy_muon_epair[j],dsdy_muon_epair[j]+NPROB_MAX,0.);
191  int_muon_pn[j]=accumulate(dsdy_muon_pn[j],dsdy_muon_pn[j]+NPROB_MAX,0.);
192  int_tauon_brems[j]=accumulate(dsdy_tauon_brems[j],dsdy_tauon_brems[j]+NPROB_MAX,0.);
193  int_tauon_epair[j]=accumulate(dsdy_tauon_epair[j],dsdy_tauon_epair[j]+NPROB_MAX,0.);
194  int_tauon_pn[j]=accumulate(dsdy_tauon_pn[j],dsdy_tauon_pn[j]+NPROB_MAX,0.);
195  int_tauon_hadrdecay[j]=accumulate(dsdy_tauon_hadrdecay[j],dsdy_tauon_hadrdecay[j]+NPROB_MAX,0.);
196  int_tauon_edecay[j]=accumulate(dsdy_tauon_edecay[j],dsdy_tauon_edecay[j]+NPROB_MAX,0.);
197  int_tauon_mudecay[j]=accumulate(dsdy_tauon_mudecay[j],dsdy_tauon_mudecay[j]+NPROB_MAX,0.);
198 
199  // maximum value of prob. dist.
200  max_muon_brems=*max_element(dsdy_muon_brems[j],dsdy_muon_brems[j]+NPROB_MAX);
201  //cout << "max_muon_brems=" << max_muon_brems << endl;//fenfang
202  max_muon_epair=*max_element(dsdy_muon_epair[j],dsdy_muon_epair[j]+NPROB_MAX);
203  max_muon_pn=*max_element(dsdy_muon_pn[j],dsdy_muon_pn[j]+NPROB_MAX);
204  max_tauon_brems=*max_element(dsdy_tauon_brems[j],dsdy_tauon_brems[j]+NPROB_MAX);
205  max_tauon_epair=*max_element(dsdy_tauon_epair[j],dsdy_tauon_epair[j]+NPROB_MAX);
206  max_tauon_pn=*max_element(dsdy_tauon_pn[j],dsdy_tauon_pn[j]+NPROB_MAX);
207  max_tauon_hadrdecay=*max_element(dsdy_tauon_hadrdecay[j],dsdy_tauon_hadrdecay[j]+NPROB_MAX);
208  max_tauon_edecay=*max_element(dsdy_tauon_edecay[j],dsdy_tauon_edecay[j]+NPROB_MAX);
209  max_tauon_mudecay=*max_element(dsdy_tauon_mudecay[j],dsdy_tauon_mudecay[j]+NPROB_MAX);
210 
211  // minimum value of prob. dist.
212  min_muon_brems=Tools::dMinNotZero(dsdy_muon_brems[j],NPROB_MAX);
213  min_muon_epair=Tools::dMinNotZero(dsdy_muon_epair[j],NPROB_MAX);
214  min_muon_pn=Tools::dMinNotZero(dsdy_muon_pn[j],NPROB_MAX);
215  min_tauon_brems=Tools::dMinNotZero(dsdy_tauon_brems[j],NPROB_MAX);
216  min_tauon_epair=Tools::dMinNotZero(dsdy_tauon_epair[j],NPROB_MAX);
217  min_tauon_pn=Tools::dMinNotZero(dsdy_tauon_pn[j],NPROB_MAX);
218  min_tauon_hadrdecay=Tools::dMinNotZero(dsdy_tauon_hadrdecay[j],NPROB_MAX);
219  min_tauon_edecay=Tools::dMinNotZero(dsdy_tauon_edecay[j],NPROB_MAX);
220  min_tauon_mudecay=Tools::dMinNotZero(dsdy_tauon_mudecay[j],NPROB_MAX);
221 
222  if (min_muon_brems<=0)
223  cout << "Minimum probability is <=0!\n";
224 
225  partial_sum(dsdy_muon_brems[j],dsdy_muon_brems[j]+NPROB_MAX,y_cumulative_muon_brems[j]);
226  partial_sum(dsdy_muon_epair[j],dsdy_muon_epair[j]+NPROB_MAX,y_cumulative_muon_epair[j]);
227  partial_sum(dsdy_muon_pn[j],dsdy_muon_pn[j]+NPROB_MAX,y_cumulative_muon_pn[j]);
228  partial_sum(dsdy_tauon_brems[j],dsdy_tauon_brems[j]+NPROB_MAX,y_cumulative_tauon_brems[j]);
229  partial_sum(dsdy_tauon_epair[j],dsdy_tauon_epair[j]+NPROB_MAX,y_cumulative_tauon_epair[j]);
230  partial_sum(dsdy_tauon_pn[j],dsdy_tauon_pn[j]+NPROB_MAX,y_cumulative_tauon_pn[j]);
231  partial_sum(dsdy_tauon_hadrdecay[j],dsdy_tauon_hadrdecay[j]+NPROB_MAX,y_cumulative_tauon_hadrdecay[j]);
232  partial_sum(dsdy_tauon_mudecay[j],dsdy_tauon_mudecay[j]+NPROB_MAX,y_cumulative_tauon_mudecay[j]);
233  partial_sum(dsdy_tauon_edecay[j],dsdy_tauon_edecay[j]+NPROB_MAX,y_cumulative_tauon_edecay[j]);
234 
235  for (int i=0;i<NPROB_MAX;i++) {
236  y_cumulative_muon_brems[j][i] /= y_cumulative_muon_brems[j][NPROB_MAX-1];
237  y_cumulative_muon_epair[j][i] /= y_cumulative_muon_epair[j][NPROB_MAX-1];
238  y_cumulative_muon_pn[j][i] /= y_cumulative_muon_pn[j][NPROB_MAX-1];
239  y_cumulative_tauon_brems[j][i] /= y_cumulative_tauon_brems[j][NPROB_MAX-1];
240  y_cumulative_tauon_epair[j][i] /= y_cumulative_tauon_epair[j][NPROB_MAX-1];
241  y_cumulative_tauon_pn[j][i] /= y_cumulative_tauon_pn[j][NPROB_MAX-1];
242  y_cumulative_tauon_hadrdecay[j][i] /= y_cumulative_tauon_hadrdecay[j][NPROB_MAX-1];
243  y_cumulative_tauon_mudecay[j][i] /= y_cumulative_tauon_mudecay[j][NPROB_MAX-1];
244  y_cumulative_tauon_edecay[j][i] /= y_cumulative_tauon_edecay[j][NPROB_MAX-1];
245  } //for
246 
247  }
248  cout<<"Finished reading secondary interaction data.\n";
249 
250 
251 } //end method ReadSecondaries
252 
253 
254  void Secondaries::GetSecondaries(Settings *settings1,string nuflavor,double plepton,double &em_secondaries_max,double &had_secondaries_max,int &n_interactions,TH1F *hy) {
255 
256 
257  em_secondaries_max=0.;
258  had_secondaries_max=0.;
259 
260  int i=(int)((log10(plepton)-18.)*2.);
261  if (i>6)
262  i=6;
263  if (i<0)
264  i=0;
265 
266  int n_brems,n_epair,n_pn; // number of interactions of each type.
267  // int index_y; // index along the horizontal axis of ped's plots
268  double rnd1=1000.;
269  // double rnd2=1000.; // random numbers for throwing at dart board
270  double y = 0; // inelasticity
271 
272  string whichtype; // which type of interaction corresponds to that index
273 
274  TRandom * rng = getRNG(RNG_SECONDARIES);
275 
276 
277  if (nuflavor=="numu") {
278  n_brems=rng->Poisson(int_muon_brems[i]); // pick number of brem interactions
279  n_epair=rng->Poisson(int_muon_epair[i]); // # of pair production
280  n_pn=rng->Poisson(int_muon_pn[i]); // # photonuclear interactions
281 
282  n_interactions+=(n_brems+n_epair+n_pn);
283 
284 
285  for (int j=0;j<n_brems+n_epair+n_pn;j++) {
286  rnd1=rng->Rndm();
287  if (rnd1<=(double)n_brems/(double)(n_brems+n_epair+n_pn))
288  whichtype="brems";
289  else if (rnd1<=(double)(n_brems+n_epair)/(double)(n_brems+n_epair+n_pn))
290  whichtype="epair";
291  else
292  whichtype="pn";
293 
294  rnd1=1000.;
295  // rnd2=1000.; // random numbers for throwing at dart board
296  // index_y=0;
297 
298  if (whichtype=="brems") {
299  rnd1=rng->Rndm();
300  Picky(y_cumulative_muon_brems[i],NPROB,rnd1,y);
301  }
302  else if (whichtype=="epair") {
303  rnd1=rng->Rndm();
304  Picky(y_cumulative_muon_epair[i],NPROB,rnd1,y);
305  }
306  else if (whichtype=="pn") {
307  rnd1=rng->Rndm();
308  Picky(y_cumulative_muon_pn[i],NPROB,rnd1,y);
309  }
310 
311  if (y*plepton>max(em_secondaries_max,had_secondaries_max)) { // if this is the largest interaction for this event so far
312  if (whichtype=="brems" || whichtype=="epair") { // save it
313  em_secondaries_max=y*plepton;
314 
315  }
316  if (whichtype=="pn")
317  had_secondaries_max=y*plepton;
318 
319 
320  }
321  } // loop over secondary interactions
322  } // end if it was a muon neutrino
323  if (nuflavor=="nutau") {
324  n_brems=rng->Poisson(int_tauon_brems[i]);
325  n_epair=rng->Poisson(int_tauon_epair[i]);
326  n_pn=rng->Poisson(int_tauon_pn[i]);
327 
328  n_interactions+=(n_brems+n_epair+n_pn); // increment number of secondary interactions.
329 
330  for (int j=0;j<n_brems+n_epair+n_pn;j++) { // loop over secondary interactions.
331 
332  rnd1=rng->Rndm();
333  if (rnd1<=(double)n_brems/(double)(n_brems+n_epair+n_pn))
334  whichtype="brems";
335  else if (rnd1<=(double)(n_brems+n_epair)/(double)(n_brems+n_epair+n_pn))
336  whichtype="epair";
337  else
338  whichtype="pn";
339 
340  rnd1=1000.;
341  // rnd2=1000.; // random numbers for throwing at dart board
342  // index_y=0;
343 
344  if (whichtype=="brems") { // bremstrahlung interaction
345  rnd1=rng->Rndm();
346  Picky(y_cumulative_tauon_brems[i],NPROB,rnd1,y);
347  }
348  if (whichtype=="epair") { // pair production
349  rnd1=rng->Rndm();
350  Picky(y_cumulative_tauon_epair[i],NPROB,rnd1,y);
351  }
352  if (whichtype=="pn") {
353  rnd1=rng->Rndm();
354  Picky(y_cumulative_tauon_pn[i],NPROB,rnd1,y);
355  }
356 
357  if (settings1->HIST==1 && !settings1->ONLYFINAL && hy->GetEntries()<settings1->HIST_MAX_ENTRIES)
358  hy->Fill(y);
359  if (y*plepton>max(em_secondaries_max,had_secondaries_max)) { // if this is the biggest secondary signal yet,
360  if (whichtype=="brems" || whichtype=="epair") // save it.
361  em_secondaries_max=y*plepton;
362  if (whichtype=="pn")
363  had_secondaries_max=y*plepton;
364  }
365  }
366 
367 
368  if (TAUDECAY) {
369  n_interactions++; // increment number of interactions, for plotting.
370 
371  rnd1=rng->Rndm();
372  if (rnd1<0.65011) // pick which type of decay it is.
373  whichtype="hadrdecay";
374  if (rnd1>=0.65011 && rnd1<0.8219)
375  whichtype="mudecay";
376  if (rnd1>=0.8219)
377  whichtype="edecay";
378 
379  rnd1=1000.;
380  // rnd2=1000.; // random numbers for throwing at dart board
381  // index_y=0;
382 
383  if (whichtype=="hadrdecay") { // hadronic decay
384  rnd1=rng->Rndm();
385  Picky(y_cumulative_tauon_hadrdecay[i],NPROB,rnd1,y);
386  }
387  else if (whichtype=="edecay") { // e decay
388  rnd1=rng->Rndm();
389  Picky(y_cumulative_tauon_edecay[i],NPROB,rnd1,y);
390  }
391  else if (whichtype=="mudecay") { // mu decay
392  rnd1=rng->Rndm();
393  Picky(y_cumulative_tauon_mudecay[i],NPROB,rnd1,y);
394  }
395 
396 
397  if (y*plepton>max(em_secondaries_max, had_secondaries_max)) { // if this is the biggest interaction yet,
398  if (whichtype=="edecay") // save it.
399  em_secondaries_max=y*plepton;
400  if (whichtype=="hadrdecay")
401  had_secondaries_max=y*plepton;
402  } //if
403  } //if (TAUDECAY)
404  } //if (nutau)
405 
406 } //GetSecondaries
407 
408 
409 
410  int Secondaries::GetEMFrac(Settings *settings1,string nuflavor,
411  string current,
412  string taudecay,
413  double y,
414  TH1F *hy,
415  double pnu,
416  int inu,
417 
418 
419  double& emfrac,
420  double& hadfrac,
421  int& n_interactions, int taumodes1) {
422 
423 
424 
425 
426  if (current=="cc")
427  plepton=(1.-y)*pnu;
428  else
429  plepton=0.;
430 
431  if (nuflavor=="nue" && current=="cc") {
432  emfrac=1.-y;
433  hadfrac=y;
434  }
435  else if(nuflavor=="numu" && current=="cc") {
436  emfrac=1.E-10;
437  hadfrac=y;
438  }
439  else if(nuflavor=="nutau" && current=="cc") {
440  // behaves like a muon
441  if(taumodes1 ==1){//taumodes==1; tau created somewhere in rock and decays at posnu.
442  this->GetEMFracDB(emfrac,hadfrac);
443  }
444  else if (taumodes1 == 0){
445  emfrac=1.E-10;
446  hadfrac=y;
447  }
448 
449 
450 
451  }
452  else if (current=="nc") {
453  emfrac=1.E-10;
454  hadfrac=y;
455  }
456 
457 
458  em_secondaries_max =emfrac; // initialize search for maximum signal among primary, secondary interactions.
459  had_secondaries_max=hadfrac;
460 
461 
462 
463  if (SECONDARIES==1 && current=="cc" && settings1->FORSECKEL!=1) {
464 
465  while (1) {
466 
467  GetSecondaries(settings1,nuflavor,plepton,em_secondaries_max,had_secondaries_max,n_interactions,hy); // find how much em and hadronic energies comes from secondary interactions. keep picking until you get a bunch of secondary interactions that conserve energy
468 
469  if (em_secondaries_max+had_secondaries_max<=plepton*(1.+1.E-5)) // if conserves energy, break.
470  break;
471  else {
472  secondary_e_noncons++; //Record how many times we come up with something that doesn't conserve energy
473  em_secondaries_max=emfrac;
474  had_secondaries_max=hadfrac;
475  } //else
476  } //while(1)
477 
478  if ((em_secondaries_max+had_secondaries_max)>(emfrac+hadfrac)*pnu) { // if maximum signal from secondaries is larger than
479  // signal from primary interaction
480  emfrac=em_secondaries_max/pnu; // then use that one.
481  hadfrac=had_secondaries_max/pnu;
482  if (emfrac <= 1.E-10)
483  emfrac=1.E-10;
484  if (hadfrac<= 1.E-10)
485  hadfrac=1.E-10;
486  } //if
487  } //if (charged current, secondaries on)
488 
489  if (nuflavor=="numu" && current=="cc" && n_interactions==0)
490  cout << "Look at this one. inu is " << inu << "\n";
491 
492 
493 
494  if ((y<0 || y>1) && y != -999.)
495  cout << "illegal y=" << y << "\n";
496 
497  if (emfrac+hadfrac>1.00001) {
498  cout << "error emfrac,hadfrac=" << emfrac << " " << hadfrac << " " << emfrac+hadfrac << "\n";
499  cout << "nuflavor,taudecay=" << nuflavor << " " << taudecay << "\n";
500  } //if
501 
502  return 1;
503 
504 } //GetEMFrac
505 
506 
507 //----------------------------------------------------------
508 //InitTauola()
509 //Initializes the tau decay information
510 
511  void Secondaries::InitTauola() {
512  for(int k=0;k<5;k++)
513  tauolainfile >> tauola[0][k];
514  for(int i=1;i<N_TAUOLA;i++)
515  for(int j=0;j<6;j++)
516  tauolainfile >> tauola[i][j];
517 
518  return;
519 }//InitTauola
520 
521 void Secondaries::GetTauDecay(string nuflavor,string current,string& taudecay,double& emfrac_db,double& hadfrac_db) {
522 
523  if (!(nuflavor=="nutau" || current=="cc" || interestedintaus))
524  return;
525 
526  // if nu_tau choose tau decay type
527 
528  TRandom * rng = getRNG(RNG_SECONDARIES);
529  double rnd = rng->Rndm();
530  int decay = static_cast<int>(rnd*(N_TAUOLA-2)+1);
531 
532  hadfrac_db=tauola[decay][3];
533  emfrac_db=tauola[decay][4];
534 
535  if(tauola[decay][1]!=0)
536  taudecay="m";
537  else
538  taudecay="e";
539 
540 
541  if(taudecay=="m")
542  secondbang=false; //for all muon decays, the interaction point chosen is the neutrino interaction since we don't detect the decay if
543  //the tau decays into a muon.
544  else {
545  double rnd=rng->Rndm();
546  if(rnd>TAUFRAC) {
547  secondbang=true;
548  count_nfb++;
549  } else
550  secondbang=false;
551  }
552 
553 
554 } //GetTauDecay
555 
556 //-----------------------------------------------------
557 //GetEMFracDB()
558 //Gets the emfrac_db and hadfrac_db for a doublebang
559 
560  void Secondaries::GetEMFracDB(double& emfrac_db, double& hadfrac_db) {
561 
562  TRandom * rng = getRNG(RNG_SECONDARIES);
563 
564  double rnd = rng->Rndm();
565  int decay = static_cast<int>(rnd*(N_TAUOLA-2)+1);
566 
567  hadfrac_db=tauola[decay][3];
568  emfrac_db=tauola[decay][4];
569 
570  return;
571 }//GetEMFracDB
572 
573 //------------------------------------------------------
574 //GetDBViewAngle()
575 //Gets the viewangle of the second bang
576 
577  double Secondaries::GetDBViewAngle(const Vector &refr, const Vector &nnu) {
578 
579  return ((nnu.ChangeCoord(refr)).Angle(z_axis));
580 
581 }//GetDBViewAngle
582 
583 //------------------------------------------------------
584 //GetFirstBang()
585 //Gets the position of the first bang when the interaction point is the tau decay point
586 
587 // void Secondaries::GetFirstBang(const Position &r_in, const Vector &nnu, Position &posnu, double len_int_kgm2, double chord, double &nuentrancelength) {
588 
589 // double weightbang;
590 // double junk1;
591 // double junk2;
592 // double junk3;
593 // int junk4,junk5,junk6;
594 // double myair=0;
595 
596 // Vector r_out = r_in + chord*nnu;
597 
598 // antarctica->Getchord(len_int_kgm2,r_in,r_out,
599 // junk1,weightbang,junk2,myair,junk3,junk4,junk5,junk6);
600 // double r1,r2;
601 // if(weightbang>.999)
602 // r2=gRandom->Rndm()*chord;
603 // else {
604 // do {
605 // r1=gRandom->Rndm();
606 // r2=gRandom->Rndm()*chord;
607 // r_out = r_in + r2*nnu;
608 // antarctica->Getchord(len_int_kgm2,r_in,r_out,
609 // junk1,weightbang,junk2,myair,junk3,junk4,junk5,junk6);
610 // }
611 // while(r1>1-weightbang);
612 // }
613 // posnu = r_in + r2*nnu;
614 // nuentrancelength=r2;
615 
616 // return;
617 // }//GetFirstBang
618 
619 //---------------------------------------------------------
620 //NFBWeight()
621 //Gets the weight of the tau decay for second bang events
622  double Secondaries::NFBWeight(double ptau, double taulength) {
623 
624  double gamma=ptau/MTAU;
625  double D=TAUDECAY_TIME*CLIGHT*gamma;
626 
627  return exp(-taulength/D);
628 
629 }
630 void Secondaries::Picky(double *y_cumulative,int NPROB,double rnd,double& y) {
631  for (int i=0;i<NPROB;i++) {
632  if (y_cumulative[i]<=rnd && y_cumulative[i+1]>rnd) {
633  y=(double)i/(double)NPROB;
634  continue; // once you found the right bin, stop looping.
635  } //if
636  } //for
637 } //Picky
638 
const char * ICEMC_SRC_DIR()
Reads in and stores input settings for the run.
Definition: Settings.h:37
This class represents a three-vector. Operators are overloaded to provide for the familiar operations...
Definition: vector.hh:27