Module taurunner.Casino

Expand source code
import proposal as pp
import numpy as np

from taurunner.utils import units
from taurunner.particle import Particle
from taurunner.body import Body
from taurunner.track import Track

#This is the propagation algorithm. The MCmeat, if you will.
def Propagate(particle: Particle, track: Track, body: Body, condition=None) -> Particle:
    r'''
    Simulate particle along a given track in a body including interactions and energy losses
    Params
    ______
    particle : taurunner Particle object you wish to propagate
    track    : taurunner Track object which defines the geometry of the trajectory
    body     : taurunner Body object which defines the medium in which to simulate
    Returns
    _______
    particle : taurunner Particle object after propagation
    '''
    total_column_depth = track.total_column_depth(body)
    total_distance     = track.x_to_d(1.-particle.position)*body.radius/units.km
    #keep iterating until final column depth is reached or a charged lepton is made
    if condition:
        if hasattr(condition, '__call__'):
            stopping_condition = lambda particle: (particle.position >= 1. or  particle.survived==False or condition(particle))
        elif type(condition)==tuple:
            stopping_condition = lambda particle: (particle.position >= 1. or  particle.survived==False or condition[0](particle, *condition[1]))
        else:
            raise TypeError('Not known how to handle condition argument')
    else:
        stopping_condition = lambda particle: (particle.position >= 1. or  particle.survived==False)
    while(not stopping_condition(particle)):
        if(np.abs(particle.ID) in [12, 14, 16]):
            #Determine how far you're going
            p1                         = particle.rand.random_sample()
            DepthStep                  = particle.GetProposedDepthStep(p1)
            CurrentDepth               = track.x_to_X(body, particle.position)
            if(CurrentDepth+DepthStep >= total_column_depth):
                particle.position=1.
                return particle
            else:
                particle.position=track.X_to_x(body, CurrentDepth+DepthStep)
            #now pick an interaction
            p2       = particle.rand.random_sample()
            CC_lint  = particle.GetInteractionDepth(interaction='CC')
            p_int_CC = particle.GetTotalInteractionDepth() / CC_lint
            if(p2 <= p_int_CC):
                #make and propagate charged lepton
                particle.Interact('CC', body, track, proton_fraction=body.get_proton_fraction(track.x_to_r(particle.position)))
                particle.PropagateChargedLepton(body, track)
            else:
                particle.Interact('NC', proton_fraction=body.get_proton_fraction(track.x_to_r(particle.position)))
        elif(np.abs(particle.ID) in [11, 13, 15]):
            current_distance = track.x_to_d(particle.position)*body.radius
            charged_distance = particle.chargedposition*units.km
            if(track.d_to_x((current_distance+charged_distance)/body.radius) >=1.): # pragma: no cover
                particle.position=1.
            else:
                current_distance += charged_distance
                particle.position = track.d_to_x(current_distance/body.radius)
                particle.Decay()
    return particle

Functions

def Propagate(particle: Particle, track: Track, body: Body, condition=None) ‑> Particle

Simulate particle along a given track in a body including interactions and energy losses Params


particle : taurunner Particle object you wish to propagate track : taurunner Track object which defines the geometry of the trajectory body : taurunner Body object which defines the medium in which to simulate Returns


particle : taurunner Particle object after propagation

Expand source code
def Propagate(particle: Particle, track: Track, body: Body, condition=None) -> Particle:
    r'''
    Simulate particle along a given track in a body including interactions and energy losses
    Params
    ______
    particle : taurunner Particle object you wish to propagate
    track    : taurunner Track object which defines the geometry of the trajectory
    body     : taurunner Body object which defines the medium in which to simulate
    Returns
    _______
    particle : taurunner Particle object after propagation
    '''
    total_column_depth = track.total_column_depth(body)
    total_distance     = track.x_to_d(1.-particle.position)*body.radius/units.km
    #keep iterating until final column depth is reached or a charged lepton is made
    if condition:
        if hasattr(condition, '__call__'):
            stopping_condition = lambda particle: (particle.position >= 1. or  particle.survived==False or condition(particle))
        elif type(condition)==tuple:
            stopping_condition = lambda particle: (particle.position >= 1. or  particle.survived==False or condition[0](particle, *condition[1]))
        else:
            raise TypeError('Not known how to handle condition argument')
    else:
        stopping_condition = lambda particle: (particle.position >= 1. or  particle.survived==False)
    while(not stopping_condition(particle)):
        if(np.abs(particle.ID) in [12, 14, 16]):
            #Determine how far you're going
            p1                         = particle.rand.random_sample()
            DepthStep                  = particle.GetProposedDepthStep(p1)
            CurrentDepth               = track.x_to_X(body, particle.position)
            if(CurrentDepth+DepthStep >= total_column_depth):
                particle.position=1.
                return particle
            else:
                particle.position=track.X_to_x(body, CurrentDepth+DepthStep)
            #now pick an interaction
            p2       = particle.rand.random_sample()
            CC_lint  = particle.GetInteractionDepth(interaction='CC')
            p_int_CC = particle.GetTotalInteractionDepth() / CC_lint
            if(p2 <= p_int_CC):
                #make and propagate charged lepton
                particle.Interact('CC', body, track, proton_fraction=body.get_proton_fraction(track.x_to_r(particle.position)))
                particle.PropagateChargedLepton(body, track)
            else:
                particle.Interact('NC', proton_fraction=body.get_proton_fraction(track.x_to_r(particle.position)))
        elif(np.abs(particle.ID) in [11, 13, 15]):
            current_distance = track.x_to_d(particle.position)*body.radius
            charged_distance = particle.chargedposition*units.km
            if(track.d_to_x((current_distance+charged_distance)/body.radius) >=1.): # pragma: no cover
                particle.position=1.
            else:
                current_distance += charged_distance
                particle.position = track.d_to_x(current_distance/body.radius)
                particle.Decay()
    return particle