Ejemplo n.º 1
0
 def accept(self):
     """Tries to restore the image, and closes the dialog if successful."""
     # get list of sources to restore
     sources = self.model.sources
     sel_sources = [src for src in sources if src.selected]
     if len(sel_sources) > 0 and len(sel_sources) < len(
             sources) and self.wselonly.isChecked():
         sources = sel_sources
     if not sources:
         self.qerrmsg.showMessage("No sources to restore.")
         return
     busy = BusyIndicator()
     # get filenames
     infile = self.wfile_in.filename()
     outfile = self.wfile_out.filename()
     self.parent().showMessage(
         "Restoring %d model sources to image %s, writing to %s" %
         (len(sources), infile, outfile))
     # read fits file
     try:
         input_hdu = pyfits.open(infile)[0]
     except Exception as err:
         busy.reset_cursor()
         self.qerrmsg.showMessage("Error reading FITS file %s: %s" %
                                  (infile, str(err)))
         return
     # get beam sizes
     try:
         bmaj = float(str(self.wbmaj.text()))
         bmin = float(str(self.wbmin.text()))
         pa = float(str(self.wbpa.text()) or "0")
     except Exception as err:
         busy.reset_cursor()
         self.qerrmsg.showMessage("Invalid beam size specified")
         return
     bmaj = bmaj / (Imaging.FWHM * 3600) * DEG
     bmin = bmin / (Imaging.FWHM * 3600) * DEG
     pa = pa * DEG
     # restore
     try:
         Imaging.restoreSources(input_hdu, sources, bmaj, bmin, pa)
     except Exception as err:
         busy.reset_cursor()
         self.qerrmsg.showMessage("Error restoring model into image: %s" %
                                  str(err))
         return
     # save fits file
     try:
         input_hdu.writeto(outfile, overwrite=True)
     except Exception as err:
         busy.reset_cursor()
         self.qerrmsg.showMessage("Error writing FITS file %s: %s" %
                                  (outfile, str(err)))
         return
     self.parent().loadImage(outfile)
     busy.reset_cursor()
     return QDialog.accept(self)
Ejemplo n.º 2
0
 def _psfFileSelected (self,filename):
   busy = BusyIndicator();
   filename = str(filename);
   self.parent().showMessage("Fitting gaussian to PSF file %s"%filename);
   try:
     bmaj,bmin,pa = [ x/DEG for x in Imaging.fitPsf(filename) ];
   except Exception,err:
     busy = None;
     self.qerrmsg.showMessage("Error fitting PSF file %s: %s"%(filename,str(err)));
     return;
Ejemplo n.º 3
0
 def _psfFileSelected (self,filename):
   busy = BusyIndicator();
   filename = str(filename);
   self.parent().showMessage("Fitting gaussian to PSF file %s"%filename);
   try:
     bmaj,bmin,pa = [ x/DEG for x in Imaging.fitPsf(filename) ];
   except Exception,err:
     busy = None;
     self.qerrmsg.showMessage("Error fitting PSF file %s: %s"%(filename,str(err)));
     return;
Ejemplo n.º 4
0
 def _psfFileSelected(self, filename):
     busy = BusyIndicator()
     filename = str(filename)
     self.parent().showMessage("Fitting gaussian to PSF file %s" % filename)
     try:
         bmaj, bmin, pa = [x / DEG for x in Imaging.fitPsf(filename)]
     except Exception as err:
         busy = None
         self.qerrmsg.showMessage("Error fitting PSF file %s: %s" % (filename, str(err)))
         return
     bmaj *= 3600 * Imaging.FWHM
     bmin *= 3600 * Imaging.FWHM
     self.wbmaj.setText(str(bmaj))
     self.wbmin.setText(str(bmin))
     self.wbpa.setText(str(pa))
