Example #1
0
    def make_sim_spec(self):
        self.outdir = self.params['outDir']
        self.tract = int(self.params['tract'])
        self.patch = self.params['patch']
        self.visit = int(self.params['visit'])
        self.fiberId = self.params['fiberId']
        self.ra = self.params['ra']
        self.dec = self.params['dec']
        self.catId = self.params['catId']
        self.objId = self.params['objId']
        self.spectrograph = self.params['spectrograph']
        try:
            self.mag_file = '%.4e' % (float(self.params['MAG_FILE']))
        except:
            self.mag_file = self.params['MAG_FILE']
        ''' some checks '''
        self.writeFits = strToBool(self.params['writeFits'])
        self.writePfsArm = strToBool(self.params['writePfsArm'])
        self.plotArmSet = strToBool(self.params['plotArmSet'])
        self.plotObject = strToBool(self.params['plotObject'])
        self.asciiTable = self.params['asciiTable']
        self.pfsConfigFull = strToBool(self.params['pfsConfigFull'])
        nrealize = int(self.params['nrealize'])

        if not self.writeFits and not self.asciiTable:
            sys.exit(
                "Please specify asciiTable or omit writeFits (or say writeFits true)"
            )
        if not os.path.exists(self.outdir):
            try:
                os.makedirs(self.outdir)
            except OSError as e:
                sys.exit("Unable to create outDir: %s" % e)
        if nrealize <= 0:
            sys.exit("Please specify at least one realization")
        ''' check magfile '''
        if os.path.exists(self.mag_file):
            dat = np.loadtxt(self.mag_file)
            nobj = dat.shape[1] - 1
        else:
            nobj = 1
        if self.pfsConfigFull:
            try:
                if len(self.fiberId) == nobj and len(self.ra) == nobj and len(
                        self.dec) == nobj and len(self.catId) == nobj and len(
                            self.objId) == nobj:
                    objIds = [self.objId]
                    catIds = [self.catId]
                else:
                    sys.exit("specify fiberId/ra/dec/objId/catId!")
            except:
                sys.exit("specify fiberId/ra/dec/objId/catId!")
        else:
            if nobj > 1:
                if nrealize > 1:
                    sys.exit(
                        "The number of realization should be one for multiple input template"
                    )
                else:
                    objIds = range(self.objId, self.objId + nobj)
                    #catIds = sp.zeros(nobj)
            else:
                objIds = range(self.objId, self.objId + nrealize)
                #catIds = sp.zeros(nobj)
            catIds = sp.array([self.catId])
        '''
            ## read input file ##
            # arm: 0-3 telling us which arm the data comes from (arm_name will convert to b, r, n, m)
            # wav: wavelength
            # nsv: per-pixel (instrumental + sky) variance (counts^2)
            # trn: conversion from I_nu to counts
            # smp: samplingFactor.  A fiddle factor for the Poisson noise in HgCdTe devices
            # skm: sky flux
        '''
        arm, wav, nsv, trn, smp, skm = np.loadtxt(self.params['etcFile'],
                                                  usecols=(0, 2, 5, 8, 9, 10),
                                                  unpack=True)
        arm = arm.astype(int)
        trn[trn < 1.0e26] = 1.0e26
        ''' load magnitude or filename '''
        if os.path.exists(self.mag_file):
            dat = np.loadtxt(self.mag_file)
            nobj = dat.shape[1] - 1
            _lam = dat[:, 0]
            mag = np.empty((len(wav), nobj))
            for i in range(nobj):
                _mag = dat[:, i + 1]
                mag[:, i] = np.interp(wav, _lam, _mag)
        else:
            nobj = 1
            mag = np.empty((len(wav), nobj))
            mag[:, 0].fill(self.mag_file)
        wav_mtrx = np.empty((len(wav), nobj))
        trn_mtrx = np.empty((len(wav), nobj))
        smp_mtrx = np.empty((len(wav), nobj))
        nsv_mtrx = np.empty((len(wav), nobj))
        for i in range(nobj):
            wav_mtrx[:, i] = wav
            trn_mtrx[:, i] = trn
            smp_mtrx[:, i] = smp
            nsv_mtrx[:, i] = nsv
        ''' calculate the flux etc. in observed units '''
        fnu = 10**(-0.4 * (mag + 48.6))
        flam = 3.0e18 * fnu / (10 * wav_mtrx)**2 / 1e-17
        counts = trn_mtrx * fnu
        if (counts == 0).any():
            print(
                "counts == 0 detected in some pixels; setting to %g for variance"
                % (float(self.params['countsMin'])),
                file=sys.stderr)
            countsp = np.where(
                counts == 0, float(self.params['countsMin']),
                counts)  # version of counts with zero pixels replaced
        else:
            countsp = counts
        snr = countsp / np.sqrt(smp_mtrx * countsp + nsv_mtrx) * np.sqrt(
            int(self.params['EXP_NUM']))
        sigma = flam / snr
        msk = np.zeros_like(wav, dtype=np.int32)
        sky = 3.0e18 * (skm / trn) / (10 * wav)**2 / 1e-17
        arm = arm_name(arm)
        arms = np.array(
            sorted(set(arm), key=lambda x: dict(b=0, r=1, m=1.5, n=2)[x])
        )  # unique values of arm
        '''
            Create and populate the objects corresponding to the datamodel

            First the parameters describing the observation, in PfsConfig
        '''
        objectMags = []
        if nobj > 1:
            for i in range(nobj):
                objectMags.append([
                    calculateFiberMagnitude(wav, mag[:, i], b) for b in "grizy"
                ])
        else:
            for i in range(nrealize):
                objectMags.append([
                    calculateFiberMagnitude(wav, mag[:, 0], b) for b in "grizy"
                ])
        if self.pfsConfigFull:
            pfsConfig = makePfsConfig(self.tract, self.patch, self.fiberId,
                                      self.ra, self.dec, self.catId, objIds,
                                      objectMags)
        else:
            if nobj > 1:
                pfsConfig = makeFakePfsConfig(self.tract,
                                              self.patch,
                                              self.ra,
                                              self.dec,
                                              self.catId,
                                              objIds[0],
                                              objectMags,
                                              nFiber=nobj)
            else:
                pfsConfig = makeFakePfsConfig(self.tract,
                                              self.patch,
                                              self.ra,
                                              self.dec,
                                              self.catId,
                                              objIds[0],
                                              objectMags,
                                              nFiber=nrealize)
        '''
            Create the PfsArmSet;  we'll put each realisation into a different fibre
        '''
        pfsConfigId = pfsConfig.pfsConfigId
        pfsArmSet = PfsArmSet(self.visit,
                              self.spectrograph,
                              arms=arms,
                              pfsConfig=pfsConfig)

        for armStr, data in pfsArmSet.data.items():
            thisArm = (arm == armStr)
            nPt = np.sum(thisArm)
            if nobj > 1:
                for i in range(nobj):
                    data.lam.append(wav[thisArm])
                    data.flux.append(flam[thisArm, i] +
                                     np.random.normal(0.0, sigma[thisArm, i]))
                    data.sky.append(sky[thisArm])
                    data.mask.append(msk[thisArm])
                    covar = np.zeros(3 * nPt).reshape((3, nPt))
                    covar[0] = sigma[thisArm, i]**2
                    data.covar.append(covar)
            else:
                for i in range(nrealize):
                    data.lam.append(wav[thisArm])
                    data.flux.append(flam[thisArm, 0] +
                                     np.random.normal(0.0, sigma[thisArm, 0]))
                    data.sky.append(sky[thisArm])
                    data.mask.append(msk[thisArm])
                    covar = np.zeros(3 * nPt).reshape((3, nPt))
                    covar[0] = sigma[thisArm, 0]**2
                    data.covar.append(covar)
        if self.plotArmSet:
            pfsArmSet.plot(showFlux=True,
                           showMask=False,
                           showSky=False,
                           showCovar=False)
        '''
            Time for I/O
        '''
        ''' Fits '''
        if self.writeFits:
            pfsConfig.write(self.outdir)  # pfsConfig file
            if self.writePfsArm:  # write pfsArm files
                for data in pfsArmSet.data.values():
                    data.write(self.outdir)
        ''' Ascii '''
        if self.asciiTable != "None":
            write_ascii(pfsArmSet, self.asciiTable, self.outdir)
            print("ASCII table %s was generated" % self.asciiTable)
        '''
            Now make the PfsObject from the PfsArmSet
        '''
        for catId in catIds:
            for objId in objIds:
                pfsObject = makePfsObject(objId, [pfsArmSet], catId=catId)
                self.pfsVisitHash = pfsObject.pfsVisitHash
                if self.plotObject:
                    pfsObject.plot()

                if self.writeFits:
                    pfsObject.write(self.outdir)  # pfsObject file

        return 0
