Skip to content

Commit 1b1cf5f

Browse files
committed
Add db components from ispyb
1 parent 36511c9 commit 1b1cf5f

File tree

2 files changed

+347
-0
lines changed

2 files changed

+347
-0
lines changed

src/murfey/util/db.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,17 @@
99
import sqlalchemy
1010
from sqlmodel import Field, Relationship, SQLModel, create_engine
1111

12+
from murfey.util.processing_db import (
13+
CTF,
14+
Atlas,
15+
MotionCorrection,
16+
Movie as ProcessingMovie,
17+
ParticleClassificationGroup,
18+
ParticlePicker,
19+
RelativeIceThickness,
20+
Tomogram,
21+
)
22+
1223
"""
1324
GENERAL
1425
"""
@@ -429,6 +440,7 @@ class DataCollectionGroup(SQLModel, table=True): # type: ignore
429440
sa_relationship_kwargs={"cascade": "delete"},
430441
)
431442
)
443+
Atlas: List["Atlas"] = Relationship(back_populates="DataCollectionGroup")
432444

433445

434446
class NotificationParameter(SQLModel, table=True): # type: ignore
@@ -468,6 +480,11 @@ class DataCollection(SQLModel, table=True): # type: ignore
468480
processing_jobs: List["ProcessingJob"] = Relationship(
469481
back_populates="data_collection", sa_relationship_kwargs={"cascade": "delete"}
470482
)
483+
Movie: List["ProcessingMovie"] = Relationship(back_populates="DataCollection")
484+
MotionCorrection: List["MotionCorrection"] = Relationship(
485+
back_populates="DataCollection"
486+
)
487+
Tomogram: List["Tomogram"] = Relationship(back_populates="DataCollection")
471488

472489

473490
class ProcessingJob(SQLModel, table=True): # type: ignore
@@ -569,6 +586,20 @@ class AutoProcProgram(SQLModel, table=True): # type: ignore
569586
murfey_ids: List["MurfeyLedger"] = Relationship(
570587
back_populates="auto_proc_program", sa_relationship_kwargs={"cascade": "delete"}
571588
)
589+
MotionCorrection: List["MotionCorrection"] = Relationship(
590+
back_populates="DataCollection"
591+
)
592+
Tomogram: List["Tomogram"] = Relationship(back_populates="AutoProcProgram")
593+
CTF: List["CTF"] = Relationship(back_populates="AutoProcProgram")
594+
ParticlePicker: List["ParticlePicker"] = Relationship(
595+
back_populates="AutoProcProgram"
596+
)
597+
RelativeIceThickness: List["RelativeIceThickness"] = Relationship(
598+
back_populates="AutoProcProgram"
599+
)
600+
ParticleClassificationGroup: List["ParticleClassificationGroup"] = Relationship(
601+
back_populates="AutoProcProgram"
602+
)
572603

573604

574605
class MurfeyLedger(SQLModel, table=True): # type: ignore

src/murfey/util/processing_db.py

