def aodm(self, **kwargs): """ AODM calculation Parameters ---------- spec : Spectrum1D (None) 1D spectrum. Required but often read in through the Class (self.spec) conti : np.array (None) Continuum array Returns: N, sigN : Column and error in linear space """ # Grab Spectrum spec = self.set_spec(**kwargs) # Velocity array spec.velo = spec.relative_vel(self.wrest*(1+self.analy['z'])) # Pixels for evaluation pix = spec.pix_minmax(self.analy['z'], self.wrest, self.analy['VLIM'].to('km/s'))[0] #self.analy['VLIM'].to('km/s').value)[0] # For convenience + normalize velo = spec.velo[pix] fx, sig = parse_spec(spec, **kwargs) # dv delv = velo - np.roll(velo,1) delv[0] = delv[1] # Atomic data cst = (10.**14.5761)/(self.atomic['fval']*self.wrest) / (u.km/u.s) / u.cm * (u.AA/u.cm) # Mask mask = (pix == pix) # True = good nndt = Quantity(np.zeros(len(pix)), unit='s/(km cm cm)') # Saturated? satp = np.where( (fx <= sig/5.) | (fx < 0.05) )[0] if len(satp) > 0: mask[satp] = False lim = np.where(sig[satp] > 0.)[0] if len(lim) > 0: sub = np.maximum(0.05, sig[satp[lim]]/5.) nndt[satp[lim]] = np.log(1./sub)*cst flg_sat = len(lim) # AODM nndt[mask] = np.log(1./fx[mask])*cst # Sum it ntot = np.sum( nndt*delv ) tvar = np.sum( (delv*cst*sig/fx)**2 ) # Fill self.attrib['N'] = ntot self.attrib['sigN'] = np.sqrt(tvar) logN, sig_logN = xsb.lin_to_log(self.attrib['N'].value, self.attrib['sigN'].value) self.attrib['logN'] = logN self.attrib['sig_logN'] = sig_logN # Return return ntot, np.sqrt(tvar)
# Test AODM if (flg_test % 2**2) >= 2**1: print('------------ AODM -------------') # Spectrum fil = '~/PROGETTI/LLSZ3/data/normalize/UM669_nF.fits' aline = AbsLine(1302.1685*u.AA) aline.spec = lsio.readspec(fil) # Line info aline.analy['z'] = 2.92652 aline.analy['VLIM'] = const.c.to('km/s') * ( ( np.array([5110.668, 5116.305])*u.AA/( 1+aline.analy['z']) - aline.wrest) / aline.wrest ) # Evaluate N,sigN = aline.aodm(conti=np.ones(len(aline.spec.flux))) logN, sig_logN = xsb.lin_to_log(N,sigN) print('logN = {:g}, sig_logN = {:g}'.format(logN, sig_logN)) # Test EW if (flg_test % 2**3) >= 2**2: print('------------ EW -------------') # Spectrum fil = '~/PROGETTI/LLSZ3/data/normalize/UM669_nF.fits' aline = AbsLine(1302.1685) aline.spec = lsio.readspec(fil) # Line info aline.analy['z'] = 2.92652 aline.analy['WVMNX'] = [5110.668, 5116.305] # Evaluate EW,sigEW = aline.restew()