def main(phosimDir): # Settings outputDir = os.path.join(getModulePath(), "output") outputImgDir = os.path.join(outputDir, "img") cmdSettingFile = os.path.join(getModulePath(), "configData", "cmdFile", "opdDefault.cmd") instSettingFile = os.path.join(getModulePath(), "configData", "instFile", "opdDefault.inst") # Declare the opd metrology and add the interested field points metr = OpdMetrology() metr.addFieldXYbyDeg(0, 0) metr.addFieldXYbyDeg(0.2, 0.3) # Set the Telescope facade class configFilePath = os.path.join(getModulePath(), "configData", "telescopeConfig", "GT.inst") tele = TeleFacade(configFilePath=configFilePath) tele.setSubSysConfigDir(phosimDir=phosimDir) obsId = 9006050 filterType = FilterType.REF tele.setSurveyParam(obsId=obsId, filterType=filterType) # Update the telescope degree of freedom dofInUm = np.zeros(50) # Camera dx dofInUm[6] = 1000 tele.accDofInUm(dofInUm) # Write the physical command file cmdFilePath = tele.writeCmdFile(outputDir, cmdSettingFile=cmdSettingFile, cmdFileName="opd.cmd") # Write the instance file instFilePath = tele.writeOpdInstFile(outputDir, metr, instSettingFile=instSettingFile, instFileName="opd.inst") # Get the argument to run the PhoSim logFilePath = os.path.join(outputImgDir, "opdPhoSim.log") argString = tele.getPhoSimArgs(instFilePath, extraCommandFile=cmdFilePath, numPro=2, outputDir=outputImgDir, e2ADC=0, logFilePath=logFilePath) # Run the PhoSim tele.runPhoSim(argString) # Analyze the OPD fits images opdFitsFile = os.path.join(outputImgDir, "opd_9006050_0.fits.gz") zk = metr.getZkFromOpd(opdFitsFile=opdFitsFile)[0] print(zk) wavelengthInUm = tele.WAVELENGTH_IN_NM * 1e-3 pssn = metr.calcPSSN(wavelengthInUm, opdFitsFile=opdFitsFile) print(pssn)
def main(phosimDir): # Settings outputDir = os.path.join(getModulePath(), "output") outputImgDir = os.path.join(outputDir, "img") cmdSettingFile = os.path.join(getModulePath(), "configData", "cmdFile", "starDefault.cmd") instSettingFile = os.path.join(getModulePath(), "configData", "instFile", "starDefault.inst") # Survey information obsId = 9006000 instName = "lsst" filterType = FilterType.REF ra = 20 decl = 30 rotSkyPos = 10 mjd = 59580.0 # Declare the SkySim() skySim = SkySim() # Set the focal plane information folderPath2FocalPlane = os.path.join(phosimDir, "data", instName) skySim.setFolderPath2FocalPlane(folderPath2FocalPlane) # Set the observation information skySim.setObservationMetaData(ra, decl, rotSkyPos, mjd) # Add the interested stars sensorName = "R22_S11" starId = [0] xInpixelInCam = [3200] yInPixelInCam = [3800] starMag = [15] for ii in range(len(starId)): skySim.addStarByChipPos(sensorName, starId[ii], xInpixelInCam[ii], yInPixelInCam[ii], starMag[ii]) # Set the Telescope facade class configFilePath = os.path.join(getModulePath(), "configData", "telescopeConfig", "GT.inst") tele = TeleFacade(configFilePath=configFilePath) tele.setSubSysConfigDir(phosimDir=phosimDir) tele.setSurveyParam(obsId=obsId, filterType=filterType, boresight=(ra, decl), rotAngInDeg=rotSkyPos, mjd=mjd) tele.setInstName(instName) # Update the telescope degree of freedom dofInUm = np.zeros(50) # Camera piston in um dofInUm[5] = 1000 tele.accDofInUm(dofInUm) # Write the accumulated DOF file tele.writeAccDofFile(outputDir) # Write the star physical command file cmdFilePath = tele.writeCmdFile(outputDir, cmdSettingFile=cmdSettingFile, cmdFileName="star.cmd") # Write the instance file instFilePath = tele.writeStarInstFile(outputDir, skySim, instSettingFile=instSettingFile, instFileName="star.inst") # Get the argument to run the PhoSim logFilePath = os.path.join(outputImgDir, "phosimStar.log") argString = tele.getPhoSimArgs(instFilePath, extraCommandFile=cmdFilePath, numPro=1, outputDir=outputImgDir, e2ADC=0, logFilePath=logFilePath) # Run the PhoSim tele.runPhoSim(argString)
def main(phosimDir): # Settings outputDir = os.path.join(getModulePath(), "output") outputImgDir = os.path.join(outputDir, "img") cmdSettingFile = os.path.join(getModulePath(), "configData", "cmdFile", "opdDefault.cmd") instSettingFile = os.path.join(getModulePath(), "configData", "instFile", "opdDefault.inst") # Declare the opd metrology and add the interested field points metr = OpdMetrology() metr.addFieldXYbyDeg(0, 0) metr.addFieldXYbyDeg(0.2, 0.3) # Set the Telescope facade class configFilePath = os.path.join(getModulePath(), "configData", "telescopeConfig", "GT.inst") tele = TeleFacade(configFilePath=configFilePath) # Subsystem data direction camDataDir = os.path.join(getModulePath(), "configData", "camera") M1M3dataDir = os.path.join(getModulePath(), "configData", "M1M3") M2dataDir = os.path.join(getModulePath(), "configData", "M2") tele.setSubSysConfigDir(camDataDir=camDataDir, M1M3dataDir=M1M3dataDir, M2dataDir=M2dataDir, phosimDir=phosimDir) # Set the survey parameters obsId = 9006000 filterType = FilterType.REF zAngleInDeg = 27.0912 rotAngInDeg = np.rad2deg(-1.2323) tele.setSurveyParam(obsId=obsId, filterType=filterType, zAngleInDeg=zAngleInDeg, rotAngInDeg=rotAngInDeg) # Generate the perturbation iSim = 6 pertCmdFilePath = tele.writePertBaseOnConfigFile(outputDir, seedNum=iSim, saveResMapFig=True) # Update the telescope degree of freedom dofInUm = np.zeros(50) # Camera dx dofInUm[6] = 1000 tele.accDofInUm(dofInUm) # Write the physical command file cmdFilePath = tele.writeCmdFile(outputDir, cmdSettingFile=cmdSettingFile, pertFilePath=pertCmdFilePath, cmdFileName="opd.cmd") # Write the instance file instFilePath = tele.writeOpdInstFile(outputDir, metr, instSettingFile=instSettingFile, instFileName="opd.inst") # Get the argument to run the PhoSim logFilePath = os.path.join(outputImgDir, "opdPhoSim.log") argString = tele.getPhoSimArgs(instFilePath, extraCommandFile=cmdFilePath, numPro=2, outputDir=outputImgDir, e2ADC=0, logFilePath=logFilePath) # Run the PhoSim tele.runPhoSim(argString) # Analyze the OPD fits images opdFitsFile = os.path.join(outputImgDir, "opd_9006000_0.fits.gz") zk = metr.getZkFromOpd(opdFitsFile=opdFitsFile)[0] print(zk) wavelengthInUm = tele.WAVELENGTH_IN_NM * 1e-3 pssn = metr.calcPSSN(wavelengthInUm, opdFitsFile=opdFitsFile) print(pssn)
class TestTeleFacade(unittest.TestCase): """ Test the TeleFacade class.""" def setUp(self): self.configFilePath = os.path.join(getModulePath(), "configData", "telescopeConfig", "GT.inst") self.tele = TeleFacade(configFilePath=self.configFilePath) # Set the subsystem data directory camDataDir = os.path.join(getModulePath(), "configData", "camera") M1M3dataDir = os.path.join(getModulePath(), "configData", "M1M3") M2dataDir = os.path.join(getModulePath(), "configData", "M2") self.tele.setSubSysConfigDir(camDataDir=camDataDir, M1M3dataDir=M1M3dataDir, M2dataDir=M2dataDir) # Set the survey parameters obsId = 9006000 filterType = FilterType.G boresight = (0.2, 0.3) zAngleInDeg = 27.0912 rotAngInDeg = np.rad2deg(-1.2323) mjd = 59552.3 self.tele.setSurveyParam(obsId=obsId, filterType=filterType, boresight=boresight, zAngleInDeg=zAngleInDeg, rotAngInDeg=rotAngInDeg, mjd=mjd) # Set the output dir self.outputDir = os.path.join(getModulePath(), "output", "temp") os.makedirs(self.outputDir) def tearDown(self): shutil.rmtree(self.outputDir) def testGetDefocalDisInMm(self): instName = "comcam13" self.tele.setInstName(instName) self.assertEqual(self.tele.getDefocalDisInMm(), 1.3) def testSetSurveyParamWithCorrectInput(self): obsId = 100 filterType = FilterType.U boresight = (10, 20) zAngleInDeg = 10.0 rotAngInDeg = 11.0 mjd = 4000.0 tele = TeleFacade() tele.setSurveyParam(obsId=obsId, filterType=filterType, boresight=boresight, zAngleInDeg=zAngleInDeg, rotAngInDeg=rotAngInDeg, mjd=mjd) self.assertEqual(tele.surveyParam["obsId"], obsId) self.assertEqual(tele.surveyParam["filterType"], filterType) self.assertEqual(tele.surveyParam["boresight"], boresight) self.assertEqual(tele.surveyParam["zAngleInDeg"], zAngleInDeg) self.assertEqual(tele.surveyParam["rotAngInDeg"], rotAngInDeg) self.assertEqual(tele.surveyParam["mjd"], mjd) def testSetSurveyParamWithWrongInput(self): defaultObsId = self.tele.surveyParam["obsId"] obsId = 1.0 self.tele.setSurveyParam(obsId=obsId) self.assertEqual(self.tele.surveyParam["obsId"], defaultObsId) self.assertEqual(self.tele.surveyParam["filterType"], FilterType.G) def testSetSensorOnWithCorrectInput(self): sciSensorOn = False wfSensorOn = False guidSensorOn = True self.tele.setSensorOn(sciSensorOn=sciSensorOn, wfSensorOn=wfSensorOn, guidSensorOn=guidSensorOn) self.assertEqual(self.tele.sensorOn["sciSensorOn"], sciSensorOn) self.assertEqual(self.tele.sensorOn["wfSensorOn"], wfSensorOn) self.assertEqual(self.tele.sensorOn["guidSensorOn"], guidSensorOn) def testSetSensorOnWithWrongInput(self): sciSensorOn = 0 self.tele.setSensorOn(sciSensorOn=sciSensorOn) self.assertEqual(self.tele.sensorOn["sciSensorOn"], True) def testSetConfigFile(self): configFilePath = "NotConfigFilePath" self.tele.setConfigFile(configFilePath) self.assertEqual(self.tele.configFile, configFilePath) def testGetConfigValue(self): varName = "M1M3TxGrad" value = self.tele.getConfigValue(varName) self.assertEqual(value, -0.0894) def testGetPhoSimArgs(self): instFilePath = "temp.inst" argString = self.tele.getPhoSimArgs(instFilePath) ansArgString = "%s -i lsst -e 1" % os.path.abspath(instFilePath) self.assertEqual(argString, ansArgString) def testSetInstName(self): instName = "comcam10" self.tele.setInstName(instName) self.assertEqual(self.tele.surveyParam["instName"], "comcam") self.assertEqual(self.tele.getDefocalDisInMm(), 1.0) instName = "temp" self.tele.setInstName(instName) self.assertEqual(self.tele.surveyParam["instName"], "temp") self.assertEqual(self.tele.getDefocalDisInMm(), 1.5) self.assertRaises(ValueError, self.tele.setInstName, "a10a") def testSetDofInUm(self): dofInUm = np.random.rand(50) self.tele.setDofInUm(dofInUm) self.assertEqual(np.sum(np.abs(self.tele.dofInUm - dofInUm)), 0) def testAccDofInUm(self): dofInUm = np.random.rand(50) self.tele.accDofInUm(dofInUm) self.assertEqual(np.sum(np.abs(self.tele.dofInUm - dofInUm)), 0) def testSetSubSysConfigDir(self): tele = TeleFacade(configFilePath=self.configFilePath) self.assertEqual(tele.cam, None) self.assertEqual(tele.M1M3, None) self.assertEqual(tele.M2, None) camDataDir = "NotCamDataDir" M1M3dataDir = "NotM1M3dataDir" M2dataDir = "NotM2dataDir" phosimDir = "NotPhosimDir" tele.setSubSysConfigDir(camDataDir=camDataDir, M1M3dataDir=M1M3dataDir, M2dataDir=M2dataDir, phosimDir=phosimDir) # Check the subsystems are instantiated after setting up the # configuration directory. self.assertNotEqual(tele.cam, None) self.assertNotEqual(tele.M1M3, None) self.assertNotEqual(tele.M2, None) self.assertEqual(tele.cam.camDataDir, camDataDir) self.assertEqual(tele.M1M3.mirrorDataDir, M1M3dataDir) self.assertEqual(tele.M2.mirrorDataDir, M2dataDir) self.assertEqual(tele.phoSimCommu.phosimDir, phosimDir) def testWriteAccDofFile(self): dofFilePath = self.tele.writeAccDofFile(self.outputDir) dof = np.loadtxt(dofFilePath) self.assertEqual(np.sum(dof), 0) self.assertEqual(len(dof), 50) def testWritePertBaseOnConfigFile(self): pertCmdFilePath = self._writePertBaseOnConfigFile(self.outputDir) numOfLineInFile = self._getNumOfLineInFile(pertCmdFilePath) self.assertEqual(numOfLineInFile, 256) def _writePertBaseOnConfigFile(self, outputDir): iSim = 6 pertCmdFilePath = self.tele.writePertBaseOnConfigFile( outputDir, seedNum=iSim, M1M3ForceError=0.05, saveResMapFig=True, pertCmdFileName="pert.cmd") return pertCmdFilePath def _getNumOfLineInFile(self, filePath): with open(filePath, "r") as file: return sum(1 for line in file.readlines()) def testWriteCmdFile(self): starCmdSettingFile = os.path.join(getModulePath(), "configData", "cmdFile", "starDefault.cmd") pertCmdFilePath = self._writePertBaseOnConfigFile(self.outputDir) cmdFilePath = self.tele.writeCmdFile( self.outputDir, cmdSettingFile=starCmdSettingFile, pertFilePath=pertCmdFilePath, cmdFileName="star.cmd") numOfLineInFile = self._getNumOfLineInFile(cmdFilePath) self.assertEqual(numOfLineInFile, 267) def testGetPhoSimCamSurf(self): camSurfName = "L1S2zer" surfaceType = self.tele._getPhoSimCamSurf(camSurfName) self.assertEqual(surfaceType.name, "L1B") self.assertRaises(ValueError, self.tele._getPhoSimCamSurf, "L4S2zer") def testWriteOpdInstFile(self): metr, opdInstSettingFile = self._generateOpd() instFilePath = self.tele.writeOpdInstFile( self.outputDir, metr, instSettingFile=opdInstSettingFile) numOfLineInFile = self._getNumOfLineInFile(instFilePath) self.assertEqual(numOfLineInFile, 59) def testWriteOpdInstFileWithFilterRef(self): self.tele.setSurveyParam(filterType=FilterType.REF) metr, opdInstSettingFile = self._generateOpd() instFilePath = self.tele.writeOpdInstFile( self.outputDir, metr, instSettingFile=opdInstSettingFile) numOfLineInFile = self._getNumOfLineInFile(instFilePath) self.assertEqual(numOfLineInFile, 59) def _generateOpd(self): metr = OpdMetrology() metr.addFieldXYbyDeg(0, 0) opdInstSettingFile = os.path.join(getModulePath(), "configData", "instFile", "opdDefault.inst") return metr, opdInstSettingFile def testWriteStarInstFile(self): skySim, starInstSettingFile = self._generateFakeSky() instFilePath = self.tele.writeStarInstFile( self.outputDir, skySim, instSettingFile=starInstSettingFile) numOfLineInFile = self._getNumOfLineInFile(instFilePath) self.assertEqual(numOfLineInFile, 63) def testWriteStarInstFileWithFilterRef(self): self.tele.setSurveyParam(filterType=FilterType.REF) skySim, starInstSettingFile = self._generateFakeSky() instFilePath = self.tele.writeStarInstFile( self.outputDir, skySim, instSettingFile=starInstSettingFile) numOfLineInFile = self._getNumOfLineInFile(instFilePath) self.assertEqual(numOfLineInFile, 63) def _generateFakeSky(self): skySim = SkySim() skySim.addStarByRaDecInDeg(0, 1.0, 1.0, 17.0) starInstSettingFile = os.path.join(getModulePath(), "configData", "instFile", "starDefault.inst") return skySim, starInstSettingFile