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))
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))
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('')