diff --git a/csaxs_bec/bec_ipython_client/plugins/LamNI/lamni.py b/csaxs_bec/bec_ipython_client/plugins/LamNI/lamni.py index 020b33b..4e2bd65 100644 --- a/csaxs_bec/bec_ipython_client/plugins/LamNI/lamni.py +++ b/csaxs_bec/bec_ipython_client/plugins/LamNI/lamni.py @@ -1631,7 +1631,12 @@ class LamNI(TomoQueueMixin, LamNIAlignmentMixin, LamNIOpticsMixin, LamniGuiTools return angle, subtomo_number def tomo_scan( - self, subtomo_start=1, start_angle=None, projection_number=None, force: bool = False + self, + subtomo_start=1, + start_angle=None, + projection_number=None, + force: bool = False, + interactive: bool = True, ): """Start a tomo scan. @@ -1639,7 +1644,13 @@ class LamNI(TomoQueueMixin, LamNIAlignmentMixin, LamNIOpticsMixin, LamniGuiTools subtomo_start (int): For tomo_type 1, the sub-tomogram to start from. Defaults to 1. start_angle (float, optional): Override starting angle of the first sub-tomogram. projection_number (int, optional): For tomo_types 2 and 3, resume from this index. - force: skip the fine-alignment check below without prompting. + force: skip the fine-alignment check below entirely (no warning at all). + interactive: if True (default, normal CLI use), the fine-alignment + check prompts and can abort. If False (used by + tomo_queue_execute() for unattended queued runs, where + input() would just hang forever with nobody watching), the + check instead prints a bold warning, waits 10s, and always + proceeds -- it never aborts or raises. """ self.lamnigui_show_progress() @@ -1656,34 +1667,40 @@ class LamNI(TomoQueueMixin, LamNIAlignmentMixin, LamNIOpticsMixin, LamniGuiTools or (self.tomo_type == 2 and projection_number is None) or (self.tomo_type == 3 and projection_number is None) ): - if not self.corr_pos_x: - if not self._confirm_sequence_override( + if not self.corr_pos_x and not force: + warning = ( "No fine (ptycho) alignment correction is loaded -- the " "sample centre will drift across projection angles " "uncorrected. Fine for a large FOV that doesn't need it; " "otherwise run tomo_alignment_scan() and " - "read_additional_correction() first.", - force, - ): - print("Aborting tomo scan.") - return - # bec.active_account is already a plain str, not bytes -- .decode() - # crashes with AttributeError. Also guard against no active - # e-account (empty string, e.g. a dev/sim session not logged into - # a real account) rather than trying to register a sample under - # one -- mirrors Flomni.tomo_scan()'s equivalent check exactly. - if bec.active_account != "": - self.tomo_id = self.add_sample_database( - self.sample_name, - str(datetime.date.today()), - bec.active_account, - bec.queue.next_scan_number, - "lamni", - "test additional info", - "BEC", + "read_additional_correction() first." ) - else: - self.tomo_id = 0 + if interactive: + if not self._confirm_sequence_override(warning, force=False): + print("Aborting tomo scan.") + return + else: + self.OMNYTools.printredbold(f"WARNING: {warning}") + self.OMNYTools.printredbold( + "Proceeding automatically in 10 s (unattended/queued run)..." + ) + time.sleep(10) + # bec.active_account is already a plain str, not bytes -- .decode() + # crashes with AttributeError. Always attempt registration (even + # for an empty/test account) and let add_sample_database() -> + # TomoIDManager.register() decide production vs. test-server vs. + # genuine-failure fallback -- this used to short-circuit straight + # to tomo_id=0 for an empty account, which also skipped the + # test-server registration path entirely. + self.tomo_id = self.add_sample_database( + self.sample_name, + str(datetime.date.today()), + bec.active_account or "", + bec.queue.next_scan_number, + "lamni", + "test additional info", + "BEC", + ) self.write_pdf_report() self.progress["tomo_start_time"] = datetime.datetime.now().isoformat() # reset stale estimates from any previous scan, otherwise the GUI