Skip to content

Commit e35ffe2

Browse files
committed
working on connect() spine
1 parent f02b29d commit e35ffe2

8 files changed

Lines changed: 93 additions & 1128 deletions

File tree

examples/example.ipynb

Lines changed: 44 additions & 1099 deletions
Large diffs are not rendered by default.

mapmanagercore/annotations/base.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,12 @@ def __init__(self, loader: Loader):
2929
self._zarrPath : str = loader.getZarrPath()
3030

3131
def getZarrPath(self):
32-
return self._zarrPath
33-
32+
try:
33+
return self._zarrPath
34+
except (AttributeError) as e:
35+
logger.warning(f'{e}')
36+
37+
# abb
3438
def __str__(self):
3539
"""Print info about the map.
3640
@@ -40,8 +44,18 @@ def __str__(self):
4044
numTimepoints = len(self._images._imagesSrcs.keys())
4145
numPnts = len(self.points._rootDf)
4246
numSegments = len(self.segments._rootDf)
43-
return f't:{numTimepoints}, points:{numPnts} segments:{numSegments} zarr:{zarrPath}'
4447

48+
# images
49+
# numTimepoints = self.numTimepoints()
50+
51+
return f't:{numTimepoints}, points:{numPnts} segments:{numSegments} zarr:{zarrPath}'
52+
53+
#abb
54+
# def numTimepoints(self) -> int:
55+
# """Get the number of timepoints.
56+
# """
57+
# return self._images.shape(t=0)[0]
58+
4559
@property
4660
def segments(self) -> LazyGeoFrame:
4761
return self._segments

mapmanagercore/annotations/mutation.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ def updateSpine(self, spineId: Keys, value: Spine, replaceLog=False, skipLog=Fal
3838
value (Union[dict, gp.Series, pd.Series]): The value to set for the spine.
3939
"""
4040

41+
# abb, remove this?
42+
# When we connect, we want to mutate the multiindex (spineID, t)
4143
if value.t != MISSING_VALUE:
4244
raise ValueError(
4345
f"Invalid type for column 't' must be set on the spine key")
@@ -76,17 +78,28 @@ def newUnassignedSegmentId(self) -> SegmentId:
7678
return self.segments.index.get_level_values(0).max() + 1
7779

7880
def connect(self, spineKey: Tuple[SpineId, int], toSpineKey: Tuple[SpineId, int]):
79-
if self.points[toSpineKey, "segmentID"] != self.points[spineKey, "segmentID"]:
81+
82+
# ValueError: Can only compare identically-labeled Series objects
83+
# if self.points[toSpineKey, "segmentID"] != self.points[spineKey, "segmentID"]:
84+
_segmentID = self.points[spineKey, "segmentID"].values[0]
85+
_toSegmentID = self.points[toSpineKey, "segmentID"].values[0]
86+
if _toSegmentID != _segmentID:
8087
raise ValueError("Cannot connect spines from different segments.")
81-
88+
8289
# check if the key already exists in the time point
83-
existingKey = (toSpineKey[0], spineKey[0])
90+
# existingKey = (toSpineKey[0], spineKey[0])
91+
# abb
92+
existingKey = (spineKey[0], toSpineKey[1])
8493
if existingKey in self.points.index:
8594
self.disconnect(existingKey)
8695

8796
# Propagate the spine ID to all future time points
88-
self.updateSpine(range(spineKey, spineKey[0]), Spine(
89-
spineID=toSpineKey[0],
97+
# self.updateSpine(range(spineKey, spineKey[0]), Spine(
98+
# spineID=toSpineKey[0],
99+
# ))
100+
# abb
101+
self.updateSpine(toSpineKey[0], Spine(
102+
spineID=spineKey[0],
90103
))
91104

92105
def disconnect(self, spineKey: Tuple[SpineId, int]):

mapmanagercore/annotations/single_time_point/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def __getitem__(self, items: Any) -> Any:
5757

5858
# abb
5959
def __len__(self):
60-
return len(self._root._rootDf)
60+
return len(self._root._df)
6161

6262
@property
6363
def index(self):

mapmanagercore/annotations/single_time_point/interactions.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@ def getSpineDistance(self, segmentID: SegmentId,
2929
minProjection = segment.project(point)
3030
return minProjection
3131

32+
# abb added findBrightest=False, do not find brightest by default
3233
def nearestAnchor(self, segmentID: SegmentId,
3334
point: Point,
34-
findBrightest = False):
35+
findBrightest : bool = False):
3536
"""Finds the nearest anchor point on a given line segment to a given point.
3637
3738
Args:
@@ -48,12 +49,12 @@ def nearestAnchor(self, segmentID: SegmentId,
4849
minProjection = segment.project(point)
4950

5051
if np.isnan(minProjection):
51-
logger.info(f'minProjection:{minProjection}')
52-
logger.info(f'segment:{segment}')
53-
logger.info(f'point:{point}')
52+
logger.warning(f'minProjection:{minProjection}')
53+
logger.warning(f'segment:{segment}')
54+
logger.warning(f'point:{point}')
5455

5556
if not findBrightest:
56-
# Default to the closest path
57+
# Default to the closest point (not brightest)
5758
anchor = segment.interpolate(minProjection)
5859
anchor = roundPoint(anchor, 1)
5960
return anchor
@@ -140,8 +141,6 @@ def addSpine(self, segmentId: SpineId, x: int, y: int, z: int) -> Union[SpineId,
140141
anchorZ=int(anchor.z),
141142
xBackgroundOffset=0.0,
142143
yBackgroundOffset=0.0,
143-
# abb
144-
# spineDistance = spineDistance
145144
))
146145

147146
self.snapBackgroundOffset(spineId)
@@ -196,19 +195,13 @@ def moveAnchor(self, spineId: SpineId,
196195
"""
197196
segmentId = self.points[spineId, "segmentID"]
198197

198+
# abb
199199
# when moving, do not find brightest
200200
anchor = self.nearestAnchor(segmentId, Point(x, y, z))
201201

202-
logger.info(f'segmentId:{segmentId} anchor:{anchor}')
203-
204-
# abb, now handled dynamically with laze
205-
# _point = self.points[spineId, "point"]
206-
# spineDistance = self.getSpineDistance(segmentId, _point)
207-
208202
self.updateSpine(spineId, Spine(
209203
anchorZ=int(anchor.z),
210204
anchor=Point(anchor.x, anchor.y),
211-
# spineDistance=spineDistance,
212205
), state != DragState.START and state != DragState.MANUAL)
213206

214207
return True

mapmanagercore/lazy_geo_pandas/lazy.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,10 @@ def _parseKeyRow(self, items):
324324

325325
return row, key
326326

327+
# abb
328+
def __len__(self):
329+
return len(self._df)
330+
327331
def __getitem__(self, items):
328332
row, key = self._parseKeyRow(items)
329333

mapmanagercore/loader/imageio.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ def imread(path: str) -> ImageLoader:
9696
return _MultiImageLoader(imread(path))
9797

9898
# abb
99-
def getNumTimepoints(self):
100-
return len(self._images.keys())
99+
# def getNumTimepoints(self):
100+
# return len(self._images.keys())
101101

102102
def read(self, path : Union[str, np.ndarray], time: int = 0, channel: int = 0):
103103
"""

mapmanagercore/schemas/spine.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,6 @@ class Spine:
115115
point: Point
116116
anchor: Point
117117

118-
# abb
119-
# spinePosition: float
120-
# spineSide: str # calculate on addSpine and moveSpine
121-
122118
xBackgroundOffset: float
123119
yBackgroundOffset: float
124120
z: int

0 commit comments

Comments
 (0)