code: def calc_dmgrid(d, maxloss=0.05, dt=3000., mindm=0., maxdm=0.):
      
  
      # parameters
      tsamp = d['inttime']*1e6  # in microsec
      k = 8.3
      freq = d['freq'].mean()  # central (mean) frequency in GHz
      bw = 1e3*(d['freq'][-1] - d['freq'][0])
      ch = 1e3*(d['freq'][1] - d['freq'][0])  # channel width in MHz
  
      # width functions and loss factor
      dt0 = lambda dm: n.sqrt(dt**2 + tsamp**2 + ((k*dm*ch)/(freq**3))**2)
      dt1 = lambda dm, ddm: n.sqrt(dt**2 + tsamp**2 + ((k*dm*ch)/(freq**3))**2 + ((k*ddm*bw)/(freq**3.))**2)
      loss = lambda dm, ddm: 1 - n.sqrt(dt0(dm)/dt1(dm,ddm))
      loss_cordes = lambda ddm, dfreq, dt, freq: 1 - (n.sqrt(n.pi) / (2 * 6.91e-3 * ddm * dfreq / (dt*freq**3))) * erf(6.91e-3 * ddm * dfreq / (dt*freq**3))  # not quite right for underresolved pulses
  
      if maxdm == 0:
          return [0]
      else:
          # iterate over dmgrid to find optimal dm values. go higher than maxdm to be sure final list includes full range.
          dmgrid = n.arange(mindm, maxdm, 0.05)
          dmgrid_final = [dmgrid[0]]
          for i in range(len(dmgrid)):
              ddm = (dmgrid[i] - dmgrid_final[-1])/2.
              ll = loss(dmgrid[i],ddm)
              if ll > maxloss:
                  dmgrid_final.append(dmgrid[i])
  
      return dmgrid_final
docs: Function to calculate the DM values for a given maximum sensitivity loss.
      maxloss is sensitivity loss tolerated by dm bin width. dt is assumed pulse width in microsec.