diff --git a/cosmosis/output/cosmomc_output.py b/cosmosis/output/cosmomc_output.py index b7d38806..a02bfd4d 100644 --- a/cosmosis/output/cosmomc_output.py +++ b/cosmosis/output/cosmomc_output.py @@ -9,7 +9,7 @@ class CosmoMCOutput(TextColumnOutput): - def __init__(self, filename, rank=0, nchain=1, delimiter=' ', lock=True, resume=False): + def __init__(self, filename, rank=0, nchain=1, delimiter=' ', lock=True, resume=False, blinding_offset_file=None): super(CosmoMCOutput, self).__init__(filename, rank, nchain, '', lock=lock, resume=resume) if filename.endswith(self.FILE_EXTENSION): filename = filename[:-len(self.FILE_EXTENSION)] @@ -19,6 +19,10 @@ def __init__(self, filename, rank=0, nchain=1, delimiter=' ', lock=True, resu self._paramfile = None self._last_params = None self._multiplicity = 0 + if blinding_offset_file is not None: + self._blinding_offsets = np.load(blinding_offset_file) + else: + self._blinding_offsets = None def _close(self): self._write_parameters_multiplicity() @@ -97,5 +101,6 @@ def load_from_options(cls, options): def from_options(cls, options, resume=False): if resume: raise ValueError("Cannot resume from cosmomc files yet") - return super(CosmoMCOutput,cls).from_options(options, resume=False) + blinding_offset_file = options.get('blinding_offsets', None) + return super(CosmoMCOutput,cls).from_options(options, resume=False, blinding_offset_file=blinding_offset_file) diff --git a/cosmosis/output/fits_output.py b/cosmosis/output/fits_output.py index 2b178eea..abf33055 100644 --- a/cosmosis/output/fits_output.py +++ b/cosmosis/output/fits_output.py @@ -33,7 +33,7 @@ class FitsOutput(OutputBase): FILE_EXTENSION = ".fits" _aliases = ["fits"] - def __init__(self, filename, rank=0, nchain=1, clobber=True): + def __init__(self, filename, rank=0, nchain=1, clobber=True, blinding_offset_file=None): super(FitsOutput, self).__init__() #If filename already ends in .txt then remove it for a moment @@ -56,6 +56,11 @@ def __init__(self, filename, rank=0, nchain=1, clobber=True): self._metadata = OrderedDict() self._final_metadata = OrderedDict() + if blinding_offset_file is not None: + self._blinding_offsets = np.load(blinding_offset_file) + else: + self._blinding_offsets = None + def _close(self): self._flush_metadata(self._final_metadata) self._final_metadata={} @@ -126,8 +131,9 @@ def from_options(cls, options, resume=False): delimiter = options.get('delimiter', '\t') rank = options.get('rank', 0) nchain = options.get('parallel', 1) + blinding_offset_file = options.get('blinding_offsets', None) clobber = utils.boolean_string(options.get('clobber', True)) - return cls(filename, rank, nchain, clobber=clobber) + return cls(filename, rank, nchain, clobber=clobber, blinding_offset_file=blinding_offset_file) @classmethod def load_from_options(cls, options): diff --git a/cosmosis/output/in_memory_output.py b/cosmosis/output/in_memory_output.py index 88dd8dc4..05162e43 100644 --- a/cosmosis/output/in_memory_output.py +++ b/cosmosis/output/in_memory_output.py @@ -3,13 +3,18 @@ class InMemoryOutput(OutputBase): _aliases = ["memory"] - def __init__(self): + def __init__(self, blinding_offset_file=None): super(InMemoryOutput,self).__init__() self.rows = [] self.meta = {} self.final_meta = {} self.comments = [] + if blinding_offset_file is not None: + self._blinding_offsets = np.load(blinding_offset_file) + else: + self._blinding_offsets = None + def _write_parameters(self, params): self.rows.append(params) @@ -33,7 +38,8 @@ def __getitem__(self, key_or_index): def from_options(cls, options, resume=False): if resume: raise ValueError("Cannot resume from in-memory output") - return cls() + blinding_offset_file = options.get('blinding_offsets', None) + return cls(blinding_offset_file=blinding_offset_file) @classmethod def load_from_options(cls, options): diff --git a/cosmosis/output/null_output.py b/cosmosis/output/null_output.py index c1a7d60a..0c9fcafd 100644 --- a/cosmosis/output/null_output.py +++ b/cosmosis/output/null_output.py @@ -2,6 +2,13 @@ class NullOutput(OutputBase): _aliases = ["none"] + + def __init__(self, blinding_offset_file=None): + if blinding_offset_file is not None: + self._blinding_offsets = np.load(blinding_offset_file) + else: + self._blinding_offsets = None + def _write_parameters(self, params): pass @@ -18,7 +25,8 @@ def _write_final(self, key, value, comment): def from_options(cls, options, resume=False): if resume: raise ValueError("Cannot resume from null output") - return cls() + blinding_offset_file = options.get('blinding_offsets', None) + return cls(blinding_offset_file=blinding_offset_file) @classmethod def load_from_options(cls, options): diff --git a/cosmosis/output/output_base.py b/cosmosis/output/output_base.py index 9a4ade21..5c6e872f 100644 --- a/cosmosis/output/output_base.py +++ b/cosmosis/output/output_base.py @@ -136,6 +136,13 @@ def parameters(self, *param_groups): if not self.begun_sampling: self._begun_sampling(params) self.begun_sampling=True + + #Blind output by applying offsets + if self._blinding_offsets is not None: + if len(self._blinding_offsets)!=len(params): + raise ValueError("Length of blinding offsets %d does not match number of output parameters %d"%(len(self._blinding_offsets), len(params))) + params+= self._blinding_offsets + #Pass to the subclasses to write output self._write_parameters(params) diff --git a/cosmosis/output/text_output.py b/cosmosis/output/text_output.py index 73825faa..1a062540 100644 --- a/cosmosis/output/text_output.py +++ b/cosmosis/output/text_output.py @@ -13,7 +13,8 @@ class TextColumnOutput(OutputBase): FILE_EXTENSION = ".txt" _aliases = ["text", "txt"] - def __init__(self, filename, rank=0, nchain=1, delimiter='\t', lock=True, resume=False): + def __init__(self, filename, rank=0, nchain=1, delimiter='\t', lock=True, resume=False, + blinding_offset_file=None): super(TextColumnOutput, self).__init__() self.delimiter = delimiter @@ -46,6 +47,10 @@ def __init__(self, filename, rank=0, nchain=1, delimiter='\t', lock=True, resume print("Note: You set resume=T but the file {} does not exist so I will start a new one".format(self._filename)) self._file = open(self._filename, "w") self.resumed = False + if blinding_offset_file is not None: + self._blinding_offsets = np.load(blinding_offset_file) + else: + self._blinding_offsets = None if lock: try: self.lock_file(self._file) @@ -143,8 +148,10 @@ def from_options(cls, options, resume=False): delimiter = options.get('delimiter', '\t') rank = options.get('rank', 0) nchain = options.get('parallel', 1) + blinding_offset_file = options.get('blinding_offsets', None) lock = utils.boolean_string(options.get('lock', True)) - return cls(filename, rank, nchain, delimiter=delimiter, lock=lock, resume=resume) + return cls(filename, rank, nchain, delimiter=delimiter, lock=lock, resume=resume, + blinding_offset_file=blinding_offset_file) @classmethod def load_from_options(cls, options):