Пример #1
0
    def __init__(self, pos, time, coord_system = 'GSM', INTERNAL_MODEL='LGM_DUNGEY',):
        super(Lgm_Dungey, self).__init__(Position=pos, Epoch=time, coord_system = coord_system, INTERNAL_MODEL=INTERNAL_MODEL,)

        # pos must be an Lgm_Vector or list or sensible ndarray
        try:
            if coord_system != 'GSM':
                pos = magcoords.coordTrans(pos, time, coord_system,'GSM')
                #raise(NotImplementedError('Different coord systems are not yet ready to use') )
            else:
                pass
            self._Vpos = pos2Lgm_Vector(pos)
            assert self._Vpos
        except AssertionError:
            raise(TypeError('pos must be a Lgm_Vector or list of Lgm_vectors') )

        # time must be a datetime
        if not isinstance(time, datetime.datetime) and \
            not isinstance(time, list):
            raise(TypeError('time must be a datetime or list of datetime') )

        if INTERNAL_MODEL not in (LGM_CDIP,
                                  LGM_EDIP,
                                  LGM_IGRF,
                                  LGM_DUNGEY) and \
            INTERNAL_MODEL not in ('LGM_CDIP',
                                  'LGM_EDIP',
                                  'LGM_IGRF',
                                  'LGM_DUNGEY'):
            raise(ValueError('INTERNAL_MODEL must be LGM_CDIP, LGM_EDIP, LGM_DUNGEY, or LGM_IGRF') )
        if isinstance(INTERNAL_MODEL, str):
            INTERNAL_MODEL = eval(INTERNAL_MODEL)
        self.attrs['internal_model'] = INTERNAL_MODEL

        self._mmi = Lgm_MagModelInfo.Lgm_MagModelInfo()
        self._mmi.InternalModel = INTERNAL_MODEL
        self._mmi.ExternalModel = LGM_EXTMODEL_NULL

        # either they are all one element or they are compatible lists no 1/2 way
        try:
            if len(self._Vpos) != len(self['Epoch']):
                raise(ValueError('Inputs must be the same length, scalars or lists'))
        except TypeError:
            if isinstance(self._Vpos, list) and not isinstance(self['Epoch'], list):
                raise(ValueError('Inputs must be the same length, scalars or lists'))

        self['B'] = self.calc_B()
Пример #2
0
def Closed_Field(*args, **kwargs):
    """
    Function to see if a field line is closed

    Either MagEphem or pos and date must be specified

    Parameters
    ----------
    MagEphem : Lgm_MagEphemInfo, optional
        If a populated Lgm_MagEphemInfo class is passed in the data is pulled
        from it
    pos : list, optional
        3-element list of the position in system coord_system
    date : datetime, optional
        date and time of the calculation
    height : float, optional
        height above the earth to consider a particle lost [km], default=100
    tol1 : float, optional
        TODO what do I set?  default=0.01
    tol2 : float, optional
        TODO what do I set?  default=1e-7
    bfield : str, optional
        The magnetic field model to use, default=Lgm_B_T89
    Kp : int, optional
        Kp index for the calculation, default=2
    coord_system : str
        the coordinate system of the input position, default=GSM
    extended_out : bool
        switch on extended vs regular output, see examples for details,
        default=False

    Returns
    -------
    out : str
        a string with the open of closed value for the input
            - LGM_OPEN_IMF
            - LGM_CLOSED
            - LGM_OPEN_N_LOBE
            - LGM_OPEN_S_LOBE
            - LGM_INSIDE_EARTH
            - LGM_TARGET_HEIGHT_UNREACHABLE

    Examples
    --------
    >>> from lgmpy import Closed_Field
    >>> import datetime
    >>> Closed_Field([3,1,0], datetime.datetime(2000, 12, 3))
    'LGM_CLOSED'
    >>> Closed_Field([6,1,12], datetime.datetime(2000, 12, 3))
    'LGM_OPEN_IMF'
    >>> Closed_Field([-16,1,5], datetime.datetime(2000, 12, 3))
    'LGM_OPEN_N_LOBE'
    """

    defaults = {'height': 100,
                'tol1': 0.01,
                'tol2': 1e-7,
                'bfield': 'Lgm_B_T89',
                'Kp': 2,
                'coord_system': 'GSM',
                'extended_out': False}

    #replace missing kwargs with defaults
    for dkey in defaults:
        if dkey not in kwargs:
            kwargs[dkey] = defaults[dkey]

    northern = Lgm_Vector.Lgm_Vector()
    southern = Lgm_Vector.Lgm_Vector()
    minB = Lgm_Vector.Lgm_Vector()
    #check for call w/ Lgm_MagModelInfo
    if len(args) == 1:
        MagEphemInfo = args[0]
        try:
            mmi = MagEphemInfo.LstarInfo.contents.mInfo.contents
        except AttributeError:
            raise(RuntimeError('Incorrect arguments specified'))
        dum = [MagEphemInfo.P.x, MagEphemInfo.P.y, MagEphemInfo.P.z]
        position = Lgm_Vector.Lgm_Vector(*dum)
    elif len(args) == 2:
        # input checking
        if kwargs['coord_system'] != 'GSM':
        #    raise(NotImplementedError('Different coord systems are not yet ready to use') )
            pos = magcoords.coordTrans(args[0], args[1], kwargs['coord_system'],'GSM')
        else:
            pos = args[0]
        
        # could consider a Lgm_MagModelInfo param to use an existing one
        mmi = Lgm_MagModelInfo.Lgm_MagModelInfo()
        mmi.Kp = kwargs['Kp']
        try:
            Bfield_dict[kwargs['bfield']](pointer(mmi))
        except KeyError:
            raise(NotImplementedError("Only Bfield=%s currently supported" % Bfield_dict.keys()))

        datelong = Lgm_CTrans.dateToDateLong(args[1])
        utc = Lgm_CTrans.dateToFPHours(args[1])
        Lgm_Set_Coord_Transforms( datelong, utc, mmi.c) # dont need pointer as it is one

        try:
            position = Lgm_Vector.Lgm_Vector(*pos)
        except TypeError:
            raise(TypeError('position must be an iterable') )
    else:
        raise(RuntimeError('Incorrect number of arguments specified'))

    ans = Lgm_Trace(pointer(position),
            pointer(southern),
            pointer(northern),
            pointer(minB), kwargs['height'], kwargs['tol1'], kwargs['tol2'], pointer(mmi) )

    L = numpy.nan #default to this is field not closed
    if ans == LGM_OPEN_IMF:
        retstr = 'LGM_OPEN_IMF'
    elif ans == LGM_CLOSED:
        retstr = 'LGM_CLOSED'
        L = _simpleL(northern, mmi)
    elif ans == LGM_OPEN_N_LOBE:
        retstr = 'LGM_OPEN_N_LOBE'
    elif ans == LGM_OPEN_S_LOBE:
        retstr = 'LGM_OPEN_S_LOBE'
    elif ans == LGM_INSIDE_EARTH:
        retstr = 'LGM_INSIDE_EARTH'
    elif ans == LGM_TARGET_HEIGHT_UNREACHABLE:
        retstr = 'LGM_TARGET_HEIGHT_UNREACHABLE'
    elif ans == LGM_BAD_TRACE:
        retstr = 'LGM_BAD_TRACE'
    if kwargs['extended_out']:
        return retstr, northern.tolist(), southern.tolist(), minB.tolist(), L
    else:
        return retstr
