diff --git a/pyaerocom/aeroval/glob_defaults.py b/pyaerocom/aeroval/glob_defaults.py index 5f4b7727a..390e58459 100644 --- a/pyaerocom/aeroval/glob_defaults.py +++ b/pyaerocom/aeroval/glob_defaults.py @@ -308,6 +308,17 @@ vmrox=["OX", "3D", "Gas volume mixing ratio"], concco=["CO", "3D", "Particle concentration"], vmrco=["CO", "3D", "Volume mixing ratios"], + vmrhcho=["HCHO (Formaldehyde)", "3D", "Volume mixing ratios"], + vmrisop=["C5H8 (Isoprene)", "3D", "Volume mixing ratios"], + vmrc2h6=["C2H6 (Ethane)", "3D", "Volume mixing ratios"], + vmrc2h4=["C2H4 (Ethylene)", "3D", "Volume mixing ratios"], + vmrnc4h10=["nC4H10 (n-Butane)", "3D", "Volume mixing ratios"], + vmric4h10=["iC4H10 (2-methylpropane)", "3D", "Volume mixing ratios"], + vmrbenzene=["C6H6 (Benzene)", "3D", "Volume mixing ratios"], + vmrc10h16=["C10H16 (Alpha-Pinene)", "3D", "Volume mixing ratios"], + vmrch3cho=["CH3CHO (Acetaldehyde)", "3D", "Volume mixing ratios"], + vmrglyoxal=["Glyoxal", "3D", "Volume mixing ratios"], + vmrtolu=["Toluene", "3D", "Volume mixing ratios"], # PMs concpm10=["PM10", "3D", "Particle concentrations"], concpm25=["PM2.5", "3D", "Particle concentrations"], diff --git a/pyaerocom/data/aliases.ini b/pyaerocom/data/aliases.ini index 54aa19ac4..2a04f5d5b 100644 --- a/pyaerocom/data/aliases.ini +++ b/pyaerocom/data/aliases.ini @@ -49,6 +49,7 @@ dryoxs = drysox concss10 = concsscoarse concsscoarse=concss10 vmrglyoxal = vmrglyox +concbenzene = vmrbenzene [alias_families] # so far only works with beginning of name diff --git a/pyaerocom/data/ebas_config.ini b/pyaerocom/data/ebas_config.ini index 9622f1c64..a1eba0ec6 100644 --- a/pyaerocom/data/ebas_config.ini +++ b/pyaerocom/data/ebas_config.ini @@ -399,10 +399,48 @@ matrix=precip component=precipitation_amount_off,precipitation_amount matrix=precip +# VOCs +[vmrvoc] +component=voc_complete +matrix=air + +[vmrch3cho] +component=ethanal +matrix=air + +[vmrnc4h10] +component=n-butane +matrix=air + +[vmric4h10] +component=2-methylpropane +matrix=air + +[concnc4h10] +component=n-butane +matrix=air + +[concic4h10] +component=2-methylpropane +matrix=air + +[vmrbenzene] +component=benzene +matrix=air + +[vmrc10h16] +component=alpha-pinene +matrix=air + +[vmrtolu] +component=toluene +matrix=air + [concCocpm10] component=organic_carbon matrix=pm10 [concCecpm10] component=elemental_carbon -matrix=pm10 \ No newline at end of file +matrix=pm10 + diff --git a/pyaerocom/data/paths.ini b/pyaerocom/data/paths.ini index ef7cb6b6d..3477a8e6c 100644 --- a/pyaerocom/data/paths.ini +++ b/pyaerocom/data/paths.ini @@ -82,7 +82,8 @@ AERONET_INV_V3L15_DAILY = ${BASEDIR}/aerocom/aerocom1/AEROCOM_OBSDATA/Aeronet.In AERONET_INV_V3L2_DAILY = ${BASEDIR}/aerocom/aerocom1/AEROCOM_OBSDATA/Aeronet.Inv.V3L2.0.daily/renamed # other observations -EBAS_MULTICOLUMN = ${BASEDIR}/aerocom/aerocom1/AEROCOM_OBSDATA/EBASMultiColumn/data +#EBAS_MULTICOLUMN = ${BASEDIR}/aerocom/aerocom1/AEROCOM_OBSDATA/EBASMultiColumn/data +EBAS_MULTICOLUMN = /lustre/storeB/project/aerocom/aerocom1/AEROCOM_OBSDATA/EBASMultiColumn/data EEA = ${BASEDIR}/aerocom/aerocom1/AEROCOM_OBSDATA/EEA_AQeRep/renamed EARLINET = ${BASEDIR}/aerocom/aerocom1/AEROCOM_OBSDATA/Export/Earlinet/CAMS/data GAWTADsubsetAasEtAl = ${BASEDIR}/aerocom/aerocom1/AEROCOM_OBSDATA/PYAEROCOM/GAWTADSulphurSubset/data diff --git a/pyaerocom/data/variables.ini b/pyaerocom/data/variables.ini index 445c0c9d7..165a2551a 100644 --- a/pyaerocom/data/variables.ini +++ b/pyaerocom/data/variables.ini @@ -3150,9 +3150,9 @@ var_name = vmrch3cho description = acetaldehyde Volume Mixing Ratio standard_name = mole_fraction_of_acetaldehyde_in_air var_type = volume mixing ratios -unit = mol mol-1 -minimum = 0 -maximum = 0.1 +unit = nmol mol-1 +minimum = -1e12 +maximum = 1e12 dimensions = time,lat,lon comments_and_purpose = Verification of VOC speciation/chemistry @@ -3204,9 +3204,9 @@ var_name = vmrtolu description = toluene Volume Mixing Ratio standard_name = mole_fraction_of_toluene_in_air var_type = volume mixing ratios -unit = mol mol-1 -minimum = 0 -maximum = 0.1 +unit = nmol mol-1 +minimum = -1e12 +maximum = 1e12 dimensions = time,lat,lon comments_and_purpose = Verification of VOC speciation/chemistry @@ -3237,7 +3237,7 @@ var_name = vmrc10h16 description = alpha-pinene Volume Mixing Ratio standard_name = mole_fraction_of_alpha_pinene_in_air var_type = volume mixing ratios -unit = mol mol-1 +unit = nmol mol-1 minimum = 0 maximum = 0.1 dimensions = time,lat,lon @@ -5320,7 +5320,7 @@ unit = m s-1 minimum = -150 maximum = 150 dimensions = time,lev,station -comments_and_purpose = For physics evaluation and chemistry interpretation above stations' locations. +comments_and_purpose = For physics evaluation and chemistry interpretation above stations locations. [wa] var_name = wa @@ -5331,7 +5331,75 @@ unit = m s-1 minimum = -150 maximum = 150 dimensions = time,lev,station -comments_and_purpose = For physics evaluation and chemistry interpretation above stations' locations. +comments_and_purpose = For physics evaluation and chemistry interpretation above stations locations. + +[vmrbenzene] +var_name = vmrbenzene +description = mole_fraction_of_benzene_in_air +standard_name = benzene +var_type = volume mixing ratios +unit = nmol mol-1 +minimum = -1e12 +maximum = 1e12 +dimensions = time, lat, lon +comments_and_purpose = Verification of VOC speciation/chemistry. + +[concbenzene] +var_name = concbenzene +description = concentration_of_benzene_in_air +standard_name = benzene +var_type = mass concentration +unit = ug m-3 +minimum = -1e12 +maximum = 1e12 +dimensions = time, lat, lon +comments_and_purpose = Verification of VOC speciation/chemistry. + + +[vmrnc4h10] +var_name = vmrnc4h10 +description = mole_fraction_of_n-butane_in_air +standard_name = n-butane +var_type = volume mixing ratios +unit = nmol mol-1 +minimum = -1e12 +maximum = 1e12 +dimensions = time, lat, lon +comments_and_purpose = Verification of VOC speciation/chemistry. + +[vmric4h10] +var_name = vmric4h10 +description = mole_fraction_of_2-methylpropane_in_air +standard_name = 2-methylpropane +var_type = volume mixing ratios +unit = nmol mol-1 +minimum = -1e12 +maximum = 1e12 +dimensions = time, lat, lon +comments_and_purpose = Verification of VOC speciation/chemistry. + +[concnc4h10] +var_name= concnc4h10 +description = concentration_of_i-butane_in_air +standard_name = n-butane +var_type = mass concentration +unit = ug S m-3 +minimum = -1e12 +maximum = 1e12 +dimensions = time, lat, lon +comments_and_purpose = Verification of VOC speciation/chemistry. + +[concic4h10] +var_name= concic4h10 +description = concentration_of_i-butane_in_air +standard_name = 2-methylpropane +var_type = mass concentration +unit = ug S m-3 +minimum = -1e12 +maximum = 1e12 +dimensions = time, lat, lon +comments_and_purpose = Verification of VOC speciation/chemistry. + [ratpm10pm25] description = ratio of pm10 and pm25 @@ -5346,3 +5414,4 @@ unit = 1 minimum = -150 maximum = 150 dimensions = time,lat,lon + diff --git a/pyaerocom/io/read_eea_aqerep_base.py b/pyaerocom/io/read_eea_aqerep_base.py index 414f86025..3e3194d86 100644 --- a/pyaerocom/io/read_eea_aqerep_base.py +++ b/pyaerocom/io/read_eea_aqerep_base.py @@ -76,6 +76,8 @@ class ReadEEAAQEREPBase(ReadUngriddedBase): VAR_NAMES_FILE["vmro3"] = "concentration" VAR_NAMES_FILE["vmro3max"] = "concentration" VAR_NAMES_FILE["vmrno2"] = "concentration" + VAR_NAMES_FILE["concbenzene"] = "concentration" + VAR_NAMES_FILE["vmrbenzene"] = "concentration" VAR_NAMES_FILE["concSso2"] = "concentration" VAR_NAMES_FILE["concNno"] = "concentration" @@ -102,6 +104,8 @@ class ReadEEAAQEREPBase(ReadUngriddedBase): concco="**/??_10_*_timeseries.csv*", concno="**/??_38_*_timeseries.csv*", concpm25="**/??_6001_*_timeseries.csv*", + concbenzene="**/??_20_*_timeseries.csv*", + vmrbenzene="**/??_20_*_timeseries.csv*", concSso2="**/??_1_*_timeseries.csv*", concNno2="**/??_8_*_timeseries.csv*", concNno="**/??_38_*_timeseries.csv*", @@ -122,6 +126,7 @@ class ReadEEAAQEREPBase(ReadUngriddedBase): CONV_FACTOR["vmrno2"] = np.float_( 0.514 ) # retrieved using STD atmosphere from geonum and pya.mathutils.concx_to_vmrx + CONV_FACTOR["vmrbenzene"] = np.float_(1.0 / 3.2430) # unit of the converted property after the conversion CONV_UNIT = {} @@ -131,7 +136,7 @@ class ReadEEAAQEREPBase(ReadUngriddedBase): CONV_UNIT["vmro3"] = "ppb" CONV_UNIT["vmro3max"] = "ppb" CONV_UNIT["vmrno2"] = "ppb" - + CONV_UNIT["vmrbenzene"] = "ppb" #: field name of the start time of the measurement (in lower case) START_TIME_NAME = "datetimebegin" @@ -147,6 +152,7 @@ class ReadEEAAQEREPBase(ReadUngriddedBase): VAR_CODES["10"] = "concco" VAR_CODES["38"] = "concno" VAR_CODES["6001"] = "concpm25" + VAR_CODES["20"] = "concbenzene" #: column name that holds the EEA variable code VAR_CODE_NAME = "airpollutantcode" @@ -198,12 +204,14 @@ class ReadEEAAQEREPBase(ReadUngriddedBase): "concNno2": ["concno2"], "concNno": ["concno"], "concSso2": ["concso2"], + "vmrbenzene": ["concbenzene"], } AUX_FUNS = { "vmro3": NotImplementedError(), "vmro3max": NotImplementedError(), "vmrno2": NotImplementedError(), + "vmrbenzene": NotImplementedError(), "concNno2": NotImplementedError(), "concNno": NotImplementedError(), "concSso2": NotImplementedError(), diff --git a/pyaerocom/plugins/mscw_ctm/emep_variables.toml b/pyaerocom/plugins/mscw_ctm/emep_variables.toml index 0dda9c5dc..ce3a00c08 100644 --- a/pyaerocom/plugins/mscw_ctm/emep_variables.toml +++ b/pyaerocom/plugins/mscw_ctm/emep_variables.toml @@ -53,6 +53,8 @@ concbcc = "SURF_ug_ECCOARSE" concbcf = "SURF_ug_ECFINE" concdust = "SURF_ug_DUST" conchno3 = "SURF_ug_HNO3" +concnc4h10= "SURF_ug_NC4H10_T" +concic4h10= "SURF_ug_IC4H10_T" concnh3 = "SURF_ug_NH3" concnh4 = "SURF_ug_NH4_F" concnh4coarse = "SURF_ug_NH4_F" @@ -78,15 +80,22 @@ concssf = "SURF_ug_SEASALT_F" concssc = "SURF_ug_SEASALT_C" concCocpm25 = "SURF_ugC_PM_OM25" concecpm25 = "SURF_ug_ECFINE" +vmrc10h16= "SURF_ppb_APINENE" vmro32m = "SURF_2MO3" vmro3max = "SURF_MAXO3" vmro3 = "SURF_ppb_O3" vmrco = "SURF_ppb_CO" vmrc2h6 = "SURF_ppb_C2H6" vmrc2h4 = "SURF_ppb_C2H4" +vmrbenzene= "SURF_ppb_BENZENE" +vmrch3cho= "SURF_ppb_CH3CHO" vmrhcho = "SURF_ppb_HCHO" +vmrnc4h10= "SURF_ppb_NC4H10_T" +vmric4h10= "SURF_ppb_IC4H10_T" vmrglyoxal = "SURF_ppb_GLYOX" vmrisop = "SURF_ppb_C5H8" +vmrtolu= "SURF_ppb_TOLUENE" +vmrvoc= "SURF_ppbC_VOC" wetbc = "WDEP_EC" wetdust = "WDEP_DUST" wetnh4 = "WDEP_NH4_f" diff --git a/pyaerocom/plugins/mscw_ctm/reader.py b/pyaerocom/plugins/mscw_ctm/reader.py index ac0607ec9..ee2a6fcf3 100755 --- a/pyaerocom/plugins/mscw_ctm/reader.py +++ b/pyaerocom/plugins/mscw_ctm/reader.py @@ -84,6 +84,7 @@ class ReadMscwCtm: # "vmrox": ["concno2", "vmro3"], "vmrox": ["concno2", "conco3"], "vmrno2": ["concno2"], + # "concbenzene": ["vmrbenezene"], "concNtno3": ["concoxn"], "concNtnh": ["concrdn"], # "concNtno3": ["conchno3", "concno3f", "concno3c"], diff --git a/pyaerocom/units_helpers.py b/pyaerocom/units_helpers.py index b17be3f03..3b16980c2 100644 --- a/pyaerocom/units_helpers.py +++ b/pyaerocom/units_helpers.py @@ -58,6 +58,10 @@ # ["concnh4", "ug N/m3", "ug m-3", M_NH4 / M_N], ["wetso4", "kg S/ha", "kg m-2", M_SO4 / M_S / HA_TO_SQM], ["concso4pr", "mg S/L", "g m-3", M_SO4 / M_S], + # ["vmrbenzene", "ppb", "ug m-3", 3.2430], # Source (EC): https://uk-air.defra.gov.uk/assets/documents/reports/cat06/0502160851_Conversion_Factors_Between_ppb_and.pdf + ["vmrbenzene", "ppb", "nmol mol-1", 1.0], + ["vmrbenzene", "pmol mol -1", "ppb", 1000.], + ["concbenzene", "ppb", "ug m-3", 3.2430] ], columns=["var_name", "from", "to", "fac"], ).set_index(["var_name", "from"]) diff --git a/tests/io/test_read_ebas.py b/tests/io/test_read_ebas.py index 1e7869546..5e5988a16 100644 --- a/tests/io/test_read_ebas.py +++ b/tests/io/test_read_ebas.py @@ -225,23 +225,13 @@ def test_NAN_VAL(reader: ReadEbas): def test_PROVIDES_VARIABLES(reader: ReadEbas): PROVIDES_VARIABLES = { "DEFAULT", - "concca", - "concmg", - "conck", - "sc550aer", - "sc440aer", - "sc700aer", - "sc550dryaer", - "sc440dryaer", - "sc700dryaer", - "sc550lt1aer", - "bsc550aer", + "SO4ugSm3", "ac550aer", "ac550dryaer", "ac550lt1aer", - "bsc550dryaer", - "scrh", "acrh", + "bsc550aer", + "bsc550dryaer", "ts", "concso4", "SO4ugSm3", @@ -257,50 +247,92 @@ def test_PROVIDES_VARIABLES(reader: ReadEbas): "concbc", "conceqbc", "concCec", + "concCecpm10", "concCecpm25", - "conctc", - "concoa", - "concoc", "concCoc", + "concCocpm10", "concCocpm25", - "concss", - "concsspm10", - "concsspm25", - "concnh3", + "concNhno3", "concNnh3", - "concno3", + "concNnh4", + "concNno", + "concNno2", "concNno3pm10", "concNno3pm25", - "concnh4", - "concNnh4", - "concNhno3", - "concNtno3", "concNtnh", + "concNtno3", + "concSso2", + "concbc", + "concca", + "concco", + "conceqbc", + "concglyoxal", + "conchcho", + "concic4h10", + "conck", + "concmg", + "concnc4h10", + "concnh3", + "concnh4", + "concnh4coarse", + "concnh4fine", "concno", "concno2", - "concNno2", - "conchcho", + "concno3", + "concno3pm10", + "concno3pm25", "conco3", - "concco", - "vmro3", - "vmro3max", - "vmrco", - "vmrno2", - "vmrno", - "vmrisop", - "vmrhcho", - "vmrglyoxal", - "vmrc2h6", - "vmrc2h4", - "concglyoxal", - "concprcpoxs", + "concoa", + "concoc", + "concpm1", + "concpm10", + "concpm25", "concprcpoxn", + "concprcpoxs", "concprcprdn", - "wetoxs", - "wetrdn", - "wetoxn", + "concso2", + "concso4", + "concso4c", + "concso4coarse", + "concso4fine", + "concso4pm10", + "concso4pm25", + "concso4t", + "concss", + "concsspm10", + "concsspm25", + "conctc", "pr", "prmm", + "sc440aer", + "sc440dryaer", + "sc550aer", + "sc550dryaer", + "sc550lt1aer", + "sc700aer", + "sc700dryaer", + "scrh", + "vmrbenzene", + "vmrc10h16", + "vmrc2h4", + "vmrc2h6", + "vmrch3cho", + "vmrco", + "vmrglyoxal", + "vmrhcho", + "vmric4h10", + "vmrisop", + "vmrnc4h10", + "vmrno", + "vmrno2", + "vmro3", + "vmro3max", + "vmrso2", + "vmrtolu", + "vmrvoc", + "wetoxn", + "wetoxs", + "wetrdn", "concnh4fine", "concCocpm10", "concNno", @@ -313,7 +345,8 @@ def test_PROVIDES_VARIABLES(reader: ReadEbas): "concno3pm25", } - assert set(reader.PROVIDES_VARIABLES) == (PROVIDES_VARIABLES) +assert set(reader.PROVIDES_VARIABLES) == (PROVIDES_VARIABLES) + def test_sqlite_database_file(reader: ReadEbas): diff --git a/tests/plugins/mscw_ctm/test_reader.py b/tests/plugins/mscw_ctm/test_reader.py index 800dcddac..ef9036d57 100644 --- a/tests/plugins/mscw_ctm/test_reader.py +++ b/tests/plugins/mscw_ctm/test_reader.py @@ -28,6 +28,9 @@ "dryoa": "DDEP_OM25_m2Grid", "dryso2": "DDEP_SO2_m2Grid", "dryso4": "DDEP_SO4_m2Grid", + "dryoxs": "DDEP_SOX_m2Grid", + "dryrdn": "DDEP_RDN_m2Grid", + "dryoxn": "DDEP_OXN_m2Grid", "dryss": "DDEP_SS_m2Grid", "ec550aer": "EXT_550nm", "ec550dryaer": "EXTdry_550nm", @@ -67,8 +70,12 @@ "concbcf": "SURF_ug_ECFINE", "concdust": "SURF_ug_DUST", "conchno3": "SURF_ug_HNO3", + "concnc4h10": "SURF_ug_NC4H10_T", + "concic4h10": "SURF_ug_IC4H10_T", "concnh3": "SURF_ug_NH3", "concnh4": "SURF_ug_NH4_F", + "concnh4coarse": "SURF_ug_NH4_F", + "concnh4fine": "SURF_ug_NH4_F", "concno2": "SURF_ug_NO2", "concno3c": "SURF_ug_NO3_C", "concno3f": "SURF_ug_NO3_F", @@ -81,18 +88,30 @@ "concrdn": "SURF_ugN_RDN", "concso2": "SURF_ug_SO2", "concso4": "SURF_ug_SO4", + "concso4c": "SURF_ug_SO4", + "concso4coarse": "SURF_ug_SO4", + "concso4fine": "SURF_ug_SO4", "concss": "SURF_ug_SS", "concssf": "SURF_ug_SEASALT_F", + "concssc": "SURF_ug_SEASALT_C", "concCocpm25": "SURF_ugC_PM_OM25", + "concecpm25": "SURF_ug_ECFINE", + "vmrc10h16": "SURF_ppb_APINENE", "vmro32m": "SURF_2MO3", "vmro3max": "SURF_MAXO3", "vmro3": "SURF_ppb_O3", "vmrco": "SURF_ppb_CO", "vmrc2h6": "SURF_ppb_C2H6", "vmrc2h4": "SURF_ppb_C2H4", + "vmrbenzene": "SURF_ppb_BENZENE", + "vmrch3cho": "SURF_ppb_CH3CHO", "vmrhcho": "SURF_ppb_HCHO", + "vmrnc4h10": "SURF_ppb_NC4H10_T", + "vmric4h10": "SURF_ppb_IC4H10_T", "vmrglyoxal": "SURF_ppb_GLYOX", "vmrisop": "SURF_ppb_C5H8", + "vmrtolu": "SURF_ppb_TOLUENE", + "vmrvoc": "SURF_ppbC_VOC", "wetbc": "WDEP_EC", "wetdust": "WDEP_DUST", "wetnh4": "WDEP_NH4_f", @@ -106,21 +125,11 @@ "wetss": "WDEP_SS", "z3d": "Z_MID", "prmm": "WDEP_PREC", - "concecpm25": "SURF_ug_ECFINE", - "concssc": "SURF_ug_SEASALT_C", - "dryoxn": "DDEP_OXN_m2Grid", - "dryoxs": "DDEP_SOX_m2Grid", - "dryrdn": "DDEP_RDN_m2Grid", - "concCocCoarse": "SURF_ugC_PM_OMCOARSE", "concCocFine": "SURF_ugC_PM_OM25", - "concecCoarse": "SURF_ug_ECCOARSE", + "concCocCoarse": "SURF_ugC_PM_OMCOARSE", "concecFine": "SURF_ug_ECFINE", - "concnh4coarse": "SURF_ug_NH4_F", - "concnh4fine": "SURF_ug_NH4_F", + "concecCoarse": "SURF_ug_ECCOARSE", "concoxn": "SURF_ugN_OXN", - "concso4c": "SURF_ug_SO4", - "concso4coarse": "SURF_ug_SO4", - "concso4fine": "SURF_ug_SO4", "vmrno": "SURF_ppb_NO", } diff --git a/tests/test_varcollection.py b/tests/test_varcollection.py index 2390c82ca..17901216d 100644 --- a/tests/test_varcollection.py +++ b/tests/test_varcollection.py @@ -83,7 +83,7 @@ def test_VarCollection_get_var_error(collection: VarCollection): ("*blaaaaaaa*", 0), ("dep*", 0), ("od*", 26), - ("conc*", 82), + ("conc*", 85), ], ) def test_VarCollection_find(collection: VarCollection, search_pattern: str, num: int):