class_docstr: Mixin class for Raw, Evoked, Epochs.
  
  Notes
  -----
  This mixin adds a proj attribute as a property to data containers.
  It is True if at least one proj is present and all of them are active.
  The projs might not be applied yet if data are not preloaded. In
  this case it's the _projector attribute that does the job.
  If a private _data attribute is present then the projs applied
  to it are the ones marked as active.
  
  A proj parameter passed in constructor of raw or epochs calls
  apply_proj and hence after the .proj attribute is True.
  
  As soon as you've applied the projs it will stay active in the
  remaining pipeline.
  
  The suggested pipeline is proj=True in epochs (it's cheaper than for raw).
  
  When you use delayed SSP in Epochs, projs are applied when you call
  get_data() method. They are not applied to the evoked._data unless you call
  apply_proj(). The reason is that you want to reject with projs although
  it's not stored in proj mode.
docstr: Apply the signal space projection (SSP) operators to the data.
  
  Parameters
  ----------
  %(verbose)s
  
  Returns
  -------
  self : instance of Raw | Epochs | Evoked
      The instance.
  
  Notes
  -----
  Once the projectors have been applied, they can no longer be
  removed. It is usually not recommended to apply the projectors at
  too early stages, as they are applied automatically later on
  (e.g. when computing inverse solutions).
  Hint: using the copy method individual projection vectors
  can be tested without affecting the original data.
  With evoked data, consider the following example::
  
      projs_a = mne.read_proj('proj_a.fif')
      projs_b = mne.read_proj('proj_b.fif')
      # add the first, copy, apply and see ...
      evoked.add_proj(a).copy().apply_proj().plot()
      # add the second, copy, apply and see ...
      evoked.add_proj(b).copy().apply_proj().plot()
      # drop the first and see again
      evoked.copy().del_proj(0).apply_proj().plot()
      evoked.apply_proj()  # finally keep both
docstr_tok: ["Apply","the","signal","space","projection","(","SSP",")","operators","to","the","data",".","Parameters","--","--","--","--","--","%","(","verbose",")","s","Returns","--","--","--","-","self",":","instance","of","Raw","|","Epochs","|","Evoked","The","instance",".","Notes","--","--","-","Once","the","projectors","have","been","applied",",","they","can","no","longer","be","removed",".","It","is","usually","not","recommended","to","apply","the","projectors","at","too","early","stages",",","as","they","are","applied","automatically","later","on","(","e.g",".","when","computing","inverse","solutions",")",".","Hint",":","using","the","copy","method","individual","projection","vectors","can","be","tested","without","affecting","the","original","data",".","With","evoked","data",",","consider","the","following","example",":",":","projs_a","=","mne.read_proj","(","'proj_a.fif","'",")","projs_b","=","mne.read_proj","(","'proj_b.fif","'",")","#","add","the","first",",","copy",",","apply","and","see","...","evoked.add_proj","(","a",")",".copy","(",")",".apply_proj","(",")",".plot","(",")","#","add","the","second",",","copy",",","apply","and","see","...","evoked.add_proj","(","b",")",".copy","(",")",".apply_proj","(",")",".plot","(",")","#","drop","the","first","and","see","again","evoked.copy","(",")",".del_proj","(","0",")",".apply_proj","(",")",".plot","(",")","evoked.apply_proj","(",")","#","finally","keep","both"]
code: def apply_proj(self, verbose=None):
      """Apply the signal space projection (SSP) operators to the data.
  
      Parameters
      ----------
      %(verbose)s
  
      Returns
      -------
      self : instance of Raw | Epochs | Evoked
          The instance.
  
      Notes
      -----
      Once the projectors have been applied, they can no longer be
      removed. It is usually not recommended to apply the projectors at
      too early stages, as they are applied automatically later on
      (e.g. when computing inverse solutions).
      Hint: using the copy method individual projection vectors
      can be tested without affecting the original data.
      With evoked data, consider the following example::
  
          projs_a = mne.read_proj('proj_a.fif')
          projs_b = mne.read_proj('proj_b.fif')
          # add the first, copy, apply and see ...
          evoked.add_proj(a).copy().apply_proj().plot()
          # add the second, copy, apply and see ...
          evoked.add_proj(b).copy().apply_proj().plot()
          # drop the first and see again
          evoked.copy().del_proj(0).apply_proj().plot()
          evoked.apply_proj()  # finally keep both
      """
      from ..epochs import BaseEpochs
      from ..evoked import Evoked
      from ..io import BaseRaw
  
      if self.info["projs"] is None or len(self.info["projs"]) == 0:
          logger.info(
              "No projector specified for this dataset. "
              "Please consider the method self.add_proj."
          )
          return self
  
      # Exit delayed mode if you apply proj
      if isinstance(self, BaseEpochs) and self._do_delayed_proj:
          logger.info("Leaving delayed SSP mode.")
          self._do_delayed_proj = False
  
      if all(p["active"] for p in self.info["projs"]):
          logger.info(
              "Projections have already been applied. "
              "Setting proj attribute to True."
          )
          return self
  
      _projector, info = setup_proj(
          deepcopy(self.info), add_eeg_ref=False, activate=True
      )
      # let's not raise a RuntimeError here, otherwise interactive plotting
      if _projector is None:  # won't be fun.
          logger.info(
              "The projections don't apply to these data."
              " Doing nothing."
          )
          return self
      self._projector, self.info = _projector, info
      if isinstance(self, (BaseRaw, Evoked)):
          if self.preload:
              self._data = np.dot(self._projector, self._data)
      else:  # BaseEpochs
          if self.preload:
              for ii, e in enumerate(self._data):
                  self._data[ii] = self._project_epoch(e)
          else:
              self.load_data()  # will automatically apply
      logger.info("SSP projectors applied...")
      return self
  
imports: import re
  from copy import deepcopy
  from itertools import count
  import numpy
  from ..defaults import _BORDER_DEFAULT, _EXTRAPOLATE_DEFAULT, _INTERPOLATION_DEFAULT
  from ..fixes import _safe_svd
  from ..utils import _check_option, _validate_type, fill_doc, logger, object_diff, verbose, warn
  from .constants import FIFF
  from .pick import _ELECTRODE_CH_TYPES, _electrode_types, pick_info, pick_types
  from .tag import _rename_list, find_tag
  from .tree import dir_tree_find
  from .write import _safe_name_list, end_block, start_block, write_float, write_float_matrix, write_int, write_name_list_sanitized, write_string
label_desc: Use image node_id 3 for calling the ProjMixin obj's underlying member method code with example usage: obj.apply_proj(verbose) and returns: self, self, self, self