Пример #3
0
def Closed_Field(*args, **kwargs):
    """
    Function to see if a field line is closed

    Either MagEphem or pos and date must be specified

    Parameters
    ----------
    MagEphem : Lgm_MagEphemInfo, optional
        If a populated Lgm_MagEphemInfo class is passed in the data is pulled
        from it
    pos : list, optional
        3-element list of the position in system coord_system
    date : datetime, optional
        date and time of the calculation
    height : float, optional
        height above the earth to consider a particle lost [km], default=100
    tol1 : float, optional
        TODO what do I set?  default=0.01
    tol2 : float, optional
        TODO what do I set?  default=1e-7
    bfield : str, optional
        The magnetic field model to use, default=Lgm_B_T89
    Kp : int, optional
        Kp index for the calculation, default=2
    coord_system : str
        the coordinate system of the input position, default=GSM
    extended_out : bool
        switch on extended vs regular output, see examples for details,
        default=False

    Returns
    -------
    out : str
        a string with the open of closed value for the input
            - LGM_OPEN_IMF
            - LGM_CLOSED
            - LGM_OPEN_N_LOBE
            - LGM_OPEN_S_LOBE
            - LGM_INSIDE_EARTH
            - LGM_TARGET_HEIGHT_UNREACHABLE

    Examples
    --------
    >>> from lgmpy import Closed_Field
    >>> import datetime
    >>> Closed_Field([3,1,0], datetime.datetime(2000, 12, 3))
    'LGM_CLOSED'
    >>> Closed_Field([6,1,12], datetime.datetime(2000, 12, 3))
    'LGM_OPEN_IMF'
    >>> Closed_Field([-16,1,5], datetime.datetime(2000, 12, 3))
    'LGM_OPEN_N_LOBE'
    """

    defaults = {
        'height': 100,
        'tol1': 0.01,
        'tol2': 1e-7,
        'bfield': 'Lgm_B_T89',
        'Kp': 2,
        'coord_system': 'GSM',
        'extended_out': False
    }

    #replace missing kwargs with defaults
    for dkey in defaults:
        if dkey not in kwargs:
            kwargs[dkey] = defaults[dkey]

    northern = Lgm_Vector.Lgm_Vector()
    southern = Lgm_Vector.Lgm_Vector()
    minB = Lgm_Vector.Lgm_Vector()
    #check for call w/ Lgm_MagModelInfo
    if len(args) == 1:
        MagEphemInfo = args[0]
        try:
            mmi = MagEphemInfo.LstarInfo.contents.mInfo.contents
        except AttributeError:
            raise (RuntimeError('Incorrect arguments specified'))
        dum = [MagEphemInfo.P.x, MagEphemInfo.P.y, MagEphemInfo.P.z]
        position = Lgm_Vector.Lgm_Vector(*dum)
    elif len(args) == 2:
        # input checking
        if kwargs['coord_system'] != 'GSM':
            #    raise(NotImplementedError('Different coord systems are not yet ready to use') )
            pos = magcoords.coordTrans(args[0], args[1],
                                       kwargs['coord_system'], 'GSM')
        else:
            pos = args[0]

        # could consider a Lgm_MagModelInfo param to use an existing one
        mmi = Lgm_MagModelInfo.Lgm_MagModelInfo()
        mmi.Kp = kwargs['Kp']
        try:
            Bfield_dict[kwargs['bfield']](pointer(mmi))
        except KeyError:
            raise (NotImplementedError("Only Bfield=%s currently supported" %
                                       Bfield_dict.keys()))

        datelong = Lgm_CTrans.dateToDateLong(args[1])
        utc = Lgm_CTrans.dateToFPHours(args[1])
        Lgm_Set_Coord_Transforms(datelong, utc,
                                 mmi.c)  # dont need pointer as it is one

        try:
            position = Lgm_Vector.Lgm_Vector(*pos)
        except TypeError:
            raise (TypeError('position must be an iterable'))
    else:
        raise (RuntimeError('Incorrect number of arguments specified'))

    ans = Lgm_Trace(pointer(position), pointer(southern), pointer(northern),
                    pointer(minB), kwargs['height'], kwargs['tol1'],
                    kwargs['tol2'], pointer(mmi))

    L = numpy.nan  #default to this is field not closed
    if ans == LGM_OPEN_IMF:
        retstr = 'LGM_OPEN_IMF'
    elif ans == LGM_CLOSED:
        retstr = 'LGM_CLOSED'
        L = _simpleL(northern, mmi)
    elif ans == LGM_OPEN_N_LOBE:
        retstr = 'LGM_OPEN_N_LOBE'
    elif ans == LGM_OPEN_S_LOBE:
        retstr = 'LGM_OPEN_S_LOBE'
    elif ans == LGM_INSIDE_EARTH:
        retstr = 'LGM_INSIDE_EARTH'
    elif ans == LGM_TARGET_HEIGHT_UNREACHABLE:
        retstr = 'LGM_TARGET_HEIGHT_UNREACHABLE'
    elif ans == LGM_BAD_TRACE:
        retstr = 'LGM_BAD_TRACE'
    if kwargs['extended_out']:
        return retstr, northern.tolist(), southern.tolist(), minB.tolist(), L
    else:
        return retstr
