示例#1
0
 def testIRTAM(self):
     # Top level manager config
     managerConfig = ConfigValues.TICSConfig()
     # Tell the datacontroller to use giro and roam to use irtam
     managerConfig.dataControllerConfig.sources = ['giro']
     managerConfig.roamConfig.backgroundModel = ['irtam']
     manager = Manager(managerConfig)
     manager.queryIonoState(37.2321, 256.2323, datetime(2015, 10, 20)) 
示例#2
0
 def testRIPE(self):
     # Top level manager config
     managerConfig = ConfigValues.TICSConfig()
     # Tell the datacontroller to use noaa and roam to use ripe
     managerConfig.dataControllerConfig.sources = ['noaa']
     managerConfig.roamConfig.backgroundModel = ['ripe']
     manager = Manager(managerConfig)
     manager.queryIonoState(37.2321, 256.2323, datetime(2015, 10, 20))
示例#3
0
文件: ROAM.py 项目: floquet/trabajo
    def test_CalcIonoState_IRTAM(self):
        import IonoModelEngine.Config.ConfigValues as ConfigValues
        from numpy.testing import assert_approx_equal
        logger.info("test_CalcIonoState_IRTAM")

        directory = os.path.dirname(
            os.path.realpath(__file__)) + "/UnitTestData/"

        # Setup the input into ROAM
        listOfFiles = {}
        listOfFiles['giro'] = [directory + 'IRTAM_foF2_COEFFS_20151020_0000.ASC', \
                               directory + 'IRTAM_hmF2_COEFFS_20151020_0000.ASC', \
                               directory + 'IRTAM_B0_COEFFS_20151020_0000.ASC', \
                               directory + 'IRTAM_B1_COEFFS_20151020_0000.ASC']
        listOfFiles['noaa'] = []
        listOfFiles['localDigisonde'] = []

        # First construct a config file for ROAM
        self.config = ConfigValues.ROAMConfig()
        # Tell roam to use IRTAM
        self.config.backgroundModel = 'irtam'

        # instantiate ROAM
        self.roam = ROAM(self.config, self.irtamHandle, self.pharlapHandle)

        # G10 receiver location
        lat = 32.4824
        lon = -106.3809
        UT = numpy.array([2015, 10, 20, 0, 0])
        DT = datetime(UT[0], UT[1], UT[2], UT[3], UT[4], 0)

        #self.roam.background_model = 2  # force use of IRTAM
        #self.roam.noaaConfig = []       # force use of IRTAM

        state = self.roam.CalcIonoState(lat, lon, DT, listOfFiles)

        logger.info(
             "ROAM foF2={:.4f} hmF2={:.4f} foF1={:.4f} foE={:.4f} hmE={:.4f} B0={:.4f} B1={:.4f} foEs={:.4f} hmEs={:.4f} beta_lat={:.4f} beta_lon={:.4f}". \
                 format(state[0], state[1], state[2], state[3], state[4], state[5], \
                        state[6], state[7], state[8], state[9], state[10]))

        # Output from ROAM.py running IRTAM
        # [ROAM.py:176] IRTAM data: foF2=8.7484 hmF2=252.7329 B0=59.5018 B1=3.1669
        # [ROAM.py:734] ROAM foF2=8.7484 hmF2=252.7329 foF1=-1.0000 foE=1.8131 hmE=110.0000 B0=59.5018 B1=3.1669 ...
        #                   foEs=0.0000 hmEs=110.0000 beta_lat=-0.0085 beta_lon=-0.0116

        assert_approx_equal(state[0], 8.7484, significant=3)  # foF2
        assert_approx_equal(state[1], 252.7329, significant=3)  # hmF2
        assert_approx_equal(state[2], -1.0, significant=3)  # foF1
        assert_approx_equal(state[3], 1.8131, significant=3)  # foE
        assert_approx_equal(state[5], 59.5018, significant=3)  # B0
        assert_approx_equal(state[6], 3.1669, significant=3)  # B1
        assert_approx_equal(state[9], -0.0085, significant=3)  # gradLat
        assert_approx_equal(state[10], -0.0116, significant=3)  # gradLon

        return
