docs: def _get_treated_data(self):
          """ Produce a working copy of the data based on the treated reference
  
          The reference data is always stored and untouched in self.ddataRef
          You always interact with self.data, which returns a working copy.
          That working copy is the reference data, eventually treated along the
              lines defined (by the user) in self.dtreat
          By reseting the treatment (self.reset()) all data treatment is
          cancelled and the working copy returns the reference data.
  
          """
          # --------------------
          # Copy reference data
          d = self._ddataRef['data'].copy()
          t, X = self._ddataRef['t'].copy(), self._ddataRef['X'].copy()
          lamb = self._ddataRef['lamb']
          if lamb is not None:
              lamb = lamb.copy()
  
          indtX = self._ddataRef['indtX']
          if indtX is not None:
              indtX = indtX.copy()
          indtlamb = self._ddataRef['indtlamb']
          if indtlamb is not None:
              indtlamb = indtlamb.copy()
          indXlamb = self._ddataRef['indXlamb']
          if indXlamb is not None:
              indXlamb = indXlamb.copy()
          indtXlamb = self._ddataRef['indtXlamb']
          if indtXlamb is not None:
              indtXlamb = indtXlamb.copy()
  
          # --------------------
          # Apply data treatment
          for kk in self._dtreat['order']:
              # data only
              if kk=='mask' and self._dtreat['mask-ind'] is not None:
                  d = self._mask(d, self._dtreat['mask-ind'],
                                 self._dtreat['mask-val'])
              if kk=='interp_indt':
                  d = self._interp_indt(d, self._dtreat['interp-indt'],
                                        self._ddataRef['t'])
              if kk=='interp_indch':
                  d = self._interp_indch(d, self._dtreat['interp-indch'],
                                         self._ddataRef['X'])
              if kk=='data0':
                  d = self._data0(d, self._dtreat['data0-data'])
              if kk=='dfit' and self._dtreat['dfit'] is not None:
                  d = self._dfit(d, **self._dtreat['dfit'])
  
              # data + others
              if kk=='indt' and self._dtreat['indt'] is not None:
                  d,t, indtX,indtlamb,indtXlamb = self._indt(d, t, indtX,
                                                             indtlamb, indtXlamb,
                                                             self._dtreat['indt'])
              if kk=='indch' and self._dtreat['indch'] is not None:
                  d,X, indXlamb,indtXlamb = self._indch(d, X, indXlamb, indtXlamb,
                                                        self._dtreat['indch'])
              if kk=='indlamb' and self._dtreat['indlamb'] is not None:
                  d, lamb = self._indch(d, lamb, self._dtreat['indlamb'])
              if kk=='interp_t' and self._dtreat['interp-t'] is not None:
                  d,t, indtX,indtlamb,indtXlamb\
                          = self._interp_t(d, t, indtX, indtlamb, indtXlamb,
                                           self._dtreat['interp-t'], kind='linear')
          # --------------------
          # Safety check
          if d.ndim==2:
              (nt, nch), nlamb = d.shape, 0
          else:
              nt, nch, nlamb = d.shape
          assert d.ndim in [2,3]
          assert t.shape==(nt,)
          assert X.shape==(self._ddataRef['nnch'], nch)
          if lamb is not None:
              assert lamb.shape==(self._ddataRef['nnlamb'], nlamb)
  
          lout = [d, t, X, lamb, nt, nch, nlamb,
                  indtX, indtlamb, indXlamb, indtXlamb]
          return lout