--- a/atmospheric_lidar/generic.py Fri Sep 22 14:33:51 2017 +0300 +++ b/atmospheric_lidar/generic.py Fri Sep 22 15:02:53 2017 +0300 @@ -334,12 +334,20 @@ temp_v = f.createVariable(channel_var, variable_type, ('channels',)) for n, channel in enumerate(channels): temp_v[n] = params.channel_parameters[channel][channel_var] - - # Write the values of fixed channel parameters - for (var, t) in channel_variables.iteritems(): - temp_v = f.createVariable(var, t[1], t[0]) + + # Write the values of fixed channel parameters: + fill_value = -9999 + for param in self._get_provided_extra_parameters(): + if param in channel_variables.keys(): + temp_v = f.createVariable(param, channel_variables[param][1], channel_variables[param][0]) + else: + temp_v = f.createVariable(param, 'd', ('channels',), fill_value = fill_value) + for (channel, n) in zip(channels, range(len(channels))): - temp_v[n] = params.channel_parameters[channel][var] + try: + temp_v[n] = params.channel_parameters[channel][param] + except KeyError: # The parameter was not provided for this channel so we mask the value. + temp_v[n] = fill_value # Write the id_timescale values temp_id_timescale = f.createVariable('id_timescale', 'i', ('channels',)) @@ -403,6 +411,34 @@ 'DAQ_Range': (('channels',), 'd'), } return channel_variables + + def _get_provided_extra_parameters(self): + # When looking for non-mandatory channel parameters, ignore the following parameter names: + ignore = ['channel_ID', 'channel string ID', 'Depolarization_Factor', 'Laser_Shots'] + + channels = self.channels.keys() + params = self.extra_netcdf_parameters.channel_parameters + mandatory = self._get_scc_mandatory_channel_variables() + + # Get all the provided extra parameters (both mandatory and optional): + provided_extra_parameters = [] + for (channel, n) in zip(channels, range(len(channels))): + # Check all the mandatory parameters are provided for each of the channels: + for var in mandatory.keys(): + if var not in params[channel].keys(): + raise ValueError ("Mandatory parameter '{0}' not provided for channel {1}!".format( + var, + channel + )) + + provided_extra_parameters.extend(params[channel].keys()) + + provided_extra_parameters = set(provided_extra_parameters) + # Discard certain parameter names: + for param in ignore: + provided_extra_parameters.discard(param) + + return provided_extra_parameters def add_dark_measurements_to_netcdf(self, f, channels):