Coverage for /opt/conda/envs/apienv/lib/python3.10/site-packages/daiquiri/core/schema/metadata.py: 100%
294 statements
« prev ^ index » next coverage.py v7.6.10, created at 2025-02-06 02:13 +0000
« prev ^ index » next coverage.py v7.6.10, created at 2025-02-06 02:13 +0000
1from marshmallow import Schema, fields, validate
3from daiquiri.core.schema.validators import ValidatedRegexp, OneOf
6# Helper to paginate a schema
7def paginated(schema):
8 class PaginatedSchema(Schema):
9 total = fields.Int()
10 rows = fields.Nested(schema, many=True)
12 cls_name = f"Paginated<{schema.__name__}>"
13 PaginatedSchema.__name__ = cls_name
14 PaginatedSchema.__qualname__ = cls_name
16 return PaginatedSchema
19# Users
20class UserSchema(Schema):
21 user = fields.Str()
22 personid = fields.Int()
23 login = fields.Str()
24 permissions = fields.List(fields.Str())
25 groups = fields.List(fields.Str())
26 fullname = fields.Str()
27 givenname = fields.Str()
28 familyname = fields.Str()
29 is_staff = fields.Bool()
32class UserCacheSchema(Schema):
33 cache = fields.Dict()
36# Proposals
37class ProposalSchema(Schema):
38 proposalid = fields.Int()
39 proposal = fields.Str()
40 start = fields.DateTime()
41 title = fields.Str()
42 visits = fields.Int()
45# Visits
46class SessionSchema(Schema):
47 blsessionid = fields.Int()
48 proposalid = fields.Int()
49 session = fields.Str()
50 startdate = fields.DateTime()
51 enddate = fields.DateTime()
52 proposal = fields.Str()
53 beamlinename = fields.Str()
54 active = fields.Bool()
56 class Meta:
57 datetimeformat = "%d-%m-%Y %H:%M"
60# Components
61class NewComponentSchema(Schema):
62 name = ValidatedRegexp(
63 "word-dash-space",
64 metadata={"title": "Name"},
65 validate=validate.Length(max=255),
66 required=True,
67 )
68 acronym = ValidatedRegexp(
69 "word-dash",
70 metadata={"title": "Acronym"},
71 validate=validate.Length(max=45),
72 required=True,
73 )
74 molecularmass = fields.Float(metadata={"title": "Mass", "unit": "Da"})
75 density = fields.Float(metadata={"title": "Density", "unit": "kg/m3"})
76 sequence = ValidatedRegexp(
77 "smiles", metadata={"title": "SMILES", "description": "Chemical composition"}
78 )
80 class Meta:
81 uiorder = ["name", "acronym", "molecularmass", "density", "sequence"]
84class ComponentSchema(NewComponentSchema):
85 componentid = fields.Int()
86 name = ValidatedRegexp("word-dash-space", metadata={"title": "Name"})
87 acronym = ValidatedRegexp(
88 "word-dash",
89 metadata={"title": "Acronym", "description": "A short name for the component"},
90 )
91 samples = fields.Int()
92 datacollections = fields.Int()
95# Samples
96class NewSampleSchema(Schema):
97 name = ValidatedRegexp(
98 "word-dash",
99 metadata={"title": "Name"},
100 validate=validate.Length(max=100),
101 required=True,
102 )
103 # FIXME: Name length is not consistent with the size found in ispyb (100)
104 offsetx = fields.Int(metadata={"title": "X Offset"}, dump_default=0)
105 offsety = fields.Int(metadata={"title": "Y Offset"}, dump_default=0)
106 positions = fields.Dict(keys=fields.Str(), values=fields.Float())
107 componentid = fields.Int(metadata={"title": "Component"})
108 comments = ValidatedRegexp(
109 "word-special",
110 metadata={"title": "Comments"},
111 validate=validate.Length(max=1024),
112 allow_none=True,
113 )
115 class Meta:
116 uiorder = ["componentid", "name", "offsetx", "offsety", "comments", "positions"]
117 uischema = {
118 "positions": {"classNames": "hidden-row", "ui:widget": "hidden"},
119 "offsetx": {"classNames": "hidden-row", "ui:widget": "hidden"},
120 "offsety": {"classNames": "hidden-row", "ui:widget": "hidden"},
121 "componentid": {
122 "ui:widget": "connectedSelect",
123 "ui:options": {
124 "selector": "components",
125 "key": "acronym",
126 "value": "componentid",
127 },
128 },
129 }
132class SampleSchema(NewSampleSchema):
133 name = ValidatedRegexp("word-dash", metadata={"title": "Name"})
134 offsetx = fields.Int(metadata={"title": "X Offset"})
135 offsety = fields.Int(metadata={"title": "Y Offset"})
136 sampleid = fields.Int()
137 component = fields.Str()
138 subsamples = fields.Int()
139 datacollections = fields.Int()
140 queued = fields.Bool()
141 extrametadata = fields.Dict(
142 keys=ValidatedRegexp("word-dash"),
143 metadata={"title": "Metadata", "propertyNames": {"pattern": "^[A-z0-9-]+$"}},
144 )
146 class Meta:
147 uischema = {
148 "componentid": {
149 "ui:widget": "connectedSelect",
150 "ui:options": {
151 "selector": "components",
152 "key": "acronym",
153 "value": "componentid",
154 },
155 },
156 }
159class NewSubSampleSchema(Schema):
160 sampleid = fields.Int(required=True)
161 name = ValidatedRegexp("word-dash-space", metadata={"title": "Name"})
162 type = OneOf(["roi", "poi", "loi"], metadata={"title": "Type"})
163 source = OneOf(
164 ["manual", "auto", "reference"],
165 metadata={"title": "Source"},
166 dump_default="manual",
167 )
168 comments = ValidatedRegexp(
169 "word-special", metadata={"title": "Comments"}, allow_none=True
170 )
171 x = fields.Int()
172 y = fields.Int()
173 x2 = fields.Int()
174 y2 = fields.Int()
175 positions = fields.Dict(keys=fields.Str(), values=fields.Float())
178class SubSampleSchema(NewSubSampleSchema):
179 sampleid = fields.Int()
180 sample = fields.Str()
181 subsampleid = fields.Int()
182 datacollections = fields.Int()
183 queued = fields.Bool()
184 extrametadata = fields.Dict(
185 keys=ValidatedRegexp("word-dash"),
186 metadata={"title": "Metadata", "propertyNames": {"pattern": "^[A-z0-9-]+$"}},
187 )
190class SampleTags(Schema):
191 tags = fields.List(fields.Str())
194class NewSampleImageSchema(Schema):
195 sampleid = fields.Int(required=True)
196 offsetx = fields.Int()
197 offsety = fields.Int()
198 scalex = fields.Float()
199 scaley = fields.Float()
200 rotation = fields.Float()
201 positions = fields.Dict(keys=fields.Str(), values=fields.Float())
204class SampleImageSchema(NewSampleImageSchema):
205 sampleimageid = fields.Int()
206 sampleid = fields.Int()
207 url = fields.Str()
208 positions = fields.Dict(keys=fields.Str(), values=fields.Float())
209 width = fields.Int()
210 height = fields.Int()
213class NewSampleActionPositionSchema(Schema):
214 sampleactionid = fields.Int(required=True)
215 posx = fields.Int(required=True)
216 posy = fields.Int(required=True)
217 type = OneOf(["reference", "real"], required=True)
218 id = fields.Int(required=True)
221class SampleActionPositionSchema(NewSampleActionPositionSchema):
222 sampleactionpositionid = fields.Int()
225class SampleActionSchema(Schema):
226 sampleactionid = fields.Int()
227 actiontype = fields.Str()
228 status = fields.Str()
229 message = fields.Str()
230 positions = fields.List(fields.Nested(SampleActionPositionSchema))
231 has_result = fields.Bool()
234# Datacollections
235class DataCollectionSchema(Schema):
236 sessionid = fields.Int()
237 datacollections = fields.Int()
238 datacollectionid = fields.Int(required=True)
239 datacollectiongroupid = fields.Int()
240 sampleid = fields.Int()
241 sample = fields.Str()
242 subsampleid = fields.Int()
243 starttime = fields.DateTime()
244 datacollectionplanid = fields.Int()
245 endtime = fields.DateTime()
246 duration = fields.Int()
247 experimenttype = fields.Str()
248 datacollectionnumber = fields.Int()
249 runstatus = fields.Str()
251 # Paths
252 filetemplate = fields.Str()
253 imagedirectory = fields.Str()
255 # DC Params
256 exposuretime = fields.Float()
257 wavelength = fields.Float()
258 transmission = fields.Float()
259 numberofimages = fields.Float()
260 numberofpasses = fields.Int()
262 # Beam position and size
263 xbeam = fields.Float()
264 ybeam = fields.Float()
265 beamsizeatsamplex = fields.Float()
266 beamsizeatsampley = fields.Float()
268 # Gridinfo columns
269 steps_x = fields.Int()
270 steps_y = fields.Int()
271 dx_mm = fields.Float()
272 dy_mm = fields.Float()
273 patchesx = fields.Int()
274 patchesy = fields.Int()
275 snaked = fields.Int()
277 # Snapshots
278 snapshots = fields.Dict(keys=fields.Str(), values=fields.Bool())
280 comments = fields.Str(metadata={"title": "Comments"})
282 class Meta:
283 datetimeformat = "%d-%m-%Y %H:%M:%S"
286class DataCollectionAttachmentSchema(Schema):
287 datacollectionfileattachmentid = fields.Int()
288 dataCollectionid = fields.Int()
289 filename = fields.Str()
290 filetype = fields.Str()
293class NewDataCollectionPlanSchema(Schema):
294 sampleid = fields.Int(required=True)
295 experimentkind = fields.Str()
296 energy = fields.Float()
297 exposuretime = fields.Float()
298 planorder = fields.Int()
299 scanparameters = fields.Dict(required=True)
302class DataCollectionPlanSchema(NewDataCollectionPlanSchema):
303 datacollectionplanid = fields.Int()
304 timestamp = fields.DateTime()
305 sampleid = fields.Int()
306 subsampleid = fields.Int()
307 sample = fields.Str()
308 component = fields.Str()
309 subsampleid = fields.Int()
310 datacollectionid = fields.Int()
311 containerqueuesampleid = fields.Int()
312 queued = fields.Bool()
313 status = fields.Str()
314 linked = fields.Bool()
315 scanparameters = fields.Dict()
318class ScanQualityIndicatorsSchema(Schema):
319 point = fields.List(fields.Int(), metadata={"description": "Scan point"})
320 total = fields.List(fields.Float(), metadata={"description": "Total signal"})
321 spots = fields.List(fields.Int(), metadata={"description": "Number of spots"})
322 autoprocprogramid = fields.List(fields.Int())
325# XRF Maps
326class NewXRFMapSchema(Schema):
327 maproiid = fields.Int(required=True, metadata={"description": "The roiid"})
328 subsampleid = fields.Int(
329 required=True, metadata={"description": "Object this map relates to"}
330 )
331 datacollectionid = fields.Int(required=True)
334class XRFMapHistogramSchema(Schema):
335 bins = fields.List(fields.Float())
336 hist = fields.List(fields.Float())
337 width = fields.List(fields.Float())
340class XRFMapSchema(NewXRFMapSchema):
341 maproiid = fields.Int(metadata={"description": "The roiid"})
342 subsampleid = fields.Int(metadata={"description": "Object this map relates to"})
343 datacollectionid = fields.Int()
344 datacollectiongroupid = fields.Int()
345 datacollectionnumber = fields.Int()
346 mapid = fields.Int(metadata={"description": "The id of the map"})
347 sampleid = fields.Int()
348 w = fields.Int(metadata={"description": "Width of the map"})
349 h = fields.Int(metadata={"description": "Height of the map"})
350 snaked = fields.Bool(
351 metadata={
352 "description": "Whether the map is collected interleaved left to right"
353 }
354 )
355 orientation = fields.Str(
356 metadata={
357 "description": "Wehther the map is collected horizontally or vertically"
358 }
359 )
360 element = fields.Str()
361 edge = fields.Str()
362 scalar = fields.Str()
363 composites = fields.Int()
365 points = fields.Int(metadata={"description": "Number of completed points"})
367 opacity = fields.Float()
368 min = fields.Float()
369 max = fields.Float()
370 colourmap = fields.String()
371 scale = fields.String()
372 autoscale = fields.Bool()
374 url = fields.Str()
377class XRFMapHistogramSchema(Schema):
378 mapid = fields.Int()
379 histogram = fields.Nested(
380 XRFMapHistogramSchema, metadata={"description": "Histogram of the map points"}
381 )
384class XRFMapValueSchema(Schema):
385 mapid = fields.Int()
386 x = fields.Int()
387 y = fields.Int()
388 value = fields.Float()
391# XRF Composite Maps
392class NewXRFCompositeMapSchema(Schema):
393 subsampleid = fields.Int(
394 required=True, metadata={"description": "Object this map relates to"}
395 )
396 r = fields.Int(required=True)
397 g = fields.Int(required=True)
398 b = fields.Int(required=True)
399 ropacity = fields.Float()
400 gopacity = fields.Float()
401 bopacity = fields.Float()
404class XRFCompositeMapSchema(NewXRFCompositeMapSchema):
405 compositeid = fields.Int(metadata={"description": "The id of the composite map"})
406 subsampleid = fields.Int()
407 sampleid = fields.Int()
408 opacity = fields.Float()
409 r = fields.Int()
410 g = fields.Int()
411 b = fields.Int()
412 rroi = fields.Str()
413 groi = fields.Str()
414 broi = fields.Str()
416 url = fields.Str()
419# XRF Map ROIs
420class NewXRFMapROISchema(Schema):
421 sampleid = fields.Int(
422 required=True, metadata={"title": "Sample ROI is associated to"}
423 )
424 element = ValidatedRegexp(
425 "word-dash",
426 required=True,
427 metadata={"title": "Element"},
428 validate=validate.Length(max=2),
429 )
430 edge = ValidatedRegexp(
431 "word-dash",
432 required=True,
433 metadata={"title": "Edge"},
434 validate=validate.Length(max=3),
435 )
436 start = fields.Float(
437 required=True,
438 metadata={"title": "Start", "description": "Start Energy of ROI", "unit": "eV"},
439 )
440 end = fields.Float(
441 required=True,
442 metadata={"title": "End", "description": "End Energy of ROI", "unit": "eV"},
443 )
445 class Meta:
446 uiorder = ["element", "edge", "start", "end", "sampleid"]
447 uischema = {"sampleid": {"classNames": "hidden-row", "ui:widget": "hidden"}}
450class XRFMapROISchema(NewXRFMapROISchema):
451 maproiid = fields.Int()
452 maps = fields.Int()
454 class Meta:
455 uiorder = ["maproiid", "element", "edge", "start", "end", "maps", "sampleid"]
456 uischema = {
457 "maproiid": {"classNames": "hidden-row", "ui:widget": "hidden"},
458 "maps": {"classNames": "hidden-row", "ui:widget": "hidden"},
459 "sampleid": {"classNames": "hidden-row", "ui:widget": "hidden"},
460 }
463# Auto Processing
464class AutoProcProgramSchema(Schema):
465 autoprocprogramid = fields.Int(required=True)
466 datacollectionid = fields.Int()
467 status = fields.Int()
468 message = fields.Str()
469 starttime = fields.DateTime()
470 endtime = fields.DateTime()
471 duration = fields.Int()
472 programs = fields.Str()
473 automatic = fields.Int()
474 warnings = fields.Int()
475 errors = fields.Int()
478class AutoProcProgramAttachmentSchema(Schema):
479 autoprocprogramattachmentid = fields.Int(required=True)
480 autoprocprogramid = fields.Int(required=True)
481 filetype = fields.Str()
482 filename = fields.Str()
483 filepath = fields.Str()
484 rank = fields.Int()
487class AutoProcProgramMessageSchema(Schema):
488 autoprocprogrammessageid = fields.Int(required=True)
489 autoprocprogramid = fields.Int(required=True)
490 timestamp = fields.DateTime()
491 severity = fields.Str()
492 message = fields.Str()
493 description = fields.Str()