Esempio n. 1
0
    def __init__(self, path=None, wait_time=10, quit_ds9_on_del=True,
                 load_help_file=True):
        """
        path :path of the ds9
        wait_time : waiting time before error is raised
        quit_ds9_on_del : If True, try to quit ds9 when this instance is deleted.
        """

        # determine whther to quit ds9 also when object deleted.
        self.quit_ds9_on_del = quit_ds9_on_del
        self._need_to_be_purged = False

        if path is None:
            self.path = _find_ds9()
        else:
            self.path = path

        self.xpa_name, self.ds9_unix_name = self.run_unixonly_ds9_v2(wait_time)
        self.xpa = xpa.XPA(self.xpa_name)

        # numdisp setup
        self.numdisp_dev = "unix:%s" % self.ds9_unix_name

        verbose.report("establish numdisplay connection (%s)" % (self.numdisp_dev,), level="debug")
        self.numdisp = displaydev.ImageDisplayProxy(self.numdisp_dev)

        self._ds9_version = self.get("version").strip()
        if load_help_file:
            self._helper = ds9_xpa_help.get(self)
        else:
            self._helper = None

        self._need_to_be_purged = True
Esempio n. 2
0
def _convert_syntax(l):

    l, c = takeout_comment(l)
    # SET
    if p_xpaset_w_echo.search(l):
        #print l
        r = p_xpaset_w_echo.subn(r"ds9.set('\2', \1)", l)[0]
    elif p_xpaset_w_cat.search(l):
        s = r"r=open('\1').read(); ds9.set('\2', r)"
        r = p_xpaset_w_cat.subn(s, l)[0]
    elif p_xpaset.search(l):
        r = p_xpaset.subn(r"ds9.set('\1')", l)[0]
    elif p_xpaset_wo_ds9.search(l):
        r = p_xpaset_wo_ds9.subn(r"ds9.set('\1')", l)[0]

    # GET
    elif p_xpaget_w_redirect.search(l):
        s = r"r = ds9.get('\1'); open('\2','w').write(r)"
        r = p_xpaget_w_redirect.subn(s, l)[0]
    elif p_xpaget_mask.search(l):
        r = p_xpaget_mask.subn(r"r = ds9.get('mask \1')", l)[0]
    elif p_xpaget.search(l):
        r = p_xpaget.subn(r"r = ds9.get('\1')", l)[0]
    else:
        if l:
            if not l[0] == "#":
                verbose.report("WARNING : failed to convert (%s)" % l,
                               "helpful")
        r = l

    if c:
        r = r + " " + c

    return r
Esempio n. 3
0
    def __init__(self,
                 path=None,
                 wait_time=10,
                 quit_ds9_on_del=True,
                 load_help_file=True,
                 **kwargs):
        """
        path :path of the ds9
        wait_time : waiting time before error is raised
        quit_ds9_on_del : If True, try to quit ds9 when this instance is deleted.

        Any additional keyword arguments will be passed a command 
        line arguments to execute ds9. For example,

            pysao.ds9(title="test")

        will add following arguments when executing the ds9.

            '-title test'

        """

        # determine whther to quit ds9 also when object deleted.
        self.quit_ds9_on_del = quit_ds9_on_del
        self._need_to_be_purged = False

        if path is None:
            self.path = _find_ds9()
        else:
            self.path = path

        self.xpa_name, self.ds9_unix_name = self.run_unixonly_ds9_v2(
            wait_time, kwargs)
        self.xpa = xpa.XPA(self.xpa_name)

        # numdisp setup
        self.numdisp_dev = "unix:%s" % self.ds9_unix_name

        verbose.report("establish numdisplay connection (%s)" %
                       (self.numdisp_dev, ),
                       level="debug")
        self.numdisp = displaydev.ImageDisplayProxy(self.numdisp_dev)

        self._ds9_version = self.get("version").strip()
        if load_help_file:
            self._helper = ds9_xpa_help.get(self)
        else:
            self._helper = None

        self._need_to_be_purged = True
