From 0f224515168295e0717422acf1e0403451f65c30 Mon Sep 17 00:00:00 2001 From: denis defolie Date: Sun, 3 May 2026 09:29:08 +0200 Subject: [PATCH] simulate --- test_tube_scanner/home/settings.py | 4 +- test_tube_scanner/scanner/multiwell.py | 34 ++++++------ test_tube_scanner/scanner/process.py | 12 +++-- .../scanner/css/{main.css => scanning.css} | 0 .../scanner/js/{main.js => scanning.js} | 0 .../scanner/templates/scanner/base.html | 12 +++-- .../scanner/{main.html => scanning.html} | 53 +++++++++++-------- test_tube_scanner/scanner/urls.py | 2 +- test_tube_scanner/scanner/views.py | 4 +- 9 files changed, 68 insertions(+), 53 deletions(-) rename test_tube_scanner/scanner/static/scanner/css/{main.css => scanning.css} (100%) rename test_tube_scanner/scanner/static/scanner/js/{main.js => scanning.js} (100%) rename test_tube_scanner/scanner/templates/scanner/{main.html => scanning.html} (62%) diff --git a/test_tube_scanner/home/settings.py b/test_tube_scanner/home/settings.py index 6ae8f09..894e8ea 100644 --- a/test_tube_scanner/home/settings.py +++ b/test_tube_scanner/home/settings.py @@ -396,8 +396,8 @@ EXPORT_DESTINATIONS = ["local", "remote"] TRACKER_TUBE_AXIS = "vertical" -TRACKER_MIN_AREA = 20 # surface min planaire -TRACKER_MAX_AREA_RATIO = 0.05 # 5% de la frame = surface max acceptable +TRACKER_MIN_AREA = 8 # surface min planaire px x px +TRACKER_MAX_AREA_RATIO = 0.1 # 5% de la frame = surface max acceptable TRACKER_MAX_PLANARIANS = 3 diff --git a/test_tube_scanner/scanner/multiwell.py b/test_tube_scanner/scanner/multiwell.py index 63feb89..ba714ad 100644 --- a/test_tube_scanner/scanner/multiwell.py +++ b/test_tube_scanner/scanner/multiwell.py @@ -122,7 +122,7 @@ class MultiWellManager: #def _grid_scanning_capture(self, uuid, duration): - def _grid_scanning_capture(self, experiment, well_position): + def _grid_scanning_capture(self, experiment, well_position, simulate=False): well = well_position.well multiwell = experiment.multiwell @@ -134,12 +134,15 @@ class MultiWellManager: uuid = f'{self.process.data.session}-{multiwell.position}-{well.name}' ## start recording self.process.data.uuid = uuid - self.process.data.record = True + if not simulate: + self.process.data.record = True + start = time.monotonic() while not self.stop_playing.is_set(): if time.monotonic() - start > multiwell.duration: break self.cnc_controller.wait_for(1.0) + self.process.data.record = False self.process.data.uuid = None @@ -148,7 +151,7 @@ class MultiWellManager: self.process._send(scan_state=msg) - def _grid_scanning(self, experiment, xnext=0, ynext=0): + def _grid_scanning(self, experiment, xnext=0, ynext=0, simulate=False): multiwell = experiment.multiwell wells = models.WellPosition.objects.filter(multiwell_id=multiwell.id).order_by('order').all() cam = self.process.cam @@ -159,10 +162,7 @@ class MultiWellManager: if self.stop_playing.is_set(): break self.cnc_controller.move_to(wl.x, wl.y, feed=wl.multiwell.feed) - - #uuid = f'{self.process.data.session}-{multiwell.position}-{wl.well.name}' - #self._grid_scanning_capture(uuid, multiwell.duration) - self._grid_scanning_capture(experiment, wl) + self._grid_scanning_capture(experiment, wl, simulate=simulate) ## change file if self.process.conf.capture_type == 'file': @@ -172,7 +172,7 @@ class MultiWellManager: self.cnc_controller.move_to(xnext, ynext, feed=multiwell.feed*2) - def _start_scanning(self, session, experiments): + def _start_scanning(self, session, experiments, simulate=False): self.process.cam._aligner.debug = False xynext = [] for obs in experiments: @@ -189,7 +189,7 @@ class MultiWellManager: obs.save() xnext, ynext = xynext[pos] pos +=1 - self._grid_scanning(obs, xnext=xnext, ynext=ynext) + self._grid_scanning(obs, xnext=xnext, ynext=ynext, simulate=simulate) obs.finished = timezone.now() obs.save() @@ -197,10 +197,12 @@ class MultiWellManager: if self.stop_playing.is_set(): msg = f"Session {session.name} abandonnée à {session.finished} après {session.finished - started} secondes." else: - session.active = False - if session.scanning_task: - session.scanning_task.enabled = False - session.save() + if not simulate: + session.active = False + if session.scanning_task: + session.scanning_task.enabled = False + session.save() + msg = f"Session {session.name} terminée à {session.finished} après {session.finished - started} secondes." logger.info(msg) self.process._send(scan_state=msg) @@ -214,13 +216,13 @@ class MultiWellManager: self.process.cam._aligner.debug = False - def scanning(self, sid): + def scanning(self, sid, simulate=False): try: if self.scan_thread: return session = models.Session.objects.get(pk=sid) experiments = models.SessionExperiment.experiment_by_session(sid) - self.scan_thread = Thread(target=self._start_scanning, args=(session, experiments, ), daemon=True).start() + self.scan_thread = Thread(target=self._start_scanning, args=(session, experiments, simulate, ), daemon=True).start() except Exception as e: print("MultiWellManager::scan error", e) @@ -258,7 +260,7 @@ class MultiWellManager: self.stop_playing = Event() cam = self.process.cam cam._aligner.set_tube_diameter(self.multiwell.diameter) - duration = self.duration if not auto else settings.CALIBRATION_AUTO_DURATION + duration = self.duration if not auto else settings.CALIBRATION_AUTO_DURATION try: start_test = time.monotonic() for wl in self.well_iterator: diff --git a/test_tube_scanner/scanner/process.py b/test_tube_scanner/scanner/process.py index 9301523..14af4ab 100644 --- a/test_tube_scanner/scanner/process.py +++ b/test_tube_scanner/scanner/process.py @@ -278,7 +278,7 @@ class ScannerProcess(Task): if self.data.play: try: jpeg=base64.b64encode(jpeg_bytes).decode() - logger.warning(f"{jpeg[:100]}") + #logger.warning(f"{jpeg[:100]}") self._send(ts=ts.timestamp(), jpeg=jpeg, frame_count=frame_count) except Exception as e: logger.error(f"----_on_frame: {e}") @@ -289,6 +289,8 @@ class ScannerProcess(Task): while not self.stop_event.is_set(): try: (uuid, ts, frame, metrics, frame_count) = self.record_queue.get() + + labels = dict(fps=self.video_fps, session=self.data.session, detected="1" if metrics.get("detected") else "0") if metrics.get("detected"): @@ -345,16 +347,16 @@ class ScannerProcess(Task): self.cam._active_median = False self.grbl.go_origin(feed=self.manager.feed) - elif topic == 'scan': - + elif topic == 'scan' or topic == 'simulate': logger.info(f"==== Scan {cmd}") sid = cmd.get("session", '0') if sid == "0": self._send(state='error', msg=str(_('La session est nulle!...'))) else: self.cam._active_median = False - self.manager.scanning(sid) - + self.manager.scanning(sid, simulate=(topic=='simulate')) + self._send(state=topic, msg=str(_('Balayage démarré...'))) + elif cmd["type"]=="calibrate": topic = cmd.get("topic") value = cmd.get("value") diff --git a/test_tube_scanner/scanner/static/scanner/css/main.css b/test_tube_scanner/scanner/static/scanner/css/scanning.css similarity index 100% rename from test_tube_scanner/scanner/static/scanner/css/main.css rename to test_tube_scanner/scanner/static/scanner/css/scanning.css diff --git a/test_tube_scanner/scanner/static/scanner/js/main.js b/test_tube_scanner/scanner/static/scanner/js/scanning.js similarity index 100% rename from test_tube_scanner/scanner/static/scanner/js/main.js rename to test_tube_scanner/scanner/static/scanner/js/scanning.js diff --git a/test_tube_scanner/scanner/templates/scanner/base.html b/test_tube_scanner/scanner/templates/scanner/base.html index b244199..86e4eb4 100644 --- a/test_tube_scanner/scanner/templates/scanner/base.html +++ b/test_tube_scanner/scanner/templates/scanner/base.html @@ -104,22 +104,24 @@ {% endif %} - + {% trans "Balayage multi-puits" %} - + {% if conf.tracking %} + {% trans "Préparation des expériences" %} - + + {% endif %} {% trans "Gestionnaire d'images" %} {% trans "Redifusion vidéos" %} - {% endblock %} + {% endblock %} - {% endblock %} + {% endblock %} {% endblock %} {% block content %}{% endblock %} diff --git a/test_tube_scanner/scanner/templates/scanner/main.html b/test_tube_scanner/scanner/templates/scanner/scanning.html similarity index 62% rename from test_tube_scanner/scanner/templates/scanner/main.html rename to test_tube_scanner/scanner/templates/scanner/scanning.html index 5af8e69..a6fc1a1 100644 --- a/test_tube_scanner/scanner/templates/scanner/main.html +++ b/test_tube_scanner/scanner/templates/scanner/scanning.html @@ -3,7 +3,7 @@ {% block styles %} {{ block.super }} - + {% endblock %} {% block columns %}{% endblock %} @@ -25,26 +25,34 @@
- -
- +
+
+ +
+
+ +
-
- -
-
- -
-
- +
+
+ +
+
+ +
+
+ +
@@ -85,10 +93,11 @@ axial_pos : sId("_axial_pos"), area_px : sId("_area_px"), frame_count : sId("_count"), - scan_state: sId("_scan_state") + scan_state : sId("_scan_state"), + simulate : sId("_simulate") }; - +