diff --git a/README.pdf b/README.pdf index e3e9bf045bf7c7ed2cf7526b41496a717ad0a1a5..9bc8cd10b40100d3732e6473c1ba2e7cd9626ed0 100644 Binary files a/README.pdf and b/README.pdf differ diff --git a/SpecWindow/specWin.py b/SpecWindow/specWin.py new file mode 100644 index 0000000000000000000000000000000000000000..0f6f060fc8e97594cd1730f2235055e496c220a8 --- /dev/null +++ b/SpecWindow/specWin.py @@ -0,0 +1,443 @@ + +from multiprocessing.managers import BaseManager +from posixpath import basename +import sys +from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QFileDialog, QApplication, QPushButton, QLineEdit, QLabel, QComboBox, QCheckBox, QGridLayout +from PyQt5 import QtWidgets, QtCore +from PyQt5.QtGui import QIcon +from PyQt5.QtCore import Qt +#class Example + + +from SpecGen.SpecGenerator import SpecGenerator +from SpecGen.Config import Config + +from astropy.io import fits +from astropy.table import Table + +import galsim + + +from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas +from matplotlib.figure import Figure +from matplotlib.lines import Line2D +import matplotlib + +import numpy as np + +from pylab import * + + + + +class Figure_Canvas(FigureCanvas): + """ + 创建画板类 + """ + + def __init__(self, width=3.2, height=2.7): + self.fig = Figure(figsize=(width, height), dpi=70) + super(Figure_Canvas, self).__init__(self.fig) + + def add_line(self, x_data, y_data, x2_data, y2_data, specImg, grating): + self.fig.clear() + self.ax = self.fig.add_subplot(211) + self.line = Line2D(x_data, y_data) + + + + self.ax.grid(True) + self.ax.set_title('1-d Spec') + + + self.ax.set_xlabel('Wavelength($\AA$)') + self.ax.set_ylabel('F$\lambda$(erg/s/cm$^2$/$\AA$)') + self.line.set_color('blue') + + + # ------------------------------------------------------# + self.ax.add_line(self.line) + + self.line2 = Line2D(x2_data, y2_data) + self.ax.add_line(self.line2) + self.line2.set_color('red') + self.ax.legend([self.line, self.line2], ['Sim Spec', 'Orig Spec']) + + if grating == 'GU': + self.ax.set_xlim(2400, 4200) + elif grating == 'GV': + self.ax.set_xlim(3800, 6400) + elif grating == 'GI': + self.ax.set_xlim(6000, 10200) + # self.ax.set_xlim(np.min(x_data), np.max(x_data)) + self.ax.set_ylim(np.min([np.min(y_data),np.min(y2_data)]), np.max([np.max(y_data), np.max(y2_data)])) + + + + self.ax1 = self.fig.add_subplot(212) + import matplotlib.colors as colors + self.ax1.imshow(specImg, norm = colors.LogNorm()) + self.ax1.set_title('Sim Slitless Spec Img') + + + + +class Example(QMainWindow): + def __init__(self): + super().__init__() + self.InitUI() + + def InitUI(self): + # self.textEdit = QTextEdit() + # self.setCentralWidget(self.textEdit) + # self.statusBar() + + # openFile = QAction(QIcon('open.png'), 'Open', self) + # openFile.setShortcut('Ctrl+O') + # openFile.setStatusTip('Open new File') + # openFile.triggered.connect(self.showDialog) + + # menubar = self.menuBar() + # fileMenu = menubar.addMenu('&File') + # fileMenu.addAction(openFile) + # + + self.lbl0 = QLabel(self) + self.lbl0.move(20, 20) + self.lbl0.setText('Input spec file') + + self.btn = QPushButton("spec file", self) + self.btn.move(120, 20) + self.btn.clicked.connect(self.showDialog1) + # self.textEdit1 = QTextEdit() + # self.setCentralWidget(self.textEdit1) + # self.textEdit1.move(20,50) + + self.lbl1 = QLabel(self) + self.lbl1.move(220, 20) + + # self.btn = QPushButton("config file", self) + # self.btn.move(20, 50) + # self.btn.clicked.connect(self.showDialog2) + + self.lbl2 = QLabel(self) + self.lbl2.setText('Grating') + self.lbl2.move(20, 50) + + # self.lbl = QLabel("Ubuntu", self) + + self.gratingCombo = QComboBox(self) + self.gratingCombo.addItem("GI") + self.gratingCombo.addItem("GV") + self.gratingCombo.addItem("GU") + self.gratingCombo.move(120,50) + self.gratingCombo.activated[str].connect(self.onActivated) + + self.lbl2 = QLabel(self) + self.lbl2.move(150, 50) + + self.lbl3 = QLabel(self) + self.lbl3.move(20, 80) + self.lbl3.setText('Beam Order') + self.lbl3.adjustSize() + + self.beamCombo = QComboBox(self) + self.beamCombo.addItem("A") + self.beamCombo.addItem("B") + self.beamCombo.addItem("C") + self.beamCombo.addItem("D") + self.beamCombo.addItem("E") + + self.beamCombo.move(120,80) + self.beamCombo.activated[str].connect(self.onActivated) + + + self.lbl_line = QLabel(self) + self.lbl_line.move(20, 110) + self.lbl_line.setText('--------------CCD Information--------------') + self.lbl_line.adjustSize() + + + self.lbl4 = QLabel(self) + self.lbl4.move(20, 140) + self.lbl4.setText('PSF(FWHM,")') + self.lbl4.adjustSize() + + self.psfText = QLineEdit(self) + self.psfText.move(150,140) + self.psfText.setText('0.39') + + # self.lbl41 = QLabel(self) + # self.lbl41.move(230, 140) + # self.lbl41.setText('arcsec') + # self.lbl41.adjustSize() + + + + self.lbl5 = QLabel(self) + self.lbl5.move(20, 170) + self.lbl5.setText('Readout(e-/pixel)') + self.lbl5.adjustSize() + + self.rdText = QLineEdit(self) + self.rdText.move(150,170) + self.rdText.setText('5.0') + + + + self.lbl6 = QLabel(self) + self.lbl6.move(20, 200) + self.lbl6.setText('Dark(e-/s/pixel)') + self.lbl6.adjustSize() + + self.dkText = QLineEdit(self) + self.dkText.move(150,200) + self.dkText.setText('0.02') + + + self.lbl7 = QLabel(self) + self.lbl7.move(20, 230) + self.lbl7.setText('Pixel size("/pixel)') + self.lbl7.adjustSize() + + self.psText = QLineEdit(self) + self.psText.move(150,230) + self.psText.setText('0.074') + + self.lbl_line1 = QLabel(self) + self.lbl_line1.move(20, 260) + self.lbl_line1.setText('--------------Other Information--------------') + self.lbl_line1.adjustSize() + + + self.lbl8 = QLabel(self) + self.lbl8.move(20, 290) + self.lbl8.setText('Sky background(e-/s/pixel)') + self.lbl8.adjustSize() + + self.sbText = QLineEdit(self) + self.sbText.move(200,290) + self.sbText.setText('0.3') + + + self.lbl9 = QLabel(self) + self.lbl9.move(20, 320) + self.lbl9.setText('Exposure Time(s/frame)') + self.lbl9.adjustSize() + + self.etText = QLineEdit(self) + self.etText.move(200,320) + self.etText.setText('150') + + + self.lbl10 = QLabel(self) + self.lbl10.move(20, 350) + self.lbl10.setText('Frames') + self.lbl10.adjustSize() + + self.frText = QLineEdit(self) + self.frText.move(200,350) + self.frText.setText('1') + + self.lbl_line1 = QLabel(self) + self.lbl_line1.move(20, 380) + self.lbl_line1.setText('-----------------Source----------------------') + self.lbl_line1.adjustSize() + + self.cb1 = QCheckBox('Star', self) + self.cb1.move(20, 410) + self.cb1.setChecked(True) + + self.cb2 = QCheckBox('Galaxy', self) + self.cb2.move(20, 430) + # self.cb2.setChecked(True) + # self.cb2.toggle() + self.cb1.stateChanged.connect(lambda:self.checkButSta(self.cb1.isChecked(),self.cb2)) + self.cb2.stateChanged.connect(lambda:self.checkButSta(self.cb2.isChecked(),self.cb1)) + + self.lbl13 = QLabel(self) + self.lbl13.move(30, 460) + self.lbl13.setText('Sersic n') + self.lbl13.adjustSize() + + self.gsnText = QLineEdit(self) + # self.gsnText.setPlaceholderText('Sersic n') + self.gsnText.move(90,456) + self.gsnText.setText('0.5') + + self.lbl14 = QLabel(self) + self.lbl14.move(200, 460) + self.lbl14.setText('re(")') + self.lbl14.adjustSize() + + self.greText = QLineEdit(self) + # self.greText.setPlaceholderText('re') + self.greText.move(230,456) + self.greText.setText('0.1') + + self.lbl15 = QLabel(self) + self.lbl15.move(30, 490) + self.lbl15.setText('PA(deg)') + self.lbl15.adjustSize() + + self.gpaText = QLineEdit(self) + # self.gsnText.setPlaceholderText('Sersic n') + self.gpaText.move(90,486) + self.gpaText.setText('45') + + self.lbl16 = QLabel(self) + self.lbl16.move(200, 490) + self.lbl16.setText('q') + self.lbl16.adjustSize() + + self.gqText = QLineEdit(self) + # self.greText.setPlaceholderText('re') + self.gqText.move(230,486) + self.gqText.setText('0.1') + + + self.lbl_line1 = QLabel(self) + self.lbl_line1.move(20, 520) + self.lbl_line1.setText('-----------------Output----------------------') + self.lbl_line1.adjustSize() + + + + self.lbl11 = QLabel(self) + self.lbl11.move(20, 550) + self.lbl11.setText('output directory') + + self.btn = QPushButton("Output", self) + self.btn.move(120, 550) + self.btn.clicked.connect(self.showDialog2) + + # self.lbl12 = QLabel(self) + # self.lbl12.move(220, 20) + + self.lbl_line1 = QLabel(self) + self.lbl_line1.move(20, 580) + self.lbl_line1.setText('----------------------------------------------') + self.lbl_line1.adjustSize() + + self.simBt = QPushButton('Begin Sim', self) + self.simBt.setCheckable(True) + self.simBt.move(20, 610) + + self.simBt.clicked.connect(self.runDialog) + + self.groupBox = QtWidgets.QGroupBox(self) + self.groupBox.setGeometry(QtCore.QRect(350, 50, 450, 600)) + + self.fig = Figure_Canvas() + self.LineFigureLayout = QGridLayout(self.groupBox) + self.LineFigureLayout.addWidget(self.fig) + + + + # self.lbl41 = QLabel(self) + # self.lbl41.move(230, 110) + # self.lbl41.setText('arcsec') + # self.lbl41.adjustSize() + + + + + self.setGeometry(300, 300, 800, 700) + self.setWindowTitle('1-d spec generator') + self.show() + + def onActivated(self, text): + # self.lbl.setText(text) + # self.lbl.adjustSize() + a = text + + def showDialog1(self): + + fname = QFileDialog.getOpenFileName(self, 'Open file', '/home') + + if fname[0]: + f = open(fname[0], 'r') + + with f: + # data = f.read() + self.lbl1.setText(fname[0]) + self.lbl1.adjustSize() + self.sedFn = fname[0] + + def showDialog2(self): + + outdir = QFileDialog.getExistingDirectory(self, 'Output', '/home') + + if outdir: + self.btn.setText(outdir) + self.btn.adjustSize() + self.outDir = outdir + + # self.sedFn = fname[0] + + def checkButSta(self,state, btn): + if state == True: + btn.setChecked(False) + else: + btn.setChecked(True) + + + def runDialog(self): + + sedFn = self.sedFn + grating = self.gratingCombo.currentText() + beam = self.beamCombo.currentText() + + dataDir = '../data/' + config = Config(dataDir = dataDir) + sedFn = dataDir + 'sed/sed_44575.txt' + fwhm = float(self.psfText.text()) + p_size = float(self.psText.text()) + skybg = float(self.sbText.text()) + dark = float(self.dkText.text()) + readout = float(self.rdText.text()) + t = float(self.etText.text()) + expNum = int(self.frText.text()) + + psf = galsim.Gaussian(fwhm=fwhm) + specG = SpecGenerator(sedFn = sedFn, grating = grating, beam = beam, aper = 2.0, xcenter = 2000,ycenter = 5000, p_size = p_size, psf = psf, skybg = skybg, dark = dark, readout = readout, t = t, expNum = expNum,config = config) + if self.cb1.isChecked() == True: + specTab, specImg, img, fluxRa=specG.generateSpec1dforStar() + else: + g_sn = float(self.gsnText.text()) + g_re = float(self.greText.text()) + g_pa = float(self.gpaText.text()) + g_q = float(self.gqText.text()) + specTab, specImg, img, fluxRa=specG.generateSpec1dforGal(s_n = g_sn, re = g_re, pa = g_pa,q_ell = g_q,limitfluxratio=0.9) + + + spec_orig = np.loadtxt(sedFn) + + self.fig.add_line(specTab['WAVELENGTH'],specTab['FLUX']/fluxRa, spec_orig[:,0], spec_orig[:,1],specImg, grating) + + self.fig.draw() + + fits.writeto(self.outDir + "/specImg.fits",specImg,overwrite=True) + fits.writeto(self.outDir + "/DImg.fits",img,overwrite=True) + specTab.write(self.outDir + "/specTab.fits",overwrite=True) + + + + # def showDialog2(self): + + # fname = QFileDialog.getOpenFileName(self, 'Open file', '/home') + + # if fname[0]: + # f = open(fname[0], 'r') + + # with f: + # # data = f.read() + # self.lbl2.setText(fname[0]) + # self.lbl2.adjustSize() + + +if __name__ == '__main__': + + app = QApplication(sys.argv) + ex = Example() + sys.exit(app.exec_())