Esempio n. 4
0
    def _purge(self):
        if not self._need_to_be_purged:
            return

        if not self.quit_ds9_on_del:
            verbose.report("You need to manually delete tmp. dir (%s)" % (self._tmpd_name), level="helpful")
            self._need_to_be_purged = False
            return

        if self.numdisp:
            self.numdisp.close()

        try:
            if self._ds9_process.poll() is None:
                self.set("quit")
        except xpa.XpaException as err:
            verbose.report("Warning : " + err.message)

        try:
            shutil.rmtree(self._tmpd_name)
            #os.rmdir(self._tmpd_name)
            self._tmp_dir_list.remove(self._tmpd_name)
        except OSError:
            verbose.report("Warning : couldn't delete the temporary directory (%s)" % (self._tmpd_name,))
        else:
            verbose.report("temporary directory deleted", level="debug")

        self._need_to_be_purged = False
Esempio n. 5
0
    def _purge(self):
        if not self._need_to_be_purged:
            return

        if not self.quit_ds9_on_del:
            verbose.report("You need to manually delete tmp. dir (%s)" %
                           (self._tmpd_name),
                           level="helpful")
            self._need_to_be_purged = False
            return

        if self.numdisp:
            self.numdisp.close()

        try:
            if self._ds9_process.poll() is None:
                self.set("quit")
        except xpa.XpaException as err:
            verbose.report("Warning : " + err.message)

        try:
            shutil.rmtree(self._tmpd_name)
            #os.rmdir(self._tmpd_name)
            self._tmp_dir_list.remove(self._tmpd_name)
        except OSError:
            verbose.report(
                "Warning : couldn't delete the temporary directory (%s)" %
                (self._tmpd_name, ))
        else:
            verbose.report("temporary directory deleted", level="debug")

        self._need_to_be_purged = False
Esempio n. 6
0
    def get_help(self):
        r = dict()

        for k, v in self.help_strings.items():
            s = v.getvalue()
            v.close()

            ## Syntax :
            ss = p_sy.split(s)

            if len(ss) == 1:
                # a special case for "psprint" with only description.
                #print "whats going on?", k, ss
                expl = ss[0].replace("\240", " ")
                syntax = ""
                example = ""

            elif len(ss) == 2:
                expl, _rest = ss

                ## Example :
                syntax, example = p_ex.split(_rest)

                syntax = _reindent_syntax(syntax, k)

                ex_ = [
                    _convert_example(l.strip()) for l in example.split("\n")
                    if l.strip()
                ]
                example = "\n".join(ex_)

            else:
                verbose.report("ignoring %s : failed to parse." % k)
                continue

            # fix expl
            extra_kewords = ["cat", "quit", "pmagnifier"]
            filtered_expl = [
                l1 for l in expl.split("\n") for l1 in [l.strip()]
                if l1 and l1 != k and l1 not in extra_kewords
            ]

            #expl
            r[k] = dict(expl=" ".join(filtered_expl),
                        syntax=syntax,
                        example=example)

        return r
Esempio n. 7
0
    def _purge(self):
        if not self._need_to_be_purged:
            return

        if not self.quit_ds9_on_del:
            verbose.report("You need to manually delete tmp. dir (%s)" % (self._tmpd_name), level="helpful")
            self._need_to_be_purged = False
            return

        if self.numdisp:
            self.numdisp.close()

        try:
            if self._ds9_process.poll() is None:
                self.set("quit")
        except xpa.XpaException, err:
            verbose.report("Warning : " + err.message)
