def addSupplementaryPressureSalinityProfile(self, key: str):
        self.addDataDescription(key + "TemplatePressureTempSalinity", BufrFXYTemplate(3, 6, 18))

        self.addDataDescription(key + "IndicatorForDigitization",BufrFXYInt(0, 2, 32, 2, True))
        self.addDataDescription(key + "MeasurementType",BufrFXYInt(0, 8, 34, 4, True))

        # replication descriptors
        self.addDataDescription(key + "DelayedReplication", BufrFXYDelayedReplication(9, True)) # replication of next 9 items
        self.addDataDescription(key + "ExtendedDelayedReplication",BufrFXYInt(0, 31, 2, 16, True))   # number of replications (i.e. levels)

        # replicated section
        self.addDataDescription(key + "WaterPressure",BufrFXYDoubleReplication(0, 7, 65, -3.0, 0.0, 17, True))
        self.addDataDescription(key + "WaterPressure_QualifierForGTSPPQualityClass",BufrFXYIntReplication(0, 8, 80, 6, True))   # pressure at a level = 10
        self.addDataDescription(key + "WaterPressure_GlobalGTSPPQualityClass",BufrFXYIntReplication(0, 33, 50, 4, True))

        self.addDataDescription(key + "SeaWaterTemperature",BufrFXYDoubleReplication(0, 22, 45, 3.0, 0.0, 19, True))
        self.addDataDescription(key + "SeaWaterTemperature_QualifierForGTSPPQualityClass",BufrFXYIntReplication(0, 8, 80, 6, True))    # water temperature at a level = 11
        self.addDataDescription(key + "SeaWaterTemperature_GlobalGTSPPQualityClass",BufrFXYIntReplication(0, 33, 50, 4, True))

        self.addDataDescription(key + "Salinity",BufrFXYDoubleReplication(0, 22, 64, 3.0, 0.0, 17, True))
        self.addDataDescription(key + "Salinity_QualifierForGTSPPQualityClass",BufrFXYIntReplication(0, 8, 80, 6, True))   # salinity at a level = 12
        self.addDataDescription(key + "Salinity_GlobalGTSPPQualityClass",BufrFXYIntReplication(0, 33, 50, 4, True))

        # end marker?
        self.addDataDescription(key + "MeasurementTypeCancel",BufrFXYInt(0, 8, 34, 4, True))

        pass