Пример #4
0
    def __init__(
        self,
        pos,
        time,
        coord_system='GSM',
        INTERNAL_MODEL='LGM_DUNGEY',
    ):
        super(Lgm_Dungey, self).__init__(
            Position=pos,
            Epoch=time,
            coord_system=coord_system,
            INTERNAL_MODEL=INTERNAL_MODEL,
        )

        # pos must be an Lgm_Vector or list or sensible ndarray
        try:
            if coord_system != 'GSM':
                pos = magcoords.coordTrans(pos, time, coord_system, 'GSM')
                #raise(NotImplementedError('Different coord systems are not yet ready to use') )
            else:
                pass
            self._Vpos = pos2Lgm_Vector(pos)
            assert self._Vpos
        except AssertionError:
            raise (
                TypeError('pos must be a Lgm_Vector or list of Lgm_vectors'))

        # time must be a datetime
        if not isinstance(time, datetime.datetime) and \
            not isinstance(time, list):
            raise (TypeError('time must be a datetime or list of datetime'))

        if INTERNAL_MODEL not in (LGM_CDIP,
                                  LGM_EDIP,
                                  LGM_IGRF,
                                  LGM_DUNGEY) and \
            INTERNAL_MODEL not in ('LGM_CDIP',
                                  'LGM_EDIP',
                                  'LGM_IGRF',
                                  'LGM_DUNGEY'):
            raise (ValueError(
                'INTERNAL_MODEL must be LGM_CDIP, LGM_EDIP, LGM_DUNGEY, or LGM_IGRF'
            ))
        if isinstance(INTERNAL_MODEL, str):
            INTERNAL_MODEL = eval(INTERNAL_MODEL)
        self.attrs['internal_model'] = INTERNAL_MODEL

        self._mmi = Lgm_MagModelInfo.Lgm_MagModelInfo()
        self._mmi.InternalModel = INTERNAL_MODEL
        self._mmi.ExternalModel = LGM_EXTMODEL_NULL

        # either they are all one element or they are compatible lists no 1/2 way
        try:
            if len(self._Vpos) != len(self['Epoch']):
                raise (ValueError(
                    'Inputs must be the same length, scalars or lists'))
        except TypeError:
            if isinstance(self._Vpos,
                          list) and not isinstance(self['Epoch'], list):
                raise (ValueError(
                    'Inputs must be the same length, scalars or lists'))

        self['B'] = self.calc_B()