Exemple #1
0
    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)
Exemple #2
0
 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)