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

1from marshmallow import Schema, fields, validate 

2 

3from daiquiri.core.schema.validators import ValidatedRegexp, OneOf 

4 

5 

6# Helper to paginate a schema 

7def paginated(schema): 

8 class PaginatedSchema(Schema): 

9 total = fields.Int() 

10 rows = fields.Nested(schema, many=True) 

11 

12 cls_name = f"Paginated<{schema.__name__}>" 

13 PaginatedSchema.__name__ = cls_name 

14 PaginatedSchema.__qualname__ = cls_name 

15 

16 return PaginatedSchema 

17 

18 

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() 

30 

31 

32class UserCacheSchema(Schema): 

33 cache = fields.Dict() 

34 

35 

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() 

43 

44 

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() 

55 

56 class Meta: 

57 datetimeformat = "%d-%m-%Y %H:%M" 

58 

59 

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 ) 

79 

80 class Meta: 

81 uiorder = ["name", "acronym", "molecularmass", "density", "sequence"] 

82 

83 

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() 

93 

94 

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 ) 

114 

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 } 

130 

131 

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 ) 

145 

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 } 

157 

158 

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()) 

176 

177 

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 ) 

188 

189 

190class SampleTags(Schema): 

191 tags = fields.List(fields.Str()) 

192 

193 

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()) 

202 

203 

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() 

211 

212 

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) 

219 

220 

221class SampleActionPositionSchema(NewSampleActionPositionSchema): 

222 sampleactionpositionid = fields.Int() 

223 

224 

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() 

232 

233 

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() 

250 

251 # Paths 

252 filetemplate = fields.Str() 

253 imagedirectory = fields.Str() 

254 

255 # DC Params 

256 exposuretime = fields.Float() 

257 wavelength = fields.Float() 

258 transmission = fields.Float() 

259 numberofimages = fields.Float() 

260 numberofpasses = fields.Int() 

261 

262 # Beam position and size 

263 xbeam = fields.Float() 

264 ybeam = fields.Float() 

265 beamsizeatsamplex = fields.Float() 

266 beamsizeatsampley = fields.Float() 

267 

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() 

276 

277 # Snapshots 

278 snapshots = fields.Dict(keys=fields.Str(), values=fields.Bool()) 

279 

280 comments = fields.Str(metadata={"title": "Comments"}) 

281 

282 class Meta: 

283 datetimeformat = "%d-%m-%Y %H:%M:%S" 

284 

285 

286class DataCollectionAttachmentSchema(Schema): 

287 datacollectionfileattachmentid = fields.Int() 

288 dataCollectionid = fields.Int() 

289 filename = fields.Str() 

290 filetype = fields.Str() 

291 

292 

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) 

300 

301 

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() 

316 

317 

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()) 

323 

324 

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) 

332 

333 

334class XRFMapHistogramSchema(Schema): 

335 bins = fields.List(fields.Float()) 

336 hist = fields.List(fields.Float()) 

337 width = fields.List(fields.Float()) 

338 

339 

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() 

364 

365 points = fields.Int(metadata={"description": "Number of completed points"}) 

366 

367 opacity = fields.Float() 

368 min = fields.Float() 

369 max = fields.Float() 

370 colourmap = fields.String() 

371 scale = fields.String() 

372 autoscale = fields.Bool() 

373 

374 url = fields.Str() 

375 

376 

377class XRFMapHistogramSchema(Schema): 

378 mapid = fields.Int() 

379 histogram = fields.Nested( 

380 XRFMapHistogramSchema, metadata={"description": "Histogram of the map points"} 

381 ) 

382 

383 

384class XRFMapValueSchema(Schema): 

385 mapid = fields.Int() 

386 x = fields.Int() 

387 y = fields.Int() 

388 value = fields.Float() 

389 

390 

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() 

402 

403 

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() 

415 

416 url = fields.Str() 

417 

418 

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 ) 

444 

445 class Meta: 

446 uiorder = ["element", "edge", "start", "end", "sampleid"] 

447 uischema = {"sampleid": {"classNames": "hidden-row", "ui:widget": "hidden"}} 

448 

449 

450class XRFMapROISchema(NewXRFMapROISchema): 

451 maproiid = fields.Int() 

452 maps = fields.Int() 

453 

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 } 

461 

462 

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() 

476 

477 

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() 

485 

486 

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()