diff --git a/scousepy/scouse.py b/scousepy/scouse.py index 06a6128..63387f7 100644 --- a/scousepy/scouse.py +++ b/scousepy/scouse.py @@ -21,6 +21,8 @@ import time import pyspeckit import random +import asyncio + warnings.simplefilter('ignore', wcs.FITSFixedWarning) from .stage_3 import * @@ -349,15 +351,32 @@ def stage_1(config='', interactive=True): coverageobject=ScouseCoverage(scouseobject=self,verbose=self.verbose, interactive=interactive) if interactive: - coverageobject.show() - if coverageobject.config_file is None or len(coverageobject.config_file) == 0: - raise ValueError("Coverage configuration was set to be 'interactive', but the " - "interactive plot window did not wait for input. If you are running in " - "Jupyter notebooks or Spyder then try running scouse as a script instead. " - "Alternatively set interactive=False and manually update coverage.config.") + coverageobject.show() + if not coverageobject.coverage_is_complete: + # we are in a notebook and need asyncio + async def wait_on_interactive(): + while coverageobject.config_file is None: + await asyncio.sleep(1) + self.save_coverage(coverageobject, old_log) + self.run_coverage(coverageobject) + plt.close(coverageobject.fig.number) + + loop = asyncio.get_event_loop() + loop.create_task(wait_on_interactive()) + else: + self.save_coverage(coverageobject, old_log) + self.run_coverage(coverageobject) + + return self + + def save_coverage(self, coverageobject, old_log): + from .io import import_from_config + with warnings.catch_warnings(): + warnings.simplefilter('ignore') # write out the config file for the coverage - self.coverage_config_file_path=os.path.join(self.outputdirectory,self.filename,'config_files','coverage.config') + self.coverage_config_file_path=os.path.join(self.outputdirectory, + self.filename, 'config_files', 'coverage.config') with open(self.coverage_config_file_path, 'w') as file: for line in coverageobject.config_file: file.write(line) @@ -365,6 +384,10 @@ def stage_1(config='', interactive=True): import_from_config(self, self.coverage_config_file_path) log.setLevel(old_log) + def run_coverage(self, coverageobject): + from .stage_1 import generate_SAAs, plot_coverage, compute_noise, get_x_axis + from .verbose_output import print_to_terminal + # start the time once the coverage has been generated starttime = time.time() diff --git a/scousepy/scousecoverage.py b/scousepy/scousecoverage.py index 6697e79..1d5984a 100644 --- a/scousepy/scousecoverage.py +++ b/scousepy/scousecoverage.py @@ -29,6 +29,8 @@ class ScouseCoverage(object): """ def __init__(self, scouseobject=None, create_config_file=True, verbose=True, interactive=True): + self.coverage_is_complete = False + # For moments self.scouseobject=scouseobject self.verbose=verbose @@ -388,6 +390,9 @@ def __init__(self, scouseobject=None, create_config_file=True, verbose=True, int self.run_coverage(None) # complete the coverage task self.coverage_complete(None) + else: + self.fig.canvas.flush_events() + self.fig.canvas.draw_idle() def show(self): @@ -432,6 +437,8 @@ def coverage_complete(self, event): self.samplesize=0.0 self.config_file=make_config_file(self) + self.coverage_is_complete = True + # close the window self.close_window() diff --git a/scousepy/stage_1.py b/scousepy/stage_1.py index 0746108..12f605c 100644 --- a/scousepy/stage_1.py +++ b/scousepy/stage_1.py @@ -155,7 +155,7 @@ def generate_SAAs(scouseobject, coverageobject): if scouseobject.njobs > 1: # if __name__ == 'scousepy.stage_1': # print(__name__) - results = parallel_map(create_saa, inputlist, numcores=scouseobject.njobs) + results = list(parallel_map(create_saa, inputlist, numcores=scouseobject.njobs)) else: if scouseobject.verbose: results=[create_saa(input) for input in tqdm(inputlist)]