Example #2
0
def main(pfsConfigId, tract, patch, fiberId=None, dataDir=".", objId=None,
         showPfsArm=False, showPfsArmSet=False, showPfsObject=False):

    pfsConfig = PfsConfig(pfsConfigId, tract, patch)
    pfsConfig.read(dataDir)

    if objId is None:
        if fiberId is None:
            fiberId = 1
    else:
        import numpy as np
        import sys
        try:
            _fiberId = np.where(pfsConfig.objId == objId)[0][0]
        except IndexError:
            print("Unable to find objId %08x in configuration with pfsConfigId 0x%08x" % \
                (objId, pfsConfigId), file=sys.stderr)
            return
        _fiberId += 1                   # 1-indexed
        if fiberId is not None and fiberId != _fiberId:
            print("fiberId %d doesn't match objId %08x's fiber %d" % \
                (fiberId, objId, _fiberId), file=sys.stderr)
            return
        fiberId = _fiberId
        
    objId = pfsConfig.objId[fiberId - 1]

    print("fiberId = %d,  objId = 0x%x" % (fiberId, objId))

    #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

    pfsArms = PfsArmSet(visit=1, spectrograph=1, pfsConfigId=pfsConfigId)
    pfsArms.read(dataDir)

    if showPfsArm:
        if True:
            pfsArms.data['r'].plot(fiberId=fiberId)
        else:
            pfsArms.data['r'].plot(fiberId=fiberId,
                                      showFlux=True, showSky=True, showCovar=True, showMask=True)

    if showPfsArmSet:
        if True:
            pfsArms.plot(fiberId=fiberId)
        else:
            pfsArms.plot(fiberId=fiberId,
                         showFlux=True, showSky=True, showCovar=True, showMask=True)

    #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

    pfsObject = makePfsObject(objId, [pfsArms])
    pfsObject.write(dataDir)

    npfs = PfsObject(tract, patch, objId, visits=[1])
    npfs.read(dataDir)
    if showPfsObject:
        if True:
            npfs.plot(showFluxTbl=True)
        else:
            npfs.plot(showFlux=True, showSky=True, showCovar=True, showCovar2=True)
            npfs.plot(showFluxTbl=True, showFluxVariance=False)