示例#4
0
文件: ROAM.py 项目: floquet/trabajo
    def test_CalcIonoState_RIPE(self):
        import IonoModelEngine.Config.ConfigValues as ConfigValues
        from numpy.testing import assert_approx_equal
        logger.info("test_CalcIonoState_RIPE")

        # Location of test files
        directory = os.path.dirname(os.path.realpath(__file__)) + "/../RIPE"

        # Setup the input into ROAM
        listOfFiles = {}
        listOfFiles['noaa'] = [directory + '/TestFiles/AU930_NOAA.TXT', \
                               directory + '/TestFiles/BC840_NOAA.TXT', \
                               directory + '/TestFiles/EG931_NOAA.TXT']
        listOfFiles['giro'] = []
        listOfFiles['localDigisonde'] = []

        # First construct a config file for ROAM
        self.config = ConfigValues.ROAMConfig()

        # Tell roam to use RIPE
        self.config.backgroundModel = 'ripe'

        # instantiate ROAM
        self.roam = ROAM(self.config, self.irtamHandle, self.pharlapHandle)

        self.roam.refreshIRI = 0

        # G10 receiver location
        lat = 32.4824
        lon = -106.3809
        UT = numpy.array([2015, 10, 20, 0, 0])
        DT = datetime(UT[0], UT[1], UT[2], UT[3], UT[4], 0)

        state = self.roam.CalcIonoState(lat, lon, DT, listOfFiles)

        logger.info(
            "ROAM foF2={:.4f} hmF2={:.4f} foF1={:.4f} foE={:.4f} hmE={:.4f} B0={:.4f} B1={:.4f} foEs={:.4f} hmEs={:.4f} beta_lat={:.4f} beta_lon={:.4f}". \
                format(state[0], state[1], state[2], state[3], state[4], state[5], \
                       state[6], state[7], state[8], state[9], state[10]))

        # Output from Matlab run of roam_using_ripe_testfiles_20151020.m followed by roam_using_ripe.m
        # YEAR MON DAY  HR MIN       foF2      hmF2      foF1       foE        B0        B1   gradLat   gradLon    ... Ref_lat   Ref_lon    AoAErr
        # 2015  10  20  00  00     9.2822  257.5859   -1.0000    1.8131   61.7588    2.5061   -0.0144   -0.0038        32.4824 -106.3809    0.0000

        assert_approx_equal(state[0], 9.2822, significant=3)  # foF2
        assert_approx_equal(state[1], 257.5859, significant=3)  # hmF2
        assert_approx_equal(state[2], -1.0, significant=3)  # foF1
        assert_approx_equal(state[3], 1.8131, significant=3)  # foE
        assert_approx_equal(state[5], 61.7588, significant=1)  # B0
        assert_approx_equal(state[6], 2.5061, significant=2)  # B1
        assert_approx_equal(state[9], -0.0144, significant=3)  # gradLat
        assert_approx_equal(state[10], -0.0038, significant=3)  # gradLon

        return
示例#5
0
    def test(self):
        # Setup the configurations

        config = ConfigValues.GIROConfig()
        # Remove the test dir to reset
        # if os.path.isdir(config.giroStore):
        #    shutil.rmtree(config.giroStore)
        # Need to stand this up
        ionoPyToCHandle = IonoPyIface.Pharlap()
        giroManager = GIRODataManager(config, ionoPyToCHandle)
        # Perform test donwload
        listOfOutputFiles = giroManager.process(datetime(2015, 10, 20))
        self.assertEqual(len(listOfOutputFiles),4)
示例#6
0
 def testNOAA(self):
     # Setup the configuration for the DataController
     dataControllerConfig = ConfigValues.DataControllerConfig()
     # Use only noaa
     dataControllerConfig.sources = ['noaa']
     # Need to stand this up, usually the Manager has it
     saoReaderHandle = SaoPyIface()
     pharlapHandle = Pharlap()
     # Create an instance of DataController and let it go
     dataController = DataController(dataControllerConfig,
                                     saoReaderHandle=saoReaderHandle,
                                     pharlapHandle=pharlapHandle)
     listOfOutputFiles = dataController.process(datetime(2015, 10, 20))
     self.assertEqual(len(listOfOutputFiles['noaa']), 4)
示例#7
0
 def testGIRO(self):
     # Setup the configuration for the DataController
     dataControllerConfig = ConfigValues.DataControllerConfig()
     # Use only giro
     dataControllerConfig.sources = ['giro']
     # Need to stand this up, usually the Manager has it
     pharlapHandle = Pharlap()
     irtamHandle = IrtamPyIface()
     # Create an instance of DataController and let it go
     dataController = DataController(dataControllerConfig,
                                     irtamHandle=irtamHandle,
                                     pharlapHandle=pharlapHandle)
     listOfOutputFiles = dataController.process(datetime(2015, 10, 20))
     self.assertEqual(len(listOfOutputFiles['giro']), 4)
