Example #1
0
class OptimizeTab:
    def __init__(self, ui, default_yspacing=1., default_iter=10):
        print 'loading OPT'
        self.ui = ui
        self.slitlets = Slitlets()
        self.opt_yspacing = default_yspacing
        self.opt_niter = default_iter

    def setoptimizer_yspacing(self):
        self.opt_yspacing = self.checkyspacing_input(
            self.ui.lineEditOpt_Yspacing.text())

    def setoptimizer_iter(self):
        self.opt_niter = self.checkniter_input(
            self.ui.lineEditOpt_Niter.text())

    def includerefstars(self):
        if self.ui.checkBoxOpt_IncRefstars.isChecked():
            nrefstars = len(np.where(self.slitlets.data['priority'] == -1)[0])
            self.ui.lineEditOpt_AllRefstars.setText(str(nrefstars))
        else:
            self.ui.lineEditOpt_AllRefstars.setText('')

    def setnumrefstars(self):
        print self.ui.lineEditOpt_NumRefstars.text()

    def optimize(self):
        """Run the optimizer program and optimize the slits"""
        msg = "Optimize the Slitlets"
        print msg
        cra = self.slitmask.center_ra
        cdec = self.slitmask.center_dec
        rotang = self.slitmask.position_angle
        equinox = 2000
        is_in_fov = np.where(self.slitlets.data['fov_flag'] == 1)[0]

        # jpk: this will need to be added in the next version
        #        is_in_fov = np.where((self.slitlets.data['inmask_flag'] == 1) * (self.slitlets.data['fov_flag'] == 1))[0]

        ra = self.slitlets.data['targ_ra']
        dec = self.slitlets.data['targ_dec']
        pri = self.slitlets.data['priority']
        slen = self.slitlets.data['len1'] + self.slitlets.data['len2']
        swid = self.slitlets.data['width']
        stilt = self.slitlets.data['tilt']

        Nstars_req = 0.  # **** Paul: I'm not quite sure where to get this from ****
        Niter = 10  # **** as above ****
        # set all inmask flags to zero before running optimiser
        #self.slitlets.emptymask()

        # -- only run this on objects within FOV:
        ok = is_in_fov
        if not ok.any():
            print "No objects in the field of view--update mask center and run again"
            return

        print ra[ok]
        tra = ra[ok]
        tdec = dec[ok]
        tpri = pri[ok]
        tslen = slen[ok]
        tswid = swid[ok]
        tstilt = stilt[ok]
        print 'running optimizer'

        tin_mask = opt.pyslit_optimize(cra, cdec, rotang, equinox, tra, tdec, \
                                    tpri,tslen,tswid,tstilt,\
                                    Niter,self.opt_yspacing, Nstars_req)
        # apply index numbers to full list:
        in_mask = ok[tin_mask]

        # reset all the in_mask values, otherwise the objects which should not
        # be in the optimized mask will still have a in_mask flag
        self.slitlets.data['inmask_flag'] = 0
        self.slitlets.data['collision_flag'] = 0

        # now add the in_mask flag to the sources which was found by the
        # optimizer
        for sid in in_mask:
            self.slitlets.addtomask(sid)
        self.updatetabs()

    def updatetabs(self):
        self.slitmask.outFoV_all()
        self.slitmask.find_collisions()
        self.slitlets.update_flags()
#        pass

    def checkyspacing_input(self, x):
        try:
            val = float(x)
            if val > 0:
                return val
            else:
                self.opt_yspacing = 1
                self.ui.lineEditOpt_Yspacing.setText(str(self.opt_yspacing))
        except ValueError, e:
            self.opt_yspacing = 1
            self.ui.lineEditOpt_Yspacing.setText(str(self.opt_yspacing))