def main(pfsConfigId, tract, patch, fiberId=None, dataDir=".", objId=None,
         showPfsArm=False, showPfsArmSet=False, showPfsObject=False):

    pfsConfig = PfsConfig(pfsConfigId)
    pfsConfig.read(dataDir)

    if objId is None:
        if fiberId is None:
            fiberId = 1
    else:
        import numpy as np
        import sys
        try:
            _fiberId = np.where(pfsConfig.objId == objId)[0][0]
        except IndexError:
            print >> sys.stderr, "Unable to find objId %08x in configuration with pfsConfigId 0x%08x" % \
                (objId, pfsConfigId)
            return
        _fiberId += 1                   # 1-indexed
        if fiberId is not None and fiberId != _fiberId:
            print >> sys.stderr, "fiberId %d doesn't match objId %08x's fiber %d" % \
                (fiberId, objId, _fiberId)
            return
        fiberId = _fiberId
        
    objId = pfsConfig.objId[fiberId - 1]

    print "fiberId = %d,  objId = 0x%x" % (fiberId, objId)

    #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

    pfsArms = PfsArmSet(visit=1, spectrograph=1)
    pfsArms.read(dataDir)

    if showPfsArm:
        if True:
            pfsArms.data['r'].plot(fiberId=fiberId)
        else:
            pfsArms.data['r'].plot(fiberId=fiberId,
                                      showFlux=True, showSky=True, showCovar=True, showMask=True)

    if showPfsArmSet:
        if True:
            pfsArms.plot(fiberId=fiberId)
        else:
            pfsArms.plot(fiberId=fiberId,
                         showFlux=True, showSky=True, showCovar=True, showMask=True)

    #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

    pfsObject = makePfsObject(tract, patch, objId, [pfsArms])
    pfsObject.write(dataDir)

    npfs = PfsObject(tract, patch, objId, visits=[1])
    npfs.read(dataDir)
    if showPfsObject:
        if True:
            npfs.plot(showFluxTbl=True)
        else:
            npfs.plot(showFlux=True, showSky=True, showCovar=True, showCovar2=True)
            npfs.plot(showFluxTbl=True, showFluxVariance=False)