Esempio n. 2
0
 def test_BufrFXYDoubleReplication_Basic(self):
     eF = 2
     eX = 13
     eY = 27
     bits = 10
     eValues = [
         1.3, 1.4, 101.3, 102.3, 10.6, 98.3, 1.3, 101.3, 101.3, 101.3
     ]
     scale = 1.0
     offset = -2.0
     repeats = len(eValues)
     min = sys.float_info.min
     max = sys.float_info.max
     XY = BufrFXYDoubleReplication(eF, eX, eY, scale, offset, bits, False,
                                   min, max)
     XY.setValue(eValues)
     buffer = BufrBitArray()
     XY.writeDefinitionToBuffer(buffer)
     # write all the data
     for i in range(repeats):
         XY.writeValueToBuffer(buffer)
     buffer.bytepos = 0
     F, X, Y = buffer.readlist([2, 6, 8])
     self.assertEqual(F.uint, eF, "F incorrect")
     self.assertEqual(X.uint, eX, "X incorrect")
     self.assertEqual(Y.uint, eY, "Y incorrect")
     for i in range(repeats):
         value = buffer.read(bits)
         eValueInt = (eValues[i] * 10**scale) + offset
         eValueInt = int(math.trunc(eValueInt + 0.5))
         self.assertEqual(value.uint, eValueInt,
                          "Value incorrect for repeat " + str(i))
    def addDissolvedOxygenProfile(self, key: str):
        self.addDataDescription(key + "TemplatePressureTemp", BufrFXYTemplate(3, 6, 37))

        # replication descriptors
        self.addDataDescription(key + "DelayedReplication", BufrFXYDelayedReplication(9, True)) # replication of next 9 items
        self.addDataDescription(key + "ExtendedDelayedReplication",BufrFXYInt(0, 31, 2, 16, True))   # number of replications (i.e. levels)

        # replicated section
        self.addDataDescription(key + "Depth",BufrFXYDoubleReplication(0, 7, 62, 0.0, 0.0, 17, True))
        self.addDataDescription(key + "Depth_QualifierForGTSPPQualityClass",BufrFXYIntReplication(0, 8, 80, 6, True))   # depth at a level = 13
        self.addDataDescription(key + "Depth_GlobalGTSPPQualityClass",BufrFXYIntReplication(0, 33, 50, 4, True))

        self.addDataDescription(key + "WaterPressure",BufrFXYDoubleReplication(0, 7, 65, -3.0, 0.0, 17, True))
        self.addDataDescription(key + "WaterPressure_QualifierForGTSPPQualityClass",BufrFXYIntReplication(0, 8, 80, 6, True))   # pressure at a level = 10
        self.addDataDescription(key + "WaterPressure_GlobalGTSPPQualityClass",BufrFXYIntReplication(0, 33, 50, 4, True))

        self.addDataDescription(key + "DissolvedOxygen",BufrFXYDoubleReplication(0, 22, 188, 3.0, 0.0, 19, True))
        self.addDataDescription(key + "DissolvedOxygen_QualifierForGTSPPQualityClass",BufrFXYIntReplication(0, 8, 80, 6, True))  # dissolved oxygen at a level = 16
        self.addDataDescription(key + "DissolvedOxygen_GlobalGTSPPQualityClass",BufrFXYIntReplication(0, 33, 50, 4, True))
        pass
    def __init__(self, argoChannels: dict):
        super(ArgoNetCDFBufrEncoder, self).__init__()

        #pdb.set_trace()

        # main bufr sequence
        self.addDataDescription("TemplateArgo", BufrFXYTemplate(3, 15, 3))

        self.addDataDescription("WMOMarineObservingPlatform",BufrFXYInt(0, 1, 87, 23, True))
        self.addDataDescription("ObservingPlatformManufacturesModel",BufrFXYString(0, 1, 85, 20, True))
        self.addDataDescription("ObservingPlatformManufacturesSerialNumber",BufrFXYString(0, 1, 86, 32, True))
        self.addDataDescription("BuoyType",BufrFXYInt(0, 2, 36, 2, True))
        self.addDataDescription("DataCollectionAndOrLocationSystem",BufrFXYInt(0, 2, 148, 5, True))
        self.addDataDescription("DataTypeOfBuoy",BufrFXYInt(0, 2, 149, 6, True))
        self.addDataDescription("FloatCycleNumber",BufrFXYInt(0, 22, 55, 10, True))
        self.addDataDescription("DirectionOfProfile",BufrFXYInt(0, 22, 56, 2, True))
        self.addDataDescription("InstrumentTypeForWaterTemperatureProfileMeasurement",BufrFXYInt(0, 22, 67, 10, True))

        #self.addDataDescription("TemplateDate", BufrFXYTemplate(3, 1, 11))
        self.addDataDescription("Year",BufrFXYInt(0, 4, 1, 12, True))
        self.addDataDescription("Month",BufrFXYInt(0, 4, 2, 4, True))
        self.addDataDescription("Day",BufrFXYInt(0, 4, 3, 6, True))

        #self.addDataDescription("TemplateTime", BufrFXYTemplate(3, 1, 12))
        self.addDataDescription("Hour",BufrFXYInt(0, 4, 4, 5, True))
        self.addDataDescription("Minute",BufrFXYInt(0, 4, 5, 6, True))

        #self.addDataDescription("TemplatePosition", BufrFXYTemplate(3, 1, 21))
        self.addDataDescription("LatitudeCoarse",BufrFXYDouble(0, 5, 1, 5.0, 9000000.0, 25, True))
        self.addDataDescription("LongitudeCoarse",BufrFXYDouble(0, 6, 1, 5.0, 18000000.0, 26, True))

        self.addDataDescription("Position_QualifierForGTSPPQualityClass",BufrFXYInt(0, 8, 80, 6, True))
        self.addDataDescription("Position_GlobalGTSPPQualityClass",BufrFXYInt(0, 33, 50, 4, True))

        # replication descriptors
        self.addDataDescription("DelayedReplication", BufrFXYDelayedReplication(9, True)) # replication of next 9 items
        self.addDataDescription("ExtendedDelayedReplication",BufrFXYInt(0, 31, 2, 16, True))   # number of replications (i.e. levels)

        # replicated section
        self.addDataDescription("WaterPressure",BufrFXYDoubleReplication(0, 7, 65, -3.0, 0.0, 17, True))
        self.addDataDescription("WaterPressure_QualifierForGTSPPQualityClass",BufrFXYIntReplication(0, 8, 80, 6, True))    # pressure at a level = 10
        self.addDataDescription("WaterPressure_GlobalGTSPPQualityClass",BufrFXYIntReplication(0, 33, 50, 4, True))

        self.addDataDescription("SeaWaterTemperature",BufrFXYDoubleReplication(0, 22, 45, 3.0, 0.0, 19, True))
        self.addDataDescription("SeaWaterTemperature_QualifierForGTSPPQualityClass",BufrFXYIntReplication(0, 8, 80, 6, True))    # water temperature at a level = 11
        self.addDataDescription("SeaWaterTemperature_GlobalGTSPPQualityClass",BufrFXYIntReplication(0, 33, 50, 4, True))

        self.addDataDescription("Salinity",BufrFXYDoubleReplication(0, 22, 64, 3.0, 0.0, 17, True))
        self.addDataDescription("Salinity_QualifierForGTSPPQualityClass",BufrFXYIntReplication(0, 8, 80, 6, True))   # salinity at a level = 12
        self.addDataDescription("Salinity_GlobalGTSPPQualityClass",BufrFXYIntReplication(0, 33, 50, 4, True))

        # add any additional bufr templates for other Argo profiles
        self.additionalProfiles = []
        numProfiles = argoChannels["N_PROF"].value
        if numProfiles>1:
            samplingSchemesInFile = argoChannels["VERTICAL_SAMPLING_SCHEME"].value
            # check that primary is first
            if not samplingSchemesInFile[0].startswith(self.verticalSamlingSchemes[0]):
                raise Exception("First vertical sampling scheme is not a primary")
            # add profiles for secondary profiles
            for profileNo, samplingScheme in enumerate(samplingSchemesInFile):
                if samplingScheme.startswith(self.verticalSamlingSchemes[1]):
                    profileNamePrefix = "Complimentary" + str(profileNo)    # used for keeping the keys unique for all profiles
                    # save a list of tuples for the additional profiles, for use when adding the data
                    salinity = argoChannels["PSAL"].value[profileNo]
                    oxygen = argoChannels["DOXY"].value[profileNo]
                    oxygenAvailable = oxygen.count() > 0    # include oxygen if there are some values which are not masked
                    salinityAvailable = salinity.count() > 0    # include salinity if there are some values which are not masked
                    self.additionalProfiles.append((profileNamePrefix, profileNo, samplingScheme.rstrip(), salinityAvailable, oxygenAvailable))
                    if salinityAvailable:
                        self.addSupplementaryPressureSalinityProfile(profileNamePrefix)
                    else:
                        self.addSupplementaryPressureProfile(profileNamePrefix)
                pass
            pass

        self.DissolvedOxygenProfile = ""
        # add dissolved oxygen profile?
        if "DOXY" in argoChannels:
            dissolvedOxygen = argoChannels["DOXY"].value[0]
            oxygenAvailable = dissolvedOxygen.count() > 0    # include oxygen if there are some values which are not masked
            if oxygenAvailable:
                self.DissolvedOxygenProfile = "DissolvedOxygen"
                self.addDissolvedOxygenProfile(self.DissolvedOxygenProfile)
                pass
            pass

        pass