Esempio n. 8
0
    def __init__(self, path=None, wait_time=10, quit_ds9_on_del=True,
                 load_help_file=True, **kwargs):
        """
        path :path of the ds9
        wait_time : waiting time before error is raised
        quit_ds9_on_del : If True, try to quit ds9 when this instance is deleted.

        Any additional keyword arguments will be passed a command 
        line arguments to execute ds9. For example,

            pysao.ds9(title="test")

        will add following arguments when executing the ds9.

            '-title test'

        """

        # determine whther to quit ds9 also when object deleted.
        self.quit_ds9_on_del = quit_ds9_on_del
        self._need_to_be_purged = False

        if path is None:
            self.path = _find_ds9()
        else:
            self.path = path

        self.xpa_name, self.ds9_unix_name = self.run_unixonly_ds9_v2(wait_time,
                                                                     kwargs)
        self.xpa = xpa.XPA(self.xpa_name)

        # numdisp setup
        self.numdisp_dev = "unix:%s" % self.ds9_unix_name

        verbose.report("establish numdisplay connection (%s)" % (self.numdisp_dev,), level="debug")
        self.numdisp = displaydev.ImageDisplayProxy(self.numdisp_dev)

        self._ds9_version = self.get("version").strip()
        if load_help_file:
            self._helper = ds9_xpa_help.get(self)
        else:
            self._helper = None

        self._need_to_be_purged = True
Esempio n. 9
0
    def get_help(self):
        r = dict()

        for k, v in self.help_strings.items():
            s = v.getvalue()
            v.close()

            ## Syntax :
            ss = p_sy.split(s)

            if len(ss) == 1:
                # a special case for "psprint" with only description.
                #print "whats going on?", k, ss
                expl = ss[0].replace("\240", " ")
                syntax = ""
                example = ""

            elif len(ss) == 2:
                expl, _rest = ss

                ## Example :
                syntax, example = p_ex.split(_rest)

                syntax = _reindent_syntax(syntax, k)

                ex_ = [_convert_example(l.strip()) for l
                       in example.split("\n") if l.strip()]
                example = "\n".join(ex_)


            else:
                verbose.report("ignoring %s : failed to parse." % k)
                continue

            # fix expl
            extra_kewords = ["cat", "quit", "pmagnifier"]
            filtered_expl = [l1 for l in expl.split("\n")
                             for l1 in [l.strip()]
                             if l1 and l1 != k and l1 not in extra_kewords]

            #expl
            r[k] = dict(expl=" ".join(filtered_expl), syntax=syntax, example=example)

        return r
Esempio n. 10
0
    def __init__(self,
                 path=None,
                 wait_time=10,
                 quit_ds9_on_del=True,
                 load_help_file=True):
        """
        path :path of the ds9
        wait_time : waiting time before error is raised
        quit_ds9_on_del : If True, try to quit ds9 when this instance is deleted.
        """

        # determine whther to quit ds9 also when object deleted.
        self.quit_ds9_on_del = quit_ds9_on_del
        self._need_to_be_purged = False

        if path is None:
            self.path = _find_ds9()
        else:
            self.path = path

        self.xpa_name, self.ds9_unix_name = self.run_unixonly_ds9_v2(wait_time)
        self.xpa = xpa.XPA(self.xpa_name)

        # numdisp setup
        self.numdisp_dev = "unix:%s" % self.ds9_unix_name

        verbose.report("establish numdisplay connection (%s)" %
                       (self.numdisp_dev, ),
                       level="debug")
        self.numdisp = displaydev.ImageDisplayProxy(self.numdisp_dev)

        self._ds9_version = self.get("version").strip()
        if load_help_file:
            self._helper = ds9_xpa_help.get(self)
        else:
            self._helper = None

        self._need_to_be_purged = True
Esempio n. 11
0
def _convert_example(l):

    l, c = takeout_comment(l)

    if l.strip() in example_typo:
        l = example_typo[l.strip()]

    # SET
    if p_xpaset_w_echo.search(l):
        r = p_xpaset_w_echo.subn(r"ds9.set('\2', \1)", l)[0]
    elif p_xpaset_w_cat.search(l):
        s = r"r=open('\1').read(); ds9.set('\2', r)"
        r = p_xpaset_w_cat.subn(s, l)[0]
    elif p_xpaset.search(l):
        r = p_xpaset.subn(r"ds9.set('\1')", l)[0]
    elif p_xpaset_wo_ds9.search(l):
        r = p_xpaset_wo_ds9.subn(r"ds9.set('\1')", l)[0]

    # GET
    elif p_xpaget_w_redirect.search(l):
        s = r"r = ds9.get('\1'); open('\2','w').write(r)"
        r = p_xpaget_w_redirect.subn(s, l)[0]
    elif p_xpaget_mask.search(l):
        r = p_xpaget_mask.subn(r"r = ds9.get('mask \1')", l)[0]
    elif p_xpaget.search(l):
        r = p_xpaget.subn(r"r = ds9.get('\1')", l)[0]
    else:
        if l:
            if not l[0] == "#":
                verbose.report("WARNING : failed to convert (%s)" % l,
                               "helpful")
        r = l

    if c:
        r = r + " " + c

    return r