Lines changed: 316 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,316 @@
1+
import datetime
2+
from typing import List, Optional
3+
4+
from sqlmodel import Enum, Field, Relationship, SQLModel
5+
6+
from murfey.util.db import AutoProcProgram, DataCollection, DataCollectionGroup
7+
8+
9+
class Atlas(SQLModel, table=True): # type: ignore
10+
atlasId: int = Field(primary_key=True, unique=True)
11+
dataCollectionGroupId: int = Field(foreign_key="DataCollectionGroup.id")
12+
atlasImage: str
13+
pixelSize: float
14+
cassetteSlot: Optional[int] = None
15+
DataCollectionGroup: Optional["DataCollectionGroup"] = Relationship(
16+
back_populates="Atlas"
17+
)
18+
GridSquare: List["GridSquare"] = Relationship(back_populates="Atlas")
19+
20+
21+
class GridSquare(SQLModel, table=True): # type: ignore
22+
gridSquareId: int = Field(primary_key=True, unique=True)
23+
atlasId: int = Field(foreign_key="Atlas.atlasId")
24+
gridSquareLabel: Optional[int] = None
25+
gridSquareImage: Optional[str] = None
26+
pixelLocationX: Optional[int] = None
27+
pixelLocationY: Optional[int] = None
28+
height: Optional[int] = None
29+
width: Optional[int] = None
30+
angle: Optional[float] = None
31+
stageLocationX: Optional[float] = None
32+
stageLocationY: Optional[float] = None
33+
qualityIndicator: Optional[float] = None
34+
pixelSize: Optional[float] = None
35+
Atlas: Optional["Atlas"] = Relationship(back_populates="Atlas")
36+
FoilHole: List["FoilHole"] = Relationship(back_populates="GridSquare")
37+
Tomogram: List["Tomogram"] = Relationship(back_populates="GridSquare")
38+
39+
40+
class FoilHole(SQLModel, table=True): # type: ignore
41+
foilHoleId: int = Field(primary_key=True, unique=True)
42+
gridSquareId: int = Field(foreign_key="GridSquare.gridSquareId")
43+
foilHoleLabel: str
44+
foilHoleImage: Optional[str] = None
45+
pixelLocationX: Optional[int] = None
46+
pixelLocationY: Optional[int] = None
47+
diameter: Optional[int] = None
48+
stageLocationX: Optional[float] = None
49+
stageLocationY: Optional[float] = None
50+
qualityIndicator: Optional[float] = None
51+
pixelSize: Optional[float] = None
52+
GridSquare: Optional["GridSquare"] = Relationship(back_populates="FoilHole")
53+
Movie: List["Movie"] = Relationship(back_populates="FoilHole")
54+
55+
56+
class Movie(SQLModel, table=True): # type: ignore
57+
movieId: int = Field(primary_key=True, unique=True)
58+
createdTimeStamp: datetime.datetime
59+
dataCollectionId: Optional[int] = Field(foreign_key="DataCollection.id")
60+
movieNumber: Optional[int] = None
61+
movieFullPath: Optional[str] = None
62+
positionX: Optional[float] = None
63+
positionY: Optional[float] = None
64+
nominalDefocus: Optional[float] = None
65+
angle: Optional[float] = None
66+
fluence: Optional[float] = None
67+
numberOfFrames: Optional[int] = None
68+
foilHoleId: Optional[int] = Field(foreign_key="FoilHole.foilHoleId")
69+
templateLabel: Optional[int] = None
70+
DataCollection: Optional["DataCollection"] = Relationship(back_populates="Movie")
71+
FoilHole: Optional["FoilHole"] = Relationship(back_populates="Movie")
72+
MotionCorrection: List["MotionCorrection"] = Relationship(back_populates="Movie")
73+
TiltImageAlignment: List["TiltImageAlignment"] = Relationship(
74+
back_populates="Movie"
75+
)
76+
77+
78+
class MotionCorrection(SQLModel, table=True): # type: ignore
79+
motionCorrectionId: int = Field(primary_key=True, unique=True)
80+
dataCollectionId: Optional[int] = Field(foreign_key="DataCollection.id")
81+
autoProcProgramId: Optional[int] = Field(foreign_key="AutoProcProgram.id")
82+
imageNumber: Optional[int] = None
83+
firstFrame: Optional[int] = None
84+
lastFrame: Optional[int] = None
85+
dosePerFrame: Optional[float] = None
86+
doseWeight: Optional[float] = None
87+
totalMotion: Optional[float] = None
88+
averageMotionPerFrame: Optional[float] = None
89+
driftPlotFullPath: Optional[str] = None
90+
micrographFullPath: Optional[str] = None
91+
micrographSnapshotFullPath: Optional[str] = None
92+
patchesUsedX: Optional[int] = None
93+
patchesUsedY: Optional[int] = None
94+
fftFullPath: Optional[str] = None
95+
fftCorrectedFullPath: Optional[str] = None
96+
comments: Optional[str] = None
97+
movieId: Optional[int] = Field(foreign_key="Movie.movieId")
98+
AutoProcProgram: Optional["AutoProcProgram"] = Relationship(
99+
back_populates="MotionCorrection"
100+
)
101+
DataCollection: Optional["DataCollection"] = Relationship(
102+
back_populates="MotionCorrection"
103+
)
104+
Movie: Optional["Movie"] = Relationship(back_populates="MotionCorrection")
105+
CTF: List["CTF"] = Relationship(back_populates="MotionCorrection")
106+
ParticlePicker: List["ParticlePicker"] = Relationship(
107+
back_populates="MotionCorrection"
108+
)
109+
RelativeIceThickness: List["RelativeIceThickness"] = Relationship(
110+
back_populates="MotionCorrection"
111+
)
112+
113+
114+
class Tomogram(SQLModel, table=True): # type: ignore
115+
tomogramId: int = Field(primary_key=True, unique=True)
116+
dataCollectionId: Optional[int] = Field(foreign_key="DataCollection.id")
117+
autoProcProgramId: Optional[int] = Field(foreign_key="AutoProcProgram.id")
118+
volumeFile: Optional[str] = None
119+
stackFile: Optional[str] = None
120+
sizeX: Optional[int] = None
121+
sizeY: Optional[int] = None
122+
sizeZ: Optional[int] = None
123+
pixelSpacing: Optional[float] = None
124+
residualErrorMean: Optional[float] = None
125+
residualErrorSD: Optional[float] = None
126+
xAxisCorrection: Optional[float] = None
127+
tiltAngleOffset: Optional[float] = None
128+
zShift: Optional[float] = None
129+
fileDirectory: Optional[str] = None
130+
centralSliceImage: Optional[str] = None
131+
tomogramMovie: Optional[str] = None
132+
xyShiftPlot: Optional[str] = None
133+
projXY: Optional[str] = None
134+
projXZ: Optional[str] = None
135+
recordTimeStamp: Optional[datetime.datetime] = None
136+
globalAlignmentQuality: Optional[float] = None
137+
gridSquareId: Optional[int] = Field(foreign_key="GridSquare.gridSquareId")
138+
pixelLocationX: Optional[int] = None
139+
pixelLocationY: Optional[int] = None
140+
AutoProcProgram: Optional["AutoProcProgram"] = Relationship(
141+
back_populates="Tomogram"
142+
)
143+
DataCollection: Optional["DataCollection"] = Relationship(back_populates="Tomogram")
144+
GridSquare: Optional["GridSquare"] = Relationship(back_populates="Tomogram")
145+
ProcessedTomogram: List["ProcessedTomogram"] = Relationship(
146+
back_populates="Tomogram"
147+
)
148+
TiltImageAlignment: List["TiltImageAlignment"] = Relationship(
149+
back_populates="Tomogram"
150+
)
151+
152+
153+
class CTF(SQLModel, table=True): # type: ignore
154+
ctfId: int = Field(primary_key=True, unique=True)
155+
motionCorrectionId: Optional[int] = Field(
156+
foreign_key="MotionCorrection.motionCorrectionId"
157+
)
158+
autoProcProgramId: Optional[int] = Field(foreign_key="AutoProcProgram.id")
159+
boxSizeX: Optional[float] = None
160+
boxSizeY: Optional[float] = None
161+
minResolution: Optional[float] = None
162+
maxResolution: Optional[float] = None
163+
minDefocus: Optional[float] = None
164+
maxDefocus: Optional[float] = None
165+
defocusStepSize: Optional[float] = None
166+
astigmatism: Optional[float] = None
167+
astigmatismAngle: Optional[float] = None
168+
estimatedResolution: Optional[float] = None
169+
estimatedDefocus: Optional[float] = None
170+
amplitudeContrast: Optional[float] = None
171+
ccValue: Optional[float] = None
172+
fftTheoreticalFullPath: Optional[str] = None
173+
comments: Optional[str] = None
174+
AutoProcProgram: Optional["AutoProcProgram"] = Relationship(back_populates="CTF")
175+
MotionCorrection: Optional["MotionCorrection"] = Relationship(back_populates="CTF")
176+
177+
178+
class ParticlePicker(SQLModel, table=True): # type: ignore
179+
particlePickerId: int = Field(primary_key=True, unique=True)
180+
programId: Optional[int] = Field(foreign_key="AutoProcProgram.autoProcProgramId")
181+
firstMotionCorrectionId: Optional[int] = Field(
182+
foreign_key="MotionCorrection.motionCorrectionId"
183+
)
184+
particlePickingTemplate: Optional[str] = None
185+
particleDiameter: Optional[float] = None
186+
numberOfParticles: Optional[int] = None
187+
summaryImageFullPath: Optional[str] = None
188+
MotionCorrection: Optional["MotionCorrection"] = Relationship(
189+
back_populates="ParticlePicker"
190+
)
191+
AutoProcProgram: Optional["AutoProcProgram"] = Relationship(
192+
back_populates="ParticlePicker"
193+
)
194+
ParticleClassificationGroup: List["ParticleClassificationGroup"] = Relationship(
195+
back_populates="ParticlePicker"
196+
)
197+
198+
199+
class ProcessedTomogram(SQLModel, table=True): # type: ignore
200+
processedTomogramId: int = Field(primary_key=True, unique=True)
201+
tomogramId: int = Field(foreign_key="Tomogram.tomogramId")
202+
filePath: Optional[str] = None
203+
processingType: Optional[str] = None
204+
Tomogram: Optional["Tomogram"] = Relationship(back_populates="ProcessedTomogram")
205+
206+
207+
class RelativeIceThickness(SQLModel, table=True): # type: ignore
208+
relativeIceThicknessId: int = Field(primary_key=True, unique=True)
209+
motionCorrectionId: Optional[int] = Field(
210+
foreign_key="MotionCorrection.motionCorrectionId"
211+
)
212+
autoProcProgramId: Optional[int] = Field(
213+
foreign_key="AutoProcProgram.autoProcProgramId"
214+
)
215+
minimum: Optional[float] = None
216+
q1: Optional[float] = None
217+
median: Optional[float] = None
218+
q3: Optional[float] = None
219+
maximum: Optional[float] = None
220+
AutoProcProgram: Optional["AutoProcProgram"] = Relationship(
221+
back_populates="RelativeIceThickness"
222+
)
223+
MotionCorrection: Optional["MotionCorrection"] = Relationship(
224+
back_populates="RelativeIceThickness"
225+
)
226+
227+
228+
class TiltImageAlignment(SQLModel, table=True): # type: ignore
229+
movieId: int = Field(foreign_key="Movie.movieId", primary_key=True)
230+
tomogramId: int = Field(foreign_key="Tomogram.tomogramId", primary_key=True)
231+
defocusU: Optional[float] = None
232+
defocusV: Optional[float] = None
233+
psdFile: Optional[str] = None
234+
resolution: Optional[float] = None
235+
fitQuality: Optional[float] = None
236+
refinedMagnification: Optional[float] = None
237+
refinedTiltAngle: Optional[float] = None
238+
refinedTiltAxis: Optional[float] = None
239+
residualError: Optional[float] = None
240+
Movie: Optional["Movie"] = Relationship(back_populates="TiltImageAlignment")
241+
Tomogram: Optional["Tomogram"] = Relationship(back_populates="TiltImageAlignment")
242+
243+
244+
class ParticleClassificationGroup(SQLModel, table=True): # type: ignore
245+
particleClassificationGroupId: int = Field(primary_key=True, unique=True)
246+
particlePickerId: Optional[int] = Field(
247+
foreign_key="ParticlePicker.particlePickerId"
248+
)
249+
programId: Optional[int] = Field(foreign_key="AutoProcProgram.autoProcProgramId")
250+
type: Optional[str] = Enum("2D", "3D")
251+
batchNumber: Optional[int] = None
252+
numberOfParticlesPerBatch: Optional[int] = None
253+
numberOfClassesPerBatch: Optional[int] = None
254+
symmetry: Optional[str] = None
255+
binnedPixelSize: Optional[float] = None
256+
ParticlePicker: Optional["ParticlePicker"] = Relationship(
257+
back_populates="ParticleClassificationGroup"
258+
)
259+
AutoProcProgram: Optional["AutoProcProgram"] = Relationship(
260+
back_populates="ParticleClassificationGroup"
261+
)
262+
ParticleClassification: List["ParticleClassification"] = Relationship(
263+
back_populates="ParticleClassificationGroup"
264+
)
265+
266+
267+
class ParticleClassification(SQLModel, table=True): # type: ignore
268+
particleClassificationId: int = Field(primary_key=True, unique=True)
269+
classNumber: Optional[int] = None
270+
classImageFullPath: Optional[str] = None
271+
particlesPerClass: Optional[int] = None
272+
rotationAccuracy: Optional[float] = None
273+
translationAccuracy: Optional[float] = None
274+
estimatedResolution: Optional[float] = None
275+
overallFourierCompleteness: Optional[float] = None
276+
particleClassificationGroupId: Optional[int] = Field(
277+
foreign_key="ParticleClassificationGroup.particleClassificationGroupId"
278+
)
279+
classDistribution: Optional[float] = None
280+
selected: Optional[int] = None
281+
bFactorFitIntercept: Optional[float] = None
282+
bFactorFitLinear: Optional[float] = None
283+
bFactorFitQuadratic: Optional[float] = None
284+
angularEfficiency: Optional[float] = None
285+
suggestedTilt: Optional[float] = None
286+
CryoemInitialModel: List["CryoemInitialModel"] = Relationship(
287+
back_populates="ParticleClassification"
288+
)
289+
ParticleClassificationGroup: Optional["ParticleClassificationGroup"] = Relationship(
290+
back_populates="ParticleClassification"
291+
)
292+
BFactorFit: List["BFactorFit"] = Relationship(
293+
back_populates="ParticleClassification"
294+
)
295+
296+
297+
class BFactorFit(SQLModel, table=True): # type: ignore
298+
bFactorFitId: int = Field(primary_key=True, unique=True)
299+
particleClassificationId: int = Field(
300+
foreign_key="ParticleClassification.particleClassificationId"
301+
)
302+
resolution: Optional[float] = None
303+
numberOfParticles: Optional[int] = None
304+
particleBatchSize: Optional[int] = None
305+
ParticleClassification: Optional["ParticleClassification"] = Relationship(
306+
back_populates="BFactorFit"
307+
)
308+
309+
310+
class CryoemInitialModel(SQLModel, table=True): # type: ignore
311+
cryoemInitialModelId: int = Field(primary_key=True, unique=True)
312+
resolution: Optional[float] = None
313+
numberOfParticles: Optional[int] = None
314+
ParticleClassification: List["ParticleClassification"] = Relationship(
315+
back_populates="CryoemInitialModel"
316+
)

0 commit comments

Comments
 (0)