def create_nuSQuIDS(mutauBins,tautauBins): global numuSQUIDSDict, numubarSQUIDSDict, nueSQUIDSDict, nuebarSQUIDSDict for mutau in mutauBins: # print 'MT: ',etau for tautau in tautauBins: # print 'TT: ',tautau #TODO: Currently taking bin edges, probably want bin centers, oh well nuSQBar = nsq.nuSQUIDS(beg_ene,end_ene,200,3,nsq.NeutrinoType.antineutrino,True,False) nuSQ = nsq.nuSQUIDS(beg_ene,end_ene,200,3,nsq.NeutrinoType.neutrino,True,False) #Muon neutrinos SetNSQParams(this_zen,nuSQ,1) SetNSQParams(this_zen,nuSQBar,1) # filename = "/data/user/mamday/newSQuIDS/nuSQuIDS/resources/python/bindings/HD5Files/Squid-Zen%.3f.hdf5" % (this_zen) filename = "/data/user/mamday/newSQuIDS/nuSQuIDS/resources/python/bindings/NewTest.hdf5" groupname = "/NuMu%.4fET%.3fEM" % (mutau, tautau) print filename,groupname nuSQ.WriteStateHDF5(filename,groupname,False,"/") #nuSQ.WriteStateHDF5(filename) groupname = "/NuMuBar%.4fET%.3fEM" % (mutau, tautau) # print groupname nuSQBar.WriteStateHDF5(filename,groupname,False,"/") #Electron neutrinos SetNSQParams(this_zen,nuSQ,0) SetNSQParams(this_zen,nuSQBar,0) groupname = "/NuE%.4fET%.3fEM" % (mutau, tautau) nuSQ.WriteStateHDF5(filename,groupname,False,"/") groupname = "/NuEBar%.4fET%.3fEM" % (mutau, tautau) nuSQBar.WriteStateHDF5(filename,groupname,False,"/")
def create_nuSQuIDS(mutauBins, tautauBins): global numuSQUIDSDict, numubarSQUIDSDict, nueSQUIDSDict, nuebarSQUIDSDict for mutau in mutauBins: # print 'MT: ',etau for tautau in tautauBins: # print 'TT: ',tautau #TODO: Currently taking bin edges, probably want bin centers, oh well nuSQBar = nsq.nuSQUIDS(beg_ene, end_ene, 200, 3, nsq.NeutrinoType.antineutrino, True, False) nuSQ = nsq.nuSQUIDS(beg_ene, end_ene, 200, 3, nsq.NeutrinoType.neutrino, True, False) #Muon neutrinos SetNSQParams(this_zen, nuSQ, 1) SetNSQParams(this_zen, nuSQBar, 1) # filename = "/data/user/mamday/newSQuIDS/nuSQuIDS/resources/python/bindings/HD5Files/Squid-Zen%.3f.hdf5" % (this_zen) filename = "/data/user/mamday/newSQuIDS/nuSQuIDS/resources/python/bindings/NewTest.hdf5" groupname = "/NuMu%.4fET%.3fEM" % (mutau, tautau) print filename, groupname nuSQ.WriteStateHDF5(filename, groupname, False, "/") #nuSQ.WriteStateHDF5(filename) groupname = "/NuMuBar%.4fET%.3fEM" % (mutau, tautau) # print groupname nuSQBar.WriteStateHDF5(filename, groupname, False, "/") #Electron neutrinos SetNSQParams(this_zen, nuSQ, 0) SetNSQParams(this_zen, nuSQBar, 0) groupname = "/NuE%.4fET%.3fEM" % (mutau, tautau) nuSQ.WriteStateHDF5(filename, groupname, False, "/") groupname = "/NuEBar%.4fET%.3fEM" % (mutau, tautau) nuSQBar.WriteStateHDF5(filename, groupname, False, "/")
def makenuSQuIDS(ene,zen,flav,n_type,mutau=0.0,tautau=0.0,mode=0,e_SQuIDS=None,m_SQuIDS=None): if(mode==0): if(n_type>0): nuSQ = nsq.nuSQUIDSNSI(mutau,0.0,tautau,0.0,0.0,math.floor(ene),math.ceil(ene),2,3,nsq.NeutrinoType.neutrino,True,False) if(n_type<0): nuSQ = nsq.nuSQUIDSNSI(mutau,0.0,tautau,0.0,0.0,math.floor(ene),math.ceil(ene),2,3,nsq.NeutrinoType.antineutrino,True,False) if(flav=='e'): SetNSQParams(numpy.cos(zen),nuSQ,0) if(flav=='mu'): SetNSQParams(numpy.cos(zen),nuSQ,1) return nuSQ.EvalFlavor(0,ene*nuSQ.units.GeV,0),nuSQ.EvalFlavor(1,ene*nuSQ.units.GeV,0),nuSQ.EvalFlavor(2,ene*nuSQ.units.GeV,0) if(mode==1): pytpe = None if(n_type>0): if(flav=='e'): ptype = 'NuE' if(flav=='mu'): ptype = 'NuMu' if(n_type<0): if(flav=='e'): ptype = 'NuEBar' if(flav=='mu'): ptype = 'NuMuBar' file_name = "/data/user/mamday/newSQuIDS/nuSQuIDS/resources/python/bindings/ZenWeights/Switch%s%.4fET%.3fEM.hd5" % (ptype,mutau,tautau) e_vals = [] m_vals = [] t_vals = [] zen_val = round(2*numpy.cos(zen),2)/2 if(zen_val<-0.995): zen_val=-0.995 if(zen_val==0): zen_val=0.005 group_name = "%s%.4fET%.3fEM%.3f" % (ptype,mutau,tautau,zen_val) nuSQ = None if(flav=='e'): if(not((ptype,mutau,tautau,zen_val) in e_SQuIDS.keys())): e_SQuIDS[(ptype,mutau,tautau,zen_val)] = nsq.nuSQUIDS(file_name,group_name) nuSQ = e_SQuIDS[(ptype,mutau,tautau,zen_val)] if(flav=='mu'): if(not((ptype,mutau,tautau,zen_val) in m_SQuIDS.keys())): m_SQuIDS[(ptype,mutau,tautau,zen_val)] = nsq.nuSQUIDS(file_name,group_name) nuSQ = m_SQuIDS[(ptype,mutau,tautau,zen_val)] eWeight = nuSQ.EvalFlavor(0,ene*nuSQ.units.GeV,0) mWeight = nuSQ.EvalFlavor(1,ene*nuSQ.units.GeV,0) tWeight = nuSQ.EvalFlavor(2,ene*nuSQ.units.GeV,0) return eWeight,mWeight,tWeight
def make_squids(mutauBins,tautauBins,zenBins): #print mutauBins,tautauBins,zenBins for this_zen in zenBins: for mutau in mutauBins: for tautau in tautauBins: ind_tup = (mutau,tautau,this_zen) file_name = "/data/user/mamday/newSQuIDS/nuSQuIDS/resources/python/bindings/HD5Files/Squid-Zen%.3f.hdf5" % (this_zen) groupname = "NuMu%.4fET%.3fEM" % (mutau, tautau) #print file_name,groupname nuSQ = nsq.nuSQUIDS(file_name,groupname) hmSQUIDDict[ind_tup] = nuSQ groupname = "NuE%.4fET%.3fEM" % (mutau, tautau) #print groupname nuSQ = nsq.nuSQUIDS(file_name,groupname) heSQUIDDict[ind_tup] = nuSQ groupname = "NuMuBar%.4fET%.3fEM" % (mutau, tautau) #print groupname nuSQBar = nsq.nuSQUIDS(file_name,groupname) hmbSQUIDDict[ind_tup] = nuSQBar groupname = "NuEBar%.4fET%.3fEM" % (mutau, tautau) #print groupname nuSQBar = nsq.nuSQUIDS(file_name,groupname) hebSQUIDDict[ind_tup] = nuSQBar
def make_squids(mutauBins, tautauBins, zenBins): #print mutauBins,tautauBins,zenBins for this_zen in zenBins: for mutau in mutauBins: for tautau in tautauBins: ind_tup = (mutau, tautau, this_zen) file_name = "/data/user/mamday/newSQuIDS/nuSQuIDS/resources/python/bindings/HD5Files/Squid-Zen%.3f.hdf5" % ( this_zen) groupname = "NuMu%.4fET%.3fEM" % (mutau, tautau) #print file_name,groupname nuSQ = nsq.nuSQUIDS(file_name, groupname) hmSQUIDDict[ind_tup] = nuSQ groupname = "NuE%.4fET%.3fEM" % (mutau, tautau) #print groupname nuSQ = nsq.nuSQUIDS(file_name, groupname) heSQUIDDict[ind_tup] = nuSQ groupname = "NuMuBar%.4fET%.3fEM" % (mutau, tautau) #print groupname nuSQBar = nsq.nuSQUIDS(file_name, groupname) hmbSQUIDDict[ind_tup] = nuSQBar groupname = "NuEBar%.4fET%.3fEM" % (mutau, tautau) #print groupname nuSQBar = nsq.nuSQUIDS(file_name, groupname) hebSQUIDDict[ind_tup] = nuSQBar
import numpy as np mpl.rc('font', family='serif', size=20) plt.style.use('./paper.mplstyle') # Welcome to the $\nu$-SQuIDS demo. In # this notebook we will demostrate some of the functionalities of the $\nu$-SQuIDS' python bindings. All of the calculations performed here can also be done in the C++ interface. Enjoy :)! Carlos, Jordi & Chris. # # The Basics: single energy mode # #### Basic definitions # To start, like in the C++ case, we need to create a $\nu$-SQuIDS object. To begin this demonstration we will create a simple single energy three flavor neutrino oscillation calculator. Thus we just need to specify the number of neutrinos (3) and if we are dealing with neutrinos or antineutrinos. nuSQ = nsq.nuSQUIDS(3,nsq.NeutrinoType.neutrino) # nuSQuIDS inputs should be given in natural units. In order to make this convenient we have define a units class called *Const*. We can instanciate it as follows units = nsq.Const() # As in the C++ $\nu$-SQuIDS interface one can propagate the neutrinos in various environments (see the documentation for further details), and the user can create and include their own environments. To start a simple case, lets consider oscillactions in <strong> Vacuum </strong> nuSQ.Set_Body(nsq.Vacuum()) # Since we have specify that we are considering vacuum propagation, we must construct - as in the C++ interface - a *trayectory* inside that object. This can be done using the `Track` property of the given `Body`. Each `Body` will have its on `Track` subclass and its constructors. We can set and construct a <strong>vacuum trayectory</strong> in the following way:
def makenuSQuIDS(ene, zen, flav, n_type, mutau=0.0, tautau=0.0, mode=0, e_SQuIDS=None, m_SQuIDS=None): if (mode == 0): if (n_type > 0): nuSQ = nsq.nuSQUIDSNSI(mutau, 0.0, tautau, 0.0, 0.0, math.floor(ene), math.ceil(ene), 2, 3, nsq.NeutrinoType.neutrino, True, False) if (n_type < 0): nuSQ = nsq.nuSQUIDSNSI(mutau, 0.0, tautau, 0.0, 0.0, math.floor(ene), math.ceil(ene), 2, 3, nsq.NeutrinoType.antineutrino, True, False) if (flav == 'e'): SetNSQParams(numpy.cos(zen), nuSQ, 0) if (flav == 'mu'): SetNSQParams(numpy.cos(zen), nuSQ, 1) return nuSQ.EvalFlavor(0, ene * nuSQ.units.GeV, 0), nuSQ.EvalFlavor( 1, ene * nuSQ.units.GeV, 0), nuSQ.EvalFlavor(2, ene * nuSQ.units.GeV, 0) if (mode == 1): pytpe = None if (n_type > 0): if (flav == 'e'): ptype = 'NuE' if (flav == 'mu'): ptype = 'NuMu' if (n_type < 0): if (flav == 'e'): ptype = 'NuEBar' if (flav == 'mu'): ptype = 'NuMuBar' file_name = "/data/user/mamday/newSQuIDS/nuSQuIDS/resources/python/bindings/ZenWeights/Switch%s%.4fET%.3fEM.hd5" % ( ptype, mutau, tautau) e_vals = [] m_vals = [] t_vals = [] zen_val = round(2 * numpy.cos(zen), 2) / 2 if (zen_val < -0.995): zen_val = -0.995 if (zen_val == 0): zen_val = 0.005 group_name = "%s%.4fET%.3fEM%.3f" % (ptype, mutau, tautau, zen_val) nuSQ = None if (flav == 'e'): if (not ((ptype, mutau, tautau, zen_val) in e_SQuIDS.keys())): e_SQuIDS[(ptype, mutau, tautau, zen_val)] = nsq.nuSQUIDS(file_name, group_name) nuSQ = e_SQuIDS[(ptype, mutau, tautau, zen_val)] if (flav == 'mu'): if (not ((ptype, mutau, tautau, zen_val) in m_SQuIDS.keys())): m_SQuIDS[(ptype, mutau, tautau, zen_val)] = nsq.nuSQUIDS(file_name, group_name) nuSQ = m_SQuIDS[(ptype, mutau, tautau, zen_val)] eWeight = nuSQ.EvalFlavor(0, ene * nuSQ.units.GeV, 0) mWeight = nuSQ.EvalFlavor(1, ene * nuSQ.units.GeV, 0) tWeight = nuSQ.EvalFlavor(2, ene * nuSQ.units.GeV, 0) return eWeight, mWeight, tWeight
def NuFlux_Earth(proflux,Enu_min,Enu_max,nodes,ch,DMm,param,theta_12=33.82,theta_23=48.6,theta_13=8.60,delta_m_12=7.39e-5,delta_m_13=2.528e-3,delta=0.,logscale=False,interactions=True,location = 'Earth',time=57754.,angle=None,latitude=-90.,xsec=None): ''' calculate neutrino flux after propagation for solar wimp (multiple energy mode with interactions) @type proflux : str @param proflux : name of the production flux, e.g. Pythia @type Enu_min : float @param Enu_min : GeV @type Enu_max : float @param Enu_max : GeV @type nodes : int @param nodes : number of nodes @type ch : str @param ch : channel of the production @type DMm : float @param DMm : GeV @type location : str @param location : Sunsfc or Earth @type time : float @parm time : MJD of the detection time (input can be either the angle or the time) @type angle : float @param angle : Zenith angle of the detection in degree (input can be either the angle or the time) @parm time : MJD of the detection time @type latitude : float @param latitude : latitude of the detector @type xsec : str @param xsec : path to neutrino xsec files. @return : flux per annihilation ''' #Oscillation parameters are from NuFIT 4.1 (2019) normal ordering with delta_cp=0. Adjust according to your need. #default cross section is based on isoscalar target from arXiv: 1106.3723v2. I have also run nusigma which is a neutrino-nucleon cross section writen by J. Edsjo assuming isoscalar target. There files are in `./xsec/`. The choice of the cross sections makes difference. #TODO: implement full MC #DM_annihilation_rate_Sun = float(np.sum(DM.DMSunAnnihilationRate(DMm*param.GeV,DMsig,param)))*param.sec DM_annihilation_rate_Sun = 1. E_nodes = nodes Enu_min = Enu_min*param.GeV Enu_max = Enu_max*param.GeV #e_range = np.linspace(Enu_min*pc.GeV,Enu_max*pc.GeV,100) if logscale is True: e_vector = np.logspace(np.log10(Enu_min),np.log10(Enu_max),E_nodes) else: e_vector = np.linspace(Enu_min,Enu_max,E_nodes) if proflux == 'Pythia': production = pythiaflux elif proflux == 'Herwig': production = herwigflux elif proflux == 'WimpSim': production = DMSweFluxEarth else: print('No Such Production') flux = {} if xsec == None: print(xsec) nuSQ = nsq.nuSQUIDS(e_vector,3,nsq.NeutrinoType.both,interactions) else: print(xsec) xsec = nsq.NeutrinoDISCrossSectionsFromTables(xsec+'nusigma_') nuSQ = nsq.nuSQUIDS(e_vector,3,nsq.NeutrinoType.both,interactions,xsec) energy = nuSQ.GetERange() for i in range(3): flux[str(i)+'_nu'] = np.array(map(lambda E_nu: production(E_nu/param.GeV,i*2,ch,DMm,wimp_loc='Earth'),energy)) flux[str(i)+'_nubar'] = np.array(map(lambda E_nu: production(E_nu/param.GeV,i*2+1,ch,DMm,wimp_loc='Earth'),energy)) nuSQ.Set_Body(nsq.Earth()) nuSQ.Set_Track(nsq.Earth.Track(param.EARTHRADIUS*param.km)) #nuSQ.Set_Track(nsq.ConstantDensity.Track(param.SUNRADIUS*param.km)) nuSQ.Set_MixingAngle(0,1,np.deg2rad(theta_12)) nuSQ.Set_MixingAngle(0,2,np.deg2rad(theta_13)) nuSQ.Set_MixingAngle(1,2,np.deg2rad(theta_23)) nuSQ.Set_SquareMassDifference(1,delta_m_12) nuSQ.Set_SquareMassDifference(2,delta_m_13) nuSQ.Set_abs_error(1.e-5) nuSQ.Set_rel_error(1.e-5) nuSQ.Set_CPPhase(0,2,delta) nuSQ.Set_ProgressBar(True) initial_flux = np.zeros((E_nodes,2,3)) for j in range(len(flux['0_nu'])): for k in range(3): initial_flux[j][0][k] = flux[str(k)+'_nu'][j] initial_flux[j][1][k] = flux[str(k)+'_nubar'][j] nuSQ.Set_initial_state(initial_flux,nsq.Basis.flavor) nuSQ.Set_TauRegeneration(True) nuSQ.EvolveState() e_range = np.linspace(Enu_min,Enu_max,nodes) flux_surface = np.zeros(len(e_range),dtype = [('Energy','float'),('nu_e','float'),('nu_mu','float'),('nu_tau','float'),('nu_e_bar','float'),('nu_mu_bar','float'),('nu_tau_bar','float'),('zenith','float')]) factor = 1. flux_surface['Energy'] = e_range flux_surface['nu_e'] = factor*np.array([nuSQ.EvalFlavor(0,e,0) for e in e_range]) flux_surface['nu_mu'] = factor*np.array([nuSQ.EvalFlavor(1,e,0) for e in e_range]) flux_surface['nu_tau'] = factor*np.array([nuSQ.EvalFlavor(2,e,0) for e in e_range]) flux_surface['nu_e_bar'] = factor*np.array([nuSQ.EvalFlavor(0,e,1) for e in e_range]) flux_surface['nu_mu_bar'] = factor*np.array([nuSQ.EvalFlavor(1,e,1) for e in e_range]) flux_surface['nu_tau_bar'] = factor*np.array([nuSQ.EvalFlavor(2,e,1) for e in e_range]) return flux_surface
def NuFlux_GC(proflux, Enu_min, Enu_max, nodes, ch, DMm, param, theta_12=33.82, theta_23=48.6, theta_13=8.60, delta_m_12=7.39e-5, delta_m_13=2.528e-3, delta=0., logscale=False, interactions=True, location='Detector', xsec=None, zenith=180.): if logscale is True: e_vector = np.logspace(np.log10(Enu_min), np.log10(Enu_max), nodes) else: e_vector = np.linspace(Enu_min, Enu_max, nodes) if proflux == 'Pythia': production = pythiaflux elif proflux == 'Herwig': production = herwigflux elif proflux == 'WimpSim': production = DMSweFluxEarth else: print 'No Such Production' flux = {} energy = nuSQ.GetERange() for i in range(3): flux[str(i) + '_nu'] = np.array( map(lambda E_nu: production(E_nu, i * 2, ch, DMm, wimp_loc='GC'), e_vector)) flux[str(i) + '_nubar'] = np.array( map( lambda E_nu: production( E_nu, i * 2 + 1, ch, DMm, wimp_loc='GC'), e_vector)) osc_matrix = angles_to_u(theta_12, theta_13, theta_23, delta) flux_surface = np.zeros(len(e_vector), dtype=[('Energy', 'float'), ('nu_e', 'float'), ('nu_mu', 'float'), ('nu_tau', 'float'), ('nu_e_bar', 'float'), ('nu_mu_bar', 'float'), ('nu_tau_bar', 'float')]) flux_surface['Energy'] = e_vector composition_nu = np.array([ u_to_fr([flux['0_nu'][j], flux['1_nu'][j], flux['2_nu'][j]], osc_matrix) for j in range(len(e_vector)) ]) composition_nubar = np.array([ u_to_fr([flux['0_nubar'][j], flux['1_nubar'][j], flux['2_nubar'][j]], osc_matrix) for j in range(len(e_vector)) ]) flux_surface['nu_e'] = composition_nu[:, 0] flux_surface['nu_mu'] = composition_nu[:, 1] flux_surface['nu_tau'] = composition_nu[:, 2] flux_surface['nu_e_bar'] = composition_nubar[:, 0] flux_surface['nu_mu_bar'] = composition_nubar[:, 1] flux_surface['nu_tau_bar'] = composition_nubar[:, 2] if location == 'EarthSurface': return flux_surface elif location == 'Detector': e_vector = e_vector * param.GeV if xsec == None: xsec = nsq.NeutrinoDISCrossSectionsFromTables('../xsec/nusigma_') nuSQ = nsq.nuSQUIDS(e_vector, 3, nsq.NeutrinoType.both, interactions, xsec) else: xsec = nsq.NeutrinoDISCrossSectionsFromTables(xsec) nuSQ = nsq.nuSQUIDS(e_vector, 3, nsq.NeutrinoType.both, interactions, xsec) nuSQ.Set_Body(nsq.Earth()) nuSQ.Set_Track( nsq.Earth.Track(2 * abs(np.cos(np.deg2rad(zenith))) * param.EARTHRADIUS * param.km)) nuSQ.Set_MixingAngle(0, 1, np.deg2rad(theta_12)) nuSQ.Set_MixingAngle(0, 2, np.deg2rad(theta_13)) nuSQ.Set_MixingAngle(1, 2, np.deg2rad(theta_23)) nuSQ.Set_SquareMassDifference(1, delta_m_12) nuSQ.Set_SquareMassDifference(2, delta_m_13) nuSQ.Set_abs_error(1.e-5) nuSQ.Set_rel_error(1.e-5) nuSQ.Set_CPPhase(0, 2, delta) nuSQ.Set_ProgressBar(True) initial_flux = np.zeros((nodes, 2, 3)) for i in range(3): initial_flux[:, 0, i] = composition_nu[:, i] initial_flux[:, 1, i] = composition_nubar[:, i] #composition =np.array([[[composition_nu[i,0],composition_nu[i,1],composition_nu[i,2]],[composition_nubar[i,0],composition_nubar[i,1],composition_nubar[i,2]]] for i in range(len(composition_nu))]) nuSQ.Set_initial_state(initial_flux, nsq.Basis.flavor) nuSQ.Set_TauRegeneration(True) nuSQ.EvolveState() flux_surface = np.zeros(len(e_vector), dtype=[('Energy', 'float'), ('nu_e', 'float'), ('nu_mu', 'float'), ('nu_tau', 'float'), ('nu_e_bar', 'float'), ('nu_mu_bar', 'float'), ('nu_tau_bar', 'float'), ('zenith', 'float')]) energy = nuSQ.GetERange() print energy flux_surface['Energy'] = energy / param.GeV flux_surface['nu_e'] = np.array( [nuSQ.EvalFlavor(0, e, 0) for e in energy]) flux_surface['nu_mu'] = np.array( [nuSQ.EvalFlavor(1, e, 0) for e in energy]) flux_surface['nu_tau'] = np.array( [nuSQ.EvalFlavor(2, e, 0) for e in energy]) flux_surface['nu_e_bar'] = np.array( [nuSQ.EvalFlavor(0, e, 1) for e in energy]) flux_surface['nu_mu_bar'] = np.array( [nuSQ.EvalFlavor(1, e, 1) for e in energy]) flux_surface['nu_tau_bar'] = np.array( [nuSQ.EvalFlavor(2, e, 1) for e in energy]) flux_surface['zenith'] = np.array([zenith] * len(e_vector)) return flux_surface
def NuFlux_Solar(proflux, Enu_min, Enu_max, nodes, ch, DMm, param, theta_12=33.82, theta_23=48.6, theta_13=8.60, delta_m_12=7.39e-5, delta_m_13=2.528e-3, delta=0., logscale=False, interactions=True, location='detector', time=57754., angle=None, latitude=-90., xsec=None): ''' calculate neutrino flux after propagation for solar wimp (multiple energy mode with interactions) @type proflux : str @param proflux : name of the production flux, e.g. Pythia @type Enu_min : float @param Enu_min : GeV @type Enu_max : float @param Enu_max : GeV @type nodes : int @param nodes : number of nodes @type ch : str @param ch : channel of the production @type DMm : float @param DMm : GeV @type location : str @param location : Sunsfc or detector @type time : float @parm time : MJD of the detection time (input can be either the angle or the time) @type angle : float @param angle : Zenith angle of the detection in degree (input can be either the angle or the time) @parm time : MJD of the detection time @type latitude : float @param latitude : latitude of the detector @type xsec : str @param xsec : path to neutrino xsec files. @return : flux per annihilation ''' #Oscillation parameters are from NuFIT 4.1 (2019) normal ordering with delta_cp=0. Adjust according to your need. #default cross section is based on isoscalar target from arXiv: 1106.3723v2. I have also run nusigma which is a neutrino-nucleon cross section writen by J. Edsjo assuming isoscalar target. There files are in `./xsec/`. The choice of the cross sections makes difference. #TODO: implement full MC #DM_annihilation_rate_Sun = float(np.sum(DM.DMSunAnnihilationRate(DMm*param.GeV,DMsig,param)))*param.sec DM_annihilation_rate_Sun = 1. Enu_min = Enu_min * param.GeV Enu_max = Enu_max * param.GeV #e_range = np.linspace(Enu_min*pc.GeV,Enu_max*pc.GeV,100) if logscale is True: e_vector = np.logspace(np.log10(Enu_min), np.log10(Enu_max), nodes) print(e_vector[:100] / 1.e9) print(nodes) else: e_vector = np.linspace(Enu_min, Enu_max, nodes) if proflux == 'Pythia': production = pythiaflux elif proflux == 'Herwig': production = herwigflux elif proflux == 'WimpSim': production = DMSweFluxSun else: print "No Such Production." quit() flux = {} if xsec == None: xsec = nsq.NeutrinoDISCrossSectionsFromTables( '/data/user/qliu/DM/GOLEMTools/sources/nuSQuIDS/data/xsections/nusigma_' ) nuSQ = nsq.nuSQUIDS(e_vector, 3, nsq.NeutrinoType.both, interactions, xsec) else: xsec = nsq.NeutrinoDISCrossSectionsFromTables( "/data/user/qliu/DM/GOLEMTools/sources/nuSQuIDS/data/xsections/nusigma_" ) nuSQ = nsq.nuSQUIDS(e_vector, 3, nsq.NeutrinoType.both, interactions, xsec) energy = nuSQ.GetERange() for i in range(3): flux[str(i) + '_nu'] = np.array( map( lambda E_nu: production( E_nu / param.GeV, i * 2, ch, DMm, wimp_loc='Sun'), energy)) flux[str(i) + '_nubar'] = np.array( map( lambda E_nu: production( E_nu / param.GeV, i * 2 + 1, ch, DMm, wimp_loc='Sun'), energy)) nuSQ.Set_Body(nsq.Sun()) nuSQ.Set_Track(nsq.Sun.Track(0., param.SUNRADIUS * param.km)) nuSQ.Set_MixingAngle(0, 1, np.deg2rad(theta_12)) nuSQ.Set_MixingAngle(0, 2, np.deg2rad(theta_13)) nuSQ.Set_MixingAngle(1, 2, np.deg2rad(theta_23)) nuSQ.Set_SquareMassDifference(1, delta_m_12) nuSQ.Set_SquareMassDifference(2, delta_m_13) nuSQ.Set_abs_error(1.e-5) nuSQ.Set_rel_error(1.e-5) nuSQ.Set_CPPhase(0, 2, delta) nuSQ.Set_ProgressBar(True) initial_flux = np.zeros((nodes, 2, 3)) for j in range(len(flux['0_nu'])): for k in range(3): initial_flux[j][0][k] = flux[str(k) + '_nu'][j] initial_flux[j][1][k] = flux[str(k) + '_nubar'][j] nuSQ.Set_initial_state(initial_flux, nsq.Basis.flavor) nuSQ.Set_TauRegeneration(True) nuSQ.EvolveState() #e_range = np.linspace(Enu_min,Enu_max,nodes) flux_surface = np.zeros(len(energy), dtype=[('Energy', 'float'), ('nu_e', 'float'), ('nu_mu', 'float'), ('nu_tau', 'float'), ('nu_e_bar', 'float'), ('nu_mu_bar', 'float'), ('nu_tau_bar', 'float'), ('zenith', 'float')]) if location == 'Sunsfc': #factor = DM_annihilation_rate_Sun/(4.0*PI*(param.SUNRADIUS*param.km/param.cm)**2*DMm) flux_surface['Energy'] = energy / param.GeV flux_surface['nu_e'] = np.array( [nuSQ.EvalFlavor(0, e, 0) for e in energy]) flux_surface['nu_mu'] = np.array( [nuSQ.EvalFlavor(1, e, 0) for e in energy]) flux_surface['nu_tau'] = np.array( [nuSQ.EvalFlavor(2, e, 0) for e in energy]) flux_surface['nu_e_bar'] = np.array( [nuSQ.EvalFlavor(0, e, 1) for e in energy]) flux_surface['nu_mu_bar'] = np.array( [nuSQ.EvalFlavor(1, e, 1) for e in energy]) flux_surface['nu_tau_bar'] = np.array( [nuSQ.EvalFlavor(2, e, 1) for e in energy]) return flux_surface elif location == 'detector': flux_earth = flux_surface if angle == None: zenith = SunZenith(time, latitude) else: zenith = np.deg2rad(angle) d_tot, d_vacuum, d_earthatm = Distance(zenith, param) composition_new = np.zeros((len(e_vector), 2, 3)) for i in range(3): for j in range(2): composition_new[:, j, i] = np.array( [nuSQ.EvalFlavor(i, e, j) for e in energy]) #composition_new =np.array([[[nuSQ.EvalFlavor(0,e,0),nuSQ.EvalFlavor(1,e,0),nuSQ.EvalFlavor(2,e,0)],[nuSQ.EvalFlavor(0,e,1),nuSQ.EvalFlavor(1,e,1),nuSQ.EvalFlavor(2,e,1)]] for e in e_vector]) #print composition_new nuSQ.Set_Body(nsq.Vacuum()) nuSQ.Set_Track(nsq.Vacuum.Track(float(d_vacuum) * param.km)) nuSQ.Set_ProgressBar(True) nuSQ.Set_initial_state(composition_new, nsq.Basis.flavor) nuSQ.Set_TauRegeneration(True) nuSQ.EvolveState() composition_new = np.zeros((len(e_vector), 2, 3)) for i in range(3): for j in range(2): composition_new[:, j, i] = np.array( [nuSQ.EvalFlavor(i, e, j) for e in energy]) #composition_new =np.array([[[nuSQ.EvalFlavor(0,e,0),nuSQ.EvalFlavor(1,e,0),nuSQ.EvalFlavor(2,e,0)],[nuSQ.EvalFlavor(0,e,1),nuSQ.EvalFlavor(1,e,1),nuSQ.EvalFlavor(2,e,1)]] for e in e_vector]) nuSQ.Set_Body(nsq.EarthAtm()) nuSQ.Set_Track(nsq.EarthAtm.Track(zenith)) nuSQ.Set_ProgressBar(True) nuSQ.Set_initial_state(composition_new, nsq.Basis.flavor) nuSQ.Set_TauRegeneration(True) nuSQ.EvolveState() flux_earth['Energy'] = energy / param.GeV flux_earth['nu_e'] = np.array( [nuSQ.EvalFlavor(0, e, 0) for e in energy]) flux_earth['nu_mu'] = np.array( [nuSQ.EvalFlavor(1, e, 0) for e in energy]) flux_earth['nu_tau'] = np.array( [nuSQ.EvalFlavor(2, e, 0) for e in energy]) flux_earth['nu_e_bar'] = np.array( [nuSQ.EvalFlavor(0, e, 1) for e in energy]) flux_earth['nu_mu_bar'] = np.array( [nuSQ.EvalFlavor(1, e, 1) for e in energy]) flux_earth['nu_tau_bar'] = np.array( [nuSQ.EvalFlavor(2, e, 1) for e in energy]) flux_earth['zenith'] = np.array([zenith] * len(e_vector)) return flux_earth
def propagate( iniflux, Ein, Eout, location_ini, location_end, theta_12=33.82, theta_23=48.6, theta_13=8.60, delta_m_12=7.39e-5, delta_m_13=2.528e-3, delta=0.0, interactions=True, xsec=None, secluded=False, r=0.0, mass_v=0.0, zenith=0.0, avg=True, pathSunModel=None, pathEarthModel=None, ): r"""propagate neutrino flux Parameters ---------- iniflux : array initial flux for propagation Ein : array energies of the initial flux Eout : array energies of the output flux location_ini : str location of neutrino production location_end : str location that the flux propagates to pathSunModel : str path to the Sun profile pathEarthModel : str path to the Earth profile theta_12 : float theta_12 in degree theta_23 : float theta_23 in degree theta_13 : float theta_13 in degree delta_m_12 : float delta_m_12 square in eV^2 delta_m_13 : float delta_m_13 square in eV^2 delta : float cp phase in degree interactions : bool whether to included interactions between nodes xsec : str Use default cross sections if None. Or can use external table of cross section with names `n(p)_sigma_CC(NC).dat`,`n(p)_dsde_CC(NC).dat`. secluded : bool standard or secluded r : float or list if secluded, the distance picked mass_v : float mediator_mass in GeV zenith : float zenith angle in radian avg : bool whether to average out flux Returns ------- flux : array averaged flux of a specific flavor. """ flavor_list = { 0: "nu_e", 1: "nu_e_bar", 2: "nu_mu", 3: "nu_mu_bar", 4: "nu_tau", 5: "nu_tau_bar", } if xsec == None: xsec = nsq.NeutrinoDISCrossSectionsFromTables(dirpath + "/xsec/nusigma_") nuSQ = nsq.nuSQUIDS(Ein * pc.GeV, 3, nsq.NeutrinoType.both, interactions, xsec) else: xsec = nsq.NeutrinoDISCrossSectionsFromTables(xsec) nuSQ = nsq.nuSQUIDS(Ein * pc.GeV, 3, nsq.NeutrinoType.both, interactions, xsec) nuSQ.Set_MixingAngle(0, 1, np.deg2rad(theta_12)) nuSQ.Set_MixingAngle(0, 2, np.deg2rad(theta_13)) nuSQ.Set_MixingAngle(1, 2, np.deg2rad(theta_23)) nuSQ.Set_SquareMassDifference(1, delta_m_12) nuSQ.Set_SquareMassDifference(2, delta_m_13) nuSQ.Set_abs_error(1.0e-10) nuSQ.Set_rel_error(1.0e-10) nuSQ.Set_CPPhase(0, 2, np.deg2rad(delta)) nuSQ.Set_ProgressBar(True) nuSQ.Set_TauRegeneration(True) flux_output = np.zeros( len(Eout), dtype=[ ("Energy", "float"), ("nu_e", "float"), ("nu_mu", "float"), ("nu_tau", "float"), ("nu_e_bar", "float"), ("nu_mu_bar", "float"), ("nu_tau_bar", "float"), ("zenith", "float"), ], ) # Standard case if not secluded: # from Sun if location_ini == "Sun": if pathSunModel == None: nuSQ.Set_Body(nsq.Sun(dirpath + "/models/struct_b16_agss09.dat")) else: nuSQ.Set_Body(nsq.Sun(pathSunModel)) nuSQ.Set_Track(nsq.Sun.Track(0.0, pc.SUNRADIUS * pc.km)) nuSQ.Set_initial_state(iniflux, nsq.Basis.flavor) nuSQ.EvolveState() # flux at sun surface if location_end == "SunSurface": zenith = None # flux at 1AU elif location_end == "1AU": nuSQ.Set_Body(nsq.Vacuum()) nuSQ.Set_Track(nsq.Vacuum.Track(pc.AU - pc.SUNRADIUS * pc.km)) nuSQ.EvolveState() # flux at detector elif location_end == "detector": nuSQ.Set_Body(nsq.Vacuum()) d_vacuum = float(Distance(zenith)[1]) nuSQ.Set_Track(nsq.Vacuum.Track(d_vacuum * pc.km)) nuSQ.EvolveState() if pathEarthModel == None: nuSQ.Set_Body(nsq.EarthAtm()) else: nuSQ.Set_Body(nsq.EarthAtm(pathEarthModel)) nuSQ.Set_Track(nsq.EarthAtm.Track(zenith)) nuSQ.EvolveState() # from Earth elif location_ini == "Earth": # flux at detector if location_end == "detector": if pathEarthModel == None: nuSQ.Set_Body(nsq.Earth()) else: nuSQ.Set_Body(nsq.Earth(pathEarthModel)) # nuSQ.Set_Body(nsq.Earth()) nuSQ.Set_Track( nsq.Earth.Track( pc.EARTHRADIUS * pc.km, 2 * pc.EARTHRADIUS * pc.km, 2 * pc.EARTHRADIUS * pc.km, ) ) nuSQ.Set_initial_state(iniflux, nsq.Basis.flavor) nuSQ.EvolveState() # from Halo elif location_ini == "Halo": osc_matrix = angles_to_u(theta_12, theta_13, theta_23, delta) composition_nu = np.array( [ u_to_fr( [iniflux[j, 0, 0], iniflux[j, 0, 1], iniflux[j, 0, 2]], osc_matrix, ) for j in range(len(Ein)) ] ) composition_nubar = np.array( [ u_to_fr( [iniflux[j, 1, 0], iniflux[j, 1, 1], iniflux[j, 1, 2]], osc_matrix, ) for j in range(len(Ein)) ] ) # flux at Earth surface before entering matter if location_end == "Earth" or zenith <= np.pi / 2.0: for i in range(3): inter_nu = interp1d(Ein, composition_nu[:, i]) inter_nubar = interp1d(Ein, composition_nubar[:, i]) flux_output[flavor_list[2 * i]] = inter_nu(Eout) flux_output[flavor_list[2 * i + 1]] = inter_nubar(Eout) flux_output["Energy"] = Eout flux_output["zenith"] = np.array([zenith] * len(Eout)) return flux_output # flux at detector elif location_end == "detector": if pathEarthModel == None: nuSQ.Set_Body(nsq.Earth()) else: nuSQ.Set_Body(nsq.Earth(pathEarthModel)) # nuSQ.Set_Body(nsq.Earth()) nuSQ.Set_Track( nsq.Earth.Track(2 * abs(np.cos(zenith)) * pc.EARTHRADIUS * pc.km) ) surface_flux = np.zeros((len(composition_nu), 2, 3)) for i in range(3): surface_flux[:, 0, i] = composition_nu[:, i] surface_flux[:, 1, i] = composition_nubar[:, i] nuSQ.Set_initial_state(surface_flux, nsq.Basis.flavor) nuSQ.EvolveState() # Secluded case elif secluded: theta = 0.0 # from Sun if location_ini == "Sun": b_impact = np.sin(theta) * r if r < pc.SUNRADIUS: if theta <= np.pi / 2.0: xini = xini_Sun(b_impact, r, zenith)[0][1] else: xini = xini_Sun(b_impact, r, zenith)[0][0] if b_impact != 0: l = 2 * np.sqrt(pc.SUNRADIUS ** 2 - b_impact ** 2) if pathSunModel == None: nuSQ.Set_Body( nsq.SunASnu(dirpath + "/models/struct_b16_agss09.dat") ) else: nuSQ.Set_Body(nsq.SunASnu(pathSunModel)) nuSQ.Set_Track( nsq.SunASnu.Track(l * pc.km, xini * pc.km, b_impact * pc.km) ) elif b_impact == 0: if pathSunModel == None: nuSQ.Set_Body( nsq.Sun(dirpath + "/models/struct_b16_agss09.dat") ) else: nuSQ.Set_Body(nsq.Sun(pathSunModel)) nuSQ.Set_Track(nsq.Sun.Track(xini * pc.km, pc.SUNRADIUS * pc.km)) nuSQ.Set_initial_state(iniflux, nsq.Basis.flavor) nuSQ.EvolveState() # flux at sun surface if location_end == "SunSurface": pass # flux at 1AU elif location_end == "1AU": if r < pc.SUNRADIUS: nuSQ.Set_Body(nsq.Vacuum()) nuSQ.Set_Track(nsq.Vacuum.Track(pc.AU - pc.SUNRADIUS * pc.km)) elif r >= pc.SUNRADIUS and r < pc.AU / pc.km - pc.EARTHRADIUS: nuSQ.Set_Body(nsq.Vacuum()) nuSQ.Set_Track(nsq.Vacuum.Track(pc.AU - r * pc.km)) nuSQ.Set_initial_state(iniflux, nsq.Basis.flavor) nuSQ.EvolveState() # flux at detector elif location_end == "detector": nuSQ.Set_Body(nsq.Vacuum()) if r < pc.SUNRADIUS: nuSQ.Set_Track( nsq.Vacuum.Track(xini_Sun(b_impact, r, zenith)[1] * pc.km) ) elif r >= pc.SUNRADIUS and r < pc.AU / pc.km - pc.EARTHRADIUS: nuSQ.Set_Track( nsq.Vacuum.Track(xini_Sun(b_impact, r, zenith)[0][1] * pc.km) ) nuSQ.Set_initial_state(iniflux, nsq.Basis.flavor) nuSQ.EvolveState() if pathEarthModel == None: nuSQ.Set_Body(nsq.EarthAtm()) else: nuSQ.Set_Body(nsq.EarthAtm(pathEarthModel)) nuSQ.Set_Track(nsq.EarthAtm.Track(zenith)) nuSQ.EvolveState() # from the Earth elif location_ini == "Earth" and location_end == "detector": xini = xini_Earth(np.pi, r)[0][1] if pathEarthModel == None: nuSQ.Set_Body(nsq.Earth()) else: nuSQ.Set_Body(nsq.Earth(pathEarthModel)) nuSQ.Set_Track( nsq.Earth.Track( xini * pc.km, 2 * pc.EARTHRADIUS * pc.km, 2 * pc.EARTHRADIUS * pc.km ) ) nuSQ.Set_initial_state(iniflux, nsq.Basis.flavor) nuSQ.EvolveState() flux_output["Energy"] = Eout flux_output["zenith"] = np.array([zenith] * len(Eout)) Eout = Eout * pc.GeV if avg: flux_output["nu_e"] = average(nuSQ, Eout, [0, 0]) flux_output["nu_mu"] = average(nuSQ, Eout, [1, 0]) flux_output["nu_tau"] = average(nuSQ, Eout, [2, 0]) flux_output["nu_e_bar"] = average(nuSQ, Eout, [0, 1]) flux_output["nu_mu_bar"] = average(nuSQ, Eout, [1, 1]) flux_output["nu_tau_bar"] = average(nuSQ, Eout, [2, 1]) else: flux_output["nu_e"] = np.array([nuSQ.EvalFlavor(0, e, 0) for e in Eout]) flux_output["nu_mu"] = np.array([nuSQ.EvalFlavor(1, e, 0) for e in Eout]) flux_output["nu_tau"] = np.array([nuSQ.EvalFlavor(2, e, 0) for e in Eout]) flux_output["nu_e_bar"] = np.array([nuSQ.EvalFlavor(0, e, 1) for e in Eout]) flux_output["nu_mu_bar"] = np.array([nuSQ.EvalFlavor(1, e, 1) for e in Eout]) flux_output["nu_tau_bar"] = np.array([nuSQ.EvalFlavor(2, e, 1) for e in Eout]) return flux_output