def main(
    inFile,
    magFile,
    outDir=".",
    tract=0,
    patch="0,0",
    visit=1,
    spectrograph=1,
    catId=0,
    objIds=[1],
    nRealize=1,
    nExposure=1,
    countsMin=0.1,
    asciiTable=None,
    writeFits=True,
    writePfsArm=True,
    plotArmSet=False,
    plotObject=False,
):
    ## read input file ##
    # arm: 0-3 telling us which arm the data comes from (arm_name will convert to b, r, n, m)
    # wav: wavelength
    # nsv: per-pixel (instrumental + sky) variance (counts^2)
    # trn: conversion from I_nu to counts
    # smp: samplingFactor.  A fiddle factor for the Poisson noise in HgCdTe devices
    # skm: sky flux
    arm, wav, nsv, trn, smp, skm = np.loadtxt(inFile, usecols=(0, 2, 5, 8, 9, 10), unpack=True)
    arm = arm.astype(int)
    trn[trn < 1.0e26] = 1.0e26

    ## load magnitude or filename ##
    if os.path.exists(magFile):
        _lam, _mag = np.loadtxt(magFile, usecols=(0, 1), unpack=True)
        mag = np.interp(wav, _lam, _mag)
    else:
        mag = np.empty(len(wav))
        mag.fill(float(magFile))

    ##
    # Calculate the flux etc. in observed units
    ##
    fnu = 10 ** (-0.4 * (mag + 48.6))
    flam = 3.0e18 * fnu / (10 * wav) ** 2 / 1e-17

    counts = trn * fnu
    if (counts == 0).any():
        print >> sys.stderr, "counts == 0 detected in some pixels; setting to %g for variance" % countsMin
        countsp = np.where(counts == 0, countsMin, counts)  # version of counts with zero pixels replaced
    else:
        countsp = counts

    snr = countsp / np.sqrt(smp * countsp + nsv) * np.sqrt(nExposure)
    sigma = flam / snr
    msk = np.zeros_like(wav, dtype=np.int32)
    sky = 3.0e18 * (skm / trn) / (10 * wav) ** 2 / 1e-17

    arm = arm_name(arm)
    arms = np.array(sorted(set(arm), key=lambda x: dict(b=0, r=1, m=1.5, n=2)[x]))  # unique values of arm
    #
    # Create and populate the objects corresponding to the datamodel
    #
    # First the parameters describing the observation, in PfsConfig
    objectMags = [calculateFiberMagnitude(wav, mag, b) for b in "grizy"]
    pfsConfig = makeFakePfsConfig(tract, patch, 150.0, 2.0, catId, objIds[0], objectMags, nFiber=nRealize)
    #
    # Create the PfsArmSet;  we'll put each realisation into a different fibre
    #
    pfsConfigId = pfsConfig.pfsConfigId
    pfsArmSet = PfsArmSet(visit, spectrograph, arms=arms, pfsConfig=pfsConfig)

    for armStr, data in pfsArmSet.data.items():
        thisArm = arm == armStr
        nPt = np.sum(thisArm)

        for i in range(nRealize):
            data.lam.append(wav[thisArm])
            data.flux.append(flam[thisArm] + np.random.normal(0.0, sigma[thisArm]))
            data.sky.append(sky[thisArm])
            data.mask.append(msk[thisArm])
            covar = np.zeros(3 * nPt).reshape((3, nPt))
            covar[0] = sigma[thisArm] ** 2
            data.covar.append(covar)

    if plotArmSet:
        pfsArmSet.plot(showFlux=True, showMask=False, showSky=False, showCovar=False)

    #
    # Time for I/O
    #
    # Fits
    #
    if writeFits:
        pfsConfig.write(outDir)  # pfsConfig file
        if writePfsArm:  # write pfsArm files
            for data in pfsArmSet.data.values():
                data.write(outDir)
    # Ascii
    #
    if asciiTable:
        write_ascii(pfsArmSet, asciiTable, outDir)
        print "ASCII table %s was generated" % asciiTable
    #
    # Now make the PfsObject from the PfsArmSet
    #
    for objId in objIds:
        pfsObject = makePfsObject(objId, [pfsArmSet])

        if plotObject:
            pfsObject.plot()

        if writeFits:
            pfsObject.write(outDir)  # pfsObject file