| 336 | return self._renderer |
| 337 | |
| 338 | def simulate(self, n, progress=None, emit_method="kT"): |
| 339 | if self._scene is None: |
| 340 | self._make_scene() |
| 341 | scene = self._scene |
| 342 | |
| 343 | # Simulate can be called multiple time to append rays to the store |
| 344 | if self._store is None: |
| 345 | store = {"entrance_rays": [], "exit_rays": []} |
| 346 | |
| 347 | vis = self._renderer |
| 348 | count = 0 |
| 349 | for ray in scene.emit(n): |
| 350 | history = photon_tracer.follow(scene, ray, emit_method=emit_method) |
| 351 | rays, events = zip(*history) |
| 352 | store["entrance_rays"].append((rays[1], events[1])) |
| 353 | if events[-1] in (Event.ABSORB, Event.KILL): |
| 354 | # final event is a lost store path information at final event |
| 355 | store["exit_rays"].append((rays[-1], events[-1])) |
| 356 | elif events[-1] == Event.EXIT: |
| 357 | # final event hits the world node. Store path information at |
| 358 | # penultimate location |
| 359 | store["exit_rays"].append((rays[-2], events[-2])) |
| 360 | |
| 361 | # Update visualiser |
| 362 | if vis: |
| 363 | vis.add_history(history, **self._add_history_kwargs) |
| 364 | |
| 365 | # Progress callback |
| 366 | if progress: |
| 367 | count += 1 |
| 368 | progress(count) |
| 369 | |
| 370 | self._store = store |
| 371 | print("Tracing finished.") |
| 372 | print("Preparing results.") |
| 373 | df = self._make_dataframe() |
| 374 | df = self.expand_coords(df, "direction") |
| 375 | df = self.expand_coords(df, "position") |
| 376 | df = self.label_facets(df, *self.size) |
| 377 | self._df = df |
| 378 | |
| 379 | def _make_dataframe(self): |
| 380 | |