Example #2
0
class OptimizeTab:
    def __init__(self, ui, default_yspacing=1., default_iter=10):
        print 'loading OPT'
        self.ui = ui
        self.slitlets=Slitlets()
        self.opt_yspacing = default_yspacing
        self.opt_niter = default_iter
        
    def setoptimizer_yspacing(self):
        self.opt_yspacing = self.checkyspacing_input(self.ui.lineEditOpt_Yspacing.text())
        
    def setoptimizer_iter(self):
        self.opt_niter = self.checkniter_input(self.ui.lineEditOpt_Niter.text())

    def includerefstars(self):
        if self.ui.checkBoxOpt_IncRefstars.isChecked():
            nrefstars = len(np.where(self.slitlets.data['priority'] == -1)[0])
            self.ui.lineEditOpt_AllRefstars.setText(str(nrefstars))
        else:
            self.ui.lineEditOpt_AllRefstars.setText('')

    def setnumrefstars(self):
        print self.ui.lineEditOpt_NumRefstars.text()

        
    def optimize(self): 
        """Run the optimizer program and optimize the slits"""
        msg = "Optimize the Slitlets"
        print msg
        cra = self.slitmask.center_ra
        cdec = self.slitmask.center_dec
        rotang = self.slitmask.position_angle
        equinox = 2000
        is_in_fov = np.where(self.slitlets.data['fov_flag'] == 1)[0]

        # jpk: this will need to be added in the next version
#        is_in_fov = np.where((self.slitlets.data['inmask_flag'] == 1) * (self.slitlets.data['fov_flag'] == 1))[0]

        ra = self.slitlets.data['targ_ra']
        dec = self.slitlets.data['targ_dec']
        pri = self.slitlets.data['priority']
        slen = self.slitlets.data['len1'] + self.slitlets.data['len2'] 
        swid = self.slitlets.data['width']
        stilt = self.slitlets.data['tilt']
        
        Nstars_req = 0. # **** Paul: I'm not quite sure where to get this from ****
        Niter=10 # **** as above ****
        # set all inmask flags to zero before running optimiser
        #self.slitlets.emptymask()
        
        # -- only run this on objects within FOV:        
        ok = is_in_fov
        if not ok.any(): 
           print "No objects in the field of view--update mask center and run again"
           return

        print ra[ok]
        tra = ra[ok]
        tdec = dec[ok]
        tpri = pri[ok]
        tslen = slen[ok]
        tswid = swid[ok]
        tstilt = stilt[ok]
        print 'running optimizer'
 
        tin_mask = opt.pyslit_optimize(cra, cdec, rotang, equinox, tra, tdec, \
                                    tpri,tslen,tswid,tstilt,\
                                    Niter,self.opt_yspacing, Nstars_req)
        # apply index numbers to full list:
        in_mask = ok[tin_mask]

        # reset all the in_mask values, otherwise the objects which should not
        # be in the optimized mask will still have a in_mask flag 
        self.slitlets.data['inmask_flag'] = 0
        self.slitlets.data['collision_flag'] = 0

        # now add the in_mask flag to the sources which was found by the
        # optimizer 
        for sid in in_mask:
            self.slitlets.addtomask(sid)
        self.updatetabs()


    def updatetabs(self):
        self.slitmask.outFoV_all()
        self.slitmask.find_collisions()
        self.slitlets.update_flags()
#        pass
    
    def checkyspacing_input(self, x):
        try:
            val = float(x)
            if val > 0:
                return val
            else:
                self.opt_yspacing = 1
                self.ui.lineEditOpt_Yspacing.setText(str(self.opt_yspacing))
        except ValueError,e:
            self.opt_yspacing = 1
            self.ui.lineEditOpt_Yspacing.setText(str(self.opt_yspacing))