示例#8
0
文件: ROAM.py 项目: floquet/trabajo
    def test_CalcIonoState_RIPEwithIRTAM(self):
        import IonoModelEngine.Config.ConfigValues as ConfigValues
        from numpy.testing import assert_approx_equal
        logger.info("test_CalcIonoState_RIPEwithIRTAM")

        # Location of test files
        directory = os.path.dirname(os.path.realpath(__file__)) + '/'

        # Setup the input into ROAM
        listOfFiles = {}
        listOfFiles['noaa'] = [directory + '../RIPE/TestFiles/AU930_NOAA.TXT', \
                               directory + '../RIPE/TestFiles/BC840_NOAA.TXT', \
                               directory + '../RIPE/TestFiles/EG931_NOAA.TXT']
        listOfFiles['giro'] = [directory + '../IRTAM/UnitTestData/IRTAM_foF2_COEFFS_20151020_0000.ASC', \
                               directory + '../IRTAM/UnitTestData/IRTAM_hmF2_COEFFS_20151020_0000.ASC', \
                               directory + '../IRTAM/UnitTestData/IRTAM_B0_COEFFS_20151020_0000.ASC', \
                               directory + '../IRTAM/UnitTestData/IRTAM_B1_COEFFS_20151020_0000.ASC']
        listOfFiles['localDigisonde'] = []

        # First construct a config file for ROAM
        self.config = ConfigValues.ROAMConfig()

        # Tell roam to use RIPE with IRTAM
        self.config.backgroundModel = 'ripe-irtam'
        #self.config.synopticTilt = 0

        # instantiate ROAM
        self.roam = ROAM(self.config, self.irtamHandle, self.pharlapHandle)

        self.roam.refreshIRI = 0

        # G10 receiver location
        lat = 32.4824
        lon = -106.3809
        UT = numpy.array([2015, 10, 20, 0, 0])
        DT = datetime(UT[0], UT[1], UT[2], UT[3], UT[4], 0)

        state = self.roam.CalcIonoState(lat, lon, DT, listOfFiles)

        logger.info(
            "ROAM foF2={:.4f} hmF2={:.4f} foF1={:.4f} foE={:.4f} hmE={:.4f} B0={:.4f} B1={:.4f} foEs={:.4f} hmEs={:.4f} beta_lat={:.5f} beta_lon={:.5f}". \
                format(state[0], state[1], state[2], state[3], state[4], state[5], \
                       state[6], state[7], state[8], state[9], state[10]))

        # Output from Matlab run of roam_using_ripe_testfiles_20151020.m followed by roam_using_ripe.m
        # YEAR MON DAY  HR MIN       foF2      hmF2      foF1       foE        B0        B1   gradLat   gradLon    ... Ref_lat   Ref_lon    AoAErr
        # 2015  10  20  00  00     9.2822  257.5859   -1.0000    1.8131   61.7588    2.5061   -0.0144   -0.0038        32.4824 -106.3809    0.0000
        # foF2, hmF2, B0, B1 in this unit test are from RIPE.py using ripe-irtam option
        # [RIPE.py: 666] RIPE foF2 = 9.5167 hmF2 = 259.2598 B0 = 69.4209 B1 = 2.3416
        # [ROAM.py:759] ROAM  foF2 = 9.5167 hmF2 = 259.2598 foF1 = -1.0000 foE = 1.8131 hmE = 110.0000 B0 = 69.4209 B1 = 2.3416 \
        #        foEs = 0.0000 hmEs = 110.0000 beta_lat=-0.01840 beta_lon=-0.00578

        assert_approx_equal(state[0], 9.5167, significant=3)  # foF2
        assert_approx_equal(state[1], 259.2598, significant=3)  # hmF2
        assert_approx_equal(state[2], -1.0, significant=3)  # foF1
        assert_approx_equal(state[3], 1.8131, significant=3)  # foE
        assert_approx_equal(state[5], 69.4209, significant=1)  # B0
        assert_approx_equal(state[6], 2.3416, significant=2)  # B1
        assert_approx_equal(state[9], -0.01840, significant=3)  # gradLat
        assert_approx_equal(state[10], -0.00578, significant=3)  # gradLon

        return
