def PropagateMuons( tray, name, RandomService=None, CylinderRadius=1200. * I3Units.m, CylinderLength=1700. * I3Units.m, ): from I3Tray import I3Units from icecube import icetray, dataclasses, phys_services, sim_services, simclasses from icecube import cmc muPropagator = MakePropagator( radius=CylinderRadius, length=CylinderLength, particleType=dataclasses.I3Particle.ParticleType.MuMinus) tauPropagator = MakePropagator( radius=CylinderRadius, length=CylinderLength, particleType=dataclasses.I3Particle.ParticleType.TauMinus) cascadePropagator = cmc.I3CascadeMCService( phys_services.I3GSLRandomService(1)) # dummy RNG # set up propagators propagators = sim_services.I3ParticleTypePropagatorServiceMap() for pt in 'MuMinus', 'MuPlus': propagators[getattr(dataclasses.I3Particle.ParticleType, pt)] = muPropagator for pt in 'TauMinus', 'TauPlus': propagators[getattr(dataclasses.I3Particle.ParticleType, pt)] = tauPropagator for pt in 'DeltaE', 'Brems', 'PairProd', 'NuclInt', 'Hadrons', 'EMinus', 'EPlus': propagators[getattr(dataclasses.I3Particle.ParticleType, pt)] = cascadePropagator tray.AddModule('I3PropagatorModule', name + '_propagator', PropagatorServices=propagators, RandomService=RandomService, RNGStateName="RNGState", InputMCTreeName="I3MCTree_preMuonProp", OutputMCTreeName="I3MCTree") # add empty MMCTrackList objects for events that have none def addEmptyMMCTrackList(frame): if "MMCTrackList" not in frame: frame["MMCTrackList"] = simclasses.I3MMCTrackList() tray.AddModule(addEmptyMMCTrackList, name + '_addEmptyMMCTrackList', Streams=[icetray.I3Frame.DAQ])
def make_propagators(): """ Set up a stable of propagators for all the kinds of particles we're going to see. """ from icecube.PROPOSAL import I3PropagatorServicePROPOSAL from icecube.cmc import I3CascadeMCService propagators = sim_services.I3ParticleTypePropagatorServiceMap() muprop = I3PropagatorServicePROPOSAL(type=dataclasses.I3Particle.MuMinus) cprop = I3CascadeMCService(phys_services.I3GSLRandomService(1)) # dummy RNG for pt in 'MuMinus', 'MuPlus': propagators[getattr(dataclasses.I3Particle.ParticleType, pt)] = muprop for pt in 'DeltaE', 'Brems', 'PairProd', 'NuclInt', 'Hadrons', 'EMinus', 'EPlus': propagators[getattr(dataclasses.I3Particle.ParticleType, pt)] = cprop return propagators
def get_propagators(): """ Set up a stable of propagators for muons, taus, and cascades. """ from icecube import sim_services, phys_services from icecube.PROPOSAL import I3PropagatorServicePROPOSAL from icecube.cmc import I3CascadeMCService propagators = sim_services.I3ParticleTypePropagatorServiceMap() mu_tau_prop = I3PropagatorServicePROPOSAL() cprop = I3CascadeMCService( phys_services.I3GSLRandomService(1)) # dummy RNG for pt in 'MuMinus', 'MuPlus', 'TauMinus', 'TauPlus': propagators[getattr(dataclasses.I3Particle.ParticleType, pt)] = mu_tau_prop for pt in 'DeltaE', 'Brems', 'PairProd', 'NuclInt', 'Hadrons', 'EMinus', 'EPlus': propagators[getattr(dataclasses.I3Particle.ParticleType, pt)] = cprop return propagators
def SelectNeutrino( tray, name, Propagators=None, AutoExtendMuonVolume=False, EnergyBiasPower=1, FlavorBias=[30, 1, 1], CylinderRadius=600 * I3Units.m, CylinderHeight=1200 * I3Units.m, CrossSections='csms', ): r""" Select a neutrino to interact, and add neutrino propagators to the context. :param AutoExtendMuonVolume: allow :math:`\nu_{\mu}` to interact far before they reach the detector :param EnergyBiasPower: select a neutrino from the bundle with probability proportional to E^power :param FlavorBias: scale selection probability for :math:`\nu_{e}/\nu_{\mu}/\nu_{\tau}` by these factors. The default value is appropriate for equal sampling of conventional atmospheric :math:`\nu_{e}/\nu_{\mu}`. :param CylinderRadius: radius of upright-cylinder target volume :param CylinderHeight: full height of simulation volume :param CrossSections: cross-section tables to use ('cteq5', 'css', or 'csms') """ from operator import add from icecube import neutrino_generator, sim_services, MuonGun # Set up NeutrinoGenerator internals random = tray.context['I3RandomService'] #surface = MuonGun.Cylinder(CylinderHeight, CylinderRadius) surface = phys_services.Cylinder(CylinderHeight, CylinderRadius) config = neutrino_generator.Steering() config.detection_surface = surface config.do_muon_range_extension = AutoExtendMuonVolume interactions = neutrino_generator.I3NuGInteractionInfo( random, config, CrossSections) interactions.initialize() # I3NuGSourceSelector needs this in its context tray.context['NuGSteer'] = config # Remove all but one neutrino tray.Add('I3NuGSourceSelector', EnergyBiasPowerIndex=EnergyBiasPower, ParticleBiases=reduce(add, [[b] * 2 for b in FlavorBias]), KeepDarkNeutrinos=False) # Store propagators in the context if not 'I3ParticleTypePropagatorServiceMap' in tray.context: tray.context[ 'I3ParticleTypePropagatorServiceMap'] = sim_services.I3ParticleTypePropagatorServiceMap( ) Propagators = tray.context['I3ParticleTypePropagatorServiceMap'] # Use NeutrinoPropagator for neutrinos prop = neutrino_generator.I3NeutrinoPropagator(random, config, interactions) # ensure that all nu_e and nu_mu reach the detector prop.prop_mode = neutrino_generator.PropagationMode.ncgrweighted tau_prop = neutrino_generator.I3NeutrinoPropagator(random, config, interactions) # un-weighted propagation for nu_tau to allow for tau regeneration tau_prop.prop_mode = neutrino_generator.PropagationMode.nopropweight for flavor in 'E', 'Mu', 'Tau': for ptype in '', 'Bar': Propagators[getattr(dataclasses.I3Particle.ParticleType, 'Nu' + flavor + ptype)] = tau_prop if flavor == 'Tau' else prop
tray.AddModule("I3GENIEResultDictToMCTree", "toMcTree", MCTreeName="I3MCTree_preprop", WeightDictName="I3MCWeightDict_GENIE") if options.FLAVOR == 'NuMu': ### ADDING PROPAGATOR ### tray.AddModule("I3GENIEResultDictToMCTree", "toMcTree", MCTreeName="I3MCTree_preprop", WeightDictName="I3MCWeightDict_GENIE") # tray.AddModule("Rename", # Keys = ["I3MCTree","I3MCTree_preprop"]) from icecube import PROPOSAL, sim_services propagators = sim_services.I3ParticleTypePropagatorServiceMap() mediadef = expandvars('$I3_BUILD/PROPOSAL/resources/mediadef') muMinusPropagator = PROPOSAL.I3PropagatorServicePROPOSAL( mediadef=mediadef, cylinderRadius=1200, cylinderHeight=1700, type=dataclasses.I3Particle.ParticleType.MuMinus) muPlusPropagator = PROPOSAL.I3PropagatorServicePROPOSAL( mediadef=mediadef, cylinderRadius=1200, cylinderHeight=1700, type=dataclasses.I3Particle.ParticleType.MuPlus) propagators[