def export(self, experiment): """ Export FCS files from an experiment. Parameters ---------- experiment : Experiment The :class:`.Experiment` to export """ if experiment is None: raise util.CytoflowViewError('experiment', "No experiment specified") if len(experiment) == 0: raise util.CytoflowViewError('experiment', "No events in experiment") if not self.path: raise util.CytoflowViewError('path', 'Must specify an output directory') d = Path(self.path) if not d.is_dir(): raise util.CytoflowViewError('path', 'Output directory {} must exist') # also tests for good experiment, self.by for filename in self.enum_files(experiment): p = d / filename if p.is_file(): raise util.CytoflowViewError( 'path', 'File {} already exists'.format(p)) if self.subset: try: experiment = experiment.query(self.subset) except util.CytoflowError as e: raise util.CytoflowViewError('subset', str(e)) from e except Exception as e: raise util.CytoflowViewError( 'subset', "Subset string '{0}' isn't valid".format( self.subset)) from e if len(experiment) == 0: raise util.CytoflowViewError( 'subset', "Subset string '{0}' returned no events".format( self.subset)) tube0, common_metadata = list( experiment.metadata['fcs_metadata'].items())[0] common_metadata = copy(common_metadata) exclude_keywords = [ '$BEGINSTEXT', '$ENDSTEXT', '$BEGINANALYSIS', '$ENDANALYSIS', '$BEGINDATA', '$ENDDATA', '$BYTEORD', '$DATATYPE', '$MODE', '$NEXTDATA', '$TOT', '$PAR' ] common_metadata = { str(k): str(v) for k, v in common_metadata.items() if re.search('^\$P\d+[BENRDSG]$', k) is None and k not in exclude_keywords } for filename, metadata in experiment.metadata['fcs_metadata'].items(): if filename == tube0: continue for name, value in metadata.items(): if name not in common_metadata: continue if name not in common_metadata or value != common_metadata[ name]: del common_metadata[name] for i, channel in enumerate(experiment.channels): if 'voltage' in experiment.metadata[channel]: common_metadata['$P{}V'.format( i + 1)] = experiment.metadata[channel]['voltage'] for group, data_subset in experiment.data.groupby(self.by): data_subset = data_subset[experiment.channels] if len(self.by) == 1: group = [group] parts = [] kws = copy(self.keywords) kws.update(common_metadata) kws = {k: str(v) for k, v in kws.items()} for i, name in enumerate(self.by): if self._include_by: parts.append(name + '_' + str(group[i])) else: parts.append(str(group[i])) kws["CF_" + name] = str(group[i]) if self.base: filename = self.base + '_' + '_'.join(parts) + '.fcs' else: filename = '_'.join(parts) + '.fcs' full_path = d / filename util.write_fcs(str(full_path), experiment.channels, { c: experiment.metadata[c]['range'] for c in experiment.channels }, data_subset.values, compat_chn_names=False, compat_negative=False, **kws)
def export(self, experiment): """ Export FCS files from an experiment. Parameters ---------- experiment : Experiment The :class:`.Experiment` to export """ if experiment is None: raise util.CytoflowViewError('experiment', "No experiment specified") if not self.path: raise util.CytoflowOpError('path', 'Must specify an output directory') d = Path(self.path) if not d.is_dir(): raise util.CytoflowOpError('path', 'Output directory {} must exist') # also tests for good experiment, self.by for filename in self.enum_files(experiment): p = d / filename if p.is_file(): raise util.CytoflowOpError('path', 'File {} already exists' .format(p)) if self.subset: try: experiment = experiment.query(self.subset) except util.CytoflowError as e: raise util.CytoflowViewError('subset', str(e)) from e except Exception as e: raise util.CytoflowViewError('subset', "Subset string '{0}' isn't valid" .format(self.subset)) from e if len(experiment) == 0: raise util.CytoflowViewError('subset', "Subset string '{0}' returned no events" .format(self.subset)) for group, data_subset in experiment.data.groupby(self.by): data_subset = data_subset[experiment.channels] if len(self.by) == 1: group = [group] parts = [] kws = copy(self.keywords) for i, name in enumerate(self.by): if self._include_by: parts.append(name + '_' + str(group[i])) else: parts.append(str(group[i])) kws["CF_" + name] = str(group[i]) if self.base: filename = self.base + '_' + '_'.join(parts) + '.fcs' else: filename = '_'.join(parts) + '.fcs' full_path = d / filename util.write_fcs(str(full_path), experiment.channels, data_subset.values, compat_chn_names = False, compat_negative = False, **kws)