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()
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
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
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()