Ejemplo n.º 5
0
 def accept(self):
     """Tries to make a brick, and closes the dialog if successful."""
     sources = [
         src for src in self.model.sources
         if src.selected and src.typecode == 'pnt'
     ]
     filename = self.wfile.filename()
     if not self._fileSelected(filename):
         return
     # get PB expression
     pbfunc = None
     if self.wpb_apply.isChecked():
         pbexp = str(self.wpb_exp.text())
         try:
             pbfunc = eval("lambda r,fq:" + pbexp)
         except Exception as err:
             QMessageBox.warning(
                 self, "Error parsing PB experssion",
                 "Error parsing primary beam expression %s: %s" %
                 (pbexp, str(err)))
             return
     # get frequency
     freq = str(self.wfreq.text())
     freq = float(freq) * 1e+6 if freq else None
     # get pad factor
     pad = str(self.wpad.text())
     pad = max(float(pad), 1) if pad else 1
     # read fits file
     busy = BusyIndicator()
     try:
         input_hdu = pyfits.open(filename)[0]
     except Exception as err:
         busy = None
         QMessageBox.warning(
             self, "Error reading FITS",
             "Error reading FITS file %s: %s" % (filename, str(err)))
         return
     # reset data if asked to
     if self.woverwrite.isChecked():
         input_hdu.data[...] = 0
     # insert sources
     Imaging.restoreSources(input_hdu,
                            sources,
                            0,
                            primary_beam=pbfunc,
                            freq=freq)
     # save fits file
     try:
         # pyfits seems to produce an exception:
         #         TypeError: formatwarning() takes exactly 4 arguments (5 given)
         # when attempting to overwrite a file. As a workaround, remove the file first.
         if os.path.exists(filename):
             os.remove(filename)
         input_hdu.writeto(filename)
     except Exception as err:
         traceback.print_exc()
         busy = None
         QMessageBox.warning(
             self, "Error writing FITS",
             "Error writing FITS file %s: %s" % (filename, str(err)))
         return
     changed = False
     sources = self.model.sources
     # remove sources from model if asked to
     if self.wdel.isChecked():
         sources = [
             src for src in sources
             if not (src.selected and src.typecode == 'pnt')
         ]
         changed = True
     # add image to model if asked to
     if self.wadd.isChecked():
         hdr = input_hdu.header
         # get image parameters
         max_flux = float(input_hdu.data.max())
         wcs = WCS(hdr, mode='pyfits')
         # Get reference pixel coordinates
         # wcs.getCentreWCSCoords() doesn't work, as that gives us the middle of the image
         # So scan the header to get the CRPIX values
         ra0 = dec0 = 1
         for iaxis in range(hdr['NAXIS']):
             axs = str(iaxis + 1)
             name = hdr.get('CTYPE' + axs, axs).upper()
             if name.startswith("RA"):
                 ra0 = hdr.get('CRPIX' + axs, 1) - 1
             elif name.startswith("DEC"):
                 dec0 = hdr.get('CRPIX' + axs, 1) - 1
         # convert pixel to degrees
         ra0, dec0 = wcs.pix2wcs(ra0, dec0)
         ra0 *= DEG
         dec0 *= DEG
         sx, sy = wcs.getHalfSizeDeg()
         sx *= DEG
         sy *= DEG
         nx, ny = input_hdu.data.shape[-1:-3:-1]
         # check if this image is already contained in the model
         for src in sources:
             if isinstance(getattr(src, 'shape', None),
                           ModelClasses.FITSImage) and os.path.samefile(
                               src.shape.filename, filename):
                 # update source parameters
                 src.pos.ra, src.pos.dec = ra0, dec0
                 src.flux.I = max_flux
                 src.shape.ex, src.shape.ey = sx, sy
                 src.shape.nx, src.shape.ny = nx, ny
                 src.shape.pad = pad
                 break
         # not contained, make new source object
         else:
             pos = ModelClasses.Position(ra0, dec0)
             flux = ModelClasses.Flux(max_flux)
             shape = ModelClasses.FITSImage(sx,
                                            sy,
                                            0,
                                            os.path.basename(filename),
                                            nx,
                                            ny,
                                            pad=pad)
             img_src = SkyModel.Source(os.path.splitext(
                 os.path.basename(filename))[0],
                                       pos,
                                       flux,
                                       shape=shape)
             sources.append(img_src)
         changed = True
     if changed:
         self.model.setSources(sources)
         self.model.emitUpdate(SkyModel.SkyModel.UpdateAll, origin=self)
     self.parent().showMessage("Wrote %d sources to FITS file %s" %
                               (len(sources), filename))
     busy = None
     return QDialog.accept(self)