示例#9
0
def PharlapRayProcessorConfig(pharlap=None):

    pharlapRayProcessorConfig = ConfigDef.PharlapRayProcessorConfig()

    # The footprints of the voxel grids are squares with an incribed circle with this radius. (Meter)
    pharlapRayProcessorConfig.grids.radiusMeter = 900e3

    # The electron density grid's increment in latitude (degrees)
    pharlapRayProcessorConfig.grids.latInc = numpy.deg2rad(0.10048)
    # The electron density grid's increment in longitude (degrees)
    pharlapRayProcessorConfig.grids.lonInc = numpy.deg2rad(0.10048)
    # The electron density grid's lowest height (km)
    pharlapRayProcessorConfig.grids.htStart = 60e3
    # The electron density grid's increment in height (km)
    pharlapRayProcessorConfig.grids.htInc = 2e3
    # The electron density grid's number of voxels in height
    pharlapRayProcessorConfig.grids.numHt = 201

    # The geomagnetic field grid's increment in latitude (degrees)
    pharlapRayProcessorConfig.grids.bLatInc = numpy.deg2rad(0.2)
    # The geomagnetic field grid's increment in longitude (degrees)
    pharlapRayProcessorConfig.grids.bLonInc = numpy.deg2rad(0.2)
    # The geomagnetic field grid's lowest height (km)
    pharlapRayProcessorConfig.grids.bHtStart = 60e3
    # The geomagnetic field grid's increment in height (km)
    pharlapRayProcessorConfig.grids.bHtInc = 10e3
    # The geomagnetic field grid's number of voxels in height
    pharlapRayProcessorConfig.grids.bNumHt = 41

    # Parameters of PHaRLAP
    pharlapRayProcessorConfig.pharlap.tolPharlapMin = numpy.array(
        [1e-7, 0.01, 1])
    # Root solver for ray homing

    elLimits = numpy.array([0, 90.0])
    elSpan = 180.0
    azSpan = 30.0

    # 1D Ray Shooting
    options1d = {"fatol": 1e-2, "maxNumIter": 10, "nfev": 50}
    elLimits = pharlapRayProcessorConfig.elLimits
    pharlapRayProcessorConfig.elMaxSolver = RayData.genRootSolver(
        "rayShooting1d", option=options1d, elLimits=elLimits)
    #pharlapRayProcessorConfig.solver = RayData.genRootSolver("minimize")
    #pharlapRayProcessorConfig.solver = RayData.genRootSolver("krylov", options={"fatol": 1.0e-3})

    # 2D Bisectioning
    #solverOptions = {"fatol": 20, "maxNumIter": 100, "func1d": pharlapRayProcessorConfig.elMaxSolver}
    # pharlapRayProcessorConfig.solver = RayData.genRootSolver("bisect2d", options=solverOptions,
    #             elLimits=elLimits, elSpan=elSpan, azSpan=azSpan)

    # 2D Ray Shooting
    solverOptions = {
        "fatol": 10000,
        "maxNumIter": 50,
        "nfev": 100,
        "nInit": 200
    }
    pharlapRayProcessorConfig.solver = RayData.genRootSolver(
        "rayShooting2d",
        options=solverOptions,
        elLimits=elLimits,
        elSpan=elSpan,
        azSpan=azSpan)

    # If no Pharlap object is provided, construct a new one.
    if not isinstance(pharlap, Pharlap):
        pharlap = Pharlap()

    # Construct a ROAM object
    roamConfig = IonoConfig.ROAMConfig()
    roam = ROAM(roamConfig, pharlapHandle=pharlap)
    # Set the model to IRI
    roam.background_model = 0

    pharlapRayProcessorConfig.raytrace_3d = pharlap.raytrace_3d
    pharlapRayProcessorConfig.genGeoMagGrid = GeoMagGrid.genGridIGRF12
    pharlapRayProcessorConfig.genElectronDensityGridROAM = roam.genElectronDensityGridROAM

    # Number of days as the threshold to trigger the regeneration of geomagnetic fields.
    pharlapRayProcessorConfig.deltaDaysRegenGeomagGrid = datetime.timedelta(
        90
    )  # Regenerate the geomagnetic fields if it is outdated by more than 90 days.

    return pharlapRayProcessorConfig