fucciphase 0.0.2__py3-none-any.whl → 0.0.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fucciphase/__init__.py +7 -1
- fucciphase/__main__.py +12 -0
- fucciphase/fucci_phase.py +123 -53
- fucciphase/io.py +18 -17
- fucciphase/main_cli.py +151 -34
- fucciphase/napari/tracks_to_napari.py +20 -21
- fucciphase/phase.py +350 -137
- fucciphase/plot.py +240 -88
- fucciphase/sensor.py +47 -33
- fucciphase/tracking_utilities.py +70 -9
- fucciphase/utils/__init__.py +14 -1
- fucciphase/utils/checks.py +2 -5
- fucciphase/utils/dtw.py +2 -4
- fucciphase/utils/normalize.py +46 -12
- fucciphase/utils/phase_fit.py +11 -7
- fucciphase/utils/simulator.py +1 -1
- fucciphase/utils/track_postprocessing.py +16 -11
- fucciphase/utils/trackmate.py +30 -13
- fucciphase-0.0.4.dist-info/METADATA +238 -0
- fucciphase-0.0.4.dist-info/RECORD +25 -0
- {fucciphase-0.0.2.dist-info → fucciphase-0.0.4.dist-info}/WHEEL +1 -1
- fucciphase-0.0.2.dist-info/METADATA +0 -137
- fucciphase-0.0.2.dist-info/RECORD +0 -24
- {fucciphase-0.0.2.dist-info → fucciphase-0.0.4.dist-info}/entry_points.txt +0 -0
- {fucciphase-0.0.2.dist-info → fucciphase-0.0.4.dist-info}/licenses/LICENSE +0 -0
fucciphase/utils/trackmate.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import re
|
|
2
2
|
import xml.etree.ElementTree as et
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
import numpy as np
|
|
7
7
|
import pandas as pd
|
|
@@ -46,7 +46,7 @@ class TrackMateXML:
|
|
|
46
46
|
List of all features in the xml file, and whether they are integer features.
|
|
47
47
|
"""
|
|
48
48
|
|
|
49
|
-
def __init__(self, xml_path:
|
|
49
|
+
def __init__(self, xml_path: str | Path) -> None:
|
|
50
50
|
"""Initialize the TrackMateXML object.
|
|
51
51
|
|
|
52
52
|
The xml file is parsed and the model and all spots are imported.
|
|
@@ -55,18 +55,35 @@ class TrackMateXML:
|
|
|
55
55
|
----------
|
|
56
56
|
xml_path : Union[str, Path]
|
|
57
57
|
Path to the xml file.
|
|
58
|
+
|
|
59
|
+
Raises
|
|
60
|
+
------
|
|
61
|
+
FileNotFoundError
|
|
62
|
+
If the XML file does not exist.
|
|
63
|
+
ValueError
|
|
64
|
+
If the XML file is malformed or not a valid TrackMate file.
|
|
58
65
|
"""
|
|
59
66
|
# parse tree
|
|
60
|
-
|
|
67
|
+
xml_path = Path(xml_path)
|
|
68
|
+
if not xml_path.exists():
|
|
69
|
+
raise FileNotFoundError(f"TrackMate XML file not found: {xml_path}")
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
self._tree: et.ElementTree[et.Element[str]] = et.parse(xml_path)
|
|
73
|
+
except et.ParseError as e:
|
|
74
|
+
raise ValueError(
|
|
75
|
+
f"Failed to parse TrackMate XML file {xml_path}: {e}"
|
|
76
|
+
) from None
|
|
77
|
+
|
|
61
78
|
self._root: et.Element | Any = self._tree.getroot()
|
|
62
79
|
|
|
63
80
|
# placeholders
|
|
64
|
-
self._model:
|
|
65
|
-
self._allspots:
|
|
81
|
+
self._model: et.Element | None = None
|
|
82
|
+
self._allspots: et.Element | None = None
|
|
66
83
|
|
|
67
84
|
self.nspots: int = 0 # number of spots
|
|
68
|
-
self.features:
|
|
69
|
-
self.spot_features:
|
|
85
|
+
self.features: dict[str, type] = {} # features and their types
|
|
86
|
+
self.spot_features: list[str] = [] # list of spot features
|
|
70
87
|
|
|
71
88
|
# import model and all spots
|
|
72
89
|
self._import_data()
|
|
@@ -74,7 +91,7 @@ class TrackMateXML:
|
|
|
74
91
|
def _get_spot_features(self) -> None:
|
|
75
92
|
"""Get the spot features from the tree."""
|
|
76
93
|
if self._allspots is not None:
|
|
77
|
-
spot_features:
|
|
94
|
+
spot_features: list[str] = []
|
|
78
95
|
for frame in self._allspots:
|
|
79
96
|
for spot in frame:
|
|
80
97
|
spot_features.extend(spot.attrib.keys())
|
|
@@ -249,7 +266,7 @@ class TrackMateXML:
|
|
|
249
266
|
for feature in new_features:
|
|
250
267
|
spot.attrib[feature] = str(spot_df[feature].values[0])
|
|
251
268
|
|
|
252
|
-
def save_xml(self, xml_path:
|
|
269
|
+
def save_xml(self, xml_path: str | Path) -> None:
|
|
253
270
|
"""Save the xml file.
|
|
254
271
|
|
|
255
272
|
Parameters
|
|
@@ -262,12 +279,12 @@ class TrackMateXML:
|
|
|
262
279
|
|
|
263
280
|
def get_full_tracks(
|
|
264
281
|
df: pd.DataFrame,
|
|
265
|
-
channels:
|
|
282
|
+
channels: list[str],
|
|
266
283
|
track_id_name: str = "UNIQUE_TRACK_ID",
|
|
267
284
|
spot_name: str = "name",
|
|
268
285
|
frame_name: str = "FRAME",
|
|
269
286
|
min_length: int = 40,
|
|
270
|
-
) ->
|
|
287
|
+
) -> tuple[list[pd.DataFrame], list[pd.DataFrame]]:
|
|
271
288
|
"""Locate all tracks that may describe a full cycle.
|
|
272
289
|
Tracks need to be auto-named by TrackMate.
|
|
273
290
|
For example, Track_1a, Track_1aa, Track_1b etc.
|
|
@@ -275,8 +292,8 @@ class TrackMateXML:
|
|
|
275
292
|
In addition, tracks longer than a certain minimum length can be selected.
|
|
276
293
|
"""
|
|
277
294
|
regex = "Track_[0-9]+.[a-z]+"
|
|
278
|
-
candidate_tracks:
|
|
279
|
-
save_tracks:
|
|
295
|
+
candidate_tracks: list[pd.DataFrame] = []
|
|
296
|
+
save_tracks: list[pd.DataFrame] = []
|
|
280
297
|
track_ids = df[track_id_name].unique()
|
|
281
298
|
for track_id in track_ids:
|
|
282
299
|
track = df[df[track_id_name] == track_id]
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: fucciphase
|
|
3
|
+
Version: 0.0.4
|
|
4
|
+
Summary: Cell cycle analysis plugin.
|
|
5
|
+
Project-URL: homepage, https://github.com/nobias-ht/fucciphase
|
|
6
|
+
Project-URL: repository, https://github.com/nobias-ht/fucciphase
|
|
7
|
+
Author-email: Joran Deschamps <joran.deschamps@fht.org>
|
|
8
|
+
License: BSD-3-Clause
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
|
+
Requires-Python: >=3.10
|
|
19
|
+
Requires-Dist: dtaidistance
|
|
20
|
+
Requires-Dist: lineagetree<1.5.0
|
|
21
|
+
Requires-Dist: matplotlib
|
|
22
|
+
Requires-Dist: monotonic-derivative
|
|
23
|
+
Requires-Dist: numpy
|
|
24
|
+
Requires-Dist: openpyxl
|
|
25
|
+
Requires-Dist: pandas
|
|
26
|
+
Requires-Dist: scipy
|
|
27
|
+
Requires-Dist: svgwrite
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: ipython; extra == 'dev'
|
|
30
|
+
Requires-Dist: mypy; extra == 'dev'
|
|
31
|
+
Requires-Dist: pdbpp; extra == 'dev'
|
|
32
|
+
Requires-Dist: pre-commit; extra == 'dev'
|
|
33
|
+
Requires-Dist: rich; extra == 'dev'
|
|
34
|
+
Requires-Dist: ruff; extra == 'dev'
|
|
35
|
+
Provides-Extra: doc
|
|
36
|
+
Requires-Dist: sphinx; extra == 'doc'
|
|
37
|
+
Provides-Extra: jupyter
|
|
38
|
+
Requires-Dist: jupyter; extra == 'jupyter'
|
|
39
|
+
Provides-Extra: napari
|
|
40
|
+
Requires-Dist: bioio; extra == 'napari'
|
|
41
|
+
Requires-Dist: bioio-ome-tiff; extra == 'napari'
|
|
42
|
+
Requires-Dist: bioio-tifffile; extra == 'napari'
|
|
43
|
+
Requires-Dist: napari; extra == 'napari'
|
|
44
|
+
Provides-Extra: test
|
|
45
|
+
Requires-Dist: pytest; extra == 'test'
|
|
46
|
+
Requires-Dist: pytest-cov; extra == 'test'
|
|
47
|
+
Description-Content-Type: text/markdown
|
|
48
|
+
|
|
49
|
+
# fucciphase
|
|
50
|
+
|
|
51
|
+
[](https://github.com/Synthetic-Physiology-Lab/fucciphase/raw/main/LICENSE)
|
|
52
|
+
[](https://pypi.org/project/fucciphase)
|
|
53
|
+
[](https://python.org)
|
|
54
|
+
[](https://github.com/Synthetic-Physiology-Lab/fucciphase/actions/workflows/ci.yml)
|
|
55
|
+
[](https://codecov.io/gh/Synthetic-Physiology-Lab/fucciphase)
|
|
56
|
+
[](https://results.pre-commit.ci/latest/github/Synthetic-Physiology-Lab/fucciphase/main)
|
|
57
|
+
|
|
58
|
+
FUCCI cell cycle analysis plugin. Obtain cell cycle information from FUCCI fluorescence intensities.
|
|
59
|
+
|
|
60
|
+
## Installation
|
|
61
|
+
The best way to run fucciphase is to install it in a virtual conda environment.
|
|
62
|
+
Make sure that git is installed and can be called from the command line.
|
|
63
|
+
|
|
64
|
+
To install from pip:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pip install fucciphase
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
If you wish to install it from source:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
git clone https://github.com/Synthetic-Physiology-Lab/fucciphase
|
|
74
|
+
cd fucciphase
|
|
75
|
+
pip install -e .
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The installation should not take longer than a few seconds (depending on your internet connection).
|
|
79
|
+
|
|
80
|
+
A minimal environment for running the [notebooks](examples/notebooks) can be set up with:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
pip install fucciphase jupyter matplotlib pandas
|
|
84
|
+
````
|
|
85
|
+
|
|
86
|
+
### Install Napari + movie reading support (optional)
|
|
87
|
+
|
|
88
|
+
FUCCIphase does not install Napari by default. For .ome.tif visualisation, install:
|
|
89
|
+
```bash
|
|
90
|
+
pip install napari bioio bioio-ome-tiff bioio-tifffile
|
|
91
|
+
```
|
|
92
|
+
or, if installing from source with extras:
|
|
93
|
+
```bash
|
|
94
|
+
pip install -e ".[napari]"
|
|
95
|
+
```
|
|
96
|
+
---
|
|
97
|
+
## What’s Inside This Repository
|
|
98
|
+
|
|
99
|
+
This repository is organized to support both **analysis workflows** and **reproducible usage examples** of FUCCIphase.
|
|
100
|
+
If you're new to the tool, this is where to start.
|
|
101
|
+
|
|
102
|
+
### 1 — `examples/notebooks/` [📁 notebooks](examples/notebooks)
|
|
103
|
+
|
|
104
|
+
Interactive Jupyter workflows demonstrating how to use FUCCIphase in practical scenarios.
|
|
105
|
+
|
|
106
|
+
| Notebook | Purpose |
|
|
107
|
+
| ---------------------------------- |----------------------------------------------------------------|
|
|
108
|
+
| `extract_calibration_data.ipynb` | Convert raw movies + TrackMate XML into FUCCI reference curves |
|
|
109
|
+
| `sensor_calibration.ipynb` | Build a FUCCI sensor model from calibration traces |
|
|
110
|
+
| `getting_started.ipynb` | Minimal end-to-end example of FUCCIphase usage |
|
|
111
|
+
| `example_estimated.ipynb` | Visualize fucciphase output tables |
|
|
112
|
+
| `percentage_reconstruction.ipynb` | Smooth and reconstruct %phase trajectories |
|
|
113
|
+
| `example_reconstruction.ipynb` | Recover incomplete/noisy fluorescence traces |
|
|
114
|
+
| `example_simulated.ipynb` | Generate synthetic FUCCI signals for testing |
|
|
115
|
+
| `color-tails-by-percentage.ipynb` | Visualize population-level phase composition |
|
|
116
|
+
| `explanation-dtw-alignment.ipynb` | How DTW alignment works internally |
|
|
117
|
+
| `phaselocking-workflow-lazy.ipynb` | Scalable phase-locking for large datasets |
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
### 2 — `examples/reproducibility/` [📁 reproducibility](examples/reproducibility)
|
|
121
|
+
|
|
122
|
+
This is a minimal workflow that uses the sample data. Navigate to the reproducibility directory, then run the following command in one step:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
fucciphase inputs/merged_linked.ome.xml `
|
|
126
|
+
-ref ../example_data/hacat_fucciphase_reference.csv `
|
|
127
|
+
-dt 0.25 `
|
|
128
|
+
-m MEAN_INTENSITY_CH1 `
|
|
129
|
+
-c MEAN_INTENSITY_CH2 `
|
|
130
|
+
--generate_unique_tracks true `
|
|
131
|
+
```
|
|
132
|
+
and to visualize results in napari:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
fucciphase-napari outputs/merged_linked.ome_processed.csv inputs/downscaled_hacat.ome.tif -m 0 -c 1 -s 2 --pixel_size 0.544
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Below a preview of the output generated by the reproducibility workflow:
|
|
139
|
+
|
|
140
|
+
[](outputs/video_downscaled_hacat.mp4)
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### 3 — `examples/example_data/` [📁 example_data](examples/example_data)
|
|
145
|
+
|
|
146
|
+
Reference-style FUCCI datasets used for **calibration & sensor building**.
|
|
147
|
+
|
|
148
|
+
Includes:
|
|
149
|
+
|
|
150
|
+
| File | Meaning |
|
|
151
|
+
| ------------------ | ------------------------------------------------- |
|
|
152
|
+
| `*_reference.csv` | FUCCI calibration traces used to learn the sensor |
|
|
153
|
+
| `*.json` | Saved sensor models usable via CLI or notebooks |
|
|
154
|
+
|
|
155
|
+
Use this folder if you want to train your own sensor or understand expected input format.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
## Basic usage
|
|
159
|
+
|
|
160
|
+
Fucci phase currently supports loading a
|
|
161
|
+
[TrackMate](https://imagej.net/plugins/trackmate/) XML file:
|
|
162
|
+
|
|
163
|
+
```python
|
|
164
|
+
from fucciphase import process_trackmate
|
|
165
|
+
from fucciphase.sensor import get_fuccisa_default_sensor
|
|
166
|
+
|
|
167
|
+
trackmate_xml = "path/to/trackmate.xml"
|
|
168
|
+
channel1 = "MEAN_INTENSITY_CH3"
|
|
169
|
+
channel2 = "MEAN_INTENSITY_CH4"
|
|
170
|
+
|
|
171
|
+
sensor = get_fuccisa_default_sensor()
|
|
172
|
+
|
|
173
|
+
df = process_trackmate(trackmate_xml,
|
|
174
|
+
channels=[channel1, channel2],
|
|
175
|
+
sensor=sensor,
|
|
176
|
+
thresholds=[0.1, 0.1])
|
|
177
|
+
print(df)
|
|
178
|
+
```
|
|
179
|
+
The TrackMate XML is converted to a [Pandas](https://pandas.pydata.org/) DataFrame.
|
|
180
|
+
Thus, in general data (e.g., stored in a CSV or XLSX file) that can be parsed into
|
|
181
|
+
a DataFrame is supported.
|
|
182
|
+
|
|
183
|
+
The runtime of the scripts depends on your datasize. 2D samples with a few hundred to a few thousand cells
|
|
184
|
+
can be processed in a few minutes. Visualization in Napari can take a bit longer.
|
|
185
|
+
Standard processing does not require a powerful computer.
|
|
186
|
+
Make sure that you have sufficient RAM to load videos for visualization in Napari.
|
|
187
|
+
|
|
188
|
+
### Using your own data
|
|
189
|
+
|
|
190
|
+
To process your own dataset:
|
|
191
|
+
|
|
192
|
+
1. Export tracking from Fiji/TrackMate as `.xml`
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
2. Build a reference CSV (minimum one full cell cycle):
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
percentage, time, cyan, magenta
|
|
199
|
+
```
|
|
200
|
+
For reference, check the example files available in the `example_data` folder.
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
3. Run:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
fucciphase your_tracks.xml -ref your_reference.csv -dt <your timestep> -m <ch1> -c <ch2>
|
|
207
|
+
```
|
|
208
|
+
4. Visualize with:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
fucciphase-napari your_tracks_processed.csv your_video.ome.tif -m <ch1> -c <ch2> -s <mask>
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
## Development
|
|
216
|
+
|
|
217
|
+
To develop fucciphase, clone the repository, install fucciphase in your environment
|
|
218
|
+
and install the pre-commit hooks:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
git clone https://github.com/Synthetic-Physiology-Lab/fucciphase
|
|
222
|
+
cd fucciphase
|
|
223
|
+
pip install -e ".[test, dev]"
|
|
224
|
+
pre-commit install
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
If you want to build the documentation, replace the abovementioned pip install by:
|
|
228
|
+
```bash
|
|
229
|
+
pip install -e ".[test, dev, doc]"
|
|
230
|
+
```
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Cite us
|
|
234
|
+
|
|
235
|
+
Di Sante, M., Pezzotti, M., Zimmermann, J., Enrico, A., Deschamps, J., Balmas, E.,
|
|
236
|
+
Becca, S., Solito, S., Reali, A., Bertero, A., Jug, F. and Pasqualini, F.S., 2025.
|
|
237
|
+
CALIPERS: Cell cycle-aware live imaging for phenotyping experiments and regeneration studies.
|
|
238
|
+
bioRxiv, https://doi.org/10.1101/2024.12.19.629259
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
fucciphase/__init__.py,sha256=HkyHcSzLlTlEIz7E3bvuINGBqfnIL0s6oPU0EE_pQCs,545
|
|
2
|
+
fucciphase/__main__.py,sha256=lXUDkaeNRAZep5O7dNLj9RY4EclpPolruAll0FFC_jo,298
|
|
3
|
+
fucciphase/fucci_phase.py,sha256=34EmEaG_jEGvRMBocPRYfBYXSJpko3_nYUgP013Bkjo,8990
|
|
4
|
+
fucciphase/io.py,sha256=5a8Qre5KCT1haoqsB8FELyPKM7hzPM9kcEBGclokSPA,2018
|
|
5
|
+
fucciphase/main_cli.py,sha256=870EiTIxck_vHczeZ0Go9Ia42d9UTgWtHoNfm0Q9BJ0,11036
|
|
6
|
+
fucciphase/phase.py,sha256=wxBJoglCtnLTpZwJ2j1kUeKZMb3y3pqeKakjMSIn1bw,25450
|
|
7
|
+
fucciphase/plot.py,sha256=0bLCJBdfR-I7_qNDurY4iJyeV8D0GqBTvHZO4NSNTlk,24212
|
|
8
|
+
fucciphase/py.typed,sha256=esB4cHc6c07uVkGtqf8at7ttEnprwRxwk8obY8Qumq4,187
|
|
9
|
+
fucciphase/sensor.py,sha256=XVshjhe6ix8FO5xmICLF7ovBCf_JcEkD328tU40-dj0,15172
|
|
10
|
+
fucciphase/tracking_utilities.py,sha256=dJ0q903_aF7bJyARU7wPeRjX6r7b-sHWJVOyXucpMcI,4825
|
|
11
|
+
fucciphase/napari/__init__.py,sha256=At9Shk6HfDf6obtQaM0yKG4NOZVO6YxD2-J1M2ZGm7w,198
|
|
12
|
+
fucciphase/napari/tracks_to_napari.py,sha256=ITqm_aw1uRG-RIfuxoC-zJLCDmrxjduWbiWC69xGzMM,4060
|
|
13
|
+
fucciphase/utils/__init__.py,sha256=YwgK2COtG44QJaXHVPYKu2-Ifm6GIG1ahykvJ4pr-MM,1408
|
|
14
|
+
fucciphase/utils/checks.py,sha256=o4mMGJMIE5wlaf0jtblnTD4JGTfjc5W7ZS4tYDIPlLo,625
|
|
15
|
+
fucciphase/utils/dtw.py,sha256=6RJ5wZ8jDFKSVmcYajsdTJ4tfe3E-wKROEA2rWyGRN4,1638
|
|
16
|
+
fucciphase/utils/normalize.py,sha256=EyVDeMJrDu02XfSwt0jIUecAlTN9v9BAS2KdU5wKk_c,7173
|
|
17
|
+
fucciphase/utils/phase_fit.py,sha256=tiZ7rVkPvFokf7ghhGfkcdr1udjptUU4HmKu53EL3LQ,1835
|
|
18
|
+
fucciphase/utils/simulator.py,sha256=fV-Pj6APms3QbYmiD9TjEYYkTqkIWk0uKDLCpz36HmA,2323
|
|
19
|
+
fucciphase/utils/track_postprocessing.py,sha256=AOm4N4WACzKymX7vz74HWeAIQx556OQ5IS6uHZHgvHw,14500
|
|
20
|
+
fucciphase/utils/trackmate.py,sha256=NeP8vCQEAGiKwz2O0kDmmvJtkxHN6LBtDwkAHsZJrvg,11131
|
|
21
|
+
fucciphase-0.0.4.dist-info/METADATA,sha256=JNqZF53wGiKLnWceUHEYXj1sim9p8TgftwNoRrnWHrk,9019
|
|
22
|
+
fucciphase-0.0.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
23
|
+
fucciphase-0.0.4.dist-info/entry_points.txt,sha256=B77Cm5QnxeQz6DEfqD6n7zDw48-HrlepWPwLbdVITMY,119
|
|
24
|
+
fucciphase-0.0.4.dist-info/licenses/LICENSE,sha256=pQGrOGpOTwikEzkZ8Zc9XLQwbaZ85TMJP-GaWCNZciw,1554
|
|
25
|
+
fucciphase-0.0.4.dist-info/RECORD,,
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: fucciphase
|
|
3
|
-
Version: 0.0.2
|
|
4
|
-
Summary: Cell cycle analysis plugin.
|
|
5
|
-
Project-URL: homepage, https://github.com/nobias-ht/fucciphase
|
|
6
|
-
Project-URL: repository, https://github.com/nobias-ht/fucciphase
|
|
7
|
-
Author-email: Joran Deschamps <joran.deschamps@fht.org>
|
|
8
|
-
License: BSD-3-Clause
|
|
9
|
-
License-File: LICENSE
|
|
10
|
-
Classifier: Development Status :: 3 - Alpha
|
|
11
|
-
Classifier: License :: OSI Approved :: BSD License
|
|
12
|
-
Classifier: Programming Language :: Python :: 3
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
-
Requires-Python: >=3.8
|
|
18
|
-
Requires-Dist: dtaidistance
|
|
19
|
-
Requires-Dist: lineagetree<1.5.0
|
|
20
|
-
Requires-Dist: matplotlib
|
|
21
|
-
Requires-Dist: monotonic-derivative
|
|
22
|
-
Requires-Dist: numpy
|
|
23
|
-
Requires-Dist: openpyxl
|
|
24
|
-
Requires-Dist: pandas
|
|
25
|
-
Requires-Dist: scipy
|
|
26
|
-
Requires-Dist: svgwrite
|
|
27
|
-
Provides-Extra: dev
|
|
28
|
-
Requires-Dist: ipython; extra == 'dev'
|
|
29
|
-
Requires-Dist: mypy; extra == 'dev'
|
|
30
|
-
Requires-Dist: pdbpp; extra == 'dev'
|
|
31
|
-
Requires-Dist: pre-commit; extra == 'dev'
|
|
32
|
-
Requires-Dist: rich; extra == 'dev'
|
|
33
|
-
Requires-Dist: ruff; extra == 'dev'
|
|
34
|
-
Provides-Extra: doc
|
|
35
|
-
Requires-Dist: sphinx; extra == 'doc'
|
|
36
|
-
Provides-Extra: jupyter
|
|
37
|
-
Requires-Dist: jupyter; extra == 'jupyter'
|
|
38
|
-
Provides-Extra: test
|
|
39
|
-
Requires-Dist: pytest; extra == 'test'
|
|
40
|
-
Requires-Dist: pytest-cov; extra == 'test'
|
|
41
|
-
Description-Content-Type: text/markdown
|
|
42
|
-
|
|
43
|
-
# fucciphase
|
|
44
|
-
|
|
45
|
-
[](https://github.com/Synthetic-Physiology-Lab/fucciphase/raw/main/LICENSE)
|
|
46
|
-
[](https://pypi.org/project/fucciphase)
|
|
47
|
-
[](https://python.org)
|
|
48
|
-
[](https://github.com/Synthetic-Physiology-Lab/fucciphase/actions/workflows/ci.yml)
|
|
49
|
-
[](https://codecov.io/gh/Synthetic-Physiology-Lab/fucciphase)
|
|
50
|
-
[](https://results.pre-commit.ci/latest/github/Synthetic-Physiology-Lab/fucciphase/main)
|
|
51
|
-
|
|
52
|
-
FUCCI cell cycle analysis plugin.
|
|
53
|
-
Obtain cell cycle information from FUCCI fluorescence intensities.
|
|
54
|
-
|
|
55
|
-
## Installation
|
|
56
|
-
|
|
57
|
-
The best way to run fucciphase is to install it in a virtual conda environment.
|
|
58
|
-
Make sure that git is installed and can be called from the command line.
|
|
59
|
-
|
|
60
|
-
To install from pip:
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
pip install fucciphase
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
If you wish to install it from source:
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
git clone https://github.com/Synthetic-Physiology-Lab/fucciphase
|
|
70
|
-
cd fucciphase
|
|
71
|
-
pip install -e .
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
The installation should not take longer than a few seconds (depending on your internet connection).
|
|
75
|
-
|
|
76
|
-
To use the notebooks, also install jupyter:
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
pip install jupyter
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## Usage
|
|
83
|
-
|
|
84
|
-
Fucci phase currently supports loading a
|
|
85
|
-
[TrackMate](https://imagej.net/plugins/trackmate/) XML file:
|
|
86
|
-
|
|
87
|
-
```python
|
|
88
|
-
from fucciphase import process_trackmate
|
|
89
|
-
from fucciphase.sensor import get_fuccisa_default_sensor
|
|
90
|
-
|
|
91
|
-
trackmate_xml = "path/to/trackmate.xml"
|
|
92
|
-
channel1 = "MEAN_INTENSITY_CH3"
|
|
93
|
-
channel2 = "MEAN_INTENSITY_CH4"
|
|
94
|
-
|
|
95
|
-
sensor = get_fuccisa_default_sensor()
|
|
96
|
-
|
|
97
|
-
df = process_trackmate(trackmate_xml,
|
|
98
|
-
channels=[channel1, channel2],
|
|
99
|
-
sensor=sensor,
|
|
100
|
-
thresholds=[0.1, 0.1])
|
|
101
|
-
print(df)
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
The TrackMate XML is converted to a [Pandas](https://pandas.pydata.org/) DataFrame.
|
|
105
|
-
Thus, in general data (e.g., stored in a CSV or XLSX file) that can be parsed into
|
|
106
|
-
a DataFrame is supported.
|
|
107
|
-
|
|
108
|
-
Have a look at the examples in the `example` folder to get more information!
|
|
109
|
-
|
|
110
|
-
The runtime of the scripts depends on your datasize. 2D samples with a few hundred to a few thousand cells
|
|
111
|
-
can be processed in a few minutes. Visualization in Napari can take a bit longer.
|
|
112
|
-
Standard processing does not require a powerful computer.
|
|
113
|
-
Make sure that you have sufficient RAM to load videos for visualization in Napari.
|
|
114
|
-
|
|
115
|
-
## Development
|
|
116
|
-
|
|
117
|
-
To develop fucciphase, clone the repository, install fucciphase in your environment
|
|
118
|
-
and install the pre-commit hooks:
|
|
119
|
-
|
|
120
|
-
```bash
|
|
121
|
-
git clone https://github.com/Synthetic-Physiology-Lab/fucciphase
|
|
122
|
-
cd fucciphase
|
|
123
|
-
pip install -e ".[test, dev]"
|
|
124
|
-
pre-commit install
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
If you want to build the documentation, replace the abovementioned pip install by:
|
|
128
|
-
```bash
|
|
129
|
-
pip install -e ".[test, dev, doc]"
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
## Cite us
|
|
133
|
-
|
|
134
|
-
Di Sante, M., Pezzotti, M., Zimmermann, J., Enrico, A., Deschamps, J., Balmas, E.,
|
|
135
|
-
Becca, S., Solito, S., Reali, A., Bertero, A., Jug, F. and Pasqualini, F.S., 2025.
|
|
136
|
-
CALIPERS: Cell cycle-aware live imaging for phenotyping experiments and regeneration studies.
|
|
137
|
-
bioRxiv, https://doi.org/10.1101/2024.12.19.629259
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
fucciphase/__init__.py,sha256=8PA6UNaYjycfPpOg7e5ArP3k9Lj9H15Lmw-Mnd14azY,375
|
|
2
|
-
fucciphase/fucci_phase.py,sha256=VgydHVN0nWzC6Eeh0LRaPHdScL2w7C5X7IhGSvyp4qw,6134
|
|
3
|
-
fucciphase/io.py,sha256=ELcoxsPHzcg9tf48MaMNnuSMxe0Fd3Nc9LCWbQ6p4I8,1715
|
|
4
|
-
fucciphase/main_cli.py,sha256=S4nRitMkLFFR77DHDT3j5_OtYbTST55ysMzE9J8pf9I,5979
|
|
5
|
-
fucciphase/phase.py,sha256=jy2l9LD81FTk6TIlyWyYPbVnwClGP9N4RrYyqtiMStg,17130
|
|
6
|
-
fucciphase/plot.py,sha256=gFoprFvJGH5Zb-227riRH1x5NEAAhpeqaVCyb1kYLr8,18589
|
|
7
|
-
fucciphase/py.typed,sha256=esB4cHc6c07uVkGtqf8at7ttEnprwRxwk8obY8Qumq4,187
|
|
8
|
-
fucciphase/sensor.py,sha256=6-WEI8viI5fSVyKHnECmKYKaROW4tQaPaNW4hHYVAcA,14788
|
|
9
|
-
fucciphase/tracking_utilities.py,sha256=IfKH2fyPo7fkW3PBvQrCz-UcfrdkOj7D-iLJabynvfw,2776
|
|
10
|
-
fucciphase/napari/__init__.py,sha256=At9Shk6HfDf6obtQaM0yKG4NOZVO6YxD2-J1M2ZGm7w,198
|
|
11
|
-
fucciphase/napari/tracks_to_napari.py,sha256=US9uAzGVJi5wAJ4CbUi9XztRFbrMRK7t0oJrQ40aDEg,4094
|
|
12
|
-
fucciphase/utils/__init__.py,sha256=E4wk7ygjHQQ-8vj4VNHseMLE-PQ1bZK2gvDFaO5Z1eU,1011
|
|
13
|
-
fucciphase/utils/checks.py,sha256=ZTe6cq11Y2e3suM3vECqCvvFxQTMOJqXMPS8gdCP7qc,651
|
|
14
|
-
fucciphase/utils/dtw.py,sha256=MDJEJUT9oSz8Iu6SeWFSBhVgZmLnE3CXE_2cbEl6TE8,1682
|
|
15
|
-
fucciphase/utils/normalize.py,sha256=eGytBDjmWcr1OY88McCJNcmy4zioM2DbtQConDoIVRw,6037
|
|
16
|
-
fucciphase/utils/phase_fit.py,sha256=Ht_dEyuLYonv6is9qQ-Xd95pQR7IR-8C8mv0ckDcp4E,1743
|
|
17
|
-
fucciphase/utils/simulator.py,sha256=7bmrO0IWUqsk4CyM-PlVpG2QTJxjTsY1h6buxmTs1iM,2322
|
|
18
|
-
fucciphase/utils/track_postprocessing.py,sha256=cTe3OOCR4dxFBZwN7XdbzDbnsgouoJql8rv4WwvmbM8,14438
|
|
19
|
-
fucciphase/utils/trackmate.py,sha256=dir4ayS1Fl-gtK8NTbP7t7CBLnrumC8LgPiCwxsBf-c,10666
|
|
20
|
-
fucciphase-0.0.2.dist-info/METADATA,sha256=Hbprshl_yGXUkarqCfjd1r34CDz9doj2HSHo5XN0m8Q,4893
|
|
21
|
-
fucciphase-0.0.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
22
|
-
fucciphase-0.0.2.dist-info/entry_points.txt,sha256=B77Cm5QnxeQz6DEfqD6n7zDw48-HrlepWPwLbdVITMY,119
|
|
23
|
-
fucciphase-0.0.2.dist-info/licenses/LICENSE,sha256=pQGrOGpOTwikEzkZ8Zc9XLQwbaZ85TMJP-GaWCNZciw,1554
|
|
24
|
-
fucciphase-0.0.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|