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
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