コード例 #1
0
ファイル: lcview.py プロジェクト: paegert/ebfactory
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        
        # connect the menu actions
        QtCore.QObject.connect(self.ui.actionOpen, QtCore.SIGNAL('triggered()'),
                               self.select_file)
        QtCore.QObject.connect(self.ui.actionQuit, QtCore.SIGNAL('triggered()'),
                               QtGui.qApp, QtCore.SLOT('quit()'))
        QtCore.QObject.connect(self.ui.actionAsas, QtCore.SIGNAL('triggered()'),
                               self.actionAsas)
        QtCore.QObject.connect(self.ui.actionKepler, QtCore.SIGNAL('triggered()'),
                               self.actionKepler)

        
        # make tableWidgets read only
        self.ui.lcWidget.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        self.ui.lcWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        
        self.child  = None
        self.childs = []
        
        self.offset = 0
        self.newrun = True
        self.db = None

        self.dictdb  = None
        self.vardb   = None
        self.star    = None
        self.staruid = 0
        self.cls1  = None
        self.prob1 = None
            
        self.plcdb = None            
        self.blcdb = None
        self.fitdb = None
        
        self.init_options()
コード例 #2
0
ファイル: lcview.py プロジェクト: paegert/ebfactory
class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        
        # connect the menu actions
        QtCore.QObject.connect(self.ui.actionOpen, QtCore.SIGNAL('triggered()'),
                               self.select_file)
        QtCore.QObject.connect(self.ui.actionQuit, QtCore.SIGNAL('triggered()'),
                               QtGui.qApp, QtCore.SLOT('quit()'))
        QtCore.QObject.connect(self.ui.actionAsas, QtCore.SIGNAL('triggered()'),
                               self.actionAsas)
        QtCore.QObject.connect(self.ui.actionKepler, QtCore.SIGNAL('triggered()'),
                               self.actionKepler)

        
        # make tableWidgets read only
        self.ui.lcWidget.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        self.ui.lcWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        
        self.child  = None
        self.childs = []
        
        self.offset = 0
        self.newrun = True
        self.db = None

        self.dictdb  = None
        self.vardb   = None
        self.star    = None
        self.staruid = 0
        self.cls1  = None
        self.prob1 = None
            
        self.plcdb = None            
        self.blcdb = None
        self.fitdb = None
        
        self.init_options()
        
        # enable drag and drop without subclassing QLineEdit
#        self.ui.fnameEdit.installEventFilter(self)   
#        self.ui.dnameEdit.installEventFilter(self)   

        

