示例#1
0
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])
示例#2
0
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[