Ejemplo n.º 6
0
      return;
    # get beam sizes
    try:
      bmaj = float(str(self.wbmaj.text()));
      bmin = float(str(self.wbmin.text()));
      pa = float(str(self.wbpa.text()) or "0");
    except Exception,err:
      busy = None;
      self.qerrmsg.showMessage("Invalid beam size specified");
      return;
    bmaj = bmaj/(Imaging.FWHM*3600)*DEG;
    bmin = bmin/(Imaging.FWHM*3600)*DEG;
    pa = pa*DEG;
    # restore
    try:
      Imaging.restoreSources(input_hdu,sources,bmaj,bmin,pa);
    except Exception,err:
      busy = None;
      self.qerrmsg.showMessage("Error restoring model into image: %s"%str(err));
      return;
    # save fits file
    try:
      input_hdu.writeto(outfile,clobber=True);
    except Exception,err:
      busy = None;
      self.qerrmsg.showMessage("Error writing FITS file %s: %s"%(outfile,str(err)));
      return;
    self.parent().loadImage(outfile);
    busy = None;
    return QDialog.accept(self);
Ejemplo n.º 7
0
 def accept(self):
     """Tries to make a brick, and closes the dialog if successful."""
     sources = [src for src in self.model.sources if src.selected and src.typecode == 'pnt']
     filename = self.wfile.filename()
     if not self._fileSelected(filename):
         return
     # get PB expression
     pbfunc = None
     if self.wpb_apply.isChecked():
         pbexp = str(self.wpb_exp.text())
         try:
             pbfunc = eval("lambda r,fq:" + pbexp)
         except Exception as err:
             QMessageBox.warning(self, "Error parsing PB experssion",
                                 "Error parsing primary beam expression %s: %s" % (pbexp, str(err)))
             return
     # get frequency
     freq = str(self.wfreq.text())
     freq = float(freq) * 1e+6 if freq else None
     # get pad factor
     pad = str(self.wpad.text())
     pad = max(float(pad), 1) if pad else 1
     # read fits file
     busy = BusyIndicator()
     try:
         input_hdu = pyfits.open(filename)[0]
     except Exception as err:
         busy = None
         QMessageBox.warning(self, "Error reading FITS", "Error reading FITS file %s: %s" % (filename, str(err)))
         return
     # reset data if asked to
     if self.woverwrite.isChecked():
         input_hdu.data[...] = 0
     # insert sources
     Imaging.restoreSources(input_hdu, sources, 0, primary_beam=pbfunc, freq=freq)
     # save fits file
     try:
         # pyfits seems to produce an exception:
         #         TypeError: formatwarning() takes exactly 4 arguments (5 given)
         # when attempting to overwrite a file. As a workaround, remove the file first.
         if os.path.exists(filename):
             os.remove(filename)
         input_hdu.writeto(filename)
     except Exception as err:
         traceback.print_exc()
         busy = None
         QMessageBox.warning(self, "Error writing FITS", "Error writing FITS file %s: %s" % (filename, str(err)))
         return
     changed = False
     sources = self.model.sources
     # remove sources from model if asked to
     if self.wdel.isChecked():
         sources = [src for src in sources if not (src.selected and src.typecode == 'pnt')]
         changed = True
     # add image to model if asked to
     if self.wadd.isChecked():
         hdr = input_hdu.header
         # get image parameters
         max_flux = float(input_hdu.data.max())
         wcs = WCS(hdr, mode='pyfits')
         # Get reference pixel coordinates
         # wcs.getCentreWCSCoords() doesn't work, as that gives us the middle of the image
         # So scan the header to get the CRPIX values
         ra0 = dec0 = 1
         for iaxis in range(hdr['NAXIS']):
             axs = str(iaxis + 1)
             name = hdr.get('CTYPE' + axs, axs).upper()
             if name.startswith("RA"):
                 ra0 = hdr.get('CRPIX' + axs, 1) - 1
             elif name.startswith("DEC"):
                 dec0 = hdr.get('CRPIX' + axs, 1) - 1
         # convert pixel to degrees
         ra0, dec0 = wcs.pix2wcs(ra0, dec0)
         ra0 *= DEG
         dec0 *= DEG
         sx, sy = wcs.getHalfSizeDeg()
         sx *= DEG
         sy *= DEG
         nx, ny = input_hdu.data.shape[-1:-3:-1]
         # check if this image is already contained in the model
         for src in sources:
             if isinstance(getattr(src, 'shape', None), ModelClasses.FITSImage) and os.path.samefile(
                     src.shape.filename, filename):
                 # update source parameters
                 src.pos.ra, src.pos.dec = ra0, dec0
                 src.flux.I = max_flux
                 src.shape.ex, src.shape.ey = sx, sy
                 src.shape.nx, src.shape.ny = nx, ny
                 src.shape.pad = pad
                 break
         # not contained, make new source object
         else:
             pos = ModelClasses.Position(ra0, dec0)
             flux = ModelClasses.Flux(max_flux)
             shape = ModelClasses.FITSImage(sx, sy, 0, os.path.basename(filename), nx, ny, pad=pad)
             img_src = SkyModel.Source(os.path.splitext(os.path.basename(filename))[0], pos, flux, shape=shape)
             sources.append(img_src)
         changed = True
     if changed:
         self.model.setSources(sources)
         self.model.emitUpdate(SkyModel.SkyModel.UpdateAll, origin=self)
     self.parent().showMessage("Wrote %d sources to FITS file %s" % (len(sources), filename))
     busy = None
     return QDialog.accept(self)
Ejemplo n.º 8
0
      return;
    # get beam sizes
    try:
      bmaj = float(str(self.wbmaj.text()));
      bmin = float(str(self.wbmin.text()));
      pa = float(str(self.wbpa.text()) or "0");
    except Exception,err:
      busy = None;
      self.qerrmsg.showMessage("Invalid beam size specified");
      return;
    bmaj = bmaj/(Imaging.FWHM*3600)*DEG;
    bmin = bmin/(Imaging.FWHM*3600)*DEG;
    pa = pa*DEG;
    # restore
    try:
      Imaging.restoreSources(input_hdu,sources,bmaj,bmin,pa);
    except Exception,err:
      busy = None;
      self.qerrmsg.showMessage("Error restoring model into image: %s"%str(err));
      return;
    # save fits file
    try:
      input_hdu.writeto(outfile,clobber=True);
    except Exception,err:
      busy = None;
      self.qerrmsg.showMessage("Error writing FITS file %s: %s"%(outfile,str(err)));
      return;
    self.parent().loadImage(outfile);
    busy = None;
    return QDialog.accept(self);
Ejemplo n.º 9
0
 # get pad factor
 pad = str(self.wpad.text());
 pad = max(float(pad),1) if pad else 1;
 # read fits file
 busy = BusyIndicator();
 try:
   input_hdu = pyfits.open(filename)[0];
 except Exception,err:
   busy = None;
   QMessageBox.warning(self,"Error reading FITS","Error reading FITS file %s: %s"%(filename,str(err)));
   return;
 # reset data if asked to
 if self.woverwrite.isChecked():
   input_hdu.data[...] = 0;
 # insert sources
 Imaging.restoreSources(input_hdu,sources,0,primary_beam=pbfunc,freq=freq);
 # save fits file
 try:
   # pyfits seems to produce an exception:
   #         TypeError: formatwarning() takes exactly 4 arguments (5 given)
   # when attempting to overwrite a file. As a workaround, remove the file first.
   if os.path.exists(filename):
     os.remove(filename);
   input_hdu.writeto(filename);
 except Exception,err:
   traceback.print_exc();
   busy = None;
   QMessageBox.warning(self,"Error writing FITS","Error writing FITS file %s: %s"%(filename,str(err)));
   return;
 changed = False;
 sources = self.model.sources;