def init_parameter(self, parameter_context, bricking_scheme): """ Initializes a parameter using a ParameterContext object and a bricking scheme for that parameter @param parameter_context ParameterContext object describing the parameter to initialize @param bricking_scheme A dictionary containing the brick and chunk sizes @return A PersistedStorage object """ if self.mode == 'r': raise IOError('PersistenceLayer not open for writing: mode == \'{0}\''.format(self.mode)) parameter_name = parameter_context.name self.global_bricking_scheme = bricking_scheme pm = ParameterManager(os.path.join(self.root_dir, self.guid, parameter_name), parameter_name, read_only=False) self.parameter_metadata[parameter_name] = pm pm.parameter_context = parameter_context log.debug('Initialize %s', parameter_name) self.master_manager.create_group(parameter_name) if parameter_context.param_type._value_class == 'SparseConstantValue': v = SparsePersistedStorage(pm, self.master_manager, self.brick_dispatcher, dtype=parameter_context.param_type.storage_encoding, fill_value=parameter_context.param_type.fill_value, mode=self.mode, inline_data_writes=self.inline_data_writes, auto_flush=self.auto_flush_values) else: v = PersistedStorage(pm, self.master_manager, self.brick_dispatcher, dtype=parameter_context.param_type.storage_encoding, fill_value=parameter_context.param_type.fill_value, mode=self.mode, inline_data_writes=self.inline_data_writes, auto_flush=self.auto_flush_values) self.value_list[parameter_name] = v # CBM TODO: Consider making this optional and bulk-flushing from the coverage after all parameters have been initialized # No need to check if they're dirty, we know they are! pm.flush() # Put the pm into read_only mode pm.read_only = True # If there are already bricks, ensure there are appropriate links for this new parameter for brick_guid in self.master_manager.brick_list: brick_file_name = '{0}.hdf5'.format(brick_guid) self._add_brick_link(parameter_name, brick_guid, brick_file_name) self.master_manager.flush() return v