#     def eventFilter(self, object, event):
#         if object is self.ui.fnameEdit:
#             if (event.type() == QtCore.QEvent.DragEnter):
#                 if (event.mimeData().hasUrls()):
#                     event.accept()  # otherwise the drop can't occur
#                 else:
#                     event.ignore()
#             if (event.type() == QtCore.QEvent.Drop):
#                 if (event.mimeData().hasUrls()):
#                     event.accept()
#                     url = (event.mimeData().urls())[0]
#                     self.ui.fnameEdit.setText(url.toLocalFile())
#                     self.ui.lcWidget.clear()
#                     self.ui.lcWidget.setRowCount(0)
#                     self.load_file()
#                     return True     # we did process the event
#         elif object is self.ui.dnameEdit:
#             if (event.type() == QtCore.QEvent.DragEnter):
#                 if (event.mimeData().hasUrls()):
#                     event.accept()  # otherwise the drop can't occur
#                 else:
#                     event.ignore()
#             if (event.type() == QtCore.QEvent.Drop):
#                 if (event.mimeData().hasUrls()):
#                     event.accept()
#                     url = (event.mimeData().urls())[0]
#                     self.ui.dnameEdit.setText(url.toLocalFile())
#                     self.ui.dictWidget.clear()
#                     self.ui.dictWidget.setRowCount(0)
#                     self.load_dict()
#                     return True     # we did process the event
#             
#         return False     # let event continue
    
    
    
    def init_options(self):
        global dbc, options
        
        if (options.rootdir[-1] != '/'):
            options.rootdir += '/'
    
        cls = getattr(dbconfig, options.dbconfig)
        dbc = cls()
        
        if options.clsname != None:
            self.ui.fnameEdit.setText(options.rootdir + options.clsname)
            self.load_file()
            self.run_cmd()

        if options.dictname != None:
            self.ui.dnameEdit.setText(options.rootdir + options.dictname)
            self.load_dict()

        if options.plcname != None:
            self.ui.plcnameEdit.setText(options.rootdir + options.plcname)
            self.plcdb = dbr.DbReader(options.rootdir + options.plcname)

        if options.blcname != None:
            self.ui.blcnameEdit.setText(options.rootdir + options.blcname)
            self.blcdb = dbr.DbReader(options.rootdir + options.blcname)

        if options.fitname != None:
            self.ui.fitnameEdit.setText(options.rootdir + options.fitname)
            self.fitdb = dbr.DbReader(options.rootdir + options.fitname)

        
    
    def process_options(self):
        global parser, options, dbc
        argstr = str(self.ui.optionEdit.text())
        argv = argstr.split()
        (options, args) = parser.parse_args(argv)
        self.init_options()
        
    
    def actionAsas(self):
        global options, dbc
        options.dbconfig = 'Asas'
        cls = getattr(dbconfig, options.dbconfig)
        dbc = cls()
    
    
    
    def actionKepler(self):
        global options, dbc
        options.dbconfig = 'Kepq3'
        cls = getattr(dbconfig, options.dbconfig)
        dbc = cls()
        


    def select_file(self):
        infile = QtGui.QFileDialog.getOpenFileName()
        if infile:
            self.ui.fnameEdit.setText(infile)
            self.load_file()
        


    def load_file(self):
        fname = str(self.ui.fnameEdit.text())
        if self.db != None:
            self.db.close()
        self.db = dbr.DbReader(fname)
        res = self.db.fetchall("SELECT * FROM sqlite_master WHERE type='table';")
        # print res[0].keys()
        self.tname = res[0][1]
        self.ui.cmdEdit.setText('select * from ' + self.tname + ' order by prob1 desc')
        


    def load_dict(self):
        dname = str(self.ui.dnameEdit.text())
        if self.dictdb != None:
            self.dictdb.close()
        self.dictdb = dbr.DbReader(dname)
        
    
    
    def load_plc(self):
        fname = str(self.ui.plcnameEdit.text())
        if self.plcdb != None:
            self.plcdb.close()
        self.plcdb = dbr.DbReader(fname)
        
    
    
    def load_blc(self):
        fname = str(self.ui.blcnameEdit.text())
        if self.blcdb != None:
            self.blcdb.close()
        self.blcdb = dbr.DbReader(fname)
        
    
    
    def load_fit(self):
        fname = str(self.ui.fitnameEdit.text())
        if self.fitdb != None:
            self.fitdb.close()
        self.fitdb = dbr.DbReader(fname)
        
        
        
    def run_cmd(self):
        if self.newrun == True:
            self.offset = 0
        self.ui.lcWidget.clear()
        self.ui.lcWidget.setRowCount(0)
        cmd = str(self.ui.cmdEdit.text()) + ' limit 100 offset ' + \
              str(self.offset)
        self.rows = self.db.fetchmany(cmd, None, 100)
        for i, row in enumerate(self.rows):
            if (i == 0):
                self.cols = row.keys()
                self.ui.lcWidget.setColumnCount(len(self.cols))
                self.ui.lcWidget.setHorizontalHeaderLabels(self.cols)
            self.ui.lcWidget.insertRow(i)
            for j, col in enumerate(row):
                item = QtGui.QTableWidgetItem(str(col));
                self.ui.lcWidget.setItem(i, j, item)
        self.newrun = True
        
        
        
    def prev(self):
        if self.offset >= 100:
            self.offset -= 100
        else:
            self.offset = 0
        self.newrun = False
        self.run_cmd()
        
        
        
    def next(self):
        self.offset += 100
        self.newrun = False
        self.run_cmd()
        
        
        
    def change_star(self):
        row  = self.ui.lcWidget.currentRow()
        cell = self.ui.lcWidget.item(row, 1)
        self.staruid = int(cell.text())
        cell = self.ui.lcWidget.item(row, 4)
        self.cls1 = cell.text()
        cell = self.ui.lcWidget.item(row, 5)
        self.prob1 = str(round(float(cell.text()), 4))
        if self.dictdb != None:
            cmd  = 'select * from vardict where uid = ?'
            self.star = self.dictdb.fetchone(cmd, (self.staruid,))
            cols = self.star.keys()
            self.ui.dictWidget.setColumnCount(len(cols))
            self.ui.dictWidget.setHorizontalHeaderLabels(cols)
            self.ui.dictWidget.setRowCount(1)
            for i, col in enumerate(self.star):
                item = QtGui.QTableWidgetItem(str(col))
                self.ui.dictWidget.setItem(0, i, item)
            
    
    
    def plot_newlc(self):
        self.child = None
        self.plot_lc()
        
    

    def fit4chains(self, fitphases, coeffs):
        fitvalues = []
        for x in fitphases:
            if x >= coeffs[0]['knot1'] and x < coeffs[0]['knot2']:
                xx = x - coeffs[0]['knot1']
                y = coeffs[0]['c11'] + coeffs[0]['c12'] * xx + coeffs[0]['c13'] * xx * xx
                fitvalues.append(y)
            elif x >= coeffs[0]['knot2'] and x < coeffs[0]['knot3']:
                xx = x - coeffs[0]['knot2']
                y = coeffs[0]['c21'] + coeffs[0]['c22'] * xx + coeffs[0]['c23'] * xx * xx
                fitvalues.append(y)
            elif x >= coeffs[0]['knot3'] and x < coeffs[0]['knot4']:
                xx = x - coeffs[0]['knot3']
                y = coeffs[0]['c31'] + coeffs[0]['c32'] * xx + coeffs[0]['c33'] * xx * xx
                fitvalues.append(y)
            elif x >= coeffs[0]['knot4'] or x < coeffs[0]['knot1']:
                dknot = 1.0 + coeffs[0]['knot1'] - coeffs[0]['knot4']
                if x < coeffs[0]['knot1']:
                    knot = coeffs[0]['knot4'] - 1
                else:
                    knot = coeffs[0]['knot4']
                xx = x - knot
                y = coeffs[0]['c41'] + coeffs[0]['c42'] * xx + coeffs[0]['c43'] * xx * xx
                # correct for wrapping around
                y -= coeffs[0]['c43'] * xx * dknot
                fitvalues.append(y)
        return fitvalues
        
    

    def fit2chains(self, fitphases, coeffs):
        fitvalues = []
        for x in fitphases:
            if x >= coeffs[0]['knot1'] and x < coeffs[0]['knot2']:
                xx = x - coeffs[0]['knot1']
                y = coeffs[0]['c11'] + coeffs[0]['c12'] * xx + coeffs[0]['c13'] * xx * xx
                fitvalues.append(y)
            elif x >= coeffs[0]['knot2'] or x < coeffs[0]['knot1']:
                dknot = 1.0 + coeffs[0]['knot1'] - coeffs[0]['knot2']
                if x < coeffs[0]['knot1']:
                    knot = coeffs[0]['knot2'] - 1
                else:
                    knot = coeffs[0]['knot2']
                xx = x - knot
                y = coeffs[0]['c21'] + coeffs[0]['c22'] * xx + coeffs[0]['c23'] * xx * xx
                # correct for wrapping around
                y -= coeffs[0]['c23'] * xx * dknot
                fitvalues.append(y)
        return fitvalues



    def plot_lc(self):
        if self.staruid == 0:
            QtGui.QMessageBox.critical(self, 'Error', 'No star Selected')
            return
        
        plcphases = None
        plcmags   = None
        if self.plcdb != None:
            res = self.plcdb.getlc(self.staruid, 'stars', 'phase asc')
            if type(dbc) == dbconfig.Kepq3:
                plcphases = [x[3] for x in res]
                plcmags   = [x[10] for x in res]
            else:
                plcphases = [x[4] for x in res]
                plcmags   = [x[5] for x in res]

        blcphases = None
        blcmags   = None
        if self.blcdb != None:
            res = self.blcdb.getlc(self.staruid, 'stars', 'phase asc')
            blcphases = [x[2] for x in res]
            blcmags   = [x[3] for x in res]
    
        midphases  = None
        midvalues  = None
        fitphases = None
        fitvalues = None
        if self.fitdb != None:
            mid = self.fitdb.getlc(self.staruid, tname = 'midpoints')
            if mid != None and len(mid) > 0:
                midphases = []
                midvalues = []
                for i in range(4):
                    midphases.append(mid[0][4 * i + 2])    # knot
                    midvalues.append(mid[0][4 * i + 3])    # flux of knot
                    midphases.append(mid[0][4 * i + 4])    # midpoint
                    midvalues.append(mid[0][4 * i + 5])    # flux of midpoint
                
            fit = self.fitdb.getlc(self.staruid, tname = 'fit')
            if fit != None and len(fit) > 0:
                fitphases = [x[2] for x in fit]
                fitvalues = [x[3] for x in fit]
            else:
                coeffs = self.fitdb.getlc(self.staruid, 'coeffs')
                if len(coeffs) == 0:
                    msg = 'Selected star has no light curve in ' + \
                          self.fitdb.fname
                    QtGui.QMessageBox.critical(self, 'Error', msg)
                    return
                fitphases = np.linspace(-0.5, 0.5, 100)
                if coeffs[0]['knot2'] != 0 and coeffs[0]['knot3'] != 0:
                    fitvalues = self.fit4chains(fitphases, coeffs)
                else:
                    fitvalues = self.fit2chains(fitphases, coeffs)
                    

        plotlcs = [(plcphases, plcmags, 'k.'), (blcphases, blcmags, 'r.'), 
                   (fitphases, fitvalues, 'b-'), (midphases, midvalues, 'go')]
        keylist = self.star.keys()
        title   = str(self.star[dbc.t['id']]) + '  '
        if 'varcls' in keylist and self.star['varcls'] != None:
            title += self.star['varcls'] 
        if 'cls1' in keylist and 'prob1' in keylist:
            title += '  (' + self.cls1 + ': ' + self.prob1 + ')'
        xlabel  = 'Phase (Period = ' + str(self.star['period']) + 'd)' 
        
        if self.child == None:
            self.child = PlotWindow(self)
            self.childs.append(self.child)
        else:
            self.child.pwidget.axes.clear()
        self.child.plot_figure(plotlcs, title, xlabel, [-0.5, 0.5])
        self.child.show()
        
        
        
    def close_child(self):
        if self.child in self.childs:
            self.childs.remove(self.child)
        self.child = None
        if len(self.childs) != 0:
            self.child = self.childs[-1]
        
        
    
    def closeEvent(self, ce):
        if self.db != None:
            self.db.close()
        if self.dictdb != None:
            self.dictdb.close()
        if self.plcdb != None:
            self.plcdb.close()
        if self.blcdb != None:
            self.blcdb.close()
        if self.fitdb != None:
            self.fitdb.close()
        self.close()