Example #3
0
class CatalogTab:
    def __init__(self, ui, infile=None):
        self.ui = ui
        self.slitlets = Slitlets()
        self.slitmask = Slimask()
        self.infile = infile

    def getxml(self,infile):
        """Return the xml dom file if infile is either an xml file or an rsmt file"""
        try:
            zip = zipfile.ZipFile(infile,'r')
            zip.extract('Slitmask.xml')
            try:
                dom = minidom.parse('Slitmask.xml')
            except xml.parsers.expat.ExpatError as e:
                raise ReadXMLError(e)

        except zipfile.BadZipfile:
            try:
                dom = minidom.parse(infile)
            except xml.parsers.expat.ExpatError as e:
                raise ReadXMLError(e)
        return dom

    def loadcatalog(self):
        """Locate a file and then enter it into the ui"""

        #launch a file IO dialog
        ldir = os.getcwd()
        infile = QtGui.QFileDialog.getOpenFileName(caption="Open Catalog", directory=ldir)

        #load that file into the catalog
        self.entercatalog(str(infile))
        # set the new mask values on the display
        self.ui.lineEditMain_CenRA.setText(str(self.slitmask.center_ra))
        self.ui.lineEditMain_CenDEC.setText(str(self.slitmask.center_dec))
        self.ui.lineEditMain_PA.setText(str(self.slitmask.position_angle))
        self.ui.lineEditMain_Equinox.setText(str(self.slitmask.equinox))
        
        if self.slitmask.target_name:
           self.ui.lineEditMain_TargetName.setText(self.slitmask.target_name)
        if self.slitmask.mask_name:
           self.ui.lineEditMain_MaskName.setText(self.slitmask.mask_name)
        if self.slitmask.creator:
           self.ui.lineEditInfo_Creator.setText(self.slitmask.creator)
        if self.slitmask.proposer:
           self.ui.lineEditInfo_Proposer.setText(self.slitmask.proposer)
        if self.slitmask.proposal_code:
           self.ui.lineEditInfo_ProposalCode.setText(self.slitmask.proposal_code)

    def entercatalog(self, infile=None, form='short'):
        """Given a catalog, enter it into table in the ui"""
   
        #double check that a file exists and if not, then load it
        self.infile = infile
        if self.infile is None: 
           self.loadcatalog()
           return

        # check whether the input file is a rsmt or xml file. if it is a xml file
        # load the xml slitmask info, else load it as an ascii file
        try:
            self.slitmask.readmaskxml(self.getxml(str(infile)))
        except ReadXMLError:
            #enter the file information into the slit_arr
            self.slitlets.readascii(self.infile, form=form)
            self.slitmask.set_MaskPosition()
        print(self.slitmask.center_ra, self.slitmask.center_dec)
        #check for objects outside the FoV
        self.slitmask.outFoV()
        ### TESTING THE COLLISION CHECKER
        self.slitmask.find_collisions()
        #update the table
        self.updatetabs()



    def updatecatalogtable(self):
        self.slitlets.update_flags()
        rows = self.ui.tableWidgetCat.rowCount()
        for i in range(0,rows):
            self.ui.tableWidgetCat.removeRow(i)

        self.ui.tableWidgetCat.setRowCount(0)
        #enter the information into the table
        for i in range(self.slitlets.nobjects):
            if i > self.ui.tableWidgetCat.rowCount():
                self.ui.tableWidgetCat.insertRow(i-1)
            for j in range(len(catcolumn_list)):
                f = catcolumn_list[j]
                item = self.parseItem(self.slitlets.data[catcolumn_list[j]][i])
                self.ui.tableWidgetCat.setItem(i-1,j,item)

    def updatetabs(self):
       """Task designed for overloading"""
       self.updatecatalogtable()

    def addslitfromcatalog(self):
       """Determine slits elected in the catalog and add them to the catalog"""

       #get the selected items
       sel_list = self.ui.tableWidgetCat.selectedItems()
       print(self.ui.tableWidgetCat.selectedRanges())
       
       #for each item in sel_list, 
       #get the item, and determine the parameters from it 
       #and activite the object
       for selitem in sel_list:
           selitem.row() 
           i = selitem.row()
           stext = self.ui.tableWidgetCat.item(i,0).text()
           sid = self.slitlets.findslitlet(str(stext))
           self.slitlets.addtomask(sid)
       self.updatetabs()
           
        
    def parseItem(self, x):
       """Parse an object so it can be entered into the table"""
       if isinstance(x, str):
           return QtGui.QTableWidgetItem(x)
       elif isinstance(x, np.float32):
           return QtGui.QTableWidgetItem('%f' % x)
       elif isinstance(x, float):
           return QtGui.QTableWidgetItem('%f' % x)
       elif isinstance(x, int):
           return QtGui.QTableWidgetItem('%i' % x)
       return QtGui.QTableWidgetItem('')