levalencia commited on
Commit
c1ae600
·
1 Parent(s): f98e92f

feat: enhance field and unique indices descriptions handling in app and agents

Browse files

- Updated app.py to replace YAML text area with a table format for field descriptions, allowing users to input detailed information for each field.
- Enhanced FieldMapperAgent to incorporate field descriptions into extraction prompts, improving context for data extraction.
- Modified UniqueIndicesCombinator to format unique indices descriptions with additional details such as format, examples, and possible values.
- Updated Planner and Executor to include field descriptions in execution plans, ensuring comprehensive context during processing.

logs/di_content/di_content_20250617_105150_tables.html ADDED
@@ -0,0 +1,675 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Azure DI Tables</title>
5
+ <style>
6
+ body { font-family: Arial, sans-serif; margin: 20px; }
7
+ .table-container { margin-bottom: 40px; }
8
+ h2 { color: #333; }
9
+ table { border-collapse: collapse; width: 100%; margin-bottom: 10px; }
10
+ th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
11
+ th { background-color: #f5f5f5; }
12
+ hr { border: none; border-top: 2px solid #ccc; margin: 20px 0; }
13
+ </style>
14
+ </head>
15
+ <body>
16
+ <h1>Azure Document Intelligence Tables</h1>
17
+
18
+ <div class="table-container">
19
+ <h2>Table 1</h2>
20
+ <table border="1">
21
+ <tr>
22
+ <td>Sales quote:</td>
23
+ <td>SQ20202722</td>
24
+ </tr>
25
+ <tr>
26
+ <td>Project code:</td>
27
+ <td>P3016</td>
28
+ </tr>
29
+ <tr>
30
+ <td>LNB number:</td>
31
+ <td>2023.040</td>
32
+ </tr>
33
+ <tr>
34
+ <td>Project responsible:</td>
35
+ <td>Nathan Cardon</td>
36
+ </tr>
37
+ <tr>
38
+ <td>Report name:</td>
39
+ <td>P3016_R010_v01</td>
40
+ </tr>
41
+ </table>
42
+ <hr>
43
+ </div>
44
+
45
+ <div class="table-container">
46
+ <h2>Table 2</h2>
47
+ <table border="1">
48
+ <tr>
49
+ <td>Construct</td>
50
+ <td>Stress condition</td>
51
+ <td>Concentration (mg/mL)</td>
52
+ </tr>
53
+ <tr>
54
+ <td>P018_3D6 VHO VL6 _hIgG1_LALAPG_F405L- FJB_2024-04-18_002</td>
55
+ <td>T0W</td>
56
+ <td>1.00</td>
57
+ </tr>
58
+ <tr>
59
+ <td>P018_3D6 VHO VL6 _hIgG1_LALAPG_F405L- FJB_2024-04-18_002</td>
60
+ <td>T2W_37℃</td>
61
+ <td>1.00</td>
62
+ </tr>
63
+ <tr>
64
+ <td>P018_3D6 VHO VL6 _hIgG1_LALAPG_F405L- FJB_2024-04-18_002</td>
65
+ <td>T4W_37℃</td>
66
+ <td>1.00</td>
67
+ </tr>
68
+ </table>
69
+ <hr>
70
+ </div>
71
+
72
+ <div class="table-container">
73
+ <h2>Table 3</h2>
74
+ <table border="1">
75
+ <tr>
76
+ <td>Blue:</td>
77
+ <td>VH and VL</td>
78
+ </tr>
79
+ <tr>
80
+ <td>Blue:</td>
81
+ <td>CDR</td>
82
+ </tr>
83
+ <tr>
84
+ <td>Green:</td>
85
+ <td>N-glycosylation site</td>
86
+ </tr>
87
+ </table>
88
+ <hr>
89
+ </div>
90
+
91
+ <div class="table-container">
92
+ <h2>Table 4</h2>
93
+ <table border="1">
94
+ <tr>
95
+ <td>Relative quantification by EIC (%)</td>
96
+ <td>Relative quantification by EIC (%)</td>
97
+ <td>Relative quantification by EIC (%)</td>
98
+ <td>Relative quantification by EIC (%)</td>
99
+ <td>Relative quantification by EIC (%)</td>
100
+ <td>Relative quantification by EIC (%)</td>
101
+ </tr>
102
+ <tr>
103
+ <td>AA Sequence</td>
104
+ <td>Seq Loc</td>
105
+ <td>Modification</td>
106
+ <td>T0</td>
107
+ <td>T2W_37℃</td>
108
+ <td>T4W_37℃</td>
109
+ </tr>
110
+ <tr>
111
+ <td>EVQLLESGGGLVQPGGSLR</td>
112
+ <td>HC(1-19)</td>
113
+ <td></td>
114
+ <td>99.0</td>
115
+ <td>96.1</td>
116
+ <td>93.0</td>
117
+ </tr>
118
+ <tr>
119
+ <td>EVQLLESGGGLVQPGGSLR</td>
120
+ <td>HC(1-19)</td>
121
+ <td>PyroE</td>
122
+ <td>1.0</td>
123
+ <td>3.9</td>
124
+ <td>7.0</td>
125
+ </tr>
126
+ </table>
127
+ <hr>
128
+ </div>
129
+
130
+ <div class="table-container">
131
+ <h2>Table 5</h2>
132
+ <table border="1">
133
+ <tr>
134
+ <td>Relative quantification by EIC (%)</td>
135
+ <td>Relative quantification by EIC (%)</td>
136
+ <td>Relative quantification by EIC (%)</td>
137
+ <td>Relative quantification by EIC (%)</td>
138
+ <td>Relative quantification by EIC (%)</td>
139
+ <td>Relative quantification by EIC (%)</td>
140
+ </tr>
141
+ <tr>
142
+ <td>AA Sequence</td>
143
+ <td>Seq Loc</td>
144
+ <td>Modification</td>
145
+ <td>T0</td>
146
+ <td>T2W_37℃</td>
147
+ <td>T4W_37℃</td>
148
+ </tr>
149
+ <tr>
150
+ <td>AEDTAVYYCAKPLYSNLAGDFGS WGQGTTVTVSSASTK</td>
151
+ <td>HC(88-125)</td>
152
+ <td></td>
153
+ <td>99.9</td>
154
+ <td>99.7</td>
155
+ <td>99.5</td>
156
+ </tr>
157
+ <tr>
158
+ <td>AEDTAVYYCAKPLYSNLAGDFGS WGQGTTVTVSSASTK</td>
159
+ <td>HC(88-125)</td>
160
+ <td>Isomerization</td>
161
+ <td>0.1</td>
162
+ <td>0.3</td>
163
+ <td>0.5</td>
164
+ </tr>
165
+ </table>
166
+ <hr>
167
+ </div>
168
+
169
+ <div class="table-container">
170
+ <h2>Table 6</h2>
171
+ <table border="1">
172
+ <tr>
173
+ <td>Relative quantification by EIC (%)</td>
174
+ <td>Relative quantification by EIC (%)</td>
175
+ <td>Relative quantification by EIC (%)</td>
176
+ <td>Relative quantification by EIC (%)</td>
177
+ <td>Relative quantification by EIC (%)</td>
178
+ <td>Relative quantification by EIC (%)</td>
179
+ </tr>
180
+ <tr>
181
+ <td>AA Sequence</td>
182
+ <td>Seq Loc</td>
183
+ <td>Modification</td>
184
+ <td>T0</td>
185
+ <td>T2W_37℃</td>
186
+ <td>T4W_37℃</td>
187
+ </tr>
188
+ <tr>
189
+ <td>NTLYLQMNSLR</td>
190
+ <td>HC(77-87)</td>
191
+ <td></td>
192
+ <td>99.5</td>
193
+ <td>99.5</td>
194
+ <td>99.5</td>
195
+ </tr>
196
+ <tr>
197
+ <td>NTLYLQMNSLR</td>
198
+ <td>HC(77-87)</td>
199
+ <td>Oxidation</td>
200
+ <td>0.5</td>
201
+ <td>0.5</td>
202
+ <td>0.5</td>
203
+ </tr>
204
+ <tr>
205
+ <td>DIQMTQSPSSLSASVGDR</td>
206
+ <td>LC(1-18)</td>
207
+ <td></td>
208
+ <td>99.5</td>
209
+ <td>99.5</td>
210
+ <td>99.5</td>
211
+ </tr>
212
+ <tr>
213
+ <td>DIQMTQSPSSLSASVGDR</td>
214
+ <td>LC(1-18)</td>
215
+ <td>Oxidation</td>
216
+ <td>0.5</td>
217
+ <td>0.5</td>
218
+ <td>0.5</td>
219
+ </tr>
220
+ </table>
221
+ <hr>
222
+ </div>
223
+
224
+ <div class="table-container">
225
+ <h2>Table 7</h2>
226
+ <table border="1">
227
+ <tr>
228
+ <td>Relative quantification by EIC (%)</td>
229
+ <td>Relative quantification by EIC (%)</td>
230
+ <td>Relative quantification by EIC (%)</td>
231
+ <td>Relative quantification by EIC (%)</td>
232
+ <td>Relative quantification by EIC (%)</td>
233
+ <td>Relative quantification by EIC (%)</td>
234
+ </tr>
235
+ <tr>
236
+ <td>AA Sequence</td>
237
+ <td>Seq Loc</td>
238
+ <td>Modification</td>
239
+ <td>T0</td>
240
+ <td>T2W_37℃</td>
241
+ <td>T4W_37℃</td>
242
+ </tr>
243
+ <tr>
244
+ <td>EVQLLESGGGLVQPGGSLR</td>
245
+ <td>HC(1-19)</td>
246
+ <td></td>
247
+ <td>99.6</td>
248
+ <td>99.6</td>
249
+ <td>99.5</td>
250
+ </tr>
251
+ <tr>
252
+ <td>EVQLLESGGGLVQPGGSLR</td>
253
+ <td>HC(1-19)</td>
254
+ <td>Deamidation</td>
255
+ <td>0.4</td>
256
+ <td>0.4</td>
257
+ <td>0.5</td>
258
+ </tr>
259
+ <tr>
260
+ <td>NTLYLQMNSLR*</td>
261
+ <td>HC(77-87)</td>
262
+ <td></td>
263
+ <td>99.0</td>
264
+ <td>98.8</td>
265
+ <td>98.6</td>
266
+ </tr>
267
+ <tr>
268
+ <td>NTLYLQMNSLR*</td>
269
+ <td>HC(77-87)</td>
270
+ <td>Deamidation</td>
271
+ <td>1.0</td>
272
+ <td>1.2</td>
273
+ <td>1.4</td>
274
+ </tr>
275
+ <tr>
276
+ <td>AEDTAVYYCAKPLYSNLAGDFGS WGQGTTVTVSSASTK</td>
277
+ <td>HC(88-125)</td>
278
+ <td></td>
279
+ <td>98.7</td>
280
+ <td>96.1</td>
281
+ <td>93.4</td>
282
+ </tr>
283
+ <tr>
284
+ <td>AEDTAVYYCAKPLYSNLAGDFGS WGQGTTVTVSSASTK</td>
285
+ <td>HC(88-125)</td>
286
+ <td>Deamidation</td>
287
+ <td>1.3</td>
288
+ <td>3.9</td>
289
+ <td>6.6</td>
290
+ </tr>
291
+ <tr>
292
+ <td>VTITCQASQSISSYLAWYQQKPGK</td>
293
+ <td>LC(19-42)</td>
294
+ <td></td>
295
+ <td>99.9</td>
296
+ <td>99.8</td>
297
+ <td>99.5</td>
298
+ </tr>
299
+ <tr>
300
+ <td>VTITCQASQSISSYLAWYQQKPGK</td>
301
+ <td>LC(19-42)</td>
302
+ <td>Deamidation</td>
303
+ <td>0.1</td>
304
+ <td>0.2</td>
305
+ <td>0.5</td>
306
+ </tr>
307
+ </table>
308
+ <hr>
309
+ </div>
310
+
311
+ <div class="table-container">
312
+ <h2>Table 8</h2>
313
+ <table border="1">
314
+ <tr>
315
+ <td>b --- 1</td>
316
+ <td></td>
317
+ <td></td>
318
+ <td>y</td>
319
+ </tr>
320
+ <tr>
321
+ <td>b --- 1</td>
322
+ <td>N(+0.984016)</td>
323
+ <td>11</td>
324
+ <td>---</td>
325
+ </tr>
326
+ <tr>
327
+ <td>217.0819 2</td>
328
+ <td>T</td>
329
+ <td>10</td>
330
+ <td>1238.6562</td>
331
+ </tr>
332
+ <tr>
333
+ <td>330.1660 3</td>
334
+ <td>L</td>
335
+ <td>9</td>
336
+ <td>1137.6085</td>
337
+ </tr>
338
+ <tr>
339
+ <td>493.2293 4</td>
340
+ <td>Y</td>
341
+ <td>8</td>
342
+ <td>1024.5244</td>
343
+ </tr>
344
+ <tr>
345
+ <td>606.3134 5</td>
346
+ <td>L</td>
347
+ <td>7</td>
348
+ <td>861.4611</td>
349
+ </tr>
350
+ <tr>
351
+ <td>734.3719 6</td>
352
+ <td>Q</td>
353
+ <td>6</td>
354
+ <td>748.3770</td>
355
+ </tr>
356
+ <tr>
357
+ <td>865.4124 7</td>
358
+ <td>M</td>
359
+ <td>5</td>
360
+ <td>620.3185</td>
361
+ </tr>
362
+ <tr>
363
+ <td>979.4553 8</td>
364
+ <td>N</td>
365
+ <td>4</td>
366
+ <td>489.2780</td>
367
+ </tr>
368
+ <tr>
369
+ <td>066.4874 9</td>
370
+ <td>S</td>
371
+ <td>3</td>
372
+ <td>375.2350</td>
373
+ </tr>
374
+ <tr>
375
+ <td>179.5714 10</td>
376
+ <td>L</td>
377
+ <td>2</td>
378
+ <td>288.2030</td>
379
+ </tr>
380
+ <tr>
381
+ <td>--- 11</td>
382
+ <td>R</td>
383
+ <td>1</td>
384
+ <td>175.1190</td>
385
+ </tr>
386
+ </table>
387
+ <hr>
388
+ </div>
389
+
390
+ <div class="table-container">
391
+ <h2>Table 9</h2>
392
+ <table border="1">
393
+ <tr>
394
+ <td>b</td>
395
+ <td>y</td>
396
+ <td>y</td>
397
+ <td>y</td>
398
+ </tr>
399
+ <tr>
400
+ <td>--- 1</td>
401
+ <td>N</td>
402
+ <td>11</td>
403
+ <td>---</td>
404
+ </tr>
405
+ <tr>
406
+ <td>216.0979 2</td>
407
+ <td>T</td>
408
+ <td>10</td>
409
+ <td>1239.6402</td>
410
+ </tr>
411
+ <tr>
412
+ <td>329.1819 3</td>
413
+ <td>L</td>
414
+ <td>9</td>
415
+ <td>1138.5925</td>
416
+ </tr>
417
+ <tr>
418
+ <td>492.2453 4</td>
419
+ <td>Y</td>
420
+ <td>8</td>
421
+ <td>1025.5084</td>
422
+ </tr>
423
+ <tr>
424
+ <td>605.3293 5</td>
425
+ <td>L</td>
426
+ <td>7</td>
427
+ <td>862.4451</td>
428
+ </tr>
429
+ <tr>
430
+ <td>733.3879 6</td>
431
+ <td>Q</td>
432
+ <td>6</td>
433
+ <td>749.3611</td>
434
+ </tr>
435
+ <tr>
436
+ <td>864.4284 7</td>
437
+ <td>M</td>
438
+ <td>5</td>
439
+ <td>621.3025</td>
440
+ </tr>
441
+ <tr>
442
+ <td>979.4553 8</td>
443
+ <td>N(+0.984016)</td>
444
+ <td>4</td>
445
+ <td>490.2620</td>
446
+ </tr>
447
+ <tr>
448
+ <td>1066.4874 9</td>
449
+ <td>S</td>
450
+ <td>3</td>
451
+ <td>375.2350</td>
452
+ </tr>
453
+ <tr>
454
+ <td>1179.5714 10</td>
455
+ <td>L</td>
456
+ <td>2</td>
457
+ <td>288.2030</td>
458
+ </tr>
459
+ <tr>
460
+ <td>--- 11</td>
461
+ <td>R</td>
462
+ <td>1</td>
463
+ <td>175.1190</td>
464
+ </tr>
465
+ </table>
466
+ <hr>
467
+ </div>
468
+
469
+ <div class="table-container">
470
+ <h2>Table 10</h2>
471
+ <table border="1">
472
+ <tr>
473
+ <td>Relative quantification by EIC (%)</td>
474
+ <td>Relative quantification by EIC (%)</td>
475
+ <td>Relative quantification by EIC (%)</td>
476
+ <td>Relative quantification by EIC (%)</td>
477
+ <td>Relative quantification by EIC (%)</td>
478
+ <td>Relative quantification by EIC (%)</td>
479
+ </tr>
480
+ <tr>
481
+ <td>AA Sequence</td>
482
+ <td>Seq Loc</td>
483
+ <td>Modification</td>
484
+ <td>T0</td>
485
+ <td>T2W_37℃</td>
486
+ <td>T4W_37℃</td>
487
+ </tr>
488
+ <tr>
489
+ <td>SCDK</td>
490
+ <td>HC(223-226)</td>
491
+ <td></td>
492
+ <td>99.8</td>
493
+ <td>99.5</td>
494
+ <td>98.8</td>
495
+ </tr>
496
+ <tr>
497
+ <td>SFNRGEC</td>
498
+ <td>LC(208-214)</td>
499
+ <td></td>
500
+ <td>99.8</td>
501
+ <td>99.5</td>
502
+ <td>98.8</td>
503
+ </tr>
504
+ <tr>
505
+ <td>SFNRGEC - SCDK</td>
506
+ <td>HC(223-226) + LC(208-214)</td>
507
+ <td>Thioether</td>
508
+ <td>0.2</td>
509
+ <td>0.5</td>
510
+ <td>1.2</td>
511
+ </tr>
512
+ </table>
513
+ <hr>
514
+ </div>
515
+
516
+ <div class="table-container">
517
+ <h2>Table 11</h2>
518
+ <table border="1">
519
+ <tr>
520
+ <td>Relative quantification by EIC (%)*</td>
521
+ <td>Relative quantification by EIC (%)*</td>
522
+ <td>Relative quantification by EIC (%)*</td>
523
+ <td>Relative quantification by EIC (%)*</td>
524
+ <td>Relative quantification by EIC (%)*</td>
525
+ <td>Relative quantification by EIC (%)*</td>
526
+ </tr>
527
+ <tr>
528
+ <td>AA Sequence</td>
529
+ <td>Seq Loc</td>
530
+ <td>Modification</td>
531
+ <td>T0</td>
532
+ <td>T2W_37℃</td>
533
+ <td>T4W_37℃</td>
534
+ </tr>
535
+ <tr>
536
+ <td>AEDTAVYYCAKPLYSNLAGDFGS WGQGTTVTVSSASTK</td>
537
+ <td>HC(88-125)</td>
538
+ <td></td>
539
+ <td>98.6</td>
540
+ <td>98.1</td>
541
+ <td>96.8</td>
542
+ </tr>
543
+ <tr>
544
+ <td>AEDTAVYYCAKPLYSN</td>
545
+ <td>HC(88-125)</td>
546
+ <td>Clipping</td>
547
+ <td>0.3</td>
548
+ <td>0.4</td>
549
+ <td>0.6</td>
550
+ </tr>
551
+ <tr>
552
+ <td>LAGDFGSWGQGTTVTVSSASTK</td>
553
+ <td>HC(88-125)</td>
554
+ <td>Clipping</td>
555
+ <td>1.1</td>
556
+ <td>1.5</td>
557
+ <td>2.6</td>
558
+ </tr>
559
+ <tr>
560
+ <td>STSGGTAALGCLVK</td>
561
+ <td>HC(138-151)</td>
562
+ <td></td>
563
+ <td>99.9</td>
564
+ <td>99.3</td>
565
+ <td>98.7</td>
566
+ </tr>
567
+ <tr>
568
+ <td>GGTAALGCLVK</td>
569
+ <td>HC(138-151)</td>
570
+ <td>Clipping</td>
571
+ <td>0.0</td>
572
+ <td>0.2</td>
573
+ <td>0.3</td>
574
+ </tr>
575
+ <tr>
576
+ <td>GTAALGCLVK</td>
577
+ <td>HC(138-151)</td>
578
+ <td>Clipping_2</td>
579
+ <td>0.1</td>
580
+ <td>0.5</td>
581
+ <td>0.9</td>
582
+ </tr>
583
+ <tr>
584
+ <td>SCDKTHTCPPCPAPEAAGGPSVFL FPPKPK</td>
585
+ <td>HC(223-252)</td>
586
+ <td></td>
587
+ <td>99.6</td>
588
+ <td>99.4</td>
589
+ <td>99.0</td>
590
+ </tr>
591
+ <tr>
592
+ <td>DKTHTCPPCPAPEAAGGPSVFLFP PKPK</td>
593
+ <td>HC(223-252)</td>
594
+ <td>Clipping</td>
595
+ <td>0.4</td>
596
+ <td>0.6</td>
597
+ <td>1.0</td>
598
+ </tr>
599
+ </table>
600
+ <hr>
601
+ </div>
602
+
603
+ <div class="table-container">
604
+ <h2>Table 12</h2>
605
+ <table border="1">
606
+ <tr>
607
+ <td>Blue:</td>
608
+ <td>VH and VL</td>
609
+ </tr>
610
+ <tr>
611
+ <td>Blue:</td>
612
+ <td>CDR</td>
613
+ </tr>
614
+ <tr>
615
+ <td>Green:</td>
616
+ <td>N-glycosylation site</td>
617
+ </tr>
618
+ </table>
619
+ <hr>
620
+ </div>
621
+
622
+ <div class="table-container">
623
+ <h2>Table 13</h2>
624
+ <table border="1">
625
+ <tr>
626
+ <td>Mabelle Meersseman</td>
627
+ <td>Date:</td>
628
+ </tr>
629
+ <tr>
630
+ <td>Group Leader</td>
631
+ <td>Signature:</td>
632
+ </tr>
633
+ <tr>
634
+ <td>Approver</td>
635
+ <td></td>
636
+ </tr>
637
+ <tr>
638
+ <td>Koen Sandra Ph.D.</td>
639
+ <td>Date:</td>
640
+ </tr>
641
+ <tr>
642
+ <td>CEO</td>
643
+ <td>Signature:</td>
644
+ </tr>
645
+ </table>
646
+ <hr>
647
+ </div>
648
+
649
+ <div class="table-container">
650
+ <h2>Table 14</h2>
651
+ <table border="1">
652
+ <tr>
653
+ <td>Version</td>
654
+ <td>Date of issue</td>
655
+ <td>Reason for version update</td>
656
+ </tr>
657
+ <tr>
658
+ <td>00</td>
659
+ <td>20 November 2024</td>
660
+ <td>Draft</td>
661
+ </tr>
662
+ <tr>
663
+ <td></td>
664
+ <td></td>
665
+ <td></td>
666
+ </tr>
667
+ <tr>
668
+ <td></td>
669
+ <td></td>
670
+ <td></td>
671
+ </tr>
672
+ </table>
673
+ <hr>
674
+ </div>
675
+ </body></html>
logs/di_content/di_content_20250617_110508_tables.html ADDED
@@ -0,0 +1,1441 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Azure DI Tables</title>
5
+ <style>
6
+ body { font-family: Arial, sans-serif; margin: 20px; }
7
+ .table-container { margin-bottom: 40px; }
8
+ h2 { color: #333; }
9
+ table { border-collapse: collapse; width: 100%; margin-bottom: 10px; }
10
+ th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
11
+ th { background-color: #f5f5f5; }
12
+ hr { border: none; border-top: 2px solid #ccc; margin: 20px 0; }
13
+ </style>
14
+ </head>
15
+ <body>
16
+ <h1>Azure Document Intelligence Tables</h1>
17
+
18
+ <div class="table-container">
19
+ <h2>Table 1</h2>
20
+ <table border="1">
21
+ <tr>
22
+ <td>l Sales quote:</td>
23
+ <td>SQ20202722</td>
24
+ </tr>
25
+ <tr>
26
+ <td>l Project code:</td>
27
+ <td>P3016</td>
28
+ </tr>
29
+ <tr>
30
+ <td>l LNB number:</td>
31
+ <td>2023.050</td>
32
+ </tr>
33
+ <tr>
34
+ <td>l Project responsible:</td>
35
+ <td>Nathan Cardon</td>
36
+ </tr>
37
+ <tr>
38
+ <td>l Report name:</td>
39
+ <td>P3016_R11_v00</td>
40
+ </tr>
41
+ </table>
42
+ <hr>
43
+ </div>
44
+
45
+ <div class="table-container">
46
+ <h2>Table 2</h2>
47
+ <table border="1">
48
+ <tr>
49
+ <td>Test sample ID client</td>
50
+ <td>Test sample ID RIC</td>
51
+ <td>Protein concentration (mg/ML)</td>
52
+ </tr>
53
+ <tr>
54
+ <td>P066_FH0.7-0-hulgG-LALAPG-FJB</td>
55
+ <td>aFH0.7_T0</td>
56
+ <td>1.0</td>
57
+ </tr>
58
+ <tr>
59
+ <td>P066_FH0.7-0-hulgG-LALAPG-FJB</td>
60
+ <td>aFH.07_T4W</td>
61
+ <td>1.0</td>
62
+ </tr>
63
+ <tr>
64
+ <td>P066_FHR-1.3B4_0-hulgG-LALAPG-FJB</td>
65
+ <td>FHR-1.3B4_T0</td>
66
+ <td>1.0</td>
67
+ </tr>
68
+ <tr>
69
+ <td>P066_FHR-1.3B4_0-hulgG-LALAPG-FJB</td>
70
+ <td>FHR-1.3B4_T4W</td>
71
+ <td>1.0</td>
72
+ </tr>
73
+ <tr>
74
+ <td>P066_L5_H12_0-hulgG-LALAPG-FJB</td>
75
+ <td>L5_H12_T0</td>
76
+ <td>1.0</td>
77
+ </tr>
78
+ <tr>
79
+ <td>P066_L5_H12_0-hulgG-LALAPG-FJB</td>
80
+ <td>L5_H12_T4W</td>
81
+ <td>1.0</td>
82
+ </tr>
83
+ <tr>
84
+ <td>P066_L5_H31-0-hulgG-LALAPG-FJB</td>
85
+ <td>L5_H31_T0</td>
86
+ <td>1.0</td>
87
+ </tr>
88
+ <tr>
89
+ <td>P066_L5_H31-0-hulgG-LALAPG-FJB</td>
90
+ <td>L5_H31_T4W</td>
91
+ <td>1.0</td>
92
+ </tr>
93
+ <tr>
94
+ <td>P066_L14_H12_0-hulgG-LALAPG-FJB</td>
95
+ <td>L14_H12_T0</td>
96
+ <td>1.0</td>
97
+ </tr>
98
+ <tr>
99
+ <td>P066_L14_H12_0-hulgG-LALAPG-FJB</td>
100
+ <td>L14_H12_T4W</td>
101
+ <td>1.0</td>
102
+ </tr>
103
+ <tr>
104
+ <td>P066_L14_H31_0-hulgG-LALAPG-FJB</td>
105
+ <td>L14_H31_T0</td>
106
+ <td>1.0</td>
107
+ </tr>
108
+ <tr>
109
+ <td>P066_L14_H31_0-hulgG-LALAPG-FJB</td>
110
+ <td>L14-H31_T4W</td>
111
+ <td>1.0</td>
112
+ </tr>
113
+ </table>
114
+ <hr>
115
+ </div>
116
+
117
+ <div class="table-container">
118
+ <h2>Table 3</h2>
119
+ <table border="1">
120
+ <tr>
121
+ <td></td>
122
+ <td>aFH.07_T0</td>
123
+ <td>aFH.07_T4W</td>
124
+ </tr>
125
+ <tr>
126
+ <td>G0-GlcNAc</td>
127
+ <td>5.0%</td>
128
+ <td>4.5%</td>
129
+ </tr>
130
+ <tr>
131
+ <td>Man5</td>
132
+ <td>56.1%</td>
133
+ <td>56.3%</td>
134
+ </tr>
135
+ <tr>
136
+ <td>Man6</td>
137
+ <td>17.6%</td>
138
+ <td>17.4%</td>
139
+ </tr>
140
+ <tr>
141
+ <td>Man7</td>
142
+ <td>20.7%</td>
143
+ <td>21.6%</td>
144
+ </tr>
145
+ <tr>
146
+ <td>Man8</td>
147
+ <td>0.6%</td>
148
+ <td>0.2%</td>
149
+ </tr>
150
+ </table>
151
+ <hr>
152
+ </div>
153
+
154
+ <div class="table-container">
155
+ <h2>Table 4</h2>
156
+ <table border="1">
157
+ <tr>
158
+ <td></td>
159
+ <td>aFH.07_T0</td>
160
+ <td>aFH.07_T4W</td>
161
+ </tr>
162
+ <tr>
163
+ <td>Unknown peak</td>
164
+ <td>0.6%</td>
165
+ <td>1.3%</td>
166
+ </tr>
167
+ <tr>
168
+ <td>HC [G0F/G0] - 2*GlcNAc</td>
169
+ <td>1.5%</td>
170
+ <td>2.0%</td>
171
+ </tr>
172
+ <tr>
173
+ <td>HC [Man5-Man5]</td>
174
+ <td>16.7%</td>
175
+ <td>16.5%</td>
176
+ </tr>
177
+ <tr>
178
+ <td>HC [G0F-Man5]</td>
179
+ <td>10.9%</td>
180
+ <td>11.9%</td>
181
+ </tr>
182
+ <tr>
183
+ <td>HC [G0F/G0] - GlcNAc</td>
184
+ <td>16.5%</td>
185
+ <td>17.2%</td>
186
+ </tr>
187
+ <tr>
188
+ <td>HC [G0F/G0]</td>
189
+ <td>6.5%</td>
190
+ <td>6.0%</td>
191
+ </tr>
192
+ <tr>
193
+ <td>HC [G0F/G0F]</td>
194
+ <td>35.5%</td>
195
+ <td>33.8%</td>
196
+ </tr>
197
+ <tr>
198
+ <td>HC [G0F/G1F]</td>
199
+ <td>6.5%</td>
200
+ <td>5.9%</td>
201
+ </tr>
202
+ <tr>
203
+ <td>HC [G1F/G1F] or HC [G0F/G2F]</td>
204
+ <td>5.0%</td>
205
+ <td>4.8%</td>
206
+ </tr>
207
+ <tr>
208
+ <td>HC [G1F/G2F]</td>
209
+ <td>0.3%</td>
210
+ <td>0.6%</td>
211
+ </tr>
212
+ </table>
213
+ <hr>
214
+ </div>
215
+
216
+ <div class="table-container">
217
+ <h2>Table 5</h2>
218
+ <table border="1">
219
+ <tr>
220
+ <td>Sequence</td>
221
+ <td>Sequence location</td>
222
+ <td>Modification</td>
223
+ <td>Relative abundance</td>
224
+ <td>Relative abundance</td>
225
+ </tr>
226
+ <tr>
227
+ <td>Sequence</td>
228
+ <td>Sequence location</td>
229
+ <td>Modification</td>
230
+ <td>aFH.07_T0</td>
231
+ <td>aFH.07_T4W</td>
232
+ </tr>
233
+ <tr>
234
+ <td>QIVLSQSPTFLSASPGEK</td>
235
+ <td>LC (001-018)</td>
236
+ <td>pyroQ</td>
237
+ <td>86.8%</td>
238
+ <td>99.7%</td>
239
+ </tr>
240
+ <tr>
241
+ <td>QIVLSQSPTFLSASPGEK</td>
242
+ <td>LC (001-018)</td>
243
+ <td></td>
244
+ <td>13.2%</td>
245
+ <td>0.3%</td>
246
+ </tr>
247
+ <tr>
248
+ <td>QVQLQQSGPGLVQPSQSLSITCTVSDFSLAR</td>
249
+ <td>HC (001-031)</td>
250
+ <td>pyroQ</td>
251
+ <td>90.0%</td>
252
+ <td>100.0%</td>
253
+ </tr>
254
+ <tr>
255
+ <td>QVQLQQSGPGLVQPSQSLSITCTVSDFSLAR</td>
256
+ <td>HC (001-031)</td>
257
+ <td></td>
258
+ <td>10.0%</td>
259
+ <td>n.d</td>
260
+ </tr>
261
+ </table>
262
+ <hr>
263
+ </div>
264
+
265
+ <div class="table-container">
266
+ <h2>Table 6</h2>
267
+ <table border="1">
268
+ <tr>
269
+ <td>Sequence</td>
270
+ <td>Sequence location</td>
271
+ <td>Modification</td>
272
+ <td>Relative abundance</td>
273
+ <td>Relative abundance</td>
274
+ </tr>
275
+ <tr>
276
+ <td>Sequence</td>
277
+ <td>Sequence location</td>
278
+ <td>Modification</td>
279
+ <td>aFH.07_T0</td>
280
+ <td>aFH.07_T4W</td>
281
+ </tr>
282
+ <tr>
283
+ <td>YMHWYQQKPGASPKPWIFATSNLASGVPAR</td>
284
+ <td>LC (31-60)</td>
285
+ <td>Oxidation [+16 Da]</td>
286
+ <td>0.9%</td>
287
+ <td>1.0%</td>
288
+ </tr>
289
+ <tr>
290
+ <td>YMHWYQQKPGASPKPWIFATSNLASGVPAR</td>
291
+ <td>LC (31-60)</td>
292
+ <td></td>
293
+ <td>99.1%</td>
294
+ <td>99.0%</td>
295
+ </tr>
296
+ </table>
297
+ <hr>
298
+ </div>
299
+
300
+ <div class="table-container">
301
+ <h2>Table 7</h2>
302
+ <table border="1">
303
+ <tr>
304
+ <td>Sequence</td>
305
+ <td>Sequence location</td>
306
+ <td>Modification</td>
307
+ <td>Relative abundance</td>
308
+ <td>Relative abundance</td>
309
+ </tr>
310
+ <tr>
311
+ <td>Sequence</td>
312
+ <td>Sequence location</td>
313
+ <td>Modification</td>
314
+ <td>aFH.07_T0</td>
315
+ <td>aFH.07_T4W</td>
316
+ </tr>
317
+ <tr>
318
+ <td>LNINKDNSK</td>
319
+ <td>HC (72-75)</td>
320
+ <td></td>
321
+ <td>99.5%</td>
322
+ <td>98.9%</td>
323
+ </tr>
324
+ <tr>
325
+ <td>LNINKDNSK</td>
326
+ <td>HC (72-75)</td>
327
+ <td>Deamidation</td>
328
+ <td>0.5%</td>
329
+ <td>1.1%</td>
330
+ </tr>
331
+ </table>
332
+ <hr>
333
+ </div>
334
+
335
+ <div class="table-container">
336
+ <h2>Table 8</h2>
337
+ <table border="1">
338
+ <tr>
339
+ <td>Sequence</td>
340
+ <td>Sequence location</td>
341
+ <td>Modification</td>
342
+ <td>Relative abundance</td>
343
+ <td>Relative abundance</td>
344
+ </tr>
345
+ <tr>
346
+ <td>Sequence</td>
347
+ <td>Sequence location</td>
348
+ <td>Modification</td>
349
+ <td>aFH.07_T0</td>
350
+ <td>aFH.07_T4W</td>
351
+ </tr>
352
+ <tr>
353
+ <td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
354
+ <td>LC (77-102)</td>
355
+ <td>GO-GICNAc</td>
356
+ <td>2.6%</td>
357
+ <td>4.0%</td>
358
+ </tr>
359
+ <tr>
360
+ <td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
361
+ <td>LC (77-102)</td>
362
+ <td>Man5</td>
363
+ <td>54.9%</td>
364
+ <td>57.3%</td>
365
+ </tr>
366
+ <tr>
367
+ <td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
368
+ <td>LC (77-102)</td>
369
+ <td>Man6</td>
370
+ <td>21.1%</td>
371
+ <td>18.8%</td>
372
+ </tr>
373
+ <tr>
374
+ <td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
375
+ <td>LC (77-102)</td>
376
+ <td>Man7</td>
377
+ <td>21.4%</td>
378
+ <td>20.0%</td>
379
+ </tr>
380
+ </table>
381
+ <hr>
382
+ </div>
383
+
384
+ <div class="table-container">
385
+ <h2>Table 9</h2>
386
+ <table border="1">
387
+ <tr>
388
+ <td>Sequence</td>
389
+ <td>Sequence location</td>
390
+ <td>Modification</td>
391
+ <td>Relative abundance</td>
392
+ <td>Relative abundance</td>
393
+ </tr>
394
+ <tr>
395
+ <td>Sequence</td>
396
+ <td>Sequence location</td>
397
+ <td>Modification</td>
398
+ <td>aFH.07_T0</td>
399
+ <td>aFH.07_T4W</td>
400
+ </tr>
401
+ <tr>
402
+ <td>MNSLQANDTAIYYCAR</td>
403
+ <td>HC (82-97)</td>
404
+ <td>Non glycosylated</td>
405
+ <td>n.d</td>
406
+ <td>n.d</td>
407
+ </tr>
408
+ <tr>
409
+ <td>MNSLQANDTAIYYCAR</td>
410
+ <td>HC (82-97)</td>
411
+ <td>G0F-GlcNAc</td>
412
+ <td>16.3%</td>
413
+ <td>20.8%</td>
414
+ </tr>
415
+ <tr>
416
+ <td>MNSLQANDTAIYYCAR</td>
417
+ <td>HC (82-97)</td>
418
+ <td>G0</td>
419
+ <td>4.2%</td>
420
+ <td>3.7%</td>
421
+ </tr>
422
+ <tr>
423
+ <td>MNSLQANDTAIYYCAR</td>
424
+ <td>HC (82-97)</td>
425
+ <td>G0F</td>
426
+ <td>36.5%</td>
427
+ <td>34.0%</td>
428
+ </tr>
429
+ <tr>
430
+ <td>MNSLQANDTAIYYCAR</td>
431
+ <td>HC (82-97)</td>
432
+ <td>G1F</td>
433
+ <td>4.9%</td>
434
+ <td>5.1%</td>
435
+ </tr>
436
+ <tr>
437
+ <td>MNSLQANDTAIYYCAR</td>
438
+ <td>HC (82-97)</td>
439
+ <td>G2F</td>
440
+ <td>5.7%</td>
441
+ <td>4.8%</td>
442
+ </tr>
443
+ <tr>
444
+ <td>MNSLQANDTAIYYCAR</td>
445
+ <td>HC (82-97)</td>
446
+ <td>Man5</td>
447
+ <td>32.4%</td>
448
+ <td>31.5%</td>
449
+ </tr>
450
+ </table>
451
+ <hr>
452
+ </div>
453
+
454
+ <div class="table-container">
455
+ <h2>Table 10</h2>
456
+ <table border="1">
457
+ <tr>
458
+ <td>Sequence</td>
459
+ <td>Sequence location</td>
460
+ <td>Modification</td>
461
+ <td>Relative abundance</td>
462
+ <td>Relative abundance</td>
463
+ </tr>
464
+ <tr>
465
+ <td>Sequence</td>
466
+ <td>Sequence location</td>
467
+ <td>Modification</td>
468
+ <td>aFH.07_T0</td>
469
+ <td>aFH.07_T4W</td>
470
+ </tr>
471
+ <tr>
472
+ <td>EEQYNSTYR</td>
473
+ <td>HC (293-301)</td>
474
+ <td>Non glycosylated</td>
475
+ <td>n.d</td>
476
+ <td>n.d</td>
477
+ </tr>
478
+ <tr>
479
+ <td>EEQYNSTYR</td>
480
+ <td>HC (293-301)</td>
481
+ <td>Man5</td>
482
+ <td>20.9%</td>
483
+ <td>22.5%</td>
484
+ </tr>
485
+ <tr>
486
+ <td>EEQYNSTYR</td>
487
+ <td>HC (293-301)</td>
488
+ <td>G0</td>
489
+ <td>n.D</td>
490
+ <td>n.d</td>
491
+ </tr>
492
+ <tr>
493
+ <td>EEQYNSTYR</td>
494
+ <td>HC (293-301)</td>
495
+ <td>G0F</td>
496
+ <td>79.1%</td>
497
+ <td>77.5%</td>
498
+ </tr>
499
+ <tr>
500
+ <td>EEQYNSTYR</td>
501
+ <td>HC (293-301)</td>
502
+ <td>G1F</td>
503
+ <td>n.d</td>
504
+ <td>n.d</td>
505
+ </tr>
506
+ <tr>
507
+ <td>EEQYNSTYR</td>
508
+ <td>HC (293-301)</td>
509
+ <td>G2F</td>
510
+ <td>n.d</td>
511
+ <td>n.d</td>
512
+ </tr>
513
+ </table>
514
+ <hr>
515
+ </div>
516
+
517
+ <div class="table-container">
518
+ <h2>Table 11</h2>
519
+ <table border="1">
520
+ <tr>
521
+ <td>Sequence</td>
522
+ <td>Sequence location</td>
523
+ <td>Modification</td>
524
+ <td>Relative abundance*</td>
525
+ <td>Relative abundance*</td>
526
+ </tr>
527
+ <tr>
528
+ <td>Sequence</td>
529
+ <td>Sequence location</td>
530
+ <td>Modification</td>
531
+ <td>aFH.07_T0</td>
532
+ <td>aFH.07_T4W</td>
533
+ </tr>
534
+ <tr>
535
+ <td>STSGGTAALGCLVK</td>
536
+ <td>HC (134-147)</td>
537
+ <td></td>
538
+ <td>99.9%</td>
539
+ <td>98.8%</td>
540
+ </tr>
541
+ <tr>
542
+ <td>GTAALGCLVK</td>
543
+ <td>HC (134-147)</td>
544
+ <td>Clipping</td>
545
+ <td>0.1%</td>
546
+ <td>1.2%</td>
547
+ </tr>
548
+ </table>
549
+ <hr>
550
+ </div>
551
+
552
+ <div class="table-container">
553
+ <h2>Table 12</h2>
554
+ <table border="1">
555
+ <tr>
556
+ <td>Blue:</td>
557
+ <td>VH and VL</td>
558
+ </tr>
559
+ <tr>
560
+ <td>Blue:</td>
561
+ <td>CDR</td>
562
+ </tr>
563
+ <tr>
564
+ <td>Green:</td>
565
+ <td>N-glycosylation site</td>
566
+ </tr>
567
+ </table>
568
+ <hr>
569
+ </div>
570
+
571
+ <div class="table-container">
572
+ <h2>Table 13</h2>
573
+ <table border="1">
574
+ <tr>
575
+ <td>Sequence</td>
576
+ <td>Sequence location</td>
577
+ <td>Modification</td>
578
+ <td>Relative abundance</td>
579
+ <td>Relative abundance</td>
580
+ </tr>
581
+ <tr>
582
+ <td>Sequence</td>
583
+ <td>Sequence location</td>
584
+ <td>Modification</td>
585
+ <td>FHR-1.3B4_T0</td>
586
+ <td>FHR-1.3B4_T4W</td>
587
+ </tr>
588
+ <tr>
589
+ <td>QIVLSQSPTILSASPGEK</td>
590
+ <td>LC (1-18)</td>
591
+ <td>pyro Q</td>
592
+ <td>96.1%</td>
593
+ <td>100.0%</td>
594
+ </tr>
595
+ <tr>
596
+ <td>QIVLSQSPTILSASPGEK</td>
597
+ <td>LC (1-18)</td>
598
+ <td></td>
599
+ <td>3.9%</td>
600
+ <td>n.d</td>
601
+ </tr>
602
+ <tr>
603
+ <td>QVQLR</td>
604
+ <td>HC (1-5)</td>
605
+ <td>pyro Q</td>
606
+ <td>96.7%</td>
607
+ <td>100.0%</td>
608
+ </tr>
609
+ <tr>
610
+ <td>QVQLR</td>
611
+ <td>HC (1-5)</td>
612
+ <td></td>
613
+ <td>3.3%</td>
614
+ <td>n.d</td>
615
+ </tr>
616
+ </table>
617
+ <hr>
618
+ </div>
619
+
620
+ <div class="table-container">
621
+ <h2>Table 14</h2>
622
+ <table border="1">
623
+ <tr>
624
+ <td>Sequence</td>
625
+ <td>Sequence location</td>
626
+ <td>Modification</td>
627
+ <td>Relative abundance</td>
628
+ <td>Relative abundance</td>
629
+ </tr>
630
+ <tr>
631
+ <td>Sequence</td>
632
+ <td>Sequence location</td>
633
+ <td>Modification</td>
634
+ <td>FHR-1.3B4_T0</td>
635
+ <td>FHR-1.3B4_T4W</td>
636
+ </tr>
637
+ <tr>
638
+ <td>MNSLQADDTAIYYCAR</td>
639
+ <td>HC (82-97)</td>
640
+ <td></td>
641
+ <td>99.3%</td>
642
+ <td>99.0%</td>
643
+ </tr>
644
+ <tr>
645
+ <td>MNSLQADDTAIYYCAR</td>
646
+ <td>HC (82-97)</td>
647
+ <td>Ox [+ 16 Da]</td>
648
+ <td>0.7%</td>
649
+ <td>1.0%</td>
650
+ </tr>
651
+ </table>
652
+ <hr>
653
+ </div>
654
+
655
+ <div class="table-container">
656
+ <h2>Table 15</h2>
657
+ <table border="1">
658
+ <tr>
659
+ <td>Sequence</td>
660
+ <td>Sequence location</td>
661
+ <td>Modification</td>
662
+ <td>Relative abundance</td>
663
+ <td>Relative abundance</td>
664
+ </tr>
665
+ <tr>
666
+ <td>Sequence</td>
667
+ <td>Sequence location</td>
668
+ <td>Modification</td>
669
+ <td>FHR-1.3B4_T0</td>
670
+ <td>FHR-1.3B4_T4W</td>
671
+ </tr>
672
+ <tr>
673
+ <td>MNSLQADDTAIYYCAR</td>
674
+ <td>HC (82-97)</td>
675
+ <td></td>
676
+ <td>97.6%</td>
677
+ <td>79.7%</td>
678
+ </tr>
679
+ <tr>
680
+ <td>MNSLQADDTAIYYCAR</td>
681
+ <td>HC (82-97)</td>
682
+ <td>Deamidation</td>
683
+ <td>2.4%</td>
684
+ <td>20.3%</td>
685
+ </tr>
686
+ </table>
687
+ <hr>
688
+ </div>
689
+
690
+ <div class="table-container">
691
+ <h2>Table 16</h2>
692
+ <table border="1">
693
+ <tr>
694
+ <td>Sequence</td>
695
+ <td>Sequence location</td>
696
+ <td>Modification</td>
697
+ <td>Relative abundance*</td>
698
+ <td>Relative abundance*</td>
699
+ </tr>
700
+ <tr>
701
+ <td>Sequence</td>
702
+ <td>Sequence location</td>
703
+ <td>Modification</td>
704
+ <td>FHR-1.3B4_T0</td>
705
+ <td>FHR-1.3B4_T4W</td>
706
+ </tr>
707
+ <tr>
708
+ <td>STSGGTAALGCLVK</td>
709
+ <td>HC (134-147)</td>
710
+ <td></td>
711
+ <td>99.9%</td>
712
+ <td>98.7%</td>
713
+ </tr>
714
+ <tr>
715
+ <td>GTAALGCLVK</td>
716
+ <td>HC (134-147)</td>
717
+ <td>Clipping</td>
718
+ <td>0.1%</td>
719
+ <td>1.3%</td>
720
+ </tr>
721
+ <tr>
722
+ <td>SSSNPLTFGAGTK</td>
723
+ <td>LC (91-103)</td>
724
+ <td></td>
725
+ <td>99.5%</td>
726
+ <td>97.3%</td>
727
+ </tr>
728
+ <tr>
729
+ <td>PLTFGAGTK</td>
730
+ <td>LC (91-103)</td>
731
+ <td>Clipping</td>
732
+ <td>0.5%</td>
733
+ <td>2.7%</td>
734
+ </tr>
735
+ </table>
736
+ <hr>
737
+ </div>
738
+
739
+ <div class="table-container">
740
+ <h2>Table 17</h2>
741
+ <table border="1">
742
+ <tr>
743
+ <td>Blue:</td>
744
+ <td>VH and VL</td>
745
+ </tr>
746
+ <tr>
747
+ <td>Blue:</td>
748
+ <td>CDR</td>
749
+ </tr>
750
+ <tr>
751
+ <td>Green:</td>
752
+ <td>N-glycosylation site</td>
753
+ </tr>
754
+ </table>
755
+ <hr>
756
+ </div>
757
+
758
+ <div class="table-container">
759
+ <h2>Table 18</h2>
760
+ <table border="1">
761
+ <tr>
762
+ <td>Sequence</td>
763
+ <td>Sequence location</td>
764
+ <td>Modification</td>
765
+ <td>Relative abundance</td>
766
+ <td>Relative abundance</td>
767
+ </tr>
768
+ <tr>
769
+ <td>Sequence</td>
770
+ <td>Sequence location</td>
771
+ <td>Modification</td>
772
+ <td>L5-H12_T0</td>
773
+ <td>L5-H12_T4w</td>
774
+ </tr>
775
+ <tr>
776
+ <td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
777
+ <td>HC (001-038)</td>
778
+ <td>pyro Q</td>
779
+ <td>85.5%</td>
780
+ <td>99.3%</td>
781
+ </tr>
782
+ <tr>
783
+ <td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
784
+ <td>HC (001-038)</td>
785
+ <td></td>
786
+ <td>14.5%</td>
787
+ <td>0.7%</td>
788
+ </tr>
789
+ </table>
790
+ <hr>
791
+ </div>
792
+
793
+ <div class="table-container">
794
+ <h2>Table 19</h2>
795
+ <table border="1">
796
+ <tr>
797
+ <td>Sequence</td>
798
+ <td>Sequence location</td>
799
+ <td>Modification</td>
800
+ <td>Relative abundance*</td>
801
+ <td>Relative abundance*</td>
802
+ </tr>
803
+ <tr>
804
+ <td>Sequence</td>
805
+ <td>Sequence location</td>
806
+ <td>Modification</td>
807
+ <td>L5-H12_T0</td>
808
+ <td>L5-H12_T4w</td>
809
+ </tr>
810
+ <tr>
811
+ <td>STSGGTAALGCLVK</td>
812
+ <td>HC (134-147)</td>
813
+ <td></td>
814
+ <td>99.9%</td>
815
+ <td>98.7%</td>
816
+ </tr>
817
+ <tr>
818
+ <td>GTAALGCLVK</td>
819
+ <td>HC (134-147)</td>
820
+ <td>Clipping</td>
821
+ <td>0.1%</td>
822
+ <td>1.3%</td>
823
+ </tr>
824
+ <tr>
825
+ <td>SSSNPLTFGAGTK</td>
826
+ <td>LC (91-103)</td>
827
+ <td></td>
828
+ <td>99.8%</td>
829
+ <td>98.9%</td>
830
+ </tr>
831
+ <tr>
832
+ <td>PLTFGAGTK</td>
833
+ <td>LC (91-103)</td>
834
+ <td>Clipping</td>
835
+ <td>0.2%</td>
836
+ <td>1.1%</td>
837
+ </tr>
838
+ </table>
839
+ <hr>
840
+ </div>
841
+
842
+ <div class="table-container">
843
+ <h2>Table 20</h2>
844
+ <table border="1">
845
+ <tr>
846
+ <td>Blue:</td>
847
+ <td>VH and VL</td>
848
+ </tr>
849
+ <tr>
850
+ <td>Blue:</td>
851
+ <td>CDR</td>
852
+ </tr>
853
+ <tr>
854
+ <td>Green:</td>
855
+ <td>N-glycosylation site</td>
856
+ </tr>
857
+ </table>
858
+ <hr>
859
+ </div>
860
+
861
+ <div class="table-container">
862
+ <h2>Table 21</h2>
863
+ <table border="1">
864
+ <tr>
865
+ <td>Sequence</td>
866
+ <td>Sequence location</td>
867
+ <td>Modification</td>
868
+ <td>Relative abundance</td>
869
+ <td>Relative abundance</td>
870
+ </tr>
871
+ <tr>
872
+ <td>Sequence</td>
873
+ <td>Sequence location</td>
874
+ <td>Modification</td>
875
+ <td>L5-H31_T0</td>
876
+ <td>L5-H31_T4w</td>
877
+ </tr>
878
+ <tr>
879
+ <td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
880
+ <td>HC (001-038)</td>
881
+ <td>pyro Q</td>
882
+ <td>83.5%</td>
883
+ <td>99.5%</td>
884
+ </tr>
885
+ <tr>
886
+ <td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
887
+ <td>HC (001-038)</td>
888
+ <td></td>
889
+ <td>16.5%</td>
890
+ <td>0.5%</td>
891
+ </tr>
892
+ </table>
893
+ <hr>
894
+ </div>
895
+
896
+ <div class="table-container">
897
+ <h2>Table 22</h2>
898
+ <table border="1">
899
+ <tr>
900
+ <td>Sequence</td>
901
+ <td>Sequence location</td>
902
+ <td>Modification</td>
903
+ <td>Relative abundance</td>
904
+ <td>Relative abundance</td>
905
+ </tr>
906
+ <tr>
907
+ <td>Sequence</td>
908
+ <td>Sequence location</td>
909
+ <td>Modification</td>
910
+ <td>L5-H31_T0</td>
911
+ <td>L5-H31_T4w</td>
912
+ </tr>
913
+ <tr>
914
+ <td>NFGNYAMDFWGQGTSVTVSSASTK</td>
915
+ <td>HC(98-121)</td>
916
+ <td>Ox. [+ 16 Da]</td>
917
+ <td>4.9%</td>
918
+ <td>1.9%</td>
919
+ </tr>
920
+ <tr>
921
+ <td>NFGNYAMDFWGQGTSVTVSSASTK</td>
922
+ <td>HC(98-121)</td>
923
+ <td></td>
924
+ <td>95.1%</td>
925
+ <td>98.1%</td>
926
+ </tr>
927
+ </table>
928
+ <hr>
929
+ </div>
930
+
931
+ <div class="table-container">
932
+ <h2>Table 23</h2>
933
+ <table border="1">
934
+ <tr>
935
+ <td>Sequence</td>
936
+ <td>Sequence location</td>
937
+ <td>Modification</td>
938
+ <td>Relative abundance</td>
939
+ <td>Relative abundance</td>
940
+ </tr>
941
+ <tr>
942
+ <td>Sequence</td>
943
+ <td>Sequence location</td>
944
+ <td>Modification</td>
945
+ <td>L5-H31_T0</td>
946
+ <td>L5-H31_T4w</td>
947
+ </tr>
948
+ <tr>
949
+ <td>SSSNPLTFGAGTK</td>
950
+ <td>LC (91-103)</td>
951
+ <td></td>
952
+ <td>99.8%</td>
953
+ <td>99.5%</td>
954
+ </tr>
955
+ <tr>
956
+ <td>SSSNPLTFGAGTK</td>
957
+ <td>LC (91-103)</td>
958
+ <td>deamidation</td>
959
+ <td>0.2%</td>
960
+ <td>0.5%</td>
961
+ </tr>
962
+ </table>
963
+ <hr>
964
+ </div>
965
+
966
+ <div class="table-container">
967
+ <h2>Table 24</h2>
968
+ <table border="1">
969
+ <tr>
970
+ <td>Sequence</td>
971
+ <td>Sequence location</td>
972
+ <td>Modification</td>
973
+ <td>Relative abundance*</td>
974
+ <td>Relative abundance*</td>
975
+ </tr>
976
+ <tr>
977
+ <td>Sequence</td>
978
+ <td>Sequence location</td>
979
+ <td>Modification</td>
980
+ <td>L5-H31_T0</td>
981
+ <td>L5-H31_T4w</td>
982
+ </tr>
983
+ <tr>
984
+ <td>STSGGTAALGCLVK</td>
985
+ <td>HC (134-147)</td>
986
+ <td></td>
987
+ <td>99.9%</td>
988
+ <td>98.8%</td>
989
+ </tr>
990
+ <tr>
991
+ <td>GTAALGCLVK</td>
992
+ <td>HC (134-147)</td>
993
+ <td>Clipping</td>
994
+ <td>0.1%</td>
995
+ <td>1.2%</td>
996
+ </tr>
997
+ <tr>
998
+ <td>SSSNPLTFGAGTK</td>
999
+ <td>LC (91-103)</td>
1000
+ <td></td>
1001
+ <td>99.9%</td>
1002
+ <td>98.8%</td>
1003
+ </tr>
1004
+ <tr>
1005
+ <td>PLTFGAGTK</td>
1006
+ <td>LC (91-103)</td>
1007
+ <td>Clipping</td>
1008
+ <td>0.1%</td>
1009
+ <td>1.2%</td>
1010
+ </tr>
1011
+ </table>
1012
+ <hr>
1013
+ </div>
1014
+
1015
+ <div class="table-container">
1016
+ <h2>Table 25</h2>
1017
+ <table border="1">
1018
+ <tr>
1019
+ <td>Blue:</td>
1020
+ <td>VH and VL</td>
1021
+ </tr>
1022
+ <tr>
1023
+ <td>Blue:</td>
1024
+ <td>CDR</td>
1025
+ </tr>
1026
+ <tr>
1027
+ <td>Green:</td>
1028
+ <td>N-glycosylation site</td>
1029
+ </tr>
1030
+ </table>
1031
+ <hr>
1032
+ </div>
1033
+
1034
+ <div class="table-container">
1035
+ <h2>Table 26</h2>
1036
+ <table border="1">
1037
+ <tr>
1038
+ <td>Sequence</td>
1039
+ <td>Sequence location</td>
1040
+ <td>Modification</td>
1041
+ <td>Relative abundance</td>
1042
+ <td>Relative abundance</td>
1043
+ </tr>
1044
+ <tr>
1045
+ <td>Sequence</td>
1046
+ <td>Sequence location</td>
1047
+ <td>Modification</td>
1048
+ <td>L14-H12_T0</td>
1049
+ <td>L14-H12_T4w</td>
1050
+ </tr>
1051
+ <tr>
1052
+ <td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
1053
+ <td>HC(001-038)</td>
1054
+ <td>pyroQ</td>
1055
+ <td>85.9%</td>
1056
+ <td>99.3%</td>
1057
+ </tr>
1058
+ <tr>
1059
+ <td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
1060
+ <td>HC(001-038)</td>
1061
+ <td></td>
1062
+ <td>14.1%</td>
1063
+ <td>0.7%</td>
1064
+ </tr>
1065
+ </table>
1066
+ <hr>
1067
+ </div>
1068
+
1069
+ <div class="table-container">
1070
+ <h2>Table 27</h2>
1071
+ <table border="1">
1072
+ <tr>
1073
+ <td>Sequence</td>
1074
+ <td>Sequence location</td>
1075
+ <td>Modification</td>
1076
+ <td>Relative abundance</td>
1077
+ <td>Relative abundance</td>
1078
+ </tr>
1079
+ <tr>
1080
+ <td>Sequence</td>
1081
+ <td>Sequence location</td>
1082
+ <td>Modification</td>
1083
+ <td>L14-H12_T0</td>
1084
+ <td>L14-H12_T4w</td>
1085
+ </tr>
1086
+ <tr>
1087
+ <td>ASTSVTYMHWYQQKPGK</td>
1088
+ <td>LC(25-41)</td>
1089
+ <td>Ox. [+16 Da]</td>
1090
+ <td>0.3%</td>
1091
+ <td>0.3%</td>
1092
+ </tr>
1093
+ <tr>
1094
+ <td>ASTSVTYMHWYQQKPGK</td>
1095
+ <td>LC(25-41)</td>
1096
+ <td></td>
1097
+ <td>99.7%</td>
1098
+ <td>99.7%</td>
1099
+ </tr>
1100
+ </table>
1101
+ <hr>
1102
+ </div>
1103
+
1104
+ <div class="table-container">
1105
+ <h2>Table 28</h2>
1106
+ <table border="1">
1107
+ <tr>
1108
+ <td>Sequence</td>
1109
+ <td>Sequence location</td>
1110
+ <td>Modification</td>
1111
+ <td>Relative abundance</td>
1112
+ <td>Relative abundance</td>
1113
+ </tr>
1114
+ <tr>
1115
+ <td>Sequence</td>
1116
+ <td>Sequence location</td>
1117
+ <td>Modification</td>
1118
+ <td>L14-H12_T0</td>
1119
+ <td>L14-H12_T4w</td>
1120
+ </tr>
1121
+ <tr>
1122
+ <td>SSSNPLTFGAGTK</td>
1123
+ <td>LC (91-103)</td>
1124
+ <td></td>
1125
+ <td>99.9%</td>
1126
+ <td>99.4%</td>
1127
+ </tr>
1128
+ <tr>
1129
+ <td>SSSNPLTFGAGTK</td>
1130
+ <td>LC (91-103)</td>
1131
+ <td>deamidation</td>
1132
+ <td>0.1%</td>
1133
+ <td>0.6%</td>
1134
+ </tr>
1135
+ </table>
1136
+ <hr>
1137
+ </div>
1138
+
1139
+ <div class="table-container">
1140
+ <h2>Table 29</h2>
1141
+ <table border="1">
1142
+ <tr>
1143
+ <td>Sequence</td>
1144
+ <td>Sequence location</td>
1145
+ <td>Modification</td>
1146
+ <td>Relative abundance*</td>
1147
+ <td>Relative abundance*</td>
1148
+ </tr>
1149
+ <tr>
1150
+ <td>Sequence</td>
1151
+ <td>Sequence location</td>
1152
+ <td>Modification</td>
1153
+ <td>L14-H12_T0</td>
1154
+ <td>L14-H12_T4w</td>
1155
+ </tr>
1156
+ <tr>
1157
+ <td>STSGGTAALGCLVK</td>
1158
+ <td>HC (134-147)</td>
1159
+ <td></td>
1160
+ <td>99.9%</td>
1161
+ <td>98.9%</td>
1162
+ </tr>
1163
+ <tr>
1164
+ <td>GTAALGCLVK</td>
1165
+ <td>HC (134-147)</td>
1166
+ <td>Clipping</td>
1167
+ <td>0.1%</td>
1168
+ <td>1.1%</td>
1169
+ </tr>
1170
+ <tr>
1171
+ <td>SSSNPLTFGAGTK</td>
1172
+ <td>LC (91-103)</td>
1173
+ <td></td>
1174
+ <td>99.7%</td>
1175
+ <td>98.6%</td>
1176
+ </tr>
1177
+ <tr>
1178
+ <td>PLTFGAGTK</td>
1179
+ <td>LC (91-103)</td>
1180
+ <td>Clipping</td>
1181
+ <td>0.3%</td>
1182
+ <td>1.4%</td>
1183
+ </tr>
1184
+ </table>
1185
+ <hr>
1186
+ </div>
1187
+
1188
+ <div class="table-container">
1189
+ <h2>Table 30</h2>
1190
+ <table border="1">
1191
+ <tr>
1192
+ <td>Blue:</td>
1193
+ <td>VH and VL</td>
1194
+ </tr>
1195
+ <tr>
1196
+ <td>Blue:</td>
1197
+ <td>CDR</td>
1198
+ </tr>
1199
+ <tr>
1200
+ <td>Green:</td>
1201
+ <td>N-glycosylation site</td>
1202
+ </tr>
1203
+ </table>
1204
+ <hr>
1205
+ </div>
1206
+
1207
+ <div class="table-container">
1208
+ <h2>Table 31</h2>
1209
+ <table border="1">
1210
+ <tr>
1211
+ <td>Sequence</td>
1212
+ <td>Sequence location</td>
1213
+ <td>Modification</td>
1214
+ <td>Relative abundance</td>
1215
+ <td>Relative abundance</td>
1216
+ </tr>
1217
+ <tr>
1218
+ <td>Sequence</td>
1219
+ <td>Sequence location</td>
1220
+ <td>Modification</td>
1221
+ <td>L14-H31_T0</td>
1222
+ <td>L14-H31_T4w</td>
1223
+ </tr>
1224
+ <tr>
1225
+ <td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
1226
+ <td>HC(001-038)</td>
1227
+ <td>pyroQ</td>
1228
+ <td>82.6%</td>
1229
+ <td>100.0%</td>
1230
+ </tr>
1231
+ <tr>
1232
+ <td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
1233
+ <td>HC(001-038)</td>
1234
+ <td></td>
1235
+ <td>17.4%</td>
1236
+ <td>n.d</td>
1237
+ </tr>
1238
+ </table>
1239
+ <hr>
1240
+ </div>
1241
+
1242
+ <div class="table-container">
1243
+ <h2>Table 32</h2>
1244
+ <table border="1">
1245
+ <tr>
1246
+ <td>Sequence</td>
1247
+ <td>Sequence location</td>
1248
+ <td>Modification</td>
1249
+ <td>Relative abundance</td>
1250
+ <td>Relative abundance</td>
1251
+ </tr>
1252
+ <tr>
1253
+ <td>Sequence</td>
1254
+ <td>Sequence location</td>
1255
+ <td>Modification</td>
1256
+ <td>L14-H31_T0</td>
1257
+ <td>L14-H31_T4w</td>
1258
+ </tr>
1259
+ <tr>
1260
+ <td>ASTSVTYMHWYQQKPGK</td>
1261
+ <td>LC(25-41)</td>
1262
+ <td>Ox. [+16 Da]</td>
1263
+ <td>0.5%</td>
1264
+ <td>0.4%</td>
1265
+ </tr>
1266
+ <tr>
1267
+ <td>ASTSVTYMHWYQQKPGK</td>
1268
+ <td>LC(25-41)</td>
1269
+ <td></td>
1270
+ <td>99.5%</td>
1271
+ <td>99.6%</td>
1272
+ </tr>
1273
+ </table>
1274
+ <hr>
1275
+ </div>
1276
+
1277
+ <div class="table-container">
1278
+ <h2>Table 33</h2>
1279
+ <table border="1">
1280
+ <tr>
1281
+ <td>Sequence</td>
1282
+ <td>Sequence location</td>
1283
+ <td>Modification</td>
1284
+ <td>Relative abundance</td>
1285
+ <td>Relative abundance</td>
1286
+ </tr>
1287
+ <tr>
1288
+ <td>Sequence</td>
1289
+ <td>Sequence location</td>
1290
+ <td>Modification</td>
1291
+ <td>L14-H31_T0</td>
1292
+ <td>L14-H31_T4w</td>
1293
+ </tr>
1294
+ <tr>
1295
+ <td>SSSNPLTFGAGTK</td>
1296
+ <td>LC (91-103)</td>
1297
+ <td></td>
1298
+ <td>99.9%</td>
1299
+ <td>99.5%</td>
1300
+ </tr>
1301
+ <tr>
1302
+ <td>SSSNPLTFGAGTK</td>
1303
+ <td>LC (91-103)</td>
1304
+ <td>deamidation</td>
1305
+ <td>0.1%</td>
1306
+ <td>0.5%</td>
1307
+ </tr>
1308
+ </table>
1309
+ <hr>
1310
+ </div>
1311
+
1312
+ <div class="table-container">
1313
+ <h2>Table 34</h2>
1314
+ <table border="1">
1315
+ <tr>
1316
+ <td>Sequence</td>
1317
+ <td>Sequence location</td>
1318
+ <td>Modification</td>
1319
+ <td>Relative abundance*</td>
1320
+ <td>Relative abundance*</td>
1321
+ </tr>
1322
+ <tr>
1323
+ <td>Sequence</td>
1324
+ <td>Sequence location</td>
1325
+ <td>Modification</td>
1326
+ <td>L14-H31_T0</td>
1327
+ <td>L14-H31_T4w</td>
1328
+ </tr>
1329
+ <tr>
1330
+ <td>STSGGTAALGCLVK</td>
1331
+ <td>HC (134-147)</td>
1332
+ <td></td>
1333
+ <td>99.9%</td>
1334
+ <td>98.9%</td>
1335
+ </tr>
1336
+ <tr>
1337
+ <td>GTAALGCLVK</td>
1338
+ <td>HC (134-147)</td>
1339
+ <td>Clipping</td>
1340
+ <td>0.1%</td>
1341
+ <td>1.1%</td>
1342
+ </tr>
1343
+ <tr>
1344
+ <td>SSSNPLTFGAGTK</td>
1345
+ <td>LC (91-103)</td>
1346
+ <td></td>
1347
+ <td>99.7%</td>
1348
+ <td>98.4%</td>
1349
+ </tr>
1350
+ <tr>
1351
+ <td>PLTFGAGTK</td>
1352
+ <td>LC (91-103)</td>
1353
+ <td>Clipping</td>
1354
+ <td>0.3%</td>
1355
+ <td>1.6%</td>
1356
+ </tr>
1357
+ </table>
1358
+ <hr>
1359
+ </div>
1360
+
1361
+ <div class="table-container">
1362
+ <h2>Table 35</h2>
1363
+ <table border="1">
1364
+ <tr>
1365
+ <td>Blue:</td>
1366
+ <td>VH and VL</td>
1367
+ </tr>
1368
+ <tr>
1369
+ <td>Blue:</td>
1370
+ <td>CDR</td>
1371
+ </tr>
1372
+ <tr>
1373
+ <td>Green:</td>
1374
+ <td>N-glycosylation site</td>
1375
+ </tr>
1376
+ </table>
1377
+ <hr>
1378
+ </div>
1379
+
1380
+ <div class="table-container">
1381
+ <h2>Table 36</h2>
1382
+ <table border="1">
1383
+ <tr>
1384
+ <td>Nathan Cardon</td>
1385
+ <td>Date:</td>
1386
+ </tr>
1387
+ <tr>
1388
+ <td>Sr Research Associate</td>
1389
+ <td>Signature:</td>
1390
+ </tr>
1391
+ <tr>
1392
+ <td>Mabelle Meersseman</td>
1393
+ <td>Date:</td>
1394
+ </tr>
1395
+ <tr>
1396
+ <td>Group Leader</td>
1397
+ <td>Signature:</td>
1398
+ </tr>
1399
+ <tr>
1400
+ <td>Approver</td>
1401
+ <td></td>
1402
+ </tr>
1403
+ <tr>
1404
+ <td>Koen Sandra Ph.D.</td>
1405
+ <td>Date:</td>
1406
+ </tr>
1407
+ <tr>
1408
+ <td>CEO</td>
1409
+ <td>Signature:</td>
1410
+ </tr>
1411
+ </table>
1412
+ <hr>
1413
+ </div>
1414
+
1415
+ <div class="table-container">
1416
+ <h2>Table 37</h2>
1417
+ <table border="1">
1418
+ <tr>
1419
+ <td>Version</td>
1420
+ <td>Date of issue</td>
1421
+ <td>Reason for version update</td>
1422
+ </tr>
1423
+ <tr>
1424
+ <td>00</td>
1425
+ <td>25NOV24</td>
1426
+ <td>Draft</td>
1427
+ </tr>
1428
+ <tr>
1429
+ <td></td>
1430
+ <td></td>
1431
+ <td></td>
1432
+ </tr>
1433
+ <tr>
1434
+ <td></td>
1435
+ <td></td>
1436
+ <td></td>
1437
+ </tr>
1438
+ </table>
1439
+ <hr>
1440
+ </div>
1441
+ </body></html>
src/agents/__pycache__/field_mapper_agent.cpython-312.pyc CHANGED
Binary files a/src/agents/__pycache__/field_mapper_agent.cpython-312.pyc and b/src/agents/__pycache__/field_mapper_agent.cpython-312.pyc differ
 
src/agents/__pycache__/table_agent.cpython-312.pyc CHANGED
Binary files a/src/agents/__pycache__/table_agent.cpython-312.pyc and b/src/agents/__pycache__/table_agent.cpython-312.pyc differ
 
src/agents/field_mapper_agent.py CHANGED
@@ -142,9 +142,33 @@ class FieldMapperAgent(BaseAgent):
142
  filename = self.ctx.get("pdf_meta", {}).get("filename", "")
143
  filename_context = f"\nDocument filename: {filename}" if filename else ""
144
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
  prompt = f"""You are an expert in {context}
146
 
147
- Your task is to extract the value for the field: {field}{filename_context}
148
 
149
  Consider the following context from the document:
150
  {combined_context}
@@ -200,9 +224,33 @@ class FieldMapperAgent(BaseAgent):
200
  filename = self.ctx.get("pdf_meta", {}).get("filename", "")
201
  filename_context = f"\nDocument filename: {filename}" if filename else ""
202
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
  prompt = f"""You are an expert in {context}
204
 
205
- Your task is to extract the value for the field: {field}{filename_context}
206
 
207
  Consider the following page from the document:
208
  {page_text}
@@ -275,12 +323,64 @@ class FieldMapperAgent(BaseAgent):
275
  filename = self.ctx.get("pdf_meta", {}).get("filename", "")
276
  filename_context = f"\nDocument filename: {filename}" if filename else ""
277
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
  prompt = f"""You are an expert in {context}
279
 
280
  Your task is to extract information from the document based on unique combinations of indices and their corresponding fields.
281
 
282
  Unique Indices to look for: {', '.join(unique_indices)}
283
- Fields to extract for each combination: {', '.join(fields_to_extract)}{filename_context}
284
 
285
  Consider the following document:
286
  {text}
 
142
  filename = self.ctx.get("pdf_meta", {}).get("filename", "")
143
  filename_context = f"\nDocument filename: {filename}" if filename else ""
144
 
145
+ # Get field descriptions from context if available
146
+ field_descriptions = self.ctx.get("field_descriptions", {})
147
+
148
+ # Format field descriptions for the prompt
149
+ field_descriptions_text = ""
150
+ if field_descriptions and field in field_descriptions:
151
+ desc_info = field_descriptions[field]
152
+ if isinstance(desc_info, dict):
153
+ description = desc_info.get('description', '')
154
+ format_info = desc_info.get('format', '')
155
+ examples = desc_info.get('examples', '')
156
+ possible_values = desc_info.get('possible_values', '')
157
+
158
+ field_descriptions_text = f"\nField information for '{field}':"
159
+ if description:
160
+ field_descriptions_text += f"\nDescription: {description}"
161
+ if format_info:
162
+ field_descriptions_text += f"\nFormat: {format_info}"
163
+ if examples:
164
+ field_descriptions_text += f"\nExamples: {examples}"
165
+ if possible_values:
166
+ field_descriptions_text += f"\nPossible Values: {possible_values}"
167
+ field_descriptions_text += "\n"
168
+
169
  prompt = f"""You are an expert in {context}
170
 
171
+ Your task is to extract the value for the field: {field}{filename_context}{field_descriptions_text}
172
 
173
  Consider the following context from the document:
174
  {combined_context}
 
224
  filename = self.ctx.get("pdf_meta", {}).get("filename", "")
225
  filename_context = f"\nDocument filename: {filename}" if filename else ""
226
 
227
+ # Get field descriptions from context if available
228
+ field_descriptions = self.ctx.get("field_descriptions", {})
229
+
230
+ # Format field descriptions for the prompt
231
+ field_descriptions_text = ""
232
+ if field_descriptions and field in field_descriptions:
233
+ desc_info = field_descriptions[field]
234
+ if isinstance(desc_info, dict):
235
+ description = desc_info.get('description', '')
236
+ format_info = desc_info.get('format', '')
237
+ examples = desc_info.get('examples', '')
238
+ possible_values = desc_info.get('possible_values', '')
239
+
240
+ field_descriptions_text = f"\nField information for '{field}':"
241
+ if description:
242
+ field_descriptions_text += f"\nDescription: {description}"
243
+ if format_info:
244
+ field_descriptions_text += f"\nFormat: {format_info}"
245
+ if examples:
246
+ field_descriptions_text += f"\nExamples: {examples}"
247
+ if possible_values:
248
+ field_descriptions_text += f"\nPossible Values: {possible_values}"
249
+ field_descriptions_text += "\n"
250
+
251
  prompt = f"""You are an expert in {context}
252
 
253
+ Your task is to extract the value for the field: {field}{filename_context}{field_descriptions_text}
254
 
255
  Consider the following page from the document:
256
  {page_text}
 
323
  filename = self.ctx.get("pdf_meta", {}).get("filename", "")
324
  filename_context = f"\nDocument filename: {filename}" if filename else ""
325
 
326
+ # Get field descriptions from context if available
327
+ field_descriptions = self.ctx.get("field_descriptions", {})
328
+ unique_indices_descriptions = self.ctx.get("unique_indices_descriptions", {})
329
+
330
+ # Format field descriptions for the prompt
331
+ field_descriptions_text = ""
332
+ if field_descriptions:
333
+ field_descriptions_text = "\nField descriptions:\n"
334
+ for field, desc_info in field_descriptions.items():
335
+ if isinstance(desc_info, dict):
336
+ description = desc_info.get('description', '')
337
+ format_info = desc_info.get('format', '')
338
+ examples = desc_info.get('examples', '')
339
+ possible_values = desc_info.get('possible_values', '')
340
+
341
+ desc_line = f" {field}:"
342
+ if description:
343
+ desc_line += f" {description}"
344
+ if format_info:
345
+ desc_line += f" (Format: {format_info})"
346
+ if examples:
347
+ desc_line += f" (Examples: {examples})"
348
+ if possible_values:
349
+ desc_line += f" (Possible Values: {possible_values})"
350
+ field_descriptions_text += desc_line + "\n"
351
+ else:
352
+ field_descriptions_text += f" {field}: {desc_info}\n"
353
+
354
+ # Format unique indices descriptions for the prompt
355
+ unique_indices_text = ""
356
+ if unique_indices_descriptions:
357
+ unique_indices_text = "\nUnique indices descriptions:\n"
358
+ for index, desc_info in unique_indices_descriptions.items():
359
+ if isinstance(desc_info, dict):
360
+ description = desc_info.get('description', '')
361
+ format_info = desc_info.get('format', '')
362
+ examples = desc_info.get('examples', '')
363
+ possible_values = desc_info.get('possible_values', '')
364
+
365
+ desc_line = f" {index}:"
366
+ if description:
367
+ desc_line += f" {description}"
368
+ if format_info:
369
+ desc_line += f" (Format: {format_info})"
370
+ if examples:
371
+ desc_line += f" (Examples: {examples})"
372
+ if possible_values:
373
+ desc_line += f" (Possible Values: {possible_values})"
374
+ unique_indices_text += desc_line + "\n"
375
+ else:
376
+ unique_indices_text += f" {index}: {desc_info}\n"
377
+
378
  prompt = f"""You are an expert in {context}
379
 
380
  Your task is to extract information from the document based on unique combinations of indices and their corresponding fields.
381
 
382
  Unique Indices to look for: {', '.join(unique_indices)}
383
+ Fields to extract for each combination: {', '.join(fields_to_extract)}{filename_context}{field_descriptions_text}{unique_indices_text}
384
 
385
  Consider the following document:
386
  {text}
src/agents/unique_indices_combinator.py CHANGED
@@ -61,8 +61,29 @@ class UniqueIndicesCombinator(BaseAgent):
61
  self.logger.info("Starting _extract_unique_combinations")
62
  self.logger.info(f"Processing {len(unique_indices)} unique indices")
63
 
64
- # Format the descriptions for the prompt
65
- descriptions_text = "\n".join([f" {index}: {desc}" for index, desc in unique_indices_descriptions.items()])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
  prompt = f"""You are an AI assistant tasked with helping out argenx employees in the context of biotech, drug discovery, and drug development.
68
  Your task is to assist the argenx team in retrieving all the unique combinations of indices from a given PDF.
 
61
  self.logger.info("Starting _extract_unique_combinations")
62
  self.logger.info(f"Processing {len(unique_indices)} unique indices")
63
 
64
+ # Format the descriptions for the prompt with enhanced information
65
+ descriptions_text = ""
66
+ for index, desc_info in unique_indices_descriptions.items():
67
+ if isinstance(desc_info, dict):
68
+ # Enhanced format with description, format, examples, and possible values
69
+ description = desc_info.get('description', '')
70
+ format_info = desc_info.get('format', '')
71
+ examples = desc_info.get('examples', '')
72
+ possible_values = desc_info.get('possible_values', '')
73
+
74
+ desc_line = f" {index}:"
75
+ if description:
76
+ desc_line += f" {description}"
77
+ if format_info:
78
+ desc_line += f" (Format: {format_info})"
79
+ if examples:
80
+ desc_line += f" (Examples: {examples})"
81
+ if possible_values:
82
+ desc_line += f" (Possible Values: {possible_values})"
83
+ descriptions_text += desc_line + "\n"
84
+ else:
85
+ # Fallback for simple string descriptions
86
+ descriptions_text += f" {index}: {desc_info}\n"
87
 
88
  prompt = f"""You are an AI assistant tasked with helping out argenx employees in the context of biotech, drug discovery, and drug development.
89
  Your task is to assist the argenx team in retrieving all the unique combinations of indices from a given PDF.
src/app.py CHANGED
@@ -232,8 +232,108 @@ else: # page == "Execution"
232
  st.title("Deep‑Research PDF Field Extractor (POC)")
233
 
234
  pdf_file = st.file_uploader("Upload PDF", type=["pdf"])
235
- fields_str = st.text_input("Fields (comma‑separated)", "Protein Lot, Chain, Residue")
236
- desc_blob = st.text_area("Field descriptions / rules (YAML, optional)")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
237
 
238
  # Add strategy selector
239
  strategy = st.radio(
@@ -246,38 +346,114 @@ else: # page == "Execution"
246
  unique_indices = None
247
  unique_indices_descriptions = None
248
  if strategy == "Unique Indices Strategy":
249
- unique_indices_str = st.text_input(
250
- "Unique Fields (comma-separated)",
251
- help="Enter the field names that uniquely identify each record (e.g., 'timepoint, Modification, peptide')"
252
- )
253
- if unique_indices_str:
254
- unique_indices = [idx.strip() for idx in unique_indices_str.split(",") if idx.strip()]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
255
 
256
- # Add descriptions for each unique index
257
- st.subheader("Unique Fields Descriptions")
258
- st.markdown("""
259
- Please provide a description for each unique field. This helps the system better understand what to look for.
260
- Example:
261
- ```
262
- Protein Lot: Batch number of the Proteins
263
- Timepoint: Time at which modification was measured (e.g., 0w, 2w, 4w)
264
- Modification: Type of post-translational modification
265
- Peptide: Peptide sequence containing the modification
266
- ```
267
- """)
268
- unique_indices_descriptions_str = st.text_area(
269
- "Unique Fields Descriptions (YAML format)",
270
- help="Enter descriptions for each unique field in YAML format"
271
- )
272
- if unique_indices_descriptions_str:
273
- try:
274
- unique_indices_descriptions = yaml.safe_load(unique_indices_descriptions_str)
275
- if not isinstance(unique_indices_descriptions, dict):
276
- st.error("Descriptions must be in YAML format with field names as keys")
277
- unique_indices_descriptions = None
278
- except yaml.YAMLError as e:
279
- st.error(f"Invalid YAML format: {e}")
280
- unique_indices_descriptions = None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
281
 
282
  def flatten_json_response(json_data, fields):
283
  """Flatten the nested JSON response into a tabular structure with dynamic columns."""
@@ -351,7 +527,7 @@ else: # page == "Execution"
351
 
352
  if st.button("Run extraction") and pdf_file:
353
  field_list = [f.strip() for f in fields_str.split(",") if f.strip()]
354
- field_descs = yaml.safe_load(desc_blob) if desc_blob.strip() else {}
355
 
356
  try:
357
  with st.spinner("Planning …"):
 
232
  st.title("Deep‑Research PDF Field Extractor (POC)")
233
 
234
  pdf_file = st.file_uploader("Upload PDF", type=["pdf"])
235
+ fields_str = st.text_input("Fields (comma‑separated)", "Chain, Percentage, Seq Loc")
236
+
237
+ # Replace YAML text area with table format for field descriptions
238
+ st.subheader("Field Descriptions")
239
+ st.markdown("""
240
+ Add field descriptions to help the system better understand what to extract.
241
+ You can add multiple rows to describe different aspects of each field.
242
+ """)
243
+
244
+ # Initialize session state for field descriptions table
245
+ if 'field_descriptions_table' not in st.session_state:
246
+ # Prefill with the provided JSON data for regular fields
247
+ st.session_state.field_descriptions_table = [
248
+ {
249
+ 'field_name': 'Chain',
250
+ 'field_description': 'Refers to either the heavy chain (HC) or light chain (LC) of an antibody or protein construct, each analyzed separately for structural integrity and chemical modifications.',
251
+ 'format': 'String',
252
+ 'examples': 'Heavy',
253
+ 'possible_values': 'Heavy, Light'
254
+ },
255
+ {
256
+ 'field_name': 'Percentage',
257
+ 'field_description': 'The relative abundance of a specific modification or peptide, typically quantified using extracted ion chromatograms (EICs) and expressed as a percentage of the total signal.',
258
+ 'format': 'Float',
259
+ 'examples': '90.0',
260
+ 'possible_values': ''
261
+ },
262
+ {
263
+ 'field_name': 'Seq Loc',
264
+ 'field_description': 'The specific amino acid position(s) within the protein sequence where a peptide or modification is located, often denoted by residue numbers and chain type (e.g., HC(88–125)).',
265
+ 'format': 'String',
266
+ 'examples': 'HC(1-31)',
267
+ 'possible_values': ''
268
+ }
269
+ ]
270
+
271
+ # Create the table interface
272
+ col1, col2, col3, col4, col5, col6 = st.columns([2, 3, 2, 2, 2, 1])
273
+
274
+ with col1:
275
+ st.markdown("**Field Name**")
276
+ with col2:
277
+ st.markdown("**Field Description**")
278
+ with col3:
279
+ st.markdown("**Format**")
280
+ with col4:
281
+ st.markdown("**Examples**")
282
+ with col5:
283
+ st.markdown("**Possible Values**")
284
+ with col6:
285
+ st.markdown("**Actions**")
286
+
287
+ # Display existing rows
288
+ for i, row in enumerate(st.session_state.field_descriptions_table):
289
+ col1, col2, col3, col4, col5, col6 = st.columns([2, 3, 2, 2, 2, 1])
290
+
291
+ with col1:
292
+ field_name = st.text_input("", value=row.get('field_name', ''), key=f"field_name_{i}")
293
+ with col2:
294
+ field_desc = st.text_input("", value=row.get('field_description', ''), key=f"field_desc_{i}")
295
+ with col3:
296
+ field_format = st.text_input("", value=row.get('format', ''), key=f"field_format_{i}")
297
+ with col4:
298
+ field_examples = st.text_input("", value=row.get('examples', ''), key=f"field_examples_{i}")
299
+ with col5:
300
+ field_possible_values = st.text_input("", value=row.get('possible_values', ''), key=f"field_possible_values_{i}")
301
+ with col6:
302
+ if st.button("Delete", key=f"delete_{i}"):
303
+ st.session_state.field_descriptions_table.pop(i)
304
+ st.rerun()
305
+
306
+ # Update the row in session state
307
+ st.session_state.field_descriptions_table[i] = {
308
+ 'field_name': field_name,
309
+ 'field_description': field_desc,
310
+ 'format': field_format,
311
+ 'examples': field_examples,
312
+ 'possible_values': field_possible_values
313
+ }
314
+
315
+ # Add new row button
316
+ if st.button("Add Field Description Row"):
317
+ st.session_state.field_descriptions_table.append({
318
+ 'field_name': '',
319
+ 'field_description': '',
320
+ 'format': '',
321
+ 'examples': '',
322
+ 'possible_values': ''
323
+ })
324
+ st.rerun()
325
+
326
+ # Convert table to JSON for processing
327
+ field_descs = {}
328
+ if st.session_state.field_descriptions_table:
329
+ for row in st.session_state.field_descriptions_table:
330
+ if row['field_name']: # Only include rows with field names
331
+ field_descs[row['field_name']] = {
332
+ 'description': row['field_description'],
333
+ 'format': row['format'],
334
+ 'examples': row['examples'],
335
+ 'possible_values': row['possible_values']
336
+ }
337
 
338
  # Add strategy selector
339
  strategy = st.radio(
 
346
  unique_indices = None
347
  unique_indices_descriptions = None
348
  if strategy == "Unique Indices Strategy":
349
+ # Add descriptions for each unique index using the same table format
350
+ st.subheader("Unique Fields Descriptions")
351
+ st.markdown("""
352
+ Please provide a description for each unique field. This helps the system better understand what to look for.
353
+ """)
354
+
355
+ # Initialize session state for unique indices descriptions table
356
+ if 'unique_indices_descriptions_table' not in st.session_state:
357
+ # Prefill with the provided JSON data for unique indices fields
358
+ st.session_state.unique_indices_descriptions_table = [
359
+ {
360
+ 'field_name': 'Protein Lot',
361
+ 'field_description': 'Protein lots are batches of protein constructs analyzed to detect potential liabilities affecting stability, efficacy, and safety. Key liabilities include clipping events, deamidation, cyclization, oxidation, thioether bond formation, and glycation. Analytical methods such as reduced protein analysis by RPLC-UV-MS and peptide map analysis in reducing conditions are used to identify and quantify these modifications.',
362
+ 'format': 'String',
363
+ 'examples': 'P066_FH0.7-0-hulgG-LALAPG-FJB',
364
+ 'possible_values': ''
365
+ },
366
+ {
367
+ 'field_name': 'Peptide',
368
+ 'field_description': 'A fragment of the protein sequence, typically derived from enzymatic digestion, used to detect and localize specific modifications or features.',
369
+ 'format': 'String',
370
+ 'examples': 'QVQLQQSGPGLVQPSQSLSITCTVSDFSLAR',
371
+ 'possible_values': ''
372
+ },
373
+ {
374
+ 'field_name': 'Timepoint',
375
+ 'field_description': 'A designated sampling moment in a stability or stress study, used to track changes in the protein over time under specific conditions.',
376
+ 'format': 'String',
377
+ 'examples': '0w',
378
+ 'possible_values': '0w, 2w, 4w, 6w'
379
+ },
380
+ {
381
+ 'field_name': 'Modification',
382
+ 'field_description': 'Any chemical or structural alteration to the protein or peptide, such as deamidation, oxidation, clipping, or glycation, which may affect function or stability.',
383
+ 'format': 'String',
384
+ 'examples': 'deamidation',
385
+ 'possible_values': 'Deamidation, Oxidation, Truncation, pyroE, Isomerization, N-glycosylation, NonConforming, pyroQ, Thioether, Clipping, O-glycosylation, Double deamidation'
386
+ }
387
+ ]
388
+
389
+ # Create the table interface for unique indices
390
+ col1, col2, col3, col4, col5, col6 = st.columns([2, 3, 2, 2, 2, 1])
391
+
392
+ with col1:
393
+ st.markdown("**Field Name**")
394
+ with col2:
395
+ st.markdown("**Field Description**")
396
+ with col3:
397
+ st.markdown("**Format**")
398
+ with col4:
399
+ st.markdown("**Examples**")
400
+ with col5:
401
+ st.markdown("**Possible Values**")
402
+ with col6:
403
+ st.markdown("**Actions**")
404
+
405
+ # Display existing rows for unique indices
406
+ for i, row in enumerate(st.session_state.unique_indices_descriptions_table):
407
+ col1, col2, col3, col4, col5, col6 = st.columns([2, 3, 2, 2, 2, 1])
408
 
409
+ with col1:
410
+ idx_field_name = st.text_input("", value=row.get('field_name', ''), key=f"unique_field_name_{i}")
411
+ with col2:
412
+ idx_field_desc = st.text_input("", value=row.get('field_description', ''), key=f"unique_field_desc_{i}")
413
+ with col3:
414
+ idx_field_format = st.text_input("", value=row.get('format', ''), key=f"unique_field_format_{i}")
415
+ with col4:
416
+ idx_field_examples = st.text_input("", value=row.get('examples', ''), key=f"unique_field_examples_{i}")
417
+ with col5:
418
+ idx_field_possible_values = st.text_input("", value=row.get('possible_values', ''), key=f"unique_field_possible_values_{i}")
419
+ with col6:
420
+ if st.button("Delete", key=f"unique_delete_{i}"):
421
+ st.session_state.unique_indices_descriptions_table.pop(i)
422
+ st.rerun()
423
+
424
+ # Update the row in session state
425
+ st.session_state.unique_indices_descriptions_table[i] = {
426
+ 'field_name': idx_field_name,
427
+ 'field_description': idx_field_desc,
428
+ 'format': idx_field_format,
429
+ 'examples': idx_field_examples,
430
+ 'possible_values': idx_field_possible_values
431
+ }
432
+
433
+ # Add new row button for unique indices
434
+ if st.button("Add Unique Field Description Row"):
435
+ st.session_state.unique_indices_descriptions_table.append({
436
+ 'field_name': '',
437
+ 'field_description': '',
438
+ 'format': '',
439
+ 'examples': '',
440
+ 'possible_values': ''
441
+ })
442
+ st.rerun()
443
+
444
+ # Convert unique indices table to JSON for processing and extract field names
445
+ unique_indices_descriptions = {}
446
+ unique_indices = []
447
+ if st.session_state.unique_indices_descriptions_table:
448
+ for row in st.session_state.unique_indices_descriptions_table:
449
+ if row['field_name']: # Only include rows with field names
450
+ unique_indices.append(row['field_name'])
451
+ unique_indices_descriptions[row['field_name']] = {
452
+ 'description': row['field_description'],
453
+ 'format': row['format'],
454
+ 'examples': row['examples'],
455
+ 'possible_values': row['possible_values']
456
+ }
457
 
458
  def flatten_json_response(json_data, fields):
459
  """Flatten the nested JSON response into a tabular structure with dynamic columns."""
 
527
 
528
  if st.button("Run extraction") and pdf_file:
529
  field_list = [f.strip() for f in fields_str.split(",") if f.strip()]
530
+ field_descs = field_descs
531
 
532
  try:
533
  with st.spinner("Planning …"):
src/orchestrator/__pycache__/executor.cpython-312.pyc CHANGED
Binary files a/src/orchestrator/__pycache__/executor.cpython-312.pyc and b/src/orchestrator/__pycache__/executor.cpython-312.pyc differ
 
src/orchestrator/__pycache__/planner.cpython-312.pyc CHANGED
Binary files a/src/orchestrator/__pycache__/planner.cpython-312.pyc and b/src/orchestrator/__pycache__/planner.cpython-312.pyc differ
 
src/orchestrator/executor.py CHANGED
@@ -71,7 +71,8 @@ class Executor:
71
  "cost_tracker": self.cost_tracker,
72
  "strategy": plan.get("strategy", "Original Strategy"), # Include the strategy
73
  "unique_indices": plan.get("unique_indices", []), # Include unique indices
74
- "unique_indices_descriptions": plan.get("unique_indices_descriptions", {}) # Include descriptions
 
75
  }
76
 
77
  self.logger.info("Initial context:")
 
71
  "cost_tracker": self.cost_tracker,
72
  "strategy": plan.get("strategy", "Original Strategy"), # Include the strategy
73
  "unique_indices": plan.get("unique_indices", []), # Include unique indices
74
+ "unique_indices_descriptions": plan.get("unique_indices_descriptions", {}), # Include descriptions
75
+ "field_descriptions": plan.get("field_descriptions", {}) # Include field descriptions
76
  }
77
 
78
  self.logger.info("Initial context:")
src/orchestrator/planner.py CHANGED
@@ -46,11 +46,12 @@ class Planner:
46
  logger.info(f"Fields: {fields}")
47
  logger.info(f"Unique indices: {unique_indices}")
48
  logger.info(f"Unique indices descriptions: {unique_indices_descriptions}")
 
49
 
50
  # For Unique Indices Strategy, use static plan directly
51
  if strategy == "Unique Indices Strategy":
52
  logger.info("Using static plan for Unique Indices Strategy")
53
- return self._static_plan(fields, strategy, unique_indices, unique_indices_descriptions)
54
 
55
  # For Original Strategy, try LLM first
56
  user_context = {
@@ -98,6 +99,8 @@ class Planner:
98
  plan["unique_indices"] = unique_indices
99
  if unique_indices_descriptions:
100
  plan["unique_indices_descriptions"] = unique_indices_descriptions
 
 
101
  return plan
102
  else:
103
  missing_keys = []
@@ -118,7 +121,7 @@ class Planner:
118
 
119
  # ---------- fallback static plan ----------
120
  logger.info("Falling back to static plan")
121
- return self._static_plan(fields, strategy, unique_indices, unique_indices_descriptions)
122
 
123
  # --------------------------------------------------
124
  @staticmethod
@@ -169,13 +172,14 @@ class Planner:
169
 
170
  # --------------------------------------------------
171
  @staticmethod
172
- def _static_plan(fields: List[str], strategy: str = "Original Strategy", unique_indices: List[str] | None = None, unique_indices_descriptions: Dict[str, str] | None = None) -> Dict[str, Any]:
173
  """Return a hard-coded plan to guarantee offline functionality."""
174
  logger.info("Generating static fallback plan")
175
  logger.info(f"Strategy: {strategy}")
176
  logger.info(f"Fields: {fields}")
177
  logger.info(f"Unique indices: {unique_indices}")
178
  logger.info(f"Unique indices descriptions: {unique_indices_descriptions}")
 
179
 
180
  if strategy == "Unique Indices Strategy":
181
  steps = [
@@ -209,6 +213,8 @@ class Planner:
209
  plan["unique_indices"] = unique_indices
210
  if unique_indices_descriptions:
211
  plan["unique_indices_descriptions"] = unique_indices_descriptions
 
 
212
 
213
  logger.info(f"Final plan: {json.dumps(plan, indent=2)}")
214
  return plan
 
46
  logger.info(f"Fields: {fields}")
47
  logger.info(f"Unique indices: {unique_indices}")
48
  logger.info(f"Unique indices descriptions: {unique_indices_descriptions}")
49
+ logger.info(f"Field descriptions: {field_descs}")
50
 
51
  # For Unique Indices Strategy, use static plan directly
52
  if strategy == "Unique Indices Strategy":
53
  logger.info("Using static plan for Unique Indices Strategy")
54
+ return self._static_plan(fields, strategy, unique_indices, unique_indices_descriptions, field_descs)
55
 
56
  # For Original Strategy, try LLM first
57
  user_context = {
 
99
  plan["unique_indices"] = unique_indices
100
  if unique_indices_descriptions:
101
  plan["unique_indices_descriptions"] = unique_indices_descriptions
102
+ if field_descs:
103
+ plan["field_descriptions"] = field_descs
104
  return plan
105
  else:
106
  missing_keys = []
 
121
 
122
  # ---------- fallback static plan ----------
123
  logger.info("Falling back to static plan")
124
+ return self._static_plan(fields, strategy, unique_indices, unique_indices_descriptions, field_descs)
125
 
126
  # --------------------------------------------------
127
  @staticmethod
 
172
 
173
  # --------------------------------------------------
174
  @staticmethod
175
+ def _static_plan(fields: List[str], strategy: str = "Original Strategy", unique_indices: List[str] | None = None, unique_indices_descriptions: Dict[str, str] | None = None, field_descs: Dict | None = None) -> Dict[str, Any]:
176
  """Return a hard-coded plan to guarantee offline functionality."""
177
  logger.info("Generating static fallback plan")
178
  logger.info(f"Strategy: {strategy}")
179
  logger.info(f"Fields: {fields}")
180
  logger.info(f"Unique indices: {unique_indices}")
181
  logger.info(f"Unique indices descriptions: {unique_indices_descriptions}")
182
+ logger.info(f"Field descriptions: {field_descs}")
183
 
184
  if strategy == "Unique Indices Strategy":
185
  steps = [
 
213
  plan["unique_indices"] = unique_indices
214
  if unique_indices_descriptions:
215
  plan["unique_indices_descriptions"] = unique_indices_descriptions
216
+ if field_descs:
217
+ plan["field_descriptions"] = field_descs
218
 
219
  logger.info(f"Final plan: {json.dumps(plan, indent=2)}")
220
  return plan
src/services/__pycache__/azure_di_service.cpython-312.pyc CHANGED
Binary files a/src/services/__pycache__/azure_di_service.cpython-312.pyc and b/src/services/__pycache__/azure_di_service.cpython-312.pyc differ