Esempio n. 12
0
    def _purge_tmp_dirs(cls):
        """
        When used with ipython (pylab mode), it seems that the objects
        are not prperly deleted, i.e., temporary directories are not
        deleted. This is a work around for that.
        """
        for tds9_ref in cls._ds9_instance_list:
            verbose.report("purging remaning ds9 instances", "debug")
            tds9 = tds9_ref()
            if tds9 is not None:
                verbose.report("deleting  ds9", "debug")
                tds9._purge()

        if cls._tmp_dir_list:
            verbose.report("purging remaning temporary dirs", "debug")
            for d in cls._tmp_dir_list:
                shutil.rmtree(d)
Esempio n. 13
0
    def _purge_tmp_dirs(cls):
        """
        When used with ipython (pylab mode), it seems that the objects
        are not prperly deleted, i.e., temporary directories are not
        deleted. This is a work around for that.
        """
        for tds9_ref in cls._ds9_instance_list:
            verbose.report("purging remaning ds9 instances", "debug")
            tds9 = tds9_ref()
            if tds9 is not None:
                verbose.report("deleting  ds9", "debug")
                tds9._purge()

        if cls._tmp_dir_list:
            verbose.report("purging remaning temporary dirs", "debug")
            for d in cls._tmp_dir_list:
                shutil.rmtree(d)
Esempio n. 14
0
from .version import __version__
from pysao.verbose import verbose

try:
    from .astropy_helper import pyfits

except ImportError:
    verbose.report("Loading pyfits failed. pysao.ds9 would not support fits-related tasks in this mode.", level="debug")
    import pysao.ds9_basic as _ds9

else:
    verbose.report("Loading pyfits succeded. pysao.ds9 will support fits-related tasks.", level="debug")
    import pysao.ds9_pyfits as _ds9

ds9 = _ds9.ds9

#import sla
#import slav
Esempio n. 15
0
    def run_unixonly_ds9_v2(self, wait_time):
        """ start ds9 """


        # when xpaname is parsed for local,
        # the prefix should match the XPA_TMPDIR
        # Hence, we create temporary dir under that directory.


        # The env variable "XPA_TMPDIR" is set to correct value when ds9 is
        # runned, and also xpa command is called (ie, python process).

        # This is a bit of problem when we have multiple instance of ds9.
        #env = os.environ.copy()
        env = os.environ

        self._tmpd_name = mkdtemp(prefix="xpa_"+env.get("USER",""),
                                  dir="/tmp")
        verbose.report("temporary directory created (%s)" % (self._tmpd_name,), level="debug")

        #print self._tmpd_name

        env["XPA_TMPDIR"] = self._tmpd_name

        iraf_unix = "%s/.IMT" % self._tmpd_name

        try:
            verbose.report("starting ds9 (path=%s)" % (self.path,), level="debug")
            #p = Popen(" ".join([self.path,
            #                    "-xpa local",
            #                    "-xpa noxpans",
            #                    "-unix_only",
            #                    "-unix %s &" % iraf_unix]),
            #          shell=True, env=env)
            p = Popen([self.path,
                       "-xpa", "local",
                       "-xpa", "noxpans",
                       "-unix_only",
                       "-unix",  "%s" % iraf_unix],
                      shell=False, env=env)

            #sts = os.waitpid(p.pid, 0)

            # wait until ds9 starts

            while wait_time > 0:
                file_list = os.listdir(self._tmpd_name)
                if len(file_list)>1:
                    #print file_list
                    break
                time.sleep(0.5)
                wait_time -= 0.5
            else:
                from signal import SIGTERM
                os.kill(p.pid, SIGTERM)
                raise OSError("Connection timeout with the ds9. Try to increase the *wait_time* parameter (current value is  %d s)" % (wait_time,))

        except:
            verbose.report("running  ds9 failed", level="debug")
            os.rmdir(self._tmpd_name)
            verbose.report("temporary directory deleted", level="debug")

            raise

        else:
            self._tmp_dir_list.add(self._tmpd_name)
            self._ds9_instance_list.append(weakref.ref(self))
            self._ds9_process = p

        file_list.remove(".IMT")
        xpaname = os.path.join(self._tmpd_name, file_list[0])

        env["XPA_TMPDIR"] = "/tmp/xpa" #self._tmpd_name

        return xpaname, iraf_unix
Esempio n. 16
0
    def __del__(self):

        verbose.report("deleteing pysao.ds9", level="debug")
        self._purge()
Esempio n. 17
0
    def __del__(self):

        verbose.report("deleteing pysao.ds9", level="debug")
        self._purge()
Esempio n. 18
0
    def run_unixonly_ds9_v2(self, wait_time, cmd_args_dict=None):
        """ start ds9 """

        # when xpaname is parsed for local,
        # the prefix should match the XPA_TMPDIR
        # Hence, we create temporary dir under that directory.

        # The env variable "XPA_TMPDIR" is set to correct value when ds9 is
        # runned, and also xpa command is called (ie, python process).

        # This is a bit of problem when we have multiple instance of ds9.
        #env = os.environ.copy()
        env = os.environ

        self._tmpd_name = mkdtemp(prefix="xpa_" + env.get("USER", ""),
                                  dir="/tmp")
        verbose.report("temporary directory created (%s)" %
                       (self._tmpd_name, ),
                       level="debug")

        #print self._tmpd_name

        env["XPA_TMPDIR"] = self._tmpd_name

        iraf_unix = "%s/.IMT" % self._tmpd_name

        try:
            verbose.report("starting ds9 (path=%s)" % (self.path, ),
                           level="debug")

            cmd_args = [
                "-xpa", "local", "-xpa", "noxpans", "-unix_only", "-unix",
                "%s" % iraf_unix
            ]

            for k, v in cmd_args_dict.items():
                cmd_args.extend(["-%s" % k, v])

            p = Popen([self.path] + cmd_args, shell=False, env=env)

            #sts = os.waitpid(p.pid, 0)

            # wait until ds9 starts

            countdown = wait_time
            while countdown > 0:
                file_list = os.listdir(self._tmpd_name)
                if len(file_list) > 1:
                    #print file_list
                    break
                time.sleep(0.5)
                countdown -= 0.5
            else:
                from signal import SIGTERM
                os.kill(p.pid, SIGTERM)
                raise OSError(
                    "Connection timeout with the ds9. Try to increase the *wait_time* parameter (current value is  %d s)"
                    % (wait_time, ))

        except:
            verbose.report("running  ds9 failed", level="debug")
            os.rmdir(self._tmpd_name)
            verbose.report("temporary directory deleted", level="debug")

            raise

        else:
            self._tmp_dir_list.add(self._tmpd_name)
            self._ds9_instance_list.append(weakref.ref(self))
            self._ds9_process = p

        file_list.remove(".IMT")
        xpaname = os.path.join(self._tmpd_name, file_list[0])

        env["XPA_TMPDIR"] = "/tmp/xpa"  #self._tmpd_name

        return xpaname, iraf_unix
Esempio n. 19
0
from .version import __version__
from pysao.verbose import verbose

try:
    from .astropy_helper import pyfits

except ImportError:
    verbose.report(
        "Loading pyfits failed. pysao.ds9 would not support fits-related tasks in this mode.",
        level="debug")
    import pysao.ds9_basic as _ds9

else:
    verbose.report(
        "Loading pyfits succeded. pysao.ds9 will support fits-related tasks.",
        level="debug")
    import pysao.ds9_pyfits as _ds9

ds9 = _ds9.ds9

#import sla
#import slav