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