From 4d7160ff23285762605a0104993f566fc380b143 Mon Sep 17 00:00:00 2001 From: John Backman Date: Fri, 20 Feb 2026 08:03:57 +0200 Subject: [PATCH 01/15] typos --- pysp2/io/read_hk.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pysp2/io/read_hk.py b/pysp2/io/read_hk.py index c7afaa6..b2f2682 100644 --- a/pysp2/io/read_hk.py +++ b/pysp2/io/read_hk.py @@ -78,9 +78,9 @@ def read_multi_hk_file(file_path): The path (with wildcards) to the housekeeping files. Examples: Read all .hk files in one directoy: - my_hk = pysp2.io.read_multi_hk_file(/path/to/directory/*.hk') + my_hk = pysp2.io.read_multi_hk_file('/path/to/directory/*.hk') Read all .hk files and check in the subdirectories as well. - my_hk = pysp2.io.read_multi_hk_file(/path/to/directory/**/*.hk') + my_hk = pysp2.io.read_multi_hk_file('/path/to/directory/**/*.hk') Returns ------- From c63e332cfd275d1071b1bc9684eff580200a6792 Mon Sep 17 00:00:00 2001 From: John Backman Date: Fri, 20 Feb 2026 08:07:42 +0200 Subject: [PATCH 02/15] added warning --- pysp2/util/particle_properties.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pysp2/util/particle_properties.py b/pysp2/util/particle_properties.py index c4a4a5c..0a9d0fe 100644 --- a/pysp2/util/particle_properties.py +++ b/pysp2/util/particle_properties.py @@ -38,6 +38,8 @@ def calc_diams_masses(input_ds, debug=True, factor=1.0, Globals=None, leo_fits=F rejectFtPosTotal = 0 if Globals is None: Globals = DMTGlobals() + print('Warning: Using DMTGlobal as default. To avoid this warning, \ + define Globals!=None as input variable to function call calc_diams_massess()') if leo_fits: input_ds = beam_shape(input_ds, beam_position_from='split point', Globals=Globals) input_ds = leo_fit(input_ds, Globals=Globals) From e4fc5cdaa994a2f536a954491a061c6cf9cef74c Mon Sep 17 00:00:00 2001 From: John Backman Date: Fri, 20 Feb 2026 10:21:26 +0200 Subject: [PATCH 03/15] added possibility to use second calibration curve for curvature for the low gain channel above a given threshold --- pysp2/util/particle_properties.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pysp2/util/particle_properties.py b/pysp2/util/particle_properties.py index 0a9d0fe..cd7e92a 100644 --- a/pysp2/util/particle_properties.py +++ b/pysp2/util/particle_properties.py @@ -129,11 +129,19 @@ def calc_diams_masses(input_ds, debug=True, factor=1.0, Globals=None, leo_fits=F output_ds['leo_ScatDiaSO4'] = xr.DataArray(1000 * (-0.015256 + 16.835 * leo_Scatter ** 0.15502), dims=['index']) + #High gain soot masses (only one calibration curve) sootMass_not_sat = factor * 1e-3 * ( Globals.c0Mass1 + Globals.c1Mass1*PkHt_ch1 + Globals.c2Mass1*PkHt_ch1**2) sootDiam_not_sat = (sootMass_not_sat/(0.5236e-9*Globals.densityBC))**(1./3.) + #Low gain soot masses (first calibration curve) sootMass_sat = factor * 1e-3 * ( Globals.c0Mass2 + Globals.c1Mass2*PkHt_ch5 + Globals.c2Mass2*PkHt_ch5**2) + #Low gain soot masses for large particles (second calibration curve) + if hasattr(Globals, 'IncanUsePeakHt2CalAfter'): + bl = PkHt_ch5 >= Globals.IncanUsePeakHt2CalAfter + sootMass_sat[bl] = factor * 1e-3 * ( + Globals.c0Mass3 + Globals.c1Mass3*PkHt_ch5[bl]**Globals.c3Mass3 + + Globals.c2Mass3*PkHt_ch5[bl]**2) sootDiam_sat = (sootMass_sat/(0.5236e-9*Globals.densityBC))**(1./3.) sootMass_not_sat = np.where(accepted_incand, sootMass_not_sat, np.nan) sootMass_sat = np.where(accepted_incand, sootMass_sat, np.nan) @@ -141,6 +149,11 @@ def calc_diams_masses(input_ds, debug=True, factor=1.0, Globals=None, leo_fits=F sootMass[unsat_incand] = sootMass_not_sat[unsat_incand] sootDiam = np.where(sat_incand, sootDiam_sat, np.nan) sootDiam[unsat_incand] = sootDiam_not_sat[unsat_incand] + if hasattr(Globals, 'IncanUsePeakHt2CalAfter'): + #Use these low gain particle masses instead of the high gain masses + use_these_instead = np.logical_and(accepted_incand, bl) + sootMass[use_these_instead] = sootMass_sat[use_these_instead] + sootDiam[use_these_instead] = sootDiam_sat[use_these_instead] output_ds['sootMass'] = (('index'), sootMass) output_ds['sootDiam'] = (('index'), sootDiam) From 143b71a8db8ddcd29d3efa77834af75f19eaa91b Mon Sep 17 00:00:00 2001 From: John Backman Date: Fri, 20 Feb 2026 10:24:39 +0200 Subject: [PATCH 04/15] added Globals as argument to process_psds() which makes for easier handling of different calibrations on the fly --- pysp2/util/particle_properties.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pysp2/util/particle_properties.py b/pysp2/util/particle_properties.py index cd7e92a..87a5f88 100644 --- a/pysp2/util/particle_properties.py +++ b/pysp2/util/particle_properties.py @@ -164,7 +164,8 @@ def calc_diams_masses(input_ds, debug=True, factor=1.0, Globals=None, leo_fits=F def process_psds(particle_ds, hk_ds, config, deltaSize=0.005, num_bins=199, - avg_interval=10,deadtime_correction=False, leo_fits=False): + avg_interval=10,deadtime_correction=False, leo_fits=False, + Globals=None): """ Processes the Scattering and BC mass size distributions: From d86f4449b6002516a5894db3dc1df8152a5c9a6e Mon Sep 17 00:00:00 2001 From: John Backman Date: Fri, 20 Feb 2026 11:17:09 +0200 Subject: [PATCH 05/15] added log bin spacing to scale to process_psds(), and some more documentation --- pysp2/util/particle_properties.py | 85 +++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 21 deletions(-) diff --git a/pysp2/util/particle_properties.py b/pysp2/util/particle_properties.py index 87a5f88..6a5922f 100644 --- a/pysp2/util/particle_properties.py +++ b/pysp2/util/particle_properties.py @@ -177,19 +177,35 @@ def process_psds(particle_ds, hk_ds, config, deltaSize=0.005, num_bins=199, The xarray Dataset containing the housekeeping variables config: dict The .ini file loaded as a dict. - deltaSize: float - The size distribution bin width in microns. + deltaSize: float or str + The size distribution bin width in microns if input is float. + If 'log' then the size distribution bin width will be even in log space. num_bins: int The number of size bins avg_interval: int The time in seconds to average the concentrations into. + deadtime_correction: bool + Set to True if you want to correct for the deatime. Default is False. + leo_fits: bool + Set to True if you want to do LEO-fits. Default is False. LEO fits are + done using utils/leo_fits.py + Globals: DMTGlobals structure or None + DMTGlobals structure containing calibration coefficients. Set to + None to use default values for MOSAiC. Returns ------- psd_ds: xarray Dataset The xarray Dataset containing the time-averaged particle statistics. """ - DMTGlobal = DMTGlobals() + + if Globals == None: + DMTGlobal = DMTGlobals() + print('Warning: Using DMTGlobal as default. To avoid this warning, \ + define Globals!=None as input variable to function call process_psds()') + else: + DMTGlobal = Globals + #Housekeeping 'Timestamp' is in seconds since 01-01-1904 00:00:00 UTC time_bins = np.arange(hk_ds['Timestamp'].values[0], hk_ds['Timestamp'].values[-1], @@ -215,7 +231,12 @@ def process_psds(particle_ds, hk_ds, config, deltaSize=0.005, num_bins=199, ScatDiaSO4 = particle_ds['ScatDiaSO4'].values / 1000. sootMass = particle_ds['sootMass'].values SizeIncandOnly = particle_ds['sootDiam'].values / 1000. - SpecSizeBins = 0.01 + np.arange(0, num_bins, 1) * deltaSize + if isinstance(deltaSize, float): + SpecSizeBins = 0.01 + np.arange(0, num_bins, 1) * deltaSize + elif deltaSize == 'log': + SpecSizeBins = np.logspace(np.log10(0.01), np.log10(1.00), num_bins+1) + #Setting deltaSize to zero will make SpecSizeBins become bin edges instead of bin centres + deltaSize = 0 ScatNumEnsembleBC = np.zeros((len(time_bins[:-1]), num_bins)) ScatMassEnsembleBC = np.zeros_like(ScatNumEnsembleBC) IncanNumEnsemble = np.zeros((len(time_bins[:-1]), num_bins)) @@ -280,33 +301,49 @@ def process_psds(particle_ds, hk_ds, config, deltaSize=0.005, num_bins=199, # Remove particles above max size the_particles_scat = np.logical_and.reduce( (the_particles, ScatDiaBC50 < SpecSizeBins[-1] + deltaSize / 2)) - ind = np.searchsorted(SpecSizeBins+deltaSize / 2, + ind = np.searchsorted(SpecSizeBins + deltaSize / 2, ScatDiaBC50[the_particles_scat], side='right') - #np.add.at(ScatNumEnsembleBC[t,:], ind, OneOfEvery) - np.add.at(ScatNumEnsembleBC[t,:], ind, OneOfEvery[the_particles_scat]) + + if deltaSize==0: + np.add.at(ScatNumEnsembleBC[t,:], ind-1, OneOfEvery[the_particles_scat]) + else: + np.add.at(ScatNumEnsembleBC[t,:], ind, OneOfEvery[the_particles_scat]) # Remove oversize particles the_particles_scat = np.logical_and.reduce( (the_particles, ScatDiaSO4 < SpecSizeBins[-1] + deltaSize / 2)) - ind = np.searchsorted(SpecSizeBins+deltaSize / 2, ScatDiaSO4[the_particles_scat], side='right') - #np.add.at(ScatNumEnsemble[t,:], ind, OneOfEvery) - np.add.at(ScatNumEnsemble[t,:], ind, OneOfEvery[the_particles_scat]) - #np.add.at(ScatMassEnsemble[t,:], ind, OneOfEvery * ScatMassSO4[the_particles_scat]) - np.add.at(ScatMassEnsemble[t,:], ind, np.multiply( - OneOfEvery[the_particles_scat], ScatMassSO4[the_particles_scat])) + ind = np.searchsorted(SpecSizeBins + deltaSize / 2, ScatDiaSO4[the_particles_scat], side='right') + + if deltaSize==0: + np.add.at(ScatNumEnsemble[t,:], ind-1, OneOfEvery[the_particles_scat]) + else: + np.add.at(ScatNumEnsemble[t,:], ind, OneOfEvery[the_particles_scat]) + + if deltaSize==0: + np.add.at(ScatMassEnsemble[t,:], ind-1, np.multiply( + OneOfEvery[the_particles_scat], ScatMassSO4[the_particles_scat])) + else: + np.add.at(ScatMassEnsemble[t,:], ind, np.multiply( + OneOfEvery[the_particles_scat], ScatMassSO4[the_particles_scat])) the_particles = np.logical_and.reduce((parts_time, incand_accept)) # Remove oversize particles the_particles_incan = np.logical_and.reduce( (the_particles, SizeIncandOnly < SpecSizeBins[-1] + deltaSize / 2)) - ind = np.searchsorted(SpecSizeBins+deltaSize / 2, + ind = np.searchsorted(SpecSizeBins + deltaSize / 2, SizeIncandOnly[the_particles_incan], side='right') - #np.add.at(IncanNumEnsemble[t,:], ind, OneOfEvery) - np.add.at(IncanNumEnsemble[t,:], ind, OneOfEvery[the_particles_incan]) - #np.add.at(IncanMassEnsemble[t,:], ind, OneOfEvery * sootMass[the_particles_incan]) - np.add.at(IncanMassEnsemble[t,:], ind, np.multiply( - OneOfEvery[the_particles_incan], sootMass[the_particles_incan])) - + if deltaSize=0: + np.add.at(IncanNumEnsemble[t,:], ind-1, OneOfEvery[the_particles_incan]) + else: + np.add.at(IncanNumEnsemble[t,:], ind, OneOfEvery[the_particles_incan]) + + if deltaSize==0: + np.add.at(IncanMassEnsemble[t,:], ind-1, np.multiply( + OneOfEvery[the_particles_incan], sootMass[the_particles_incan])) + else: + np.add.at(IncanMassEnsemble[t,:], ind, np.multiply( + OneOfEvery[the_particles_incan], sootMass[the_particles_incan])) + if leo_fits: leo_ScatDiaSO4 = particle_ds['leo_ScatDiaSO4'].values / 1000. leo_scatter_accept = ~np.isnan(leo_ScatDiaSO4) @@ -492,7 +529,13 @@ def process_psds(particle_ds, hk_ds, config, deltaSize=0.005, num_bins=199, ScatNumEnsembleBC.attrs["standard_name"] = "scattering_number_distribution (black carbon)" ScatNumEnsembleBC.attrs["units"] = "cm-3 per bin" - SpecSizeBins = xr.DataArray(SpecSizeBins, dims=('num_bins')) + if deltaSize != 0: + SpecSizeBins = xr.DataArray(SpecSizeBins, dims=('num_bins')) + else: + SpecSizeBins_ = np.zeros(num_bins) + for i in range(1,num_bins+1): + SpecSizeBins_[i-1] = np.sqrt(SpecSizeBins[i-1]*SpecSizeBins[i]) + SpecSizeBins = xr.DataArray(SpecSizeBins_, dims=('num_bins')) SpecSizeBins.attrs["long_name"] = "Spectra size bin centers" SpecSizeBins.attrs["standard_name"] = "particle_diameter" SpecSizeBins.attrs["units"] = "um" From e0309a9f6373829390adff1445432fccd48c1e47 Mon Sep 17 00:00:00 2001 From: John Backman Date: Fri, 20 Feb 2026 11:18:01 +0200 Subject: [PATCH 06/15] typo --- pysp2/util/particle_properties.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysp2/util/particle_properties.py b/pysp2/util/particle_properties.py index 6a5922f..b0064a1 100644 --- a/pysp2/util/particle_properties.py +++ b/pysp2/util/particle_properties.py @@ -332,7 +332,7 @@ def process_psds(particle_ds, hk_ds, config, deltaSize=0.005, num_bins=199, (the_particles, SizeIncandOnly < SpecSizeBins[-1] + deltaSize / 2)) ind = np.searchsorted(SpecSizeBins + deltaSize / 2, SizeIncandOnly[the_particles_incan], side='right') - if deltaSize=0: + if deltaSize==0: np.add.at(IncanNumEnsemble[t,:], ind-1, OneOfEvery[the_particles_incan]) else: np.add.at(IncanNumEnsemble[t,:], ind, OneOfEvery[the_particles_incan]) From 3f4c25a12589e7221b4d6fee6144064b2852b49b Mon Sep 17 00:00:00 2001 From: John Backman Date: Fri, 20 Feb 2026 11:40:09 +0200 Subject: [PATCH 07/15] bugfix --- pysp2/util/particle_properties.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysp2/util/particle_properties.py b/pysp2/util/particle_properties.py index b0064a1..e8d96d6 100644 --- a/pysp2/util/particle_properties.py +++ b/pysp2/util/particle_properties.py @@ -535,7 +535,7 @@ def process_psds(particle_ds, hk_ds, config, deltaSize=0.005, num_bins=199, SpecSizeBins_ = np.zeros(num_bins) for i in range(1,num_bins+1): SpecSizeBins_[i-1] = np.sqrt(SpecSizeBins[i-1]*SpecSizeBins[i]) - SpecSizeBins = xr.DataArray(SpecSizeBins_, dims=('num_bins')) + SpecSizeBins = xr.DataArray(SpecSizeBins_, dims=('num_bins')) SpecSizeBins.attrs["long_name"] = "Spectra size bin centers" SpecSizeBins.attrs["standard_name"] = "particle_diameter" SpecSizeBins.attrs["units"] = "um" From 851c7764d4cf8f79fdeaf0fcf422f66d8859c15f Mon Sep 17 00:00:00 2001 From: John Backman Date: Wed, 4 Mar 2026 08:40:13 +0200 Subject: [PATCH 08/15] removed c3Mass1 and c3Mass2 from globals. They are not in use in the code. --- pysp2/util/DMTGlobals.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pysp2/util/DMTGlobals.py b/pysp2/util/DMTGlobals.py index e4212c2..a4b1ae1 100644 --- a/pysp2/util/DMTGlobals.py +++ b/pysp2/util/DMTGlobals.py @@ -72,15 +72,13 @@ def __init__(self, cal_file_name=None): self.IncanMaxPeakRatio = 25 self.IncanMaxPeakOffset = 11 # Default values are for Brookhaven SP2, unit # 24 - 2010-11-17 - RS - # mass(fg) = c0Mass1 + c1Mass1 * PkHt_ch1 + c2Mass1 * PkHt_ch1 ^ 2 + c3Mass1 * PkHt_ch1 ^ 3 - High - gain + # mass(fg) = c0Mass1 + c1Mass1 * PkHt_ch1 + c2Mass1 * PkHt_ch1 ^ 2 - High - gain self.c0Mass1 = 0 self.c1Mass1 = 0.0001896 self.c2Mass1 = 0 - self.c3Mass1 = 0 self.c0Mass2 = 0 self.c1Mass2 = 0.0016815 self.c2Mass2 = 0 - self.c3Mass2 = 0 self.c0Scat1 = 0 self.c1Scat1 = 78.141 self.c2Scat1 = 0 From 4bb3ed80456a905ab129e44239a912c095a9ad73 Mon Sep 17 00:00:00 2001 From: John Backman Date: Wed, 4 Mar 2026 10:40:19 +0200 Subject: [PATCH 09/15] added attributes to dims leo_bins and incand_bins --- pysp2/util/particle_properties.py | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/pysp2/util/particle_properties.py b/pysp2/util/particle_properties.py index e8d96d6..679552b 100644 --- a/pysp2/util/particle_properties.py +++ b/pysp2/util/particle_properties.py @@ -560,28 +560,25 @@ def process_psds(particle_ds, hk_ds, config, deltaSize=0.005, num_bins=199, 'ScatNumEnsembleBC': ScatNumEnsembleBC, 'NumFracBC': NumFracBC}) if leo_fits: + coords = {'time': time, 'incand_bins': SpecSizeBins.values, 'leo_bins': SpecSizeBins.values} #Make the DataArray with differently named size dimensions - leo_IncandScatNumEnsemble = xr.DataArray(leo_IncandScatNumEnsemble, dims=('time', 'incand_bins', 'leo_bins')) + leo_IncandScatNumEnsemble = xr.DataArray(leo_IncandScatNumEnsemble.astype(np.float32), + dims=('time', 'incand_bins', 'leo_bins'), + coords=coords) + leo_IncandScatNumEnsemble.attrs["long_name"] = "2D incandesence size (black carbon core) and leo size (shell) \ number size distributions. Dimensions are (time,incandesence size, leo size)" leo_IncandScatNumEnsemble.attrs["standard_name"] = "2D core / shell size number size distributions" leo_IncandScatNumEnsemble.attrs["units"] = "cm-3 per bin" - - #Add new dimensions (xarray want's different dimension names although the dimensions are the - #same) - IncandSizeBins = xr.DataArray(SpecSizeBins, dims=('incand_bins')) - IncandSizeBins.attrs["long_name"] = "Incandesence (core) size bin centers" - IncandSizeBins.attrs["standard_name"] = "particle_diameter" - IncandSizeBins.attrs["units"] = "um" - - LeoSizeBins = xr.DataArray(SpecSizeBins, dims=('leo_bins')) - LeoSizeBins.attrs["long_name"] = "Leo (shell) size bin centers" - LeoSizeBins.attrs["standard_name"] = "particle_diameter" - LeoSizeBins.attrs["units"] = "um" - - #add the dimensions to the Dataset - psd_ds = psd_ds.expand_dims(dim={'incand_bins': IncandSizeBins, 'leo_bins': LeoSizeBins}) + #add the 2D (core,shell) variable psd_ds['leo_IncandScatNumEnsemble'] = leo_IncandScatNumEnsemble - + #explanation for the coordinates + psd_ds['incand_bins'] = psd_ds.leo_bins.assign_attrs(units="um", + standard_name="particle_diameter", + long_name="Incandesence (core) size bin centers") + psd_ds['leo_bins'] = psd_ds.leo_bins.assign_attrs(units="um", + standard_name="particle_diameter", + long_name="Leo (shell) size bin centers") + return psd_ds From f5fb6902905b975032bd15467db1827a4333bcf8 Mon Sep 17 00:00:00 2001 From: John Backman Date: Wed, 4 Mar 2026 12:58:33 +0200 Subject: [PATCH 10/15] added leo_ variables to dat file if they are present in the variables list --- pysp2/io/write_dat.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pysp2/io/write_dat.py b/pysp2/io/write_dat.py index ade95f7..77d76be 100644 --- a/pysp2/io/write_dat.py +++ b/pysp2/io/write_dat.py @@ -43,7 +43,11 @@ def write_dat(ds, file_name): "IncanRatioch5ch6", "IncanPkOffsetch5ch6", "IncanRatioch1ch2", "IncanPkOffsetch1ch2", "ScatRejectKey", "IncanRejectKey", "OneofEvery", - "DeadtimeRelativeBias"] + "DeadtimeRelativeBias", "leo_AmpFactor_ch0", + "leo_AmpFactor_ch4", "leo_PkFWHM_ch0", "leo_PkFWHM_ch4", + "leo_PkPos_ch0", "leo_PkPos_ch4", "leo_EndPos_ch0", + "leo_EndPos_ch4", "leo_FtAmp_ch0", "leo_FtAmp_ch4", + "leo_Base_ch0", "leo_Base_ch4", "leo_ScatDiaSO4"] drop_list = [] for varname in ds.variables.keys(): if varname not in index_label: From c4ab3967d744b42c08cbba8c473157cc94f66155 Mon Sep 17 00:00:00 2001 From: John Backman Date: Wed, 4 Mar 2026 22:30:58 +0200 Subject: [PATCH 11/15] added automation for leo variables, bugfix --- pysp2/io/write_dat.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pysp2/io/write_dat.py b/pysp2/io/write_dat.py index 77d76be..badac77 100644 --- a/pysp2/io/write_dat.py +++ b/pysp2/io/write_dat.py @@ -43,16 +43,22 @@ def write_dat(ds, file_name): "IncanRatioch5ch6", "IncanPkOffsetch5ch6", "IncanRatioch1ch2", "IncanPkOffsetch1ch2", "ScatRejectKey", "IncanRejectKey", "OneofEvery", - "DeadtimeRelativeBias", "leo_AmpFactor_ch0", + "DeadtimeRelativeBias" , "leo_AmpFactor_ch0", "leo_AmpFactor_ch4", "leo_PkFWHM_ch0", "leo_PkFWHM_ch4", "leo_PkPos_ch0", "leo_PkPos_ch4", "leo_EndPos_ch0", "leo_EndPos_ch4", "leo_FtAmp_ch0", "leo_FtAmp_ch4", "leo_Base_ch0", "leo_Base_ch4", "leo_ScatDiaSO4"] + drop_list = [] for varname in ds.variables.keys(): if varname not in index_label: drop_list.append(varname) - + drop_list_2 = [] + for varname in index_label: + if varname not in ds.variables.keys(): + drop_list_2.append(varname) + [index_label.remove(varname) for varname in drop_list_2] + smaller_ds = ds.drop(drop_list) pandas_ds = smaller_ds.to_dataframe() sp2_header = ["Instrument Type=SP2\n", "****\n"] From 5317bdca315e94af091ec434d53758a241611cca Mon Sep 17 00:00:00 2001 From: John Backman Date: Thu, 5 Mar 2026 00:30:37 +0200 Subject: [PATCH 12/15] back to square one --- pysp2/io/write_dat.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/pysp2/io/write_dat.py b/pysp2/io/write_dat.py index badac77..f2bc8c5 100644 --- a/pysp2/io/write_dat.py +++ b/pysp2/io/write_dat.py @@ -53,13 +53,8 @@ def write_dat(ds, file_name): for varname in ds.variables.keys(): if varname not in index_label: drop_list.append(varname) - drop_list_2 = [] - for varname in index_label: - if varname not in ds.variables.keys(): - drop_list_2.append(varname) - [index_label.remove(varname) for varname in drop_list_2] - - smaller_ds = ds.drop(drop_list) + + smaller_ds = ds[index_label] pandas_ds = smaller_ds.to_dataframe() sp2_header = ["Instrument Type=SP2\n", "****\n"] pandas_ds['TimeWave'] = pandas_ds['TimeWave'].map(lambda x: "%.16g" % x) From c7ca8083718b3a230752fa6109b81169af5b82ef Mon Sep 17 00:00:00 2001 From: John Backman Date: Thu, 5 Mar 2026 00:31:57 +0200 Subject: [PATCH 13/15] back to square one --- pysp2/io/write_dat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysp2/io/write_dat.py b/pysp2/io/write_dat.py index f2bc8c5..407e381 100644 --- a/pysp2/io/write_dat.py +++ b/pysp2/io/write_dat.py @@ -54,7 +54,7 @@ def write_dat(ds, file_name): if varname not in index_label: drop_list.append(varname) - smaller_ds = ds[index_label] + smaller_ds = ds.drop(drop_list) pandas_ds = smaller_ds.to_dataframe() sp2_header = ["Instrument Type=SP2\n", "****\n"] pandas_ds['TimeWave'] = pandas_ds['TimeWave'].map(lambda x: "%.16g" % x) From 5d99199be7d45388d6fc20298e61eb59691734f7 Mon Sep 17 00:00:00 2001 From: John Backman Date: Mon, 9 Mar 2026 19:29:26 +0200 Subject: [PATCH 14/15] removed leo variables. Will do it in another way. xarray.to_dataframe() does not work with leo_* variables --- pysp2/io/write_dat.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pysp2/io/write_dat.py b/pysp2/io/write_dat.py index 407e381..15fd600 100644 --- a/pysp2/io/write_dat.py +++ b/pysp2/io/write_dat.py @@ -43,17 +43,13 @@ def write_dat(ds, file_name): "IncanRatioch5ch6", "IncanPkOffsetch5ch6", "IncanRatioch1ch2", "IncanPkOffsetch1ch2", "ScatRejectKey", "IncanRejectKey", "OneofEvery", - "DeadtimeRelativeBias" , "leo_AmpFactor_ch0", - "leo_AmpFactor_ch4", "leo_PkFWHM_ch0", "leo_PkFWHM_ch4", - "leo_PkPos_ch0", "leo_PkPos_ch4", "leo_EndPos_ch0", - "leo_EndPos_ch4", "leo_FtAmp_ch0", "leo_FtAmp_ch4", - "leo_Base_ch0", "leo_Base_ch4", "leo_ScatDiaSO4"] + "DeadtimeRelativeBias"] drop_list = [] for varname in ds.variables.keys(): if varname not in index_label: drop_list.append(varname) - + print(drop_list) smaller_ds = ds.drop(drop_list) pandas_ds = smaller_ds.to_dataframe() sp2_header = ["Instrument Type=SP2\n", "****\n"] From 7d16e879ad53ee73f02820986d61425ddf0f3018 Mon Sep 17 00:00:00 2001 From: John Backman Date: Mon, 9 Mar 2026 19:30:13 +0200 Subject: [PATCH 15/15] removed print --- pysp2/io/write_dat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysp2/io/write_dat.py b/pysp2/io/write_dat.py index 15fd600..3aa4f7f 100644 --- a/pysp2/io/write_dat.py +++ b/pysp2/io/write_dat.py @@ -49,7 +49,7 @@ def write_dat(ds, file_name): for varname in ds.variables.keys(): if varname not in index_label: drop_list.append(varname) - print(drop_list) + smaller_ds = ds.drop(drop_list) pandas_ds = smaller_ds.to_dataframe() sp2_header = ["Instrument Type=SP2\n", "****\n"]