diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..dded946 --- /dev/null +++ b/404.html @@ -0,0 +1,856 @@ + + + + + + + + + + + + + + + + + + + + + PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..69fe55e --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/api/async_client/index.html b/api/async_client/index.html new file mode 100644 index 0000000..1ed0ec7 --- /dev/null +++ b/api/async_client/index.html @@ -0,0 +1,66835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Asynchronous Orthanc - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Asynchronous Orthanc

+ +
+ + + +

+ pyorthanc.AsyncOrthanc + + +

+ + +
+

+ Bases: AsyncClient

+ + +

Orthanc API

+

version 1.12.3 +This is the full documentation of the REST API of Orthanc.

This reference is automatically generated from the source code of Orthanc. A shorter cheat sheet is part of the Orthanc Book.

An earlier, manually crafted version from August 2019, is still available, but is not up-to-date anymore (source).

+ +
+ Source code in pyorthanc/async_client.py +
  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
+3056
+3057
+3058
+3059
+3060
+3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
+3091
+3092
+3093
+3094
+3095
+3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
+3119
+3120
+3121
+3122
+3123
+3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
+3149
+3150
+3151
+3152
+3153
+3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+3168
+3169
+3170
+3171
+3172
+3173
+3174
+3175
+3176
+3177
+3178
+3179
+3180
+3181
+3182
+3183
+3184
+3185
+3186
+3187
+3188
+3189
+3190
+3191
+3192
+3193
+3194
+3195
+3196
+3197
+3198
+3199
+3200
+3201
+3202
+3203
+3204
+3205
+3206
+3207
+3208
+3209
+3210
+3211
+3212
+3213
+3214
+3215
+3216
+3217
+3218
+3219
+3220
+3221
+3222
+3223
+3224
+3225
+3226
+3227
+3228
+3229
+3230
+3231
+3232
+3233
+3234
+3235
+3236
+3237
+3238
+3239
+3240
+3241
+3242
+3243
+3244
+3245
+3246
+3247
+3248
+3249
+3250
+3251
+3252
+3253
+3254
+3255
+3256
+3257
+3258
+3259
+3260
+3261
+3262
+3263
+3264
+3265
+3266
+3267
+3268
+3269
+3270
+3271
+3272
+3273
+3274
+3275
+3276
+3277
+3278
+3279
+3280
+3281
+3282
+3283
+3284
+3285
+3286
+3287
+3288
+3289
+3290
+3291
+3292
+3293
+3294
+3295
+3296
+3297
+3298
+3299
+3300
+3301
+3302
+3303
+3304
+3305
+3306
+3307
+3308
+3309
+3310
+3311
+3312
+3313
+3314
+3315
+3316
+3317
+3318
+3319
+3320
+3321
+3322
+3323
+3324
+3325
+3326
+3327
+3328
+3329
+3330
+3331
+3332
+3333
+3334
+3335
+3336
+3337
+3338
+3339
+3340
+3341
+3342
+3343
+3344
+3345
+3346
+3347
+3348
+3349
+3350
+3351
+3352
+3353
+3354
+3355
+3356
+3357
+3358
+3359
+3360
+3361
+3362
+3363
+3364
+3365
+3366
+3367
+3368
+3369
+3370
+3371
+3372
+3373
+3374
+3375
+3376
+3377
+3378
+3379
+3380
+3381
+3382
+3383
+3384
+3385
+3386
+3387
+3388
+3389
+3390
+3391
+3392
+3393
+3394
+3395
+3396
+3397
+3398
+3399
+3400
+3401
+3402
+3403
+3404
+3405
+3406
+3407
+3408
+3409
+3410
+3411
+3412
+3413
+3414
+3415
+3416
+3417
+3418
+3419
+3420
+3421
+3422
+3423
+3424
+3425
+3426
+3427
+3428
+3429
+3430
+3431
+3432
+3433
+3434
+3435
+3436
+3437
+3438
+3439
+3440
+3441
+3442
+3443
+3444
+3445
+3446
+3447
+3448
+3449
+3450
+3451
+3452
+3453
+3454
+3455
+3456
+3457
+3458
+3459
+3460
+3461
+3462
+3463
+3464
+3465
+3466
+3467
+3468
+3469
+3470
+3471
+3472
+3473
+3474
+3475
+3476
+3477
+3478
+3479
+3480
+3481
+3482
+3483
+3484
+3485
+3486
+3487
+3488
+3489
+3490
+3491
+3492
+3493
+3494
+3495
+3496
+3497
+3498
+3499
+3500
+3501
+3502
+3503
+3504
+3505
+3506
+3507
+3508
+3509
+3510
+3511
+3512
+3513
+3514
+3515
+3516
+3517
+3518
+3519
+3520
+3521
+3522
+3523
+3524
+3525
+3526
+3527
+3528
+3529
+3530
+3531
+3532
+3533
+3534
+3535
+3536
+3537
+3538
+3539
+3540
+3541
+3542
+3543
+3544
+3545
+3546
+3547
+3548
+3549
+3550
+3551
+3552
+3553
+3554
+3555
+3556
+3557
+3558
+3559
+3560
+3561
+3562
+3563
+3564
+3565
+3566
+3567
+3568
+3569
+3570
+3571
+3572
+3573
+3574
+3575
+3576
+3577
+3578
+3579
+3580
+3581
+3582
+3583
+3584
+3585
+3586
+3587
+3588
+3589
+3590
+3591
+3592
+3593
+3594
+3595
+3596
+3597
+3598
+3599
+3600
+3601
+3602
+3603
+3604
+3605
+3606
+3607
+3608
+3609
+3610
+3611
+3612
+3613
+3614
+3615
+3616
+3617
+3618
+3619
+3620
+3621
+3622
+3623
+3624
+3625
+3626
+3627
+3628
+3629
+3630
+3631
+3632
+3633
+3634
+3635
+3636
+3637
+3638
+3639
+3640
+3641
+3642
+3643
+3644
+3645
+3646
+3647
+3648
+3649
+3650
+3651
+3652
+3653
+3654
+3655
+3656
+3657
+3658
+3659
+3660
+3661
+3662
+3663
+3664
+3665
+3666
+3667
+3668
+3669
+3670
+3671
+3672
+3673
+3674
+3675
+3676
+3677
+3678
+3679
+3680
+3681
+3682
+3683
+3684
+3685
+3686
+3687
+3688
+3689
+3690
+3691
+3692
+3693
+3694
+3695
+3696
+3697
+3698
+3699
+3700
+3701
+3702
+3703
+3704
+3705
+3706
+3707
+3708
+3709
+3710
+3711
+3712
+3713
+3714
+3715
+3716
+3717
+3718
+3719
+3720
+3721
+3722
+3723
+3724
+3725
+3726
+3727
+3728
+3729
+3730
+3731
+3732
+3733
+3734
+3735
+3736
+3737
+3738
+3739
+3740
+3741
+3742
+3743
+3744
+3745
+3746
+3747
+3748
+3749
+3750
+3751
+3752
+3753
+3754
+3755
+3756
+3757
+3758
+3759
+3760
+3761
+3762
+3763
+3764
+3765
+3766
+3767
+3768
+3769
+3770
+3771
+3772
+3773
+3774
+3775
+3776
+3777
+3778
+3779
+3780
+3781
+3782
+3783
+3784
+3785
+3786
+3787
+3788
+3789
+3790
+3791
+3792
+3793
+3794
+3795
+3796
+3797
+3798
+3799
+3800
+3801
+3802
+3803
+3804
+3805
+3806
+3807
+3808
+3809
+3810
+3811
+3812
+3813
+3814
+3815
+3816
+3817
+3818
+3819
+3820
+3821
+3822
+3823
+3824
+3825
+3826
+3827
+3828
+3829
+3830
+3831
+3832
+3833
+3834
+3835
+3836
+3837
+3838
+3839
+3840
+3841
+3842
+3843
+3844
+3845
+3846
+3847
+3848
+3849
+3850
+3851
+3852
+3853
+3854
+3855
+3856
+3857
+3858
+3859
+3860
+3861
+3862
+3863
+3864
+3865
+3866
+3867
+3868
+3869
+3870
+3871
+3872
+3873
+3874
+3875
+3876
+3877
+3878
+3879
+3880
+3881
+3882
+3883
+3884
+3885
+3886
+3887
+3888
+3889
+3890
+3891
+3892
+3893
+3894
+3895
+3896
+3897
+3898
+3899
+3900
+3901
+3902
+3903
+3904
+3905
+3906
+3907
+3908
+3909
+3910
+3911
+3912
+3913
+3914
+3915
+3916
+3917
+3918
+3919
+3920
+3921
+3922
+3923
+3924
+3925
+3926
+3927
+3928
+3929
+3930
+3931
+3932
+3933
+3934
+3935
+3936
+3937
+3938
+3939
+3940
+3941
+3942
+3943
+3944
+3945
+3946
+3947
+3948
+3949
+3950
+3951
+3952
+3953
+3954
+3955
+3956
+3957
+3958
+3959
+3960
+3961
+3962
+3963
+3964
+3965
+3966
+3967
+3968
+3969
+3970
+3971
+3972
+3973
+3974
+3975
+3976
+3977
+3978
+3979
+3980
+3981
+3982
+3983
+3984
+3985
+3986
+3987
+3988
+3989
+3990
+3991
+3992
+3993
+3994
+3995
+3996
+3997
+3998
+3999
+4000
+4001
+4002
+4003
+4004
+4005
+4006
+4007
+4008
+4009
+4010
+4011
+4012
+4013
+4014
+4015
+4016
+4017
+4018
+4019
+4020
+4021
+4022
+4023
+4024
+4025
+4026
+4027
+4028
+4029
+4030
+4031
+4032
+4033
+4034
+4035
+4036
+4037
+4038
+4039
+4040
+4041
+4042
+4043
+4044
+4045
+4046
+4047
+4048
+4049
+4050
+4051
+4052
+4053
+4054
+4055
+4056
+4057
+4058
+4059
+4060
+4061
+4062
+4063
+4064
+4065
+4066
+4067
+4068
+4069
+4070
+4071
+4072
+4073
+4074
+4075
+4076
+4077
+4078
+4079
+4080
+4081
+4082
+4083
+4084
+4085
+4086
+4087
+4088
+4089
+4090
+4091
+4092
+4093
+4094
+4095
+4096
+4097
+4098
+4099
+4100
+4101
+4102
+4103
+4104
+4105
+4106
+4107
+4108
+4109
+4110
+4111
+4112
+4113
+4114
+4115
+4116
+4117
+4118
+4119
+4120
+4121
+4122
+4123
+4124
+4125
+4126
+4127
+4128
+4129
+4130
+4131
+4132
+4133
+4134
+4135
+4136
+4137
+4138
+4139
+4140
+4141
+4142
+4143
+4144
+4145
+4146
+4147
+4148
+4149
+4150
+4151
+4152
+4153
+4154
+4155
+4156
+4157
+4158
+4159
+4160
+4161
+4162
+4163
+4164
+4165
+4166
+4167
+4168
+4169
+4170
+4171
+4172
+4173
+4174
+4175
+4176
+4177
+4178
+4179
+4180
+4181
+4182
+4183
+4184
+4185
+4186
+4187
+4188
+4189
+4190
+4191
+4192
+4193
+4194
+4195
+4196
+4197
+4198
+4199
+4200
+4201
+4202
+4203
+4204
+4205
+4206
+4207
+4208
+4209
+4210
+4211
+4212
+4213
+4214
+4215
+4216
+4217
+4218
+4219
+4220
+4221
+4222
+4223
+4224
+4225
+4226
+4227
+4228
+4229
+4230
+4231
+4232
+4233
+4234
+4235
+4236
+4237
+4238
+4239
+4240
+4241
+4242
+4243
+4244
+4245
+4246
+4247
+4248
+4249
+4250
+4251
+4252
+4253
+4254
+4255
+4256
+4257
+4258
+4259
+4260
+4261
+4262
+4263
+4264
+4265
+4266
+4267
+4268
+4269
+4270
+4271
+4272
+4273
+4274
+4275
+4276
+4277
+4278
+4279
+4280
+4281
+4282
+4283
+4284
+4285
+4286
+4287
+4288
+4289
+4290
+4291
+4292
+4293
+4294
+4295
+4296
+4297
+4298
+4299
+4300
+4301
+4302
+4303
+4304
+4305
+4306
+4307
+4308
+4309
+4310
+4311
+4312
+4313
+4314
+4315
+4316
+4317
+4318
+4319
+4320
+4321
+4322
+4323
+4324
+4325
+4326
+4327
+4328
+4329
+4330
+4331
+4332
+4333
+4334
+4335
+4336
+4337
+4338
+4339
+4340
+4341
+4342
+4343
+4344
+4345
+4346
+4347
+4348
+4349
+4350
+4351
+4352
+4353
+4354
+4355
+4356
+4357
+4358
+4359
+4360
+4361
+4362
+4363
+4364
+4365
+4366
+4367
+4368
+4369
+4370
+4371
+4372
+4373
+4374
+4375
+4376
+4377
+4378
+4379
+4380
+4381
+4382
+4383
+4384
+4385
+4386
+4387
+4388
+4389
+4390
+4391
+4392
+4393
+4394
+4395
+4396
+4397
+4398
+4399
+4400
+4401
+4402
+4403
+4404
+4405
+4406
+4407
+4408
+4409
+4410
+4411
+4412
+4413
+4414
+4415
+4416
+4417
+4418
+4419
+4420
+4421
+4422
+4423
+4424
+4425
+4426
+4427
+4428
+4429
+4430
+4431
+4432
+4433
+4434
+4435
+4436
+4437
+4438
+4439
+4440
+4441
+4442
+4443
+4444
+4445
+4446
+4447
+4448
+4449
+4450
+4451
+4452
+4453
+4454
+4455
+4456
+4457
+4458
+4459
+4460
+4461
+4462
+4463
+4464
+4465
+4466
+4467
+4468
+4469
+4470
+4471
+4472
+4473
+4474
+4475
+4476
+4477
+4478
+4479
+4480
+4481
+4482
+4483
+4484
+4485
+4486
+4487
+4488
+4489
+4490
+4491
+4492
+4493
+4494
+4495
+4496
+4497
+4498
+4499
+4500
+4501
+4502
+4503
+4504
+4505
+4506
+4507
+4508
+4509
+4510
+4511
+4512
+4513
+4514
+4515
+4516
+4517
+4518
+4519
+4520
+4521
+4522
+4523
+4524
+4525
+4526
+4527
+4528
+4529
+4530
+4531
+4532
+4533
+4534
+4535
+4536
+4537
+4538
+4539
+4540
+4541
+4542
+4543
+4544
+4545
+4546
+4547
+4548
+4549
+4550
+4551
+4552
+4553
+4554
+4555
+4556
+4557
+4558
+4559
+4560
+4561
+4562
+4563
+4564
+4565
+4566
+4567
+4568
+4569
+4570
+4571
+4572
+4573
+4574
+4575
+4576
+4577
+4578
+4579
+4580
+4581
+4582
+4583
+4584
+4585
+4586
+4587
+4588
+4589
+4590
+4591
+4592
+4593
+4594
+4595
+4596
+4597
+4598
+4599
+4600
+4601
+4602
+4603
+4604
+4605
+4606
+4607
+4608
+4609
+4610
+4611
+4612
+4613
+4614
+4615
+4616
+4617
+4618
+4619
+4620
+4621
+4622
+4623
+4624
+4625
+4626
+4627
+4628
+4629
+4630
+4631
+4632
+4633
+4634
+4635
+4636
+4637
+4638
+4639
+4640
+4641
+4642
+4643
+4644
+4645
+4646
+4647
+4648
+4649
+4650
+4651
+4652
+4653
+4654
+4655
+4656
+4657
+4658
+4659
+4660
+4661
+4662
+4663
+4664
+4665
+4666
+4667
+4668
+4669
+4670
+4671
+4672
+4673
+4674
+4675
+4676
+4677
+4678
+4679
+4680
+4681
+4682
+4683
+4684
+4685
+4686
+4687
+4688
+4689
+4690
+4691
+4692
+4693
+4694
+4695
+4696
+4697
+4698
+4699
+4700
+4701
+4702
+4703
+4704
+4705
+4706
+4707
+4708
+4709
+4710
+4711
+4712
+4713
+4714
+4715
+4716
+4717
+4718
+4719
+4720
+4721
+4722
+4723
+4724
+4725
+4726
+4727
+4728
+4729
+4730
+4731
+4732
+4733
+4734
+4735
+4736
+4737
+4738
+4739
+4740
+4741
+4742
+4743
+4744
+4745
+4746
+4747
+4748
+4749
+4750
+4751
+4752
+4753
+4754
+4755
+4756
+4757
+4758
+4759
+4760
+4761
+4762
+4763
+4764
+4765
+4766
+4767
+4768
+4769
+4770
+4771
+4772
+4773
+4774
+4775
+4776
+4777
+4778
+4779
+4780
+4781
+4782
+4783
+4784
+4785
+4786
+4787
+4788
+4789
+4790
+4791
+4792
+4793
+4794
+4795
+4796
+4797
+4798
+4799
+4800
+4801
+4802
+4803
+4804
+4805
+4806
+4807
+4808
+4809
+4810
+4811
+4812
+4813
+4814
+4815
+4816
+4817
+4818
+4819
+4820
+4821
+4822
+4823
+4824
+4825
+4826
+4827
+4828
+4829
+4830
+4831
+4832
+4833
+4834
+4835
+4836
+4837
+4838
+4839
+4840
+4841
+4842
+4843
+4844
+4845
+4846
+4847
+4848
+4849
+4850
+4851
+4852
+4853
+4854
+4855
+4856
+4857
+4858
+4859
+4860
+4861
+4862
+4863
+4864
+4865
+4866
+4867
+4868
+4869
+4870
+4871
+4872
+4873
+4874
+4875
+4876
+4877
+4878
+4879
+4880
+4881
+4882
+4883
+4884
+4885
+4886
+4887
+4888
+4889
+4890
+4891
+4892
+4893
+4894
+4895
+4896
+4897
+4898
+4899
+4900
+4901
+4902
+4903
+4904
+4905
+4906
+4907
+4908
+4909
+4910
+4911
+4912
+4913
+4914
+4915
+4916
+4917
+4918
+4919
+4920
+4921
+4922
+4923
+4924
+4925
+4926
+4927
+4928
+4929
+4930
+4931
+4932
+4933
+4934
+4935
+4936
+4937
+4938
+4939
+4940
+4941
+4942
+4943
+4944
+4945
+4946
+4947
+4948
+4949
+4950
+4951
+4952
+4953
+4954
+4955
+4956
+4957
+4958
+4959
+4960
+4961
+4962
+4963
+4964
+4965
+4966
+4967
+4968
+4969
+4970
+4971
+4972
+4973
+4974
+4975
+4976
+4977
+4978
+4979
+4980
+4981
+4982
+4983
+4984
+4985
+4986
+4987
+4988
+4989
+4990
+4991
+4992
+4993
+4994
+4995
+4996
+4997
+4998
+4999
+5000
+5001
+5002
+5003
+5004
+5005
+5006
+5007
+5008
+5009
+5010
+5011
+5012
+5013
+5014
+5015
+5016
+5017
+5018
+5019
+5020
+5021
+5022
+5023
+5024
+5025
+5026
+5027
+5028
+5029
+5030
+5031
+5032
+5033
+5034
+5035
+5036
+5037
+5038
+5039
+5040
+5041
+5042
+5043
+5044
+5045
+5046
+5047
+5048
+5049
+5050
+5051
+5052
+5053
+5054
+5055
+5056
+5057
+5058
+5059
+5060
+5061
+5062
+5063
+5064
+5065
+5066
+5067
+5068
+5069
+5070
+5071
+5072
+5073
+5074
+5075
+5076
+5077
+5078
+5079
+5080
+5081
+5082
+5083
+5084
+5085
+5086
+5087
+5088
+5089
+5090
+5091
+5092
+5093
+5094
+5095
+5096
+5097
+5098
+5099
+5100
+5101
+5102
+5103
+5104
+5105
+5106
+5107
+5108
+5109
+5110
+5111
+5112
+5113
+5114
+5115
+5116
+5117
+5118
+5119
+5120
+5121
+5122
+5123
+5124
+5125
+5126
+5127
+5128
+5129
+5130
+5131
+5132
+5133
+5134
+5135
+5136
+5137
+5138
+5139
+5140
+5141
+5142
+5143
+5144
+5145
+5146
+5147
+5148
+5149
+5150
+5151
+5152
+5153
+5154
+5155
+5156
+5157
+5158
+5159
+5160
+5161
+5162
+5163
+5164
+5165
+5166
+5167
+5168
+5169
+5170
+5171
+5172
+5173
+5174
+5175
+5176
+5177
+5178
+5179
+5180
+5181
+5182
+5183
+5184
+5185
+5186
+5187
+5188
+5189
+5190
+5191
+5192
+5193
+5194
+5195
+5196
+5197
+5198
+5199
+5200
+5201
+5202
+5203
+5204
+5205
+5206
+5207
+5208
+5209
+5210
+5211
+5212
+5213
+5214
+5215
+5216
+5217
+5218
+5219
+5220
+5221
+5222
+5223
+5224
+5225
+5226
+5227
+5228
+5229
+5230
+5231
+5232
+5233
+5234
+5235
+5236
+5237
+5238
+5239
+5240
+5241
+5242
+5243
+5244
+5245
+5246
+5247
+5248
+5249
+5250
+5251
+5252
+5253
+5254
+5255
+5256
+5257
+5258
+5259
+5260
+5261
+5262
+5263
+5264
+5265
+5266
+5267
+5268
+5269
+5270
+5271
+5272
+5273
+5274
+5275
+5276
+5277
+5278
+5279
+5280
+5281
+5282
+5283
+5284
+5285
+5286
+5287
+5288
+5289
+5290
+5291
+5292
+5293
+5294
+5295
+5296
+5297
+5298
+5299
+5300
+5301
+5302
+5303
+5304
+5305
+5306
+5307
+5308
+5309
+5310
+5311
+5312
+5313
+5314
+5315
+5316
+5317
+5318
+5319
+5320
+5321
+5322
+5323
+5324
+5325
+5326
+5327
+5328
+5329
+5330
+5331
+5332
+5333
+5334
+5335
+5336
+5337
+5338
+5339
+5340
+5341
+5342
+5343
+5344
+5345
+5346
+5347
+5348
+5349
+5350
+5351
+5352
+5353
+5354
+5355
+5356
+5357
+5358
+5359
+5360
+5361
+5362
+5363
+5364
+5365
+5366
+5367
+5368
+5369
+5370
+5371
+5372
+5373
+5374
+5375
+5376
+5377
+5378
+5379
+5380
+5381
+5382
+5383
+5384
+5385
+5386
+5387
+5388
+5389
+5390
+5391
+5392
+5393
+5394
+5395
+5396
+5397
+5398
+5399
+5400
+5401
+5402
+5403
+5404
+5405
+5406
+5407
+5408
+5409
+5410
+5411
+5412
+5413
+5414
+5415
+5416
+5417
+5418
+5419
+5420
+5421
+5422
+5423
+5424
+5425
+5426
+5427
+5428
+5429
+5430
+5431
+5432
+5433
+5434
+5435
+5436
+5437
+5438
+5439
+5440
+5441
+5442
+5443
+5444
+5445
+5446
+5447
+5448
+5449
+5450
+5451
+5452
+5453
+5454
+5455
+5456
+5457
+5458
+5459
+5460
+5461
+5462
+5463
+5464
+5465
+5466
+5467
+5468
+5469
+5470
+5471
+5472
+5473
+5474
+5475
+5476
+5477
+5478
+5479
+5480
+5481
+5482
+5483
+5484
+5485
+5486
+5487
+5488
+5489
+5490
+5491
+5492
+5493
+5494
+5495
+5496
+5497
+5498
+5499
+5500
+5501
+5502
+5503
+5504
+5505
+5506
+5507
+5508
+5509
+5510
+5511
+5512
+5513
+5514
+5515
+5516
+5517
+5518
+5519
+5520
+5521
+5522
+5523
+5524
+5525
+5526
+5527
+5528
+5529
+5530
+5531
+5532
+5533
+5534
+5535
+5536
+5537
+5538
+5539
+5540
+5541
+5542
+5543
+5544
+5545
+5546
+5547
+5548
+5549
+5550
+5551
+5552
+5553
+5554
+5555
+5556
+5557
+5558
+5559
+5560
+5561
+5562
+5563
+5564
+5565
+5566
+5567
+5568
+5569
+5570
+5571
+5572
+5573
+5574
+5575
+5576
+5577
+5578
+5579
+5580
+5581
+5582
+5583
+5584
+5585
+5586
+5587
+5588
+5589
+5590
+5591
+5592
+5593
+5594
+5595
+5596
+5597
+5598
+5599
+5600
+5601
+5602
+5603
+5604
+5605
+5606
+5607
+5608
+5609
+5610
+5611
+5612
+5613
+5614
+5615
+5616
+5617
+5618
+5619
+5620
+5621
+5622
+5623
+5624
+5625
+5626
+5627
+5628
+5629
+5630
+5631
+5632
+5633
+5634
+5635
+5636
+5637
+5638
+5639
+5640
+5641
+5642
+5643
+5644
+5645
+5646
+5647
+5648
+5649
+5650
+5651
+5652
+5653
+5654
+5655
+5656
+5657
+5658
+5659
+5660
+5661
+5662
+5663
+5664
+5665
+5666
+5667
+5668
+5669
+5670
+5671
+5672
+5673
+5674
+5675
+5676
+5677
+5678
+5679
+5680
+5681
+5682
+5683
+5684
+5685
+5686
+5687
+5688
+5689
+5690
+5691
+5692
+5693
+5694
+5695
+5696
+5697
+5698
+5699
+5700
+5701
+5702
+5703
+5704
+5705
+5706
+5707
+5708
+5709
+5710
+5711
+5712
+5713
+5714
+5715
+5716
+5717
+5718
+5719
+5720
+5721
+5722
+5723
+5724
+5725
+5726
+5727
+5728
+5729
+5730
+5731
+5732
+5733
+5734
+5735
+5736
+5737
+5738
+5739
+5740
+5741
+5742
+5743
+5744
+5745
+5746
+5747
+5748
+5749
+5750
+5751
+5752
+5753
+5754
+5755
+5756
+5757
+5758
+5759
+5760
+5761
+5762
+5763
+5764
+5765
+5766
+5767
+5768
+5769
+5770
+5771
+5772
+5773
+5774
+5775
+5776
+5777
+5778
+5779
+5780
+5781
+5782
+5783
+5784
+5785
+5786
+5787
+5788
+5789
+5790
+5791
+5792
+5793
+5794
+5795
+5796
+5797
+5798
+5799
+5800
+5801
+5802
+5803
+5804
+5805
+5806
+5807
+5808
+5809
+5810
+5811
+5812
+5813
+5814
+5815
+5816
+5817
+5818
+5819
+5820
+5821
+5822
+5823
+5824
+5825
+5826
+5827
+5828
+5829
+5830
+5831
+5832
+5833
+5834
+5835
+5836
+5837
+5838
+5839
+5840
+5841
+5842
+5843
+5844
+5845
+5846
+5847
+5848
+5849
+5850
+5851
+5852
+5853
+5854
+5855
+5856
+5857
+5858
+5859
+5860
+5861
+5862
+5863
+5864
+5865
+5866
+5867
+5868
+5869
+5870
+5871
+5872
+5873
+5874
+5875
+5876
+5877
+5878
+5879
+5880
+5881
+5882
+5883
+5884
+5885
+5886
+5887
+5888
+5889
+5890
+5891
+5892
+5893
+5894
+5895
+5896
+5897
+5898
+5899
+5900
+5901
+5902
+5903
+5904
+5905
+5906
+5907
+5908
+5909
+5910
+5911
+5912
+5913
+5914
+5915
+5916
+5917
+5918
+5919
+5920
+5921
+5922
+5923
+5924
+5925
+5926
+5927
+5928
+5929
+5930
+5931
+5932
+5933
+5934
+5935
+5936
+5937
+5938
+5939
+5940
+5941
+5942
+5943
+5944
+5945
+5946
+5947
+5948
+5949
+5950
+5951
+5952
+5953
+5954
+5955
+5956
+5957
+5958
+5959
+5960
+5961
+5962
+5963
+5964
+5965
+5966
+5967
+5968
+5969
+5970
+5971
+5972
+5973
+5974
+5975
+5976
+5977
+5978
+5979
+5980
+5981
+5982
+5983
+5984
+5985
+5986
+5987
+5988
+5989
+5990
+5991
+5992
+5993
+5994
+5995
+5996
+5997
+5998
+5999
+6000
+6001
+6002
+6003
+6004
+6005
+6006
+6007
+6008
+6009
+6010
+6011
+6012
+6013
+6014
+6015
+6016
+6017
+6018
+6019
+6020
+6021
+6022
+6023
+6024
+6025
+6026
+6027
+6028
+6029
+6030
+6031
+6032
+6033
+6034
+6035
+6036
+6037
+6038
+6039
+6040
+6041
+6042
+6043
+6044
+6045
+6046
+6047
+6048
+6049
+6050
+6051
+6052
+6053
+6054
+6055
+6056
+6057
+6058
+6059
+6060
+6061
+6062
+6063
+6064
+6065
+6066
+6067
+6068
+6069
+6070
+6071
+6072
+6073
+6074
+6075
+6076
+6077
+6078
+6079
+6080
+6081
+6082
+6083
+6084
+6085
+6086
+6087
+6088
+6089
+6090
+6091
+6092
+6093
+6094
+6095
+6096
+6097
+6098
+6099
+6100
+6101
+6102
+6103
+6104
+6105
+6106
+6107
+6108
+6109
+6110
+6111
+6112
+6113
+6114
+6115
+6116
+6117
+6118
+6119
+6120
+6121
+6122
+6123
+6124
+6125
+6126
+6127
+6128
+6129
+6130
+6131
+6132
+6133
+6134
+6135
+6136
+6137
+6138
+6139
+6140
+6141
+6142
+6143
+6144
+6145
+6146
+6147
+6148
+6149
+6150
+6151
+6152
+6153
+6154
+6155
+6156
+6157
+6158
+6159
+6160
+6161
+6162
+6163
+6164
+6165
+6166
+6167
+6168
+6169
+6170
+6171
+6172
+6173
+6174
+6175
+6176
+6177
+6178
+6179
+6180
+6181
+6182
+6183
+6184
+6185
+6186
+6187
+6188
+6189
+6190
+6191
+6192
+6193
+6194
+6195
+6196
+6197
+6198
+6199
+6200
+6201
+6202
+6203
+6204
+6205
+6206
+6207
+6208
+6209
+6210
+6211
+6212
+6213
+6214
+6215
+6216
+6217
+6218
+6219
+6220
+6221
+6222
+6223
+6224
+6225
+6226
+6227
+6228
+6229
+6230
+6231
+6232
+6233
+6234
+6235
+6236
+6237
+6238
+6239
+6240
+6241
+6242
+6243
+6244
+6245
+6246
+6247
+6248
+6249
+6250
+6251
+6252
+6253
+6254
+6255
+6256
+6257
+6258
+6259
+6260
+6261
+6262
+6263
+6264
+6265
+6266
+6267
+6268
+6269
+6270
+6271
+6272
+6273
+6274
+6275
+6276
+6277
+6278
+6279
+6280
+6281
+6282
+6283
+6284
+6285
+6286
+6287
+6288
+6289
+6290
+6291
+6292
+6293
+6294
+6295
+6296
+6297
+6298
+6299
+6300
+6301
+6302
+6303
+6304
+6305
+6306
+6307
+6308
+6309
+6310
+6311
+6312
+6313
+6314
+6315
+6316
+6317
+6318
+6319
+6320
+6321
+6322
+6323
+6324
+6325
+6326
+6327
+6328
+6329
+6330
+6331
+6332
+6333
+6334
+6335
+6336
+6337
+6338
+6339
+6340
+6341
+6342
+6343
+6344
+6345
+6346
+6347
+6348
+6349
+6350
+6351
+6352
+6353
+6354
+6355
+6356
+6357
+6358
+6359
+6360
+6361
+6362
+6363
+6364
+6365
+6366
+6367
+6368
+6369
+6370
+6371
+6372
+6373
+6374
+6375
+6376
+6377
+6378
+6379
+6380
+6381
+6382
+6383
+6384
+6385
+6386
+6387
+6388
+6389
+6390
+6391
+6392
+6393
+6394
+6395
+6396
+6397
+6398
+6399
+6400
+6401
+6402
+6403
+6404
+6405
+6406
+6407
+6408
+6409
+6410
+6411
+6412
+6413
+6414
+6415
+6416
+6417
+6418
+6419
+6420
+6421
+6422
+6423
+6424
+6425
+6426
+6427
+6428
+6429
+6430
+6431
+6432
+6433
+6434
+6435
+6436
+6437
+6438
+6439
+6440
+6441
+6442
+6443
+6444
+6445
+6446
+6447
+6448
+6449
+6450
+6451
+6452
+6453
+6454
+6455
+6456
+6457
+6458
+6459
+6460
+6461
+6462
+6463
+6464
+6465
+6466
+6467
+6468
+6469
+6470
+6471
+6472
+6473
+6474
+6475
+6476
+6477
+6478
+6479
+6480
+6481
+6482
+6483
+6484
+6485
+6486
+6487
+6488
+6489
+6490
+6491
+6492
+6493
+6494
+6495
+6496
+6497
+6498
+6499
+6500
+6501
+6502
+6503
+6504
+6505
+6506
+6507
+6508
+6509
+6510
+6511
+6512
+6513
+6514
+6515
+6516
+6517
+6518
+6519
+6520
+6521
+6522
+6523
+6524
+6525
+6526
+6527
+6528
+6529
+6530
+6531
+6532
+6533
+6534
+6535
+6536
+6537
+6538
+6539
+6540
+6541
+6542
+6543
+6544
+6545
+6546
+6547
+6548
+6549
+6550
+6551
+6552
+6553
+6554
+6555
+6556
+6557
+6558
+6559
+6560
+6561
+6562
+6563
+6564
+6565
+6566
+6567
+6568
+6569
+6570
+6571
+6572
+6573
+6574
+6575
+6576
+6577
+6578
+6579
+6580
+6581
+6582
+6583
+6584
+6585
+6586
+6587
+6588
+6589
+6590
+6591
+6592
+6593
+6594
+6595
+6596
+6597
+6598
+6599
+6600
+6601
+6602
+6603
+6604
+6605
+6606
+6607
+6608
+6609
+6610
+6611
+6612
+6613
+6614
+6615
+6616
+6617
+6618
+6619
+6620
+6621
+6622
+6623
+6624
+6625
+6626
+6627
+6628
+6629
+6630
+6631
+6632
+6633
+6634
+6635
+6636
+6637
+6638
+6639
+6640
+6641
+6642
+6643
+6644
+6645
+6646
+6647
+6648
+6649
+6650
+6651
+6652
+6653
+6654
+6655
+6656
+6657
+6658
+6659
+6660
+6661
+6662
+6663
+6664
+6665
+6666
+6667
+6668
+6669
+6670
+6671
+6672
+6673
+6674
+6675
+6676
+6677
+6678
+6679
+6680
+6681
+6682
+6683
+6684
+6685
+6686
+6687
+6688
+6689
+6690
+6691
+6692
+6693
+6694
+6695
+6696
+6697
+6698
+6699
+6700
+6701
+6702
+6703
+6704
+6705
+6706
+6707
+6708
+6709
+6710
+6711
+6712
+6713
+6714
+6715
+6716
+6717
+6718
+6719
+6720
+6721
+6722
+6723
+6724
+6725
+6726
+6727
+6728
+6729
+6730
+6731
+6732
+6733
+6734
+6735
+6736
+6737
+6738
+6739
+6740
+6741
+6742
+6743
+6744
+6745
+6746
+6747
+6748
+6749
+6750
+6751
+6752
+6753
+6754
+6755
+6756
+6757
+6758
+6759
+6760
+6761
+6762
+6763
+6764
+6765
+6766
+6767
+6768
+6769
+6770
+6771
+6772
+6773
+6774
+6775
+6776
+6777
+6778
+6779
+6780
+6781
+6782
+6783
+6784
+6785
+6786
+6787
+6788
+6789
+6790
+6791
+6792
+6793
+6794
+6795
+6796
+6797
+6798
+6799
+6800
+6801
+6802
+6803
+6804
+6805
+6806
+6807
+6808
+6809
+6810
+6811
+6812
+6813
+6814
+6815
+6816
+6817
+6818
+6819
+6820
+6821
+6822
+6823
+6824
+6825
+6826
+6827
+6828
+6829
+6830
+6831
+6832
+6833
+6834
+6835
+6836
+6837
+6838
+6839
+6840
+6841
+6842
+6843
+6844
+6845
+6846
+6847
+6848
+6849
+6850
+6851
+6852
+6853
+6854
+6855
+6856
+6857
+6858
+6859
+6860
+6861
+6862
+6863
+6864
+6865
+6866
+6867
+6868
+6869
+6870
+6871
+6872
+6873
+6874
+6875
+6876
+6877
+6878
+6879
+6880
+6881
+6882
+6883
+6884
+6885
+6886
+6887
+6888
+6889
+6890
+6891
+6892
+6893
+6894
+6895
+6896
+6897
+6898
+6899
+6900
+6901
+6902
+6903
+6904
+6905
+6906
+6907
+6908
+6909
+6910
+6911
+6912
+6913
+6914
+6915
+6916
+6917
+6918
+6919
+6920
+6921
+6922
+6923
+6924
+6925
+6926
+6927
+6928
+6929
+6930
+6931
+6932
+6933
+6934
+6935
+6936
+6937
+6938
+6939
+6940
+6941
+6942
+6943
+6944
+6945
+6946
+6947
+6948
+6949
+6950
+6951
+6952
+6953
+6954
+6955
+6956
+6957
+6958
+6959
+6960
+6961
+6962
+6963
+6964
+6965
+6966
+6967
+6968
+6969
+6970
+6971
+6972
+6973
+6974
+6975
+6976
+6977
+6978
+6979
+6980
+6981
+6982
+6983
+6984
+6985
+6986
+6987
+6988
+6989
+6990
+6991
+6992
+6993
+6994
+6995
+6996
+6997
+6998
+6999
+7000
+7001
+7002
+7003
+7004
+7005
+7006
+7007
+7008
+7009
+7010
+7011
+7012
+7013
+7014
+7015
+7016
+7017
+7018
+7019
+7020
+7021
+7022
+7023
+7024
+7025
+7026
+7027
+7028
+7029
+7030
+7031
+7032
+7033
+7034
+7035
+7036
+7037
+7038
+7039
+7040
+7041
+7042
+7043
+7044
+7045
+7046
+7047
+7048
+7049
+7050
+7051
+7052
+7053
+7054
+7055
+7056
+7057
+7058
+7059
+7060
+7061
+7062
+7063
+7064
+7065
+7066
+7067
+7068
+7069
+7070
+7071
+7072
+7073
+7074
+7075
+7076
+7077
+7078
+7079
+7080
+7081
+7082
+7083
+7084
+7085
+7086
+7087
+7088
+7089
+7090
+7091
+7092
+7093
+7094
+7095
+7096
+7097
+7098
+7099
+7100
+7101
+7102
+7103
+7104
+7105
+7106
+7107
+7108
+7109
+7110
+7111
+7112
+7113
+7114
+7115
+7116
+7117
+7118
+7119
+7120
+7121
+7122
+7123
+7124
+7125
+7126
+7127
+7128
+7129
+7130
+7131
+7132
+7133
+7134
+7135
+7136
+7137
+7138
+7139
+7140
+7141
+7142
+7143
+7144
+7145
+7146
+7147
+7148
+7149
+7150
+7151
+7152
+7153
+7154
+7155
+7156
+7157
+7158
+7159
+7160
+7161
+7162
+7163
+7164
+7165
+7166
+7167
+7168
+7169
+7170
+7171
+7172
+7173
+7174
+7175
+7176
+7177
+7178
+7179
+7180
+7181
+7182
+7183
+7184
+7185
+7186
+7187
+7188
+7189
+7190
+7191
+7192
+7193
+7194
+7195
+7196
+7197
+7198
+7199
+7200
+7201
+7202
+7203
+7204
+7205
+7206
+7207
+7208
+7209
+7210
+7211
+7212
+7213
+7214
+7215
+7216
+7217
+7218
+7219
+7220
+7221
+7222
+7223
+7224
+7225
+7226
+7227
+7228
+7229
+7230
+7231
+7232
+7233
+7234
+7235
+7236
+7237
+7238
+7239
+7240
+7241
+7242
+7243
+7244
+7245
+7246
+7247
+7248
+7249
+7250
+7251
+7252
+7253
+7254
+7255
+7256
+7257
+7258
+7259
+7260
+7261
+7262
+7263
+7264
+7265
+7266
+7267
+7268
+7269
+7270
+7271
+7272
+7273
+7274
+7275
+7276
+7277
+7278
+7279
+7280
+7281
+7282
+7283
+7284
+7285
+7286
+7287
+7288
+7289
+7290
+7291
+7292
+7293
+7294
+7295
+7296
+7297
+7298
+7299
+7300
+7301
+7302
+7303
+7304
+7305
+7306
+7307
+7308
+7309
+7310
+7311
+7312
+7313
+7314
+7315
+7316
+7317
+7318
+7319
+7320
+7321
+7322
+7323
+7324
+7325
+7326
+7327
+7328
+7329
+7330
+7331
+7332
+7333
+7334
+7335
+7336
+7337
+7338
+7339
+7340
+7341
+7342
+7343
+7344
+7345
+7346
+7347
+7348
+7349
+7350
+7351
+7352
+7353
+7354
+7355
+7356
+7357
+7358
+7359
+7360
+7361
+7362
+7363
+7364
+7365
+7366
+7367
+7368
+7369
+7370
+7371
+7372
+7373
+7374
+7375
+7376
+7377
+7378
+7379
+7380
+7381
+7382
+7383
+7384
+7385
+7386
+7387
+7388
+7389
+7390
+7391
+7392
+7393
+7394
+7395
+7396
+7397
+7398
+7399
+7400
+7401
+7402
+7403
+7404
+7405
+7406
+7407
+7408
+7409
+7410
+7411
+7412
+7413
+7414
+7415
+7416
+7417
+7418
+7419
+7420
+7421
+7422
+7423
+7424
+7425
+7426
+7427
+7428
+7429
+7430
+7431
+7432
+7433
+7434
+7435
+7436
+7437
+7438
+7439
+7440
+7441
+7442
+7443
+7444
+7445
+7446
+7447
+7448
+7449
+7450
+7451
+7452
+7453
+7454
+7455
+7456
+7457
+7458
+7459
+7460
+7461
+7462
+7463
+7464
+7465
+7466
+7467
+7468
+7469
+7470
+7471
+7472
+7473
+7474
+7475
+7476
+7477
+7478
+7479
+7480
+7481
+7482
+7483
+7484
+7485
+7486
+7487
+7488
+7489
+7490
+7491
+7492
+7493
+7494
+7495
+7496
+7497
+7498
+7499
+7500
+7501
+7502
+7503
+7504
+7505
+7506
+7507
+7508
+7509
+7510
+7511
+7512
+7513
+7514
+7515
+7516
+7517
+7518
+7519
+7520
+7521
+7522
+7523
+7524
+7525
+7526
+7527
+7528
+7529
+7530
+7531
+7532
+7533
+7534
+7535
+7536
+7537
+7538
+7539
+7540
+7541
+7542
+7543
+7544
+7545
+7546
+7547
+7548
+7549
+7550
+7551
+7552
+7553
+7554
+7555
+7556
+7557
+7558
+7559
+7560
+7561
+7562
+7563
+7564
+7565
+7566
+7567
+7568
+7569
+7570
+7571
+7572
+7573
+7574
+7575
+7576
+7577
+7578
+7579
+7580
+7581
+7582
+7583
+7584
+7585
+7586
+7587
+7588
+7589
+7590
+7591
+7592
+7593
+7594
+7595
+7596
+7597
+7598
+7599
+7600
+7601
+7602
+7603
+7604
+7605
+7606
+7607
+7608
+7609
+7610
+7611
+7612
+7613
+7614
+7615
+7616
+7617
+7618
+7619
+7620
+7621
+7622
+7623
+7624
+7625
+7626
+7627
+7628
+7629
+7630
+7631
+7632
+7633
+7634
+7635
+7636
+7637
+7638
+7639
+7640
+7641
+7642
+7643
+7644
+7645
+7646
+7647
+7648
+7649
+7650
+7651
+7652
+7653
+7654
+7655
+7656
+7657
+7658
+7659
+7660
+7661
+7662
+7663
+7664
+7665
+7666
+7667
+7668
+7669
+7670
+7671
+7672
+7673
+7674
+7675
+7676
+7677
+7678
+7679
+7680
+7681
+7682
+7683
+7684
+7685
+7686
+7687
+7688
+7689
+7690
+7691
+7692
+7693
+7694
+7695
+7696
+7697
+7698
+7699
+7700
+7701
+7702
+7703
+7704
+7705
+7706
+7707
+7708
+7709
+7710
+7711
+7712
+7713
+7714
+7715
+7716
+7717
+7718
+7719
+7720
+7721
+7722
+7723
+7724
+7725
+7726
+7727
+7728
+7729
+7730
+7731
+7732
+7733
+7734
+7735
+7736
+7737
+7738
+7739
+7740
+7741
+7742
+7743
+7744
+7745
+7746
+7747
+7748
+7749
+7750
+7751
+7752
+7753
+7754
+7755
+7756
+7757
+7758
+7759
+7760
+7761
+7762
+7763
+7764
+7765
+7766
+7767
+7768
+7769
+7770
+7771
+7772
+7773
+7774
+7775
+7776
+7777
+7778
+7779
+7780
+7781
+7782
+7783
+7784
+7785
+7786
+7787
+7788
+7789
+7790
+7791
+7792
+7793
+7794
+7795
+7796
+7797
+7798
+7799
+7800
+7801
+7802
+7803
+7804
+7805
+7806
+7807
+7808
+7809
+7810
+7811
+7812
+7813
+7814
+7815
+7816
+7817
+7818
+7819
+7820
+7821
+7822
+7823
+7824
+7825
+7826
+7827
+7828
+7829
+7830
+7831
+7832
+7833
+7834
+7835
+7836
+7837
+7838
+7839
+7840
+7841
+7842
+7843
+7844
+7845
+7846
+7847
+7848
+7849
+7850
+7851
+7852
+7853
+7854
+7855
+7856
+7857
+7858
+7859
+7860
+7861
+7862
+7863
+7864
+7865
+7866
+7867
+7868
+7869
+7870
+7871
+7872
+7873
+7874
+7875
+7876
+7877
+7878
+7879
+7880
+7881
+7882
+7883
+7884
+7885
+7886
+7887
+7888
+7889
+7890
+7891
+7892
+7893
+7894
+7895
+7896
+7897
+7898
+7899
+7900
+7901
+7902
+7903
+7904
+7905
+7906
+7907
+7908
+7909
+7910
+7911
+7912
+7913
+7914
+7915
+7916
+7917
+7918
+7919
+7920
+7921
+7922
+7923
+7924
+7925
+7926
+7927
+7928
+7929
+7930
+7931
+7932
+7933
+7934
+7935
+7936
+7937
+7938
+7939
+7940
+7941
+7942
+7943
+7944
+7945
+7946
+7947
+7948
+7949
+7950
+7951
+7952
+7953
+7954
+7955
+7956
+7957
+7958
+7959
+7960
+7961
+7962
+7963
+7964
+7965
+7966
+7967
+7968
+7969
+7970
+7971
+7972
+7973
+7974
+7975
+7976
+7977
+7978
+7979
+7980
+7981
+7982
+7983
+7984
+7985
+7986
+7987
+7988
+7989
+7990
+7991
+7992
+7993
+7994
+7995
+7996
+7997
+7998
+7999
+8000
+8001
+8002
+8003
+8004
+8005
+8006
+8007
+8008
+8009
+8010
+8011
+8012
+8013
+8014
+8015
+8016
+8017
+8018
+8019
+8020
+8021
+8022
+8023
+8024
+8025
+8026
+8027
+8028
+8029
+8030
+8031
+8032
+8033
+8034
+8035
+8036
+8037
+8038
+8039
+8040
+8041
+8042
+8043
+8044
+8045
+8046
+8047
+8048
+8049
+8050
+8051
+8052
+8053
+8054
+8055
+8056
+8057
+8058
+8059
+8060
+8061
+8062
+8063
+8064
+8065
+8066
+8067
+8068
+8069
+8070
+8071
+8072
+8073
+8074
+8075
+8076
+8077
+8078
+8079
+8080
+8081
+8082
+8083
+8084
+8085
+8086
+8087
+8088
+8089
+8090
+8091
+8092
+8093
+8094
+8095
+8096
+8097
+8098
+8099
+8100
+8101
+8102
+8103
+8104
+8105
+8106
+8107
+8108
+8109
+8110
+8111
+8112
+8113
+8114
+8115
+8116
+8117
+8118
+8119
+8120
+8121
+8122
+8123
+8124
+8125
+8126
+8127
+8128
+8129
+8130
+8131
+8132
+8133
+8134
+8135
+8136
+8137
+8138
+8139
+8140
+8141
+8142
+8143
+8144
+8145
+8146
+8147
+8148
+8149
+8150
+8151
+8152
+8153
+8154
+8155
+8156
+8157
+8158
+8159
+8160
+8161
+8162
+8163
+8164
+8165
+8166
+8167
+8168
+8169
+8170
+8171
+8172
+8173
+8174
+8175
+8176
+8177
+8178
+8179
+8180
+8181
+8182
+8183
+8184
+8185
+8186
+8187
+8188
+8189
+8190
+8191
+8192
+8193
+8194
+8195
+8196
+8197
+8198
+8199
+8200
+8201
+8202
+8203
+8204
+8205
+8206
+8207
+8208
+8209
+8210
+8211
+8212
+8213
+8214
+8215
+8216
+8217
+8218
+8219
+8220
+8221
+8222
+8223
+8224
+8225
+8226
+8227
+8228
+8229
+8230
+8231
+8232
+8233
+8234
+8235
+8236
+8237
+8238
+8239
+8240
+8241
+8242
+8243
+8244
+8245
+8246
+8247
+8248
+8249
+8250
+8251
+8252
+8253
+8254
+8255
+8256
+8257
+8258
+8259
+8260
+8261
+8262
+8263
+8264
+8265
+8266
+8267
+8268
+8269
+8270
+8271
+8272
+8273
+8274
+8275
+8276
+8277
+8278
+8279
+8280
+8281
+8282
+8283
+8284
+8285
+8286
+8287
+8288
+8289
+8290
+8291
+8292
+8293
+8294
+8295
+8296
+8297
+8298
+8299
+8300
+8301
+8302
+8303
+8304
+8305
+8306
+8307
+8308
+8309
+8310
+8311
+8312
+8313
+8314
+8315
+8316
+8317
+8318
+8319
+8320
+8321
+8322
+8323
+8324
+8325
+8326
+8327
+8328
+8329
+8330
+8331
+8332
+8333
+8334
+8335
+8336
+8337
+8338
+8339
+8340
+8341
+8342
+8343
+8344
+8345
+8346
+8347
+8348
+8349
+8350
+8351
+8352
+8353
+8354
+8355
+8356
+8357
+8358
+8359
+8360
+8361
+8362
+8363
+8364
+8365
+8366
+8367
+8368
+8369
+8370
+8371
+8372
+8373
+8374
+8375
+8376
+8377
+8378
+8379
+8380
+8381
+8382
+8383
+8384
+8385
+8386
+8387
+8388
+8389
+8390
+8391
+8392
+8393
+8394
+8395
+8396
+8397
+8398
+8399
+8400
+8401
+8402
+8403
+8404
+8405
+8406
+8407
+8408
+8409
+8410
+8411
+8412
+8413
+8414
+8415
+8416
+8417
+8418
+8419
+8420
+8421
+8422
+8423
+8424
+8425
+8426
+8427
+8428
+8429
+8430
+8431
+8432
+8433
+8434
+8435
+8436
+8437
+8438
+8439
+8440
+8441
+8442
+8443
+8444
+8445
+8446
+8447
+8448
+8449
+8450
+8451
+8452
+8453
+8454
+8455
+8456
+8457
+8458
+8459
+8460
+8461
+8462
+8463
+8464
+8465
+8466
+8467
+8468
+8469
+8470
+8471
+8472
+8473
+8474
+8475
+8476
+8477
+8478
+8479
+8480
+8481
+8482
+8483
+8484
+8485
+8486
+8487
+8488
+8489
+8490
+8491
+8492
+8493
+8494
+8495
+8496
+8497
+8498
+8499
+8500
+8501
+8502
+8503
+8504
+8505
+8506
+8507
+8508
+8509
+8510
+8511
+8512
+8513
+8514
+8515
+8516
+8517
+8518
+8519
+8520
+8521
+8522
+8523
+8524
+8525
+8526
+8527
+8528
+8529
+8530
+8531
+8532
+8533
+8534
+8535
+8536
+8537
+8538
+8539
+8540
+8541
+8542
+8543
+8544
+8545
+8546
+8547
+8548
+8549
+8550
+8551
+8552
+8553
+8554
+8555
+8556
+8557
+8558
+8559
+8560
+8561
+8562
+8563
+8564
+8565
+8566
+8567
+8568
+8569
+8570
+8571
+8572
+8573
+8574
+8575
+8576
+8577
+8578
+8579
+8580
+8581
+8582
+8583
+8584
+8585
+8586
+8587
+8588
+8589
+8590
+8591
+8592
+8593
+8594
+8595
+8596
+8597
+8598
+8599
+8600
+8601
+8602
+8603
+8604
+8605
+8606
+8607
+8608
+8609
+8610
+8611
+8612
+8613
+8614
+8615
+8616
+8617
+8618
+8619
+8620
+8621
+8622
+8623
+8624
+8625
+8626
+8627
+8628
+8629
+8630
+8631
+8632
+8633
+8634
+8635
+8636
+8637
+8638
+8639
+8640
+8641
+8642
+8643
+8644
+8645
+8646
+8647
+8648
+8649
class AsyncOrthanc(httpx.AsyncClient):
+    """Orthanc API
+
+    version 1.12.3
+    This is the full documentation of the [REST API](https://orthanc.uclouvain.be/book/users/rest.html) of Orthanc.<p>This reference is automatically generated from the source code of Orthanc. A [shorter cheat sheet](https://orthanc.uclouvain.be/book/users/rest-cheatsheet.html) is part of the Orthanc Book.<p>An earlier, manually crafted version from August 2019, is [still available](2019-08-orthanc-openapi.html), but is not up-to-date anymore ([source](https://groups.google.com/g/orthanc-users/c/NUiJTEICSl8/m/xKeqMrbqAAAJ)).
+
+    """
+
+    def __init__(
+        self,
+        url: str,
+        username: Optional[str] = None,
+        password: Optional[str] = None,
+        return_raw_response: bool = False,
+        *args,
+        **kwargs,
+    ):
+        """
+        Parameters
+        ----------
+        url
+            server's URL
+        username
+            Orthanc's username
+        password
+            Orthanc's password
+        return_raw_response
+            All Orthanc's methods will return a raw httpx.Response rather than the serialized result
+        *args, **kwargs
+            Parameters passed to the httpx.Client (headers, timeout, etc.)
+        """
+        super().__init__(*args, **kwargs)
+        self.url = url
+        self.version = "1.12.3"
+        self.return_raw_response = return_raw_response
+
+        if username and password:
+            self.setup_credentials(username, password)
+
+    def setup_credentials(self, username: str, password: str) -> None:
+        """Set credentials needed for HTTP requests"""
+        self._auth = httpx.BasicAuth(username, password)
+
+    async def _get(
+        self,
+        route: str,
+        params: Optional[QueryParamTypes] = None,
+        headers: Optional[HeaderTypes] = None,
+        cookies: Optional[CookieTypes] = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """GET request with specified route
+
+        Parameters
+        ----------
+        route
+            HTTP route.
+        params
+            Parameters for the HTTP request.
+        headers
+            Headers for the HTTP request.
+        cookies
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Serialized response of the HTTP GET request or httpx.Response.
+        """
+        response = await self.get(
+            url=route, params=params, headers=headers, cookies=cookies
+        )
+
+        if self.return_raw_response:
+            return response
+
+        if 200 <= response.status_code < 300:
+            if "application/json" in response.headers["content-type"]:
+                return response.json()
+            elif "text/plain" in response.headers["content-type"]:
+                return response.text
+            else:
+                return response.content
+
+        raise httpx.HTTPError(
+            f"HTTP code: {response.status_code}, with content: {response.text}"
+        )
+
+    async def _delete(
+        self,
+        route: str,
+        params: Optional[QueryParamTypes] = None,
+        headers: Optional[HeaderTypes] = None,
+        cookies: Optional[CookieTypes] = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """DELETE to specified route
+
+        Parameters
+        ----------
+        route
+            HTTP route.
+        params
+            Parameters for the HTTP request.
+        headers
+            Headers for the HTTP request.
+        cookies
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Serialized response of the HTTP DELETE request or httpx.Response.
+        """
+        response = await self.delete(
+            route, params=params, headers=headers, cookies=cookies
+        )
+
+        if self.return_raw_response:
+            return response
+
+        if 200 <= response.status_code < 300:
+            if "application/json" in response.headers["content-type"]:
+                return response.json()
+            elif "text/plain" in response.headers["content-type"]:
+                return response.text
+            else:
+                return response.content
+
+        raise httpx.HTTPError(
+            f"HTTP code: {response.status_code}, with content: {response.text}"
+        )
+
+    async def _post(
+        self,
+        route: str,
+        content: Optional[RequestContent] = None,
+        data: Optional[RequestData] = None,
+        files: Optional[RequestFiles] = None,
+        json: Optional[Any] = None,
+        params: Optional[QueryParamTypes] = None,
+        headers: Optional[HeaderTypes] = None,
+        cookies: Optional[CookieTypes] = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """POST to specified route
+
+        Parameters
+        ----------
+        route
+            HTTP route.
+        content
+        data
+            Dictionary to send in the body of request.
+        files
+        json
+        params
+        headers
+        cookies
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Serialized response of the HTTP POST request or httpx.Response.
+        """
+        response = await self.post(
+            route,
+            content=content,
+            data=data,
+            files=files,
+            json=json,
+            params=params,
+            headers=headers,
+            cookies=cookies,
+        )
+
+        if self.return_raw_response:
+            return response
+
+        if 200 <= response.status_code < 300:
+            if "application/json" in response.headers["content-type"]:
+                return response.json()
+            elif "text/plain" in response.headers["content-type"]:
+                return response.text
+            else:
+                return response.content
+
+        raise httpx.HTTPError(
+            f"HTTP code: {response.status_code}, with text: {response.text}"
+        )
+
+    async def _put(
+        self,
+        route: str,
+        content: RequestContent = None,
+        data: RequestData = None,
+        files: Optional[RequestFiles] = None,
+        json: Optional[Any] = None,
+        params: Optional[QueryParamTypes] = None,
+        headers: Optional[HeaderTypes] = None,
+        cookies: Optional[CookieTypes] = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """PUT to specified route
+
+        Parameters
+        ----------
+        route
+            HTTP route.
+        content
+        data
+            Dictionary to send in the body of request.
+        files
+        json
+        params
+        headers
+        cookies
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Serialized response of the HTTP PUT request or httpx.Response.
+        """
+        response = await self.put(
+            route,
+            content=content,
+            data=data,
+            files=files,
+            json=json,
+            params=params,
+            headers=headers,
+            cookies=cookies,
+        )
+
+        if self.return_raw_response:
+            return response
+
+        if 200 <= response.status_code < 300:
+            if "application/json" in response.headers["content-type"]:
+                return response.json()
+            elif "text/plain" in response.headers["content-type"]:
+                return response.text
+            else:
+                return response.content
+
+        raise httpx.HTTPError(
+            f"HTTP code: {response.status_code}, with text: {response.text}"
+        )
+
+    async def delete_changes(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Clear changes
+
+        Clear the full history stored in the changes log
+        Tags: Tracking changes
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/changes",
+        )
+
+    async def get_changes(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List changes
+
+        Whenever Orthanc receives a new DICOM instance, this event is recorded in the so-called _Changes Log_. This enables remote scripts to react to the arrival of new DICOM resources. A typical application is auto-routing, where an external script waits for a new DICOM instance to arrive into Orthanc, then forward this instance to another modality.
+        Tags: Tracking changes
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "limit" (float): Limit the number of results
+                "since" (float): Show only the resources since the provided index
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The list of changes
+        """
+        return await self._get(
+            route=f"{self.url}/changes",
+            params=params,
+        )
+
+    async def delete_exports(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Clear exports
+
+        Clear the full history stored in the exports log
+        Tags: Tracking changes
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/exports",
+        )
+
+    async def get_exports(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List exports
+
+        For medical traceability, Orthanc can be configured to store a log of all the resources that have been exported to remote modalities. In auto-routing scenarios, it is important to prevent this log to grow indefinitely as incoming instances are routed. You can either disable this logging by setting the option `LogExportedResources` to `false` in the configuration file, or periodically clear this log by `DELETE`-ing this URI. This route might be removed in future versions of Orthanc.
+        Tags: Tracking changes
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "limit" (float): Limit the number of results
+                "since" (float): Show only the resources since the provided index
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The list of exports
+        """
+        return await self._get(
+            route=f"{self.url}/exports",
+            params=params,
+        )
+
+    async def get_instances(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List the available instances
+
+        List the Orthanc identifiers of all the available DICOM instances
+        Tags: Instances
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual instances
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "limit" (float): Limit the number of results
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "since" (float): Show only the resources since the provided index
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the Orthanc identifiers, or detailed information about the reported instances (if `expand` argument is provided)
+        """
+        return await self._get(
+            route=f"{self.url}/instances",
+            params=params,
+        )
+
+    async def post_instances(
+        self,
+        content: RequestContent = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Upload DICOM instances
+
+        Upload DICOM instances
+        Tags: Instances
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the uploaded instance, or list of information for each uploaded instance in the case of ZIP archive
+        """
+        return await self._post(
+            route=f"{self.url}/instances",
+            content=content,
+        )
+
+    async def delete_instances_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete some instance
+
+        Delete the DICOM instance whose Orthanc identifier is provided in the URL
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/instances/{id_}",
+        )
+
+    async def get_instances_id(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get information about some instance
+
+        Get detailed information about the DICOM instance whose Orthanc identifier is provided in the URL
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM instance
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}",
+            params=params,
+        )
+
+    async def post_instances_id_anonymize(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Anonymize instance
+
+        Download an anonymized version of the DICOM instance whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-a-single-instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        json
+            Dictionary with the following keys:
+              "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+              "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The anonymized DICOM instance
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/instances/{id_}/anonymize",
+            json=json,
+        )
+
+    async def get_instances_id_attachments(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List attachments
+
+        Get the list of attachments that are associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "full" (str): If present, retrieve the attachments list and their numerical ids
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the attachments
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/attachments",
+            params=params,
+        )
+
+    async def delete_instances_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete attachment
+
+        Delete an attachment associated with the given DICOM instance. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/instances/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    async def get_instances_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List operations on attachments
+
+        Get the list of the operations that are available for attachments associated with the given instance
+        Tags: Other
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    async def put_instances_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        content: RequestContent = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set attachment
+
+        Attach a file to the given DICOM instance. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        content
+                - (Content-Type: "application/octet-stream") Binary data containing the attachment
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return await self._put(
+            route=f"{self.url}/instances/{id_}/attachments/{name}",
+            content=content,
+            headers=headers,
+        )
+
+    async def post_instances_id_attachments_name_compress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Compress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/compress",
+        )
+
+    async def get_instances_id_attachments_name_compressed_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get attachment (no decompression)
+
+        Get the (binary) content of one attachment associated with the given instance. The attachment will not be decompressed if `StorageCompression` is `true`.
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/compressed-data",
+            headers=headers,
+        )
+
+    async def get_instances_id_attachments_name_compressed_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get MD5 of attachment on disk
+
+        Get the MD5 hash of one attachment associated with the given instance, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment, as stored on the disk
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/compressed-md5",
+            headers=headers,
+        )
+
+    async def get_instances_id_attachments_name_compressed_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get size of attachment on disk
+
+        Get the size of one attachment associated with the given instance, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment, as stored on the disk
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/compressed-size",
+            headers=headers,
+        )
+
+    async def get_instances_id_attachments_name_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get attachment
+
+        Get the (binary) content of one attachment associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/data",
+            headers=headers,
+        )
+
+    async def get_instances_id_attachments_name_info(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get info about the attachment
+
+        Get all the information about the attachment associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the information about the attachment
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/info",
+            headers=headers,
+        )
+
+    async def get_instances_id_attachments_name_is_compressed(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Is attachment compressed?
+
+        Test whether the attachment has been stored as a compressed file on the disk.
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `0` if the attachment was stored uncompressed, `1` if it was compressed
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/is-compressed",
+            headers=headers,
+        )
+
+    async def get_instances_id_attachments_name_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get MD5 of attachment
+
+        Get the MD5 hash of one attachment associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/md5",
+            headers=headers,
+        )
+
+    async def get_instances_id_attachments_name_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get size of attachment
+
+        Get the size of one attachment associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/size",
+            headers=headers,
+        )
+
+    async def post_instances_id_attachments_name_uncompress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Uncompress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/uncompress",
+        )
+
+    async def post_instances_id_attachments_name_verify_md5(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Verify attachment
+
+        Verify that the attachment is not corrupted, by validating its MD5 hash
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            On success, a valid JSON object is returned
+        """
+        return await self._post(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/verify-md5",
+        )
+
+    async def get_instances_id_content_path(
+        self,
+        id_: str,
+        path: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get raw tag
+
+        Get the raw content of one DICOM tag in the hierarchy of DICOM dataset
+        Tags: Instances
+
+        Parameters
+        ----------
+        path
+            Path to the DICOM tag. This is the interleaving of one DICOM tag, possibly followed by an index for sequences. Sequences are accessible as, for instance, `/0008-1140/1/0008-1150`
+        id_
+            Orthanc identifier of the DICOM instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The raw value of the tag of intereset (binary data, whose memory layout depends on the underlying transfer syntax), or JSON array containing the list of available tags if accessing a dataset
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/content/{path}",
+        )
+
+    async def post_instances_id_export(
+        self,
+        id_: str,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Write DICOM onto filesystem
+
+        Write the DICOM file onto the filesystem where Orthanc is running.  This is insecure for Orthanc servers that are remotely accessible since one could overwrite any system file.  Since Orthanc 1.12.0, this route is disabled by default, but can be enabled using the `RestApiWriteToFileSystemEnabled` configuration option.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        data
+            Target path on the filesystem
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/instances/{id_}/export",
+            data=data,
+        )
+
+    async def get_instances_id_file(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Download DICOM
+
+        Download one DICOM instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "transcode" (str): If present, the DICOM file will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): This HTTP header can be set to retrieve the DICOM instance in DICOMweb format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The DICOM instance
+            The DICOM instance, in DICOMweb JSON format
+            The DICOM instance, in DICOMweb XML format
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/file",
+            params=params,
+            headers=headers,
+        )
+
+    async def get_instances_id_frames(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List available frames
+
+        List the frames that are available in the DICOM instance of interest
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The list of the indices of the available frames
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/frames",
+        )
+
+    async def get_instances_id_frames_frame(
+        self,
+        frame: str,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List operations
+
+        List the available operations under URI `/instances/{id}/frames/{frame}/`
+        Tags: Other
+
+        Parameters
+        ----------
+        frame
+
+        id_
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}",
+        )
+
+    async def get_instances_id_frames_frame_image_int16(
+        self,
+        frame: float,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode a frame (int16)
+
+        Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [-32768,32767] range. Negative values must be interpreted according to two's complement.
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/image-int16",
+            params=params,
+            headers=headers,
+        )
+
+    async def get_instances_id_frames_frame_image_uint16(
+        self,
+        frame: float,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode a frame (uint16)
+
+        Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [0,65535] range.
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/image-uint16",
+            params=params,
+            headers=headers,
+        )
+
+    async def get_instances_id_frames_frame_image_uint8(
+        self,
+        frame: float,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode a frame (uint8)
+
+        Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [0,255] range.
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/image-uint8",
+            params=params,
+            headers=headers,
+        )
+
+    async def get_instances_id_frames_frame_matlab(
+        self,
+        frame: float,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode frame for Matlab
+
+        Decode one frame of interest from the given DICOM instance, and export this frame as a Octave/Matlab matrix to be imported with `eval()`: https://orthanc.uclouvain.be/book/faq/matlab.html
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Octave/Matlab matrix
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/matlab",
+        )
+
+    async def get_instances_id_frames_frame_numpy(
+        self,
+        frame: float,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode frame for numpy
+
+        Decode one frame of interest from the given DICOM instance, for use with numpy in Python. The numpy array has 3 dimensions: (height, width, color channel).
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM resource of interest
+        params
+            Dictionary of optional parameters:
+                "compress" (bool): Compress the file as `.npz`
+                "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/numpy",
+            params=params,
+        )
+
+    async def get_instances_id_frames_frame_preview(
+        self,
+        frame: float,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode a frame (preview)
+
+        Decode one frame of interest from the given DICOM instance. The full dynamic range of grayscale images is rescaled to the [0,255] range.
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/preview",
+            params=params,
+            headers=headers,
+        )
+
+    async def get_instances_id_frames_frame_raw(
+        self,
+        frame: float,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Access raw frame
+
+        Access the raw content of one individual frame of the DICOM instance of interest, bypassing image decoding. This is notably useful to access the source files in compressed transfer syntaxes.
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The raw frame
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/raw",
+        )
+
+    async def get_instances_id_frames_frame_raw_gz(
+        self,
+        frame: float,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Access raw frame (compressed)
+
+        Access the raw content of one individual frame of the DICOM instance of interest, bypassing image decoding. This is notably useful to access the source files in compressed transfer syntaxes. The image is compressed using gzip
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The raw frame, compressed using gzip
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/raw.gz",
+        )
+
+    async def get_instances_id_frames_frame_rendered(
+        self,
+        frame: float,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Render a frame
+
+        Render one frame of interest from the given DICOM instance. This function takes scaling into account (`RescaleSlope` and `RescaleIntercept` tags), as well as the default windowing stored in the DICOM file (`WindowCenter` and `WindowWidth`tags), and can be used to resize the resulting image. Color images are not affected by windowing.
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "height" (float): Height of the resized image
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+                "smooth" (bool): Whether to smooth image on resize
+                "width" (float): Width of the resized image
+                "window-center" (float): Windowing center
+                "window-width" (float): Windowing width
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/rendered",
+            params=params,
+            headers=headers,
+        )
+
+    async def get_instances_id_header(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get DICOM meta-header
+
+        Get the DICOM tags in the meta-header of the DICOM instance. By default, the `full` format is used, which combines hexadecimal tags with human-readable description.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the DICOM tags and their associated value
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/header",
+            params=params,
+        )
+
+    async def get_instances_id_image_int16(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode an image (int16)
+
+        Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [-32768,32767] range. Negative values must be interpreted according to two's complement.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/image-int16",
+            params=params,
+            headers=headers,
+        )
+
+    async def get_instances_id_image_uint16(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode an image (uint16)
+
+        Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [0,65535] range.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/image-uint16",
+            params=params,
+            headers=headers,
+        )
+
+    async def get_instances_id_image_uint8(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode an image (uint8)
+
+        Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [0,255] range.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/image-uint8",
+            params=params,
+            headers=headers,
+        )
+
+    async def get_instances_id_labels(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List labels
+
+        Get the labels that are associated with the given instance (new in Orthanc 1.12.0)
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the labels
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/labels",
+        )
+
+    async def delete_instances_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Remove label
+
+        Remove a label associated with a instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        label
+            The label to be removed
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/instances/{id_}/labels/{label}",
+        )
+
+    async def get_instances_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Test label
+
+        Test whether the instance is associated with the given label
+        Tags: Instances
+
+        Parameters
+        ----------
+        label
+            The label of interest
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty string is returned in the case of presence, error 404 in the case of absence
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/labels/{label}",
+        )
+
+    async def put_instances_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Add label
+
+        Associate a label with a instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        label
+            The label to be added
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/instances/{id_}/labels/{label}",
+        )
+
+    async def get_instances_id_matlab(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode frame for Matlab
+
+        Decode the first frame of the given DICOM instance., and export this frame as a Octave/Matlab matrix to be imported with `eval()`: https://orthanc.uclouvain.be/book/faq/matlab.html
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Octave/Matlab matrix
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/matlab",
+        )
+
+    async def get_instances_id_metadata(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List metadata
+
+        Get the list of metadata that are associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, also retrieve the value of the individual metadata
+                "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/metadata",
+            params=params,
+        )
+
+    async def delete_instances_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete metadata
+
+        Delete some metadata associated with the given DICOM instance. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/instances/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    async def get_instances_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get metadata
+
+        Get the value of a metadata that is associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Value of the metadata
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    async def put_instances_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        data: RequestData = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set metadata
+
+        Set the value of some metadata in the given DICOM instance. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        data
+            String value of the metadata
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/instances/{id_}/metadata/{name}",
+            data=data,
+            headers=headers,
+        )
+
+    async def post_instances_id_modify(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Modify instance
+
+        Download a modified version of the DICOM instance whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-a-single-instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        json
+            Dictionary with the following keys:
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The modified DICOM instance
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/instances/{id_}/modify",
+            json=json,
+        )
+
+    async def get_instances_id_module(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get instance module
+
+        Get the instance module of the DICOM instance whose Orthanc identifier is provided in the URL
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM instance
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/module",
+            params=params,
+        )
+
+    async def get_instances_id_numpy(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode instance for numpy
+
+        Decode the given DICOM instance, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel).
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM resource of interest
+        params
+            Dictionary of optional parameters:
+                "compress" (bool): Compress the file as `.npz`
+                "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/numpy",
+            params=params,
+        )
+
+    async def get_instances_id_patient(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get parent patient
+
+        Get detailed information about the parent patient of the DICOM instance whose Orthanc identifier is provided in the URL
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the parent DICOM patient
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/patient",
+            params=params,
+        )
+
+    async def get_instances_id_pdf(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get embedded PDF
+
+        Get the PDF file that is embedded in one DICOM instance. If the DICOM instance doesn't contain the `EncapsulatedDocument` tag or if the `MIMETypeOfEncapsulatedDocument` tag doesn't correspond to the PDF type, a `404` HTTP error is raised.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            PDF file
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/pdf",
+        )
+
+    async def get_instances_id_preview(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode an image (preview)
+
+        Decode the first frame of the given DICOM instance. The full dynamic range of grayscale images is rescaled to the [0,255] range.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/preview",
+            params=params,
+            headers=headers,
+        )
+
+    async def post_instances_id_reconstruct(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Reconstruct tags & optionally files of instance
+
+        Reconstruct the main DICOM tags in DB of the instance whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        json
+            Dictionary with the following keys:
+              "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/instances/{id_}/reconstruct",
+            json=json,
+        )
+
+    async def get_instances_id_rendered(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Render an image
+
+        Render the first frame of the given DICOM instance. This function takes scaling into account (`RescaleSlope` and `RescaleIntercept` tags), as well as the default windowing stored in the DICOM file (`WindowCenter` and `WindowWidth`tags), and can be used to resize the resulting image. Color images are not affected by windowing.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "height" (float): Height of the resized image
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+                "smooth" (bool): Whether to smooth image on resize
+                "width" (float): Width of the resized image
+                "window-center" (float): Windowing center
+                "window-width" (float): Windowing width
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/rendered",
+            params=params,
+            headers=headers,
+        )
+
+    async def get_instances_id_series(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get parent series
+
+        Get detailed information about the parent series of the DICOM instance whose Orthanc identifier is provided in the URL
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the parent DICOM series
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/series",
+            params=params,
+        )
+
+    async def get_instances_id_simplified_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get human-readable tags
+
+        Get the DICOM tags in human-readable format (same as the `/instances/{id}/tags?simplify` route)
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the DICOM tags and their associated value
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/simplified-tags",
+            params=params,
+        )
+
+    async def get_instances_id_statistics(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get instance statistics
+
+        Get statistics about the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/statistics",
+        )
+
+    async def get_instances_id_study(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get parent study
+
+        Get detailed information about the parent study of the DICOM instance whose Orthanc identifier is provided in the URL
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the parent DICOM study
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/study",
+            params=params,
+        )
+
+    async def get_instances_id_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get DICOM tags
+
+        Get the DICOM tags in the specified format. By default, the `full` format is used, which combines hexadecimal tags with human-readable description.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the DICOM tags and their associated value
+        """
+        return await self._get(
+            route=f"{self.url}/instances/{id_}/tags",
+            params=params,
+        )
+
+    async def get_jobs(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List jobs
+
+        List all the available jobs
+        Tags: Jobs
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual jobs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the jobs identifiers, or detailed information about the reported jobs (if `expand` argument is provided)
+        """
+        return await self._get(
+            route=f"{self.url}/jobs",
+            params=params,
+        )
+
+    async def delete_jobs_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete a job from history
+
+        Delete the job from the jobs history.  Only a completed job can be deleted. If the job has not run or not completed yet, you must cancel it first. If the job has outputs, all outputs will be deleted as well.
+        Tags: Jobs
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/jobs/{id_}",
+        )
+
+    async def get_jobs_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get job
+
+        Retrieve detailed information about the job whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        Tags: Jobs
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object detailing the job
+        """
+        return await self._get(
+            route=f"{self.url}/jobs/{id_}",
+        )
+
+    async def post_jobs_id_cancel(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Cancel job
+
+        Cancel the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        Tags: Jobs
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return await self._post(
+            route=f"{self.url}/jobs/{id_}/cancel",
+        )
+
+    async def post_jobs_id_pause(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Pause job
+
+        Pause the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        Tags: Jobs
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return await self._post(
+            route=f"{self.url}/jobs/{id_}/pause",
+        )
+
+    async def post_jobs_id_resubmit(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Resubmit job
+
+        Resubmit the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        Tags: Jobs
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return await self._post(
+            route=f"{self.url}/jobs/{id_}/resubmit",
+        )
+
+    async def post_jobs_id_resume(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Resume job
+
+        Resume the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        Tags: Jobs
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return await self._post(
+            route=f"{self.url}/jobs/{id_}/resume",
+        )
+
+    async def delete_jobs_id_key(
+        self,
+        id_: str,
+        key: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete a job output
+
+        Delete the output produced by a job. As of Orthanc 1.12.1, only the jobs that generate a DICOMDIR media or a ZIP archive provide such an output (with `key` equals to `archive`).
+        Tags: Jobs
+
+        Parameters
+        ----------
+        key
+            Name of the output of interest
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/jobs/{id_}/{key}",
+        )
+
+    async def get_jobs_id_key(
+        self,
+        id_: str,
+        key: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get job output
+
+        Retrieve some output produced by a job. As of Orthanc 1.8.2, only the jobs that generate a DICOMDIR media or a ZIP archive provide such an output (with `key` equals to `archive`).
+        Tags: Jobs
+
+        Parameters
+        ----------
+        key
+            Name of the output of interest
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Content of the output of the job
+        """
+        return await self._get(
+            route=f"{self.url}/jobs/{id_}/{key}",
+        )
+
+    async def get_modalities(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List DICOM modalities
+
+        List all the DICOM modalities that are known to Orthanc. This corresponds either to the content of the `DicomModalities` configuration option, or to the information stored in the database if `DicomModalitiesInDatabase` is `true`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual DICOM modalities
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the identifiers of the modalities, or detailed information about the modalities (if `expand` argument is provided)
+        """
+        return await self._get(
+            route=f"{self.url}/modalities",
+            params=params,
+        )
+
+    async def delete_modalities_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete DICOM modality
+
+        Delete one DICOM modality. This change is permanent iff. `DicomModalitiesInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the DICOM modality of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/modalities/{id_}",
+        )
+
+    async def get_modalities_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List operations on modality
+
+        List the operations that are available for a DICOM modality.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the DICOM modality of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return await self._get(
+            route=f"{self.url}/modalities/{id_}",
+        )
+
+    async def put_modalities_id(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Update DICOM modality
+
+        Define a new DICOM modality, or update an existing one. This change is permanent iff. `DicomModalitiesInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the new/updated DICOM modality
+        json
+            Dictionary with the following keys:
+              "AET": AET of the remote DICOM modality
+              "AllowEcho": Whether to accept C-ECHO SCU commands issued by the remote modality
+              "AllowFind": Whether to accept C-FIND SCU commands issued by the remote modality
+              "AllowFindWorklist": Whether to accept C-FIND SCU commands for worklists issued by the remote modality
+              "AllowGet": Whether to accept C-GET SCU commands issued by the remote modality
+              "AllowMove": Whether to accept C-MOVE SCU commands issued by the remote modality
+              "AllowStorageCommitment": Whether to accept storage commitment requests issued by the remote modality
+              "AllowStore": Whether to accept C-STORE SCU commands issued by the remote modality
+              "AllowTranscoding": Whether to allow transcoding for operations initiated by this modality. This option applies to Orthanc C-GET SCP and to Orthanc C-STORE SCU. It only has an effect if the global option `EnableTranscoding` is set to `true`.
+              "Host": Host address of the remote DICOM modality (typically, an IP address)
+              "Manufacturer": Manufacturer of the remote DICOM modality (check configuration option `DicomModalities` for possible values
+              "Port": TCP port of the remote DICOM modality
+              "UseDicomTls": Whether to use DICOM TLS in the SCU connection initiated by Orthanc (new in Orthanc 1.9.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return await self._put(
+            route=f"{self.url}/modalities/{id_}",
+            json=json,
+        )
+
+    async def get_modalities_id_configuration(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get modality configuration
+
+        Get detailed information about the configuration of some DICOM modality
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Configuration of the modality
+        """
+        return await self._get(
+            route=f"{self.url}/modalities/{id_}/configuration",
+        )
+
+    async def post_modalities_id_echo(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Trigger C-ECHO SCU
+
+        Trigger C-ECHO SCU command against the DICOM modality whose identifier is provided in URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-c-echo
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "CheckFind": Issue a dummy C-FIND command after the C-GET SCU, in order to check whether the remote modality knows about Orthanc. This field defaults to the value of the `DicomEchoChecksFind` configuration option. New in Orthanc 1.8.1.
+              "Timeout": Timeout for the C-ECHO command, in seconds
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/modalities/{id_}/echo",
+            json=json,
+        )
+
+    async def post_modalities_id_find(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Hierarchical C-FIND SCU
+
+        Trigger a sequence of C-FIND SCU commands against the DICOM modality whose identifier is provided in URL, in order to discover a hierarchy of matching patients/studies/series. Deprecated in favor of `/modalities/{id}/query`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array describing the DICOM tags of the matching patients, embedding the matching studies, then the matching series.
+        """
+        warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/modalities/{id_}/find",
+            json=json,
+        )
+
+    async def post_modalities_id_find_instance(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) C-FIND SCU for instances
+
+        Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find an instance. Deprecated in favor of `/modalities/{id}/query`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array describing the DICOM tags of the matching instances
+        """
+        warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/modalities/{id_}/find-instance",
+            json=json,
+        )
+
+    async def post_modalities_id_find_patient(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) C-FIND SCU for patients
+
+        Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a patient. Deprecated in favor of `/modalities/{id}/query`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array describing the DICOM tags of the matching patients
+        """
+        warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/modalities/{id_}/find-patient",
+            json=json,
+        )
+
+    async def post_modalities_id_find_series(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) C-FIND SCU for series
+
+        Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a series. Deprecated in favor of `/modalities/{id}/query`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array describing the DICOM tags of the matching series
+        """
+        warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/modalities/{id_}/find-series",
+            json=json,
+        )
+
+    async def post_modalities_id_find_study(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) C-FIND SCU for studies
+
+        Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a study. Deprecated in favor of `/modalities/{id}/query`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array describing the DICOM tags of the matching studies
+        """
+        warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/modalities/{id_}/find-study",
+            json=json,
+        )
+
+    async def post_modalities_id_find_worklist(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) C-FIND SCU for worklist
+
+        Trigger C-FIND SCU command against the remote worklists of the DICOM modality whose identifier is provided in URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+              "Query": Associative array containing the filter on the values of the DICOM tags
+              "Short": If set to `true`, report the DICOM tags in hexadecimal format
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array describing the DICOM tags of the matching worklists
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/modalities/{id_}/find-worklist",
+            json=json,
+        )
+
+    async def post_modalities_id_move(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Trigger C-MOVE SCU
+
+        Start a C-MOVE SCU command as a job, in order to drive the execution of a sequence of C-STORE commands by some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-c-move
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Level": Level of the query (`Patient`, `Study`, `Series` or `Instance`)
+              "LocalAet": Local AET that is used for this commands, defaults to `DicomAet` configuration option. Ignored if `DicomModalities` already sets `LocalAet` for this modality.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": List of queries identifying all the DICOM resources to be sent
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "TargetAet": Target AET that will be used by the remote DICOM modality as a target for its C-STORE SCU commands, defaults to `DicomAet` configuration option in order to do a simple query/retrieve
+              "Timeout": Timeout for the C-MOVE command, in seconds
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/modalities/{id_}/move",
+            json=json,
+        )
+
+    async def post_modalities_id_query(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Trigger C-FIND SCU
+
+        Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-query-retrieve-c-find-and-find-with-rest
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "Level": Level of the query (`Patient`, `Study`, `Series` or `Instance`)
+              "LocalAet": Local AET that is used for this commands, defaults to `DicomAet` configuration option. Ignored if `DicomModalities` already sets `LocalAet` for this modality.
+              "Normalize": Whether to normalize the query, i.e. whether to wipe out from the query, the DICOM tags that are not applicable for the query-retrieve level of interest
+              "Query": Associative array containing the filter on the values of the DICOM tags
+              "Timeout": Timeout for the C-FIND command and subsequent C-MOVE retrievals, in seconds (new in Orthanc 1.9.1)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/modalities/{id_}/query",
+            json=json,
+        )
+
+    async def post_modalities_id_storage_commitment(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Trigger storage commitment request
+
+        Trigger a storage commitment request to some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/storage-commitment.html#storage-commitment-scu
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "DicomInstances": List of DICOM resources that are not necessarily stored within Orthanc, but that must be checked by storage commitment. This is a list of JSON objects that must contain the `SOPClassUID` and `SOPInstanceUID` fields.
+              "Resources": List of the Orthanc identifiers of the DICOM resources to be checked by storage commitment
+              "Timeout": Timeout for the storage commitment command (new in Orthanc 1.9.1)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/modalities/{id_}/storage-commitment",
+            json=json,
+        )
+
+    async def post_modalities_id_store(
+        self,
+        id_: str,
+        data: RequestData = None,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Trigger C-STORE SCU
+
+        Start a C-STORE SCU command as a job, in order to send DICOM resources stored locally to some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#rest-store-scu
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "CalledAet": Called AET that is used for this commands, defaults to `AET` configuration option. Allows you to overwrite the destination AET for a specific operation.
+              "Host": Host that is used for this commands, defaults to `Host` configuration option. Allows you to overwrite the destination host for a specific operation.
+              "LocalAet": Local AET that is used for this commands, defaults to `DicomAet` configuration option. Ignored if `DicomModalities` already sets `LocalAet` for this modality.
+              "MoveOriginatorAet": Move originator AET that is used for this commands, in order to fake a C-MOVE SCU
+              "MoveOriginatorID": Move originator ID that is used for this commands, in order to fake a C-MOVE SCU
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Port": Port that is used for this command, defaults to `Port` configuration option. Allows you to overwrite the destination port for a specific operation.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": List of the Orthanc identifiers of all the DICOM resources to be sent
+              "StorageCommitment": Whether to chain C-STORE with DICOM storage commitment to validate the success of the transmission: https://orthanc.uclouvain.be/book/users/storage-commitment.html#chaining-c-store-with-storage-commitment
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Timeout": Timeout for the C-STORE command, in seconds
+
+        data
+            The Orthanc identifier of one resource to be sent
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/modalities/{id_}/store",
+            data=data,
+            json=json,
+        )
+
+    async def post_modalities_id_store_straight(
+        self,
+        id_: str,
+        content: RequestContent = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Straight C-STORE SCU
+
+        Synchronously send the DICOM instance in the POST body to the remote DICOM modality whose identifier is provided in URL, without having to first store it locally within Orthanc. This is an alternative to command-line tools such as `storescu` from DCMTK or dcm4che.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        content
+                - (Content-Type: "application/dicom") DICOM instance to be sent
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return await self._post(
+            route=f"{self.url}/modalities/{id_}/store-straight",
+            content=content,
+        )
+
+    async def get_patients(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List the available patients
+
+        List the Orthanc identifiers of all the available DICOM patients
+        Tags: Patients
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual patients
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "limit" (float): Limit the number of results
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "since" (float): Show only the resources since the provided index
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the Orthanc identifiers, or detailed information about the reported patients (if `expand` argument is provided)
+        """
+        return await self._get(
+            route=f"{self.url}/patients",
+            params=params,
+        )
+
+    async def delete_patients_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete some patient
+
+        Delete the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/patients/{id_}",
+        )
+
+    async def get_patients_id(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get information about some patient
+
+        Get detailed information about the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM patient
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}",
+            params=params,
+        )
+
+    async def post_patients_id_anonymize(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Anonymize patient
+
+        Start a job that will anonymize all the DICOM instances within the patient whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new patient, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+              "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/patients/{id_}/anonymize",
+            json=json,
+        )
+
+    async def get_patients_id_archive(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create ZIP archive
+
+        Synchronously create a ZIP archive containing the DICOM patient whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+                "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            ZIP file containing the archive
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/archive",
+            params=params,
+        )
+
+    async def post_patients_id_archive(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create ZIP archive
+
+        Create a ZIP archive containing the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/patients/{id_}/archive",
+            json=json,
+        )
+
+    async def get_patients_id_attachments(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List attachments
+
+        Get the list of attachments that are associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "full" (str): If present, retrieve the attachments list and their numerical ids
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the attachments
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/attachments",
+            params=params,
+        )
+
+    async def delete_patients_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete attachment
+
+        Delete an attachment associated with the given DICOM patient. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/patients/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    async def get_patients_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List operations on attachments
+
+        Get the list of the operations that are available for attachments associated with the given patient
+        Tags: Other
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    async def put_patients_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        content: RequestContent = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set attachment
+
+        Attach a file to the given DICOM patient. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        content
+                - (Content-Type: "application/octet-stream") Binary data containing the attachment
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return await self._put(
+            route=f"{self.url}/patients/{id_}/attachments/{name}",
+            content=content,
+            headers=headers,
+        )
+
+    async def post_patients_id_attachments_name_compress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Compress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/compress",
+        )
+
+    async def get_patients_id_attachments_name_compressed_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get attachment (no decompression)
+
+        Get the (binary) content of one attachment associated with the given patient. The attachment will not be decompressed if `StorageCompression` is `true`.
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/compressed-data",
+            headers=headers,
+        )
+
+    async def get_patients_id_attachments_name_compressed_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get MD5 of attachment on disk
+
+        Get the MD5 hash of one attachment associated with the given patient, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment, as stored on the disk
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/compressed-md5",
+            headers=headers,
+        )
+
+    async def get_patients_id_attachments_name_compressed_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get size of attachment on disk
+
+        Get the size of one attachment associated with the given patient, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment, as stored on the disk
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/compressed-size",
+            headers=headers,
+        )
+
+    async def get_patients_id_attachments_name_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get attachment
+
+        Get the (binary) content of one attachment associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/data",
+            headers=headers,
+        )
+
+    async def get_patients_id_attachments_name_info(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get info about the attachment
+
+        Get all the information about the attachment associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the information about the attachment
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/info",
+            headers=headers,
+        )
+
+    async def get_patients_id_attachments_name_is_compressed(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Is attachment compressed?
+
+        Test whether the attachment has been stored as a compressed file on the disk.
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `0` if the attachment was stored uncompressed, `1` if it was compressed
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/is-compressed",
+            headers=headers,
+        )
+
+    async def get_patients_id_attachments_name_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get MD5 of attachment
+
+        Get the MD5 hash of one attachment associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/md5",
+            headers=headers,
+        )
+
+    async def get_patients_id_attachments_name_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get size of attachment
+
+        Get the size of one attachment associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/size",
+            headers=headers,
+        )
+
+    async def post_patients_id_attachments_name_uncompress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Uncompress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/uncompress",
+        )
+
+    async def post_patients_id_attachments_name_verify_md5(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Verify attachment
+
+        Verify that the attachment is not corrupted, by validating its MD5 hash
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            On success, a valid JSON object is returned
+        """
+        return await self._post(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/verify-md5",
+        )
+
+    async def get_patients_id_instances(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get child instances
+
+        Get detailed information about the child instances of the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If false or missing, only retrieve the list of child instances
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing information about the child DICOM instances
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/instances",
+            params=params,
+        )
+
+    async def get_patients_id_instances_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get tags of instances
+
+        Get the tags of all the child instances of the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/instances-tags",
+            params=params,
+        )
+
+    async def get_patients_id_labels(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List labels
+
+        Get the labels that are associated with the given patient (new in Orthanc 1.12.0)
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the labels
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/labels",
+        )
+
+    async def delete_patients_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Remove label
+
+        Remove a label associated with a patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        label
+            The label to be removed
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/patients/{id_}/labels/{label}",
+        )
+
+    async def get_patients_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Test label
+
+        Test whether the patient is associated with the given label
+        Tags: Patients
+
+        Parameters
+        ----------
+        label
+            The label of interest
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty string is returned in the case of presence, error 404 in the case of absence
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/labels/{label}",
+        )
+
+    async def put_patients_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Add label
+
+        Associate a label with a patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        label
+            The label to be added
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/patients/{id_}/labels/{label}",
+        )
+
+    async def get_patients_id_media(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create DICOMDIR media
+
+        Synchronously create a DICOMDIR media containing the DICOM patient whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "extended" (str): If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*
+                "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+                "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            ZIP file containing the archive
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/media",
+            params=params,
+        )
+
+    async def post_patients_id_media(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/patients/{id_}/media",
+            json=json,
+        )
+
+    async def get_patients_id_metadata(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List metadata
+
+        Get the list of metadata that are associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, also retrieve the value of the individual metadata
+                "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/metadata",
+            params=params,
+        )
+
+    async def delete_patients_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete metadata
+
+        Delete some metadata associated with the given DICOM patient. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/patients/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    async def get_patients_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get metadata
+
+        Get the value of a metadata that is associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Value of the metadata
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    async def put_patients_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        data: RequestData = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set metadata
+
+        Set the value of some metadata in the given DICOM patient. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        data
+            String value of the metadata
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/patients/{id_}/metadata/{name}",
+            data=data,
+            headers=headers,
+        )
+
+    async def post_patients_id_modify(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Modify patient
+
+        Start a job that will modify all the DICOM instances within the patient whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new patient, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/patients/{id_}/modify",
+            json=json,
+        )
+
+    async def get_patients_id_module(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get patient module
+
+        Get the patient module of the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM patient
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/module",
+            params=params,
+        )
+
+    async def get_patients_id_protected(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Is the patient protected against recycling?
+
+        Is the patient protected against recycling?
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `1` if protected, `0` if not protected
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/protected",
+        )
+
+    async def put_patients_id_protected(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Protect/Unprotect a patient against recycling
+
+        Protects a patient by sending `1` or `true` in the payload request. Unprotects a patient by sending `0` or `false` in the payload requests. More info: https://orthanc.uclouvain.be/book/faq/features.html#recycling-protection
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/patients/{id_}/protected",
+        )
+
+    async def post_patients_id_reconstruct(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Reconstruct tags & optionally files of patient
+
+        Reconstruct the main DICOM tags in DB of the patient whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        json
+            Dictionary with the following keys:
+              "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/patients/{id_}/reconstruct",
+            json=json,
+        )
+
+    async def get_patients_id_series(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get child series
+
+        Get detailed information about the child series of the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If false or missing, only retrieve the list of child series
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing information about the child DICOM series
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/series",
+            params=params,
+        )
+
+    async def get_patients_id_shared_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get shared tags
+
+        Extract the DICOM tags whose value is constant across all the child instances of the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the values of the DICOM tags
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/shared-tags",
+            params=params,
+        )
+
+    async def get_patients_id_statistics(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get patient statistics
+
+        Get statistics about the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/statistics",
+        )
+
+    async def get_patients_id_studies(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get child studies
+
+        Get detailed information about the child studies of the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If false or missing, only retrieve the list of child studies
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing information about the child DICOM studies
+        """
+        return await self._get(
+            route=f"{self.url}/patients/{id_}/studies",
+            params=params,
+        )
+
+    async def get_peers(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List Orthanc peers
+
+        List all the Orthanc peers that are known to Orthanc. This corresponds either to the content of the `OrthancPeers` configuration option, or to the information stored in the database if `OrthancPeersInDatabase` is `true`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual Orthanc peers
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the identifiers of the peers, or detailed information about the peers (if `expand` argument is provided)
+        """
+        return await self._get(
+            route=f"{self.url}/peers",
+            params=params,
+        )
+
+    async def delete_peers_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete Orthanc peer
+
+        Delete one Orthanc peer. This change is permanent iff. `OrthancPeersInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the Orthanc peer of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/peers/{id_}",
+        )
+
+    async def get_peers_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List operations on peer
+
+        List the operations that are available for an Orthanc peer.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the peer of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return await self._get(
+            route=f"{self.url}/peers/{id_}",
+        )
+
+    async def put_peers_id(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Update Orthanc peer
+
+        Define a new Orthanc peer, or update an existing one. This change is permanent iff. `OrthancPeersInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the new/updated Orthanc peer
+        json
+            Dictionary with the following keys:
+              "CertificateFile": SSL certificate for the HTTPS connections
+              "CertificateKeyFile": Key file for the SSL certificate for the HTTPS connections
+              "CertificateKeyPassword": Key password for the SSL certificate for the HTTPS connections
+              "HttpHeaders": HTTP headers to be used for the connections to the remote peer
+              "Password": Password for the credentials
+              "URL": URL of the root of the REST API of the remote Orthanc peer, for instance `http://localhost:8042/`
+              "Username": Username for the credentials
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return await self._put(
+            route=f"{self.url}/peers/{id_}",
+            json=json,
+        )
+
+    async def get_peers_id_configuration(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get peer configuration
+
+        Get detailed information about the configuration of some Orthanc peer
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the peer of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Configuration of the peer
+        """
+        return await self._get(
+            route=f"{self.url}/peers/{id_}/configuration",
+        )
+
+    async def post_peers_id_store(
+        self,
+        id_: str,
+        data: RequestData = None,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Send to Orthanc peer
+
+        Send DICOM resources stored locally to some remote Orthanc peer whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#sending-one-resource
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Compress": Whether to compress the DICOM instances using gzip before the actual sending
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": List of the Orthanc identifiers of all the DICOM resources to be sent
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode to the provided DICOM transfer syntax before the actual sending
+
+        data
+            The Orthanc identifier of one resource to be sent
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/peers/{id_}/store",
+            data=data,
+            json=json,
+        )
+
+    async def post_peers_id_store_straight(
+        self,
+        id_: str,
+        content: RequestContent = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Straight store to peer
+
+        Synchronously send the DICOM instance in the POST body to the Orthanc peer whose identifier is provided in URL, without having to first store it locally within Orthanc. This is an alternative to command-line tools such as `curl`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        content
+                - (Content-Type: "application/dicom") DICOM instance to be sent
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return await self._post(
+            route=f"{self.url}/peers/{id_}/store-straight",
+            content=content,
+        )
+
+    async def get_peers_id_system(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get peer system information
+
+        Get system information about some Orthanc peer. This corresponds to doing a `GET` request against the `/system` URI of the remote peer. This route can be used to test connectivity.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the peer of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            System information about the peer
+        """
+        return await self._get(
+            route=f"{self.url}/peers/{id_}/system",
+        )
+
+    async def get_plugins(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List plugins
+
+        List all the installed plugins
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the identifiers of the installed plugins
+        """
+        return await self._get(
+            route=f"{self.url}/plugins",
+        )
+
+    async def get_plugins_explorer_js(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) JavaScript extensions to Orthanc Explorer
+
+        Get the JavaScript extensions that are installed by all the plugins using the `OrthancPluginExtendOrthancExplorer()` function of the plugin SDK. This route is for internal use of Orthanc Explorer.
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The JavaScript extensions
+        """
+        return await self._get(
+            route=f"{self.url}/plugins/explorer.js",
+        )
+
+    async def get_plugins_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get plugin
+
+        Get system information about the plugin whose identifier is provided in the URL
+        Tags: System
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing information about the plugin
+        """
+        return await self._get(
+            route=f"{self.url}/plugins/{id_}",
+        )
+
+    async def get_queries(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List query/retrieve operations
+
+        List the identifiers of all the query/retrieve operations on DICOM modalities, as initiated by calls to `/modalities/{id}/query`. The length of this list is bounded by the `QueryRetrieveSize` configuration option of Orthanc. https://orthanc.uclouvain.be/book/users/rest.html#performing-query-retrieve-c-find-and-find-with-rest
+        Tags: Networking
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the identifiers
+        """
+        return await self._get(
+            route=f"{self.url}/queries",
+        )
+
+    async def delete_queries_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete a query
+
+        Delete the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/queries/{id_}",
+        )
+
+    async def get_queries_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List operations on a query
+
+        List the available operations for the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the list of operations
+        """
+        return await self._get(
+            route=f"{self.url}/queries/{id_}",
+        )
+
+    async def get_queries_id_answers(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List answers to a query
+
+        List the indices of all the available answers resulting from a query/retrieve operation on some DICOM modality, whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual answers
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the indices of the answers, or detailed information about the reported answers (if `expand` argument is provided)
+        """
+        return await self._get(
+            route=f"{self.url}/queries/{id_}/answers",
+            params=params,
+        )
+
+    async def get_queries_id_answers_index(
+        self,
+        id_: str,
+        index: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List operations on an answer
+
+        List the available operations on an answer associated with the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        index
+            Index of the answer
+        id_
+            Identifier of the query of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the list of operations
+        """
+        return await self._get(
+            route=f"{self.url}/queries/{id_}/answers/{index}",
+        )
+
+    async def get_queries_id_answers_index_content(
+        self,
+        id_: str,
+        index: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get one answer
+
+        Get the content (DICOM tags) of one answer associated with the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        index
+            Index of the answer
+        id_
+            Identifier of the query of interest
+        params
+            Dictionary of optional parameters:
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the DICOM tags of the answer
+        """
+        return await self._get(
+            route=f"{self.url}/queries/{id_}/answers/{index}/content",
+            params=params,
+        )
+
+    async def post_queries_id_answers_index_query_instances(
+        self,
+        id_: str,
+        index: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Query the child instances of an answer
+
+        Issue a second DICOM C-FIND operation, in order to query the child instances associated with one answer to some query/retrieve operation whose identifiers are provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        index
+            Index of the answer
+        id_
+            Identifier of the query of interest
+        json
+            Dictionary with the following keys:
+              "Query": Associative array containing the filter on the values of the DICOM tags
+              "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/queries/{id_}/answers/{index}/query-instances",
+            json=json,
+        )
+
+    async def post_queries_id_answers_index_query_series(
+        self,
+        id_: str,
+        index: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Query the child series of an answer
+
+        Issue a second DICOM C-FIND operation, in order to query the child series associated with one answer to some query/retrieve operation whose identifiers are provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        index
+            Index of the answer
+        id_
+            Identifier of the query of interest
+        json
+            Dictionary with the following keys:
+              "Query": Associative array containing the filter on the values of the DICOM tags
+              "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/queries/{id_}/answers/{index}/query-series",
+            json=json,
+        )
+
+    async def post_queries_id_answers_index_query_studies(
+        self,
+        id_: str,
+        index: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Query the child studies of an answer
+
+        Issue a second DICOM C-FIND operation, in order to query the child studies associated with one answer to some query/retrieve operation whose identifiers are provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        index
+            Index of the answer
+        id_
+            Identifier of the query of interest
+        json
+            Dictionary with the following keys:
+              "Query": Associative array containing the filter on the values of the DICOM tags
+              "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/queries/{id_}/answers/{index}/query-studies",
+            json=json,
+        )
+
+    async def post_queries_id_answers_index_retrieve(
+        self,
+        id_: str,
+        index: str,
+        data: RequestData = None,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Retrieve one answer
+
+        Start a C-MOVE SCU command as a job, in order to retrieve one answer associated with the query/retrieve operation whose identifiers are provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-retrieve-c-move
+        Tags: Networking
+
+        Parameters
+        ----------
+        index
+            Index of the answer
+        id_
+            Identifier of the query of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Simplify": If set to `true`, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "TargetAet": AET of the target modality. By default, the AET of Orthanc is used, as defined in the `DicomAet` configuration option.
+              "Timeout": Timeout for the C-MOVE command, in seconds
+
+        data
+            AET of the target modality
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/queries/{id_}/answers/{index}/retrieve",
+            data=data,
+            json=json,
+        )
+
+    async def get_queries_id_level(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get level of original query
+
+        Get the query level (value of the `QueryRetrieveLevel` tag) of the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The level
+        """
+        return await self._get(
+            route=f"{self.url}/queries/{id_}/level",
+        )
+
+    async def get_queries_id_modality(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get modality of original query
+
+        Get the identifier of the DICOM modality that was targeted by the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The identifier of the DICOM modality
+        """
+        return await self._get(
+            route=f"{self.url}/queries/{id_}/modality",
+        )
+
+    async def get_queries_id_query(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get original query arguments
+
+        Get the original DICOM filter associated with the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+        params
+            Dictionary of optional parameters:
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Content of the original query
+        """
+        return await self._get(
+            route=f"{self.url}/queries/{id_}/query",
+            params=params,
+        )
+
+    async def post_queries_id_retrieve(
+        self,
+        id_: str,
+        data: RequestData = None,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Retrieve all answers
+
+        Start a C-MOVE SCU command as a job, in order to retrieve all the answers associated with the query/retrieve operation whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-retrieve-c-move
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Simplify": If set to `true`, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "TargetAet": AET of the target modality. By default, the AET of Orthanc is used, as defined in the `DicomAet` configuration option.
+              "Timeout": Timeout for the C-MOVE command, in seconds
+
+        data
+            AET of the target modality
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/queries/{id_}/retrieve",
+            data=data,
+            json=json,
+        )
+
+    async def get_series(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List the available series
+
+        List the Orthanc identifiers of all the available DICOM series
+        Tags: Series
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual series
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "limit" (float): Limit the number of results
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "since" (float): Show only the resources since the provided index
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the Orthanc identifiers, or detailed information about the reported series (if `expand` argument is provided)
+        """
+        return await self._get(
+            route=f"{self.url}/series",
+            params=params,
+        )
+
+    async def delete_series_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete some series
+
+        Delete the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/series/{id_}",
+        )
+
+    async def get_series_id(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get information about some series
+
+        Get detailed information about the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM series
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}",
+            params=params,
+        )
+
+    async def post_series_id_anonymize(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Anonymize series
+
+        Start a job that will anonymize all the DICOM instances within the series whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new series, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+              "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/series/{id_}/anonymize",
+            json=json,
+        )
+
+    async def get_series_id_archive(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create ZIP archive
+
+        Synchronously create a ZIP archive containing the DICOM series whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+                "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            ZIP file containing the archive
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/archive",
+            params=params,
+        )
+
+    async def post_series_id_archive(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create ZIP archive
+
+        Create a ZIP archive containing the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/series/{id_}/archive",
+            json=json,
+        )
+
+    async def get_series_id_attachments(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List attachments
+
+        Get the list of attachments that are associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "full" (str): If present, retrieve the attachments list and their numerical ids
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the attachments
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/attachments",
+            params=params,
+        )
+
+    async def delete_series_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete attachment
+
+        Delete an attachment associated with the given DICOM series. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/series/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    async def get_series_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List operations on attachments
+
+        Get the list of the operations that are available for attachments associated with the given series
+        Tags: Other
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    async def put_series_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        content: RequestContent = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set attachment
+
+        Attach a file to the given DICOM series. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        content
+                - (Content-Type: "application/octet-stream") Binary data containing the attachment
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return await self._put(
+            route=f"{self.url}/series/{id_}/attachments/{name}",
+            content=content,
+            headers=headers,
+        )
+
+    async def post_series_id_attachments_name_compress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Compress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/series/{id_}/attachments/{name}/compress",
+        )
+
+    async def get_series_id_attachments_name_compressed_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get attachment (no decompression)
+
+        Get the (binary) content of one attachment associated with the given series. The attachment will not be decompressed if `StorageCompression` is `true`.
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/compressed-data",
+            headers=headers,
+        )
+
+    async def get_series_id_attachments_name_compressed_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get MD5 of attachment on disk
+
+        Get the MD5 hash of one attachment associated with the given series, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment, as stored on the disk
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/compressed-md5",
+            headers=headers,
+        )
+
+    async def get_series_id_attachments_name_compressed_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get size of attachment on disk
+
+        Get the size of one attachment associated with the given series, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment, as stored on the disk
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/compressed-size",
+            headers=headers,
+        )
+
+    async def get_series_id_attachments_name_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get attachment
+
+        Get the (binary) content of one attachment associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/data",
+            headers=headers,
+        )
+
+    async def get_series_id_attachments_name_info(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get info about the attachment
+
+        Get all the information about the attachment associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the information about the attachment
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/info",
+            headers=headers,
+        )
+
+    async def get_series_id_attachments_name_is_compressed(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Is attachment compressed?
+
+        Test whether the attachment has been stored as a compressed file on the disk.
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `0` if the attachment was stored uncompressed, `1` if it was compressed
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/is-compressed",
+            headers=headers,
+        )
+
+    async def get_series_id_attachments_name_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get MD5 of attachment
+
+        Get the MD5 hash of one attachment associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/md5",
+            headers=headers,
+        )
+
+    async def get_series_id_attachments_name_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get size of attachment
+
+        Get the size of one attachment associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/size",
+            headers=headers,
+        )
+
+    async def post_series_id_attachments_name_uncompress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Uncompress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/series/{id_}/attachments/{name}/uncompress",
+        )
+
+    async def post_series_id_attachments_name_verify_md5(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Verify attachment
+
+        Verify that the attachment is not corrupted, by validating its MD5 hash
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            On success, a valid JSON object is returned
+        """
+        return await self._post(
+            route=f"{self.url}/series/{id_}/attachments/{name}/verify-md5",
+        )
+
+    async def get_series_id_instances(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get child instances
+
+        Get detailed information about the child instances of the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If false or missing, only retrieve the list of child instances
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing information about the child DICOM instances
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/instances",
+            params=params,
+        )
+
+    async def get_series_id_instances_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get tags of instances
+
+        Get the tags of all the child instances of the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/instances-tags",
+            params=params,
+        )
+
+    async def get_series_id_labels(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List labels
+
+        Get the labels that are associated with the given series (new in Orthanc 1.12.0)
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the labels
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/labels",
+        )
+
+    async def delete_series_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Remove label
+
+        Remove a label associated with a series
+        Tags: Series
+
+        Parameters
+        ----------
+        label
+            The label to be removed
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/series/{id_}/labels/{label}",
+        )
+
+    async def get_series_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Test label
+
+        Test whether the series is associated with the given label
+        Tags: Series
+
+        Parameters
+        ----------
+        label
+            The label of interest
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty string is returned in the case of presence, error 404 in the case of absence
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/labels/{label}",
+        )
+
+    async def put_series_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Add label
+
+        Associate a label with a series
+        Tags: Series
+
+        Parameters
+        ----------
+        label
+            The label to be added
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/series/{id_}/labels/{label}",
+        )
+
+    async def get_series_id_media(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create DICOMDIR media
+
+        Synchronously create a DICOMDIR media containing the DICOM series whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "extended" (str): If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*
+                "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+                "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            ZIP file containing the archive
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/media",
+            params=params,
+        )
+
+    async def post_series_id_media(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/series/{id_}/media",
+            json=json,
+        )
+
+    async def get_series_id_metadata(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List metadata
+
+        Get the list of metadata that are associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, also retrieve the value of the individual metadata
+                "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/metadata",
+            params=params,
+        )
+
+    async def delete_series_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete metadata
+
+        Delete some metadata associated with the given DICOM series. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/series/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    async def get_series_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get metadata
+
+        Get the value of a metadata that is associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Value of the metadata
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    async def put_series_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        data: RequestData = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set metadata
+
+        Set the value of some metadata in the given DICOM series. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        data
+            String value of the metadata
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/series/{id_}/metadata/{name}",
+            data=data,
+            headers=headers,
+        )
+
+    async def post_series_id_modify(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Modify series
+
+        Start a job that will modify all the DICOM instances within the series whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new series, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/series/{id_}/modify",
+            json=json,
+        )
+
+    async def get_series_id_module(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get series module
+
+        Get the series module of the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM series
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/module",
+            params=params,
+        )
+
+    async def get_series_id_numpy(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Decode series for numpy
+
+        Decode the given DICOM series, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel).
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM resource of interest
+        params
+            Dictionary of optional parameters:
+                "compress" (bool): Compress the file as `.npz`
+                "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/numpy",
+            params=params,
+        )
+
+    async def get_series_id_ordered_slices(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Order the slices
+
+        Sort the instances and frames (slices) of the DICOM series whose Orthanc identifier is provided in the URL. This URI is essentially used by the Orthanc Web viewer and by the Osimis Web viewer.
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+        return await self._get(
+            route=f"{self.url}/series/{id_}/ordered-slices",
+        )
+
+    async def get_series_id_patient(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get parent patient
+
+        Get detailed information about the parent patient of the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the parent DICOM patient
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/patient",
+            params=params,
+        )
+
+    async def post_series_id_reconstruct(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Reconstruct tags & optionally files of series
+
+        Reconstruct the main DICOM tags in DB of the series whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        json
+            Dictionary with the following keys:
+              "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/series/{id_}/reconstruct",
+            json=json,
+        )
+
+    async def get_series_id_shared_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get shared tags
+
+        Extract the DICOM tags whose value is constant across all the child instances of the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the values of the DICOM tags
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/shared-tags",
+            params=params,
+        )
+
+    async def get_series_id_statistics(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get series statistics
+
+        Get statistics about the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/statistics",
+        )
+
+    async def get_series_id_study(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get parent study
+
+        Get detailed information about the parent study of the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the parent DICOM study
+        """
+        return await self._get(
+            route=f"{self.url}/series/{id_}/study",
+            params=params,
+        )
+
+    async def get_statistics(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get database statistics
+
+        Get statistics related to the database of Orthanc
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return await self._get(
+            route=f"{self.url}/statistics",
+        )
+
+    async def get_storage_commitment_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get storage commitment report
+
+        Get the storage commitment report whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/storage-commitment.html#storage-commitment-scu
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the storage commitment report
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return await self._get(
+            route=f"{self.url}/storage-commitment/{id_}",
+        )
+
+    async def post_storage_commitment_id_remove(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Remove after storage commitment
+
+        Remove out of Orthanc, the DICOM instances that have been reported to have been properly received the storage commitment report whose identifier is provided in the URL. This is only possible if the `Status` of the storage commitment report is `Success`. https://orthanc.uclouvain.be/book/users/storage-commitment.html#removing-the-instances
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the storage commitment report
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/storage-commitment/{id_}/remove",
+        )
+
+    async def get_studies(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List the available studies
+
+        List the Orthanc identifiers of all the available DICOM studies
+        Tags: Studies
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual studies
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "limit" (float): Limit the number of results
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "since" (float): Show only the resources since the provided index
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the Orthanc identifiers, or detailed information about the reported studies (if `expand` argument is provided)
+        """
+        return await self._get(
+            route=f"{self.url}/studies",
+            params=params,
+        )
+
+    async def delete_studies_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete some study
+
+        Delete the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/studies/{id_}",
+        )
+
+    async def get_studies_id(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get information about some study
+
+        Get detailed information about the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM study
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}",
+            params=params,
+        )
+
+    async def post_studies_id_anonymize(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Anonymize study
+
+        Start a job that will anonymize all the DICOM instances within the study whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new study, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+              "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/studies/{id_}/anonymize",
+            json=json,
+        )
+
+    async def get_studies_id_archive(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create ZIP archive
+
+        Synchronously create a ZIP archive containing the DICOM study whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+                "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            ZIP file containing the archive
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/archive",
+            params=params,
+        )
+
+    async def post_studies_id_archive(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create ZIP archive
+
+        Create a ZIP archive containing the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/studies/{id_}/archive",
+            json=json,
+        )
+
+    async def get_studies_id_attachments(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List attachments
+
+        Get the list of attachments that are associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "full" (str): If present, retrieve the attachments list and their numerical ids
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the attachments
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/attachments",
+            params=params,
+        )
+
+    async def delete_studies_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete attachment
+
+        Delete an attachment associated with the given DICOM study. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/studies/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    async def get_studies_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List operations on attachments
+
+        Get the list of the operations that are available for attachments associated with the given study
+        Tags: Other
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    async def put_studies_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        content: RequestContent = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set attachment
+
+        Attach a file to the given DICOM study. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        content
+                - (Content-Type: "application/octet-stream") Binary data containing the attachment
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return await self._put(
+            route=f"{self.url}/studies/{id_}/attachments/{name}",
+            content=content,
+            headers=headers,
+        )
+
+    async def post_studies_id_attachments_name_compress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Compress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/compress",
+        )
+
+    async def get_studies_id_attachments_name_compressed_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get attachment (no decompression)
+
+        Get the (binary) content of one attachment associated with the given study. The attachment will not be decompressed if `StorageCompression` is `true`.
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/compressed-data",
+            headers=headers,
+        )
+
+    async def get_studies_id_attachments_name_compressed_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get MD5 of attachment on disk
+
+        Get the MD5 hash of one attachment associated with the given study, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment, as stored on the disk
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/compressed-md5",
+            headers=headers,
+        )
+
+    async def get_studies_id_attachments_name_compressed_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get size of attachment on disk
+
+        Get the size of one attachment associated with the given study, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment, as stored on the disk
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/compressed-size",
+            headers=headers,
+        )
+
+    async def get_studies_id_attachments_name_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get attachment
+
+        Get the (binary) content of one attachment associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/data",
+            headers=headers,
+        )
+
+    async def get_studies_id_attachments_name_info(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get info about the attachment
+
+        Get all the information about the attachment associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the information about the attachment
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/info",
+            headers=headers,
+        )
+
+    async def get_studies_id_attachments_name_is_compressed(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Is attachment compressed?
+
+        Test whether the attachment has been stored as a compressed file on the disk.
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `0` if the attachment was stored uncompressed, `1` if it was compressed
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/is-compressed",
+            headers=headers,
+        )
+
+    async def get_studies_id_attachments_name_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get MD5 of attachment
+
+        Get the MD5 hash of one attachment associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/md5",
+            headers=headers,
+        )
+
+    async def get_studies_id_attachments_name_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get size of attachment
+
+        Get the size of one attachment associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/size",
+            headers=headers,
+        )
+
+    async def post_studies_id_attachments_name_uncompress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Uncompress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/uncompress",
+        )
+
+    async def post_studies_id_attachments_name_verify_md5(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Verify attachment
+
+        Verify that the attachment is not corrupted, by validating its MD5 hash
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            On success, a valid JSON object is returned
+        """
+        return await self._post(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/verify-md5",
+        )
+
+    async def get_studies_id_instances(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get child instances
+
+        Get detailed information about the child instances of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If false or missing, only retrieve the list of child instances
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing information about the child DICOM instances
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/instances",
+            params=params,
+        )
+
+    async def get_studies_id_instances_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get tags of instances
+
+        Get the tags of all the child instances of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/instances-tags",
+            params=params,
+        )
+
+    async def get_studies_id_labels(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List labels
+
+        Get the labels that are associated with the given study (new in Orthanc 1.12.0)
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the labels
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/labels",
+        )
+
+    async def delete_studies_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Remove label
+
+        Remove a label associated with a study
+        Tags: Studies
+
+        Parameters
+        ----------
+        label
+            The label to be removed
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/studies/{id_}/labels/{label}",
+        )
+
+    async def get_studies_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Test label
+
+        Test whether the study is associated with the given label
+        Tags: Studies
+
+        Parameters
+        ----------
+        label
+            The label of interest
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty string is returned in the case of presence, error 404 in the case of absence
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/labels/{label}",
+        )
+
+    async def put_studies_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Add label
+
+        Associate a label with a study
+        Tags: Studies
+
+        Parameters
+        ----------
+        label
+            The label to be added
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/studies/{id_}/labels/{label}",
+        )
+
+    async def get_studies_id_media(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create DICOMDIR media
+
+        Synchronously create a DICOMDIR media containing the DICOM study whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "extended" (str): If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*
+                "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+                "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            ZIP file containing the archive
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/media",
+            params=params,
+        )
+
+    async def post_studies_id_media(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/studies/{id_}/media",
+            json=json,
+        )
+
+    async def post_studies_id_merge(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Merge study
+
+        Start a new job so as to move some DICOM resources into the DICOM study whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#merging
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "KeepSource": If set to `true`, instructs Orthanc to keep a copy of the original resources in their source study. By default, the original resources are deleted from Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": The list of DICOM resources (studies, series, and/or instances) to be merged into the study of interest (mandatory option)
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/studies/{id_}/merge",
+            json=json,
+        )
+
+    async def get_studies_id_metadata(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List metadata
+
+        Get the list of metadata that are associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, also retrieve the value of the individual metadata
+                "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/metadata",
+            params=params,
+        )
+
+    async def delete_studies_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete metadata
+
+        Delete some metadata associated with the given DICOM study. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._delete(
+            route=f"{self.url}/studies/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    async def get_studies_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get metadata
+
+        Get the value of a metadata that is associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Value of the metadata
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    async def put_studies_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        data: RequestData = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set metadata
+
+        Set the value of some metadata in the given DICOM study. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        data
+            String value of the metadata
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/studies/{id_}/metadata/{name}",
+            data=data,
+            headers=headers,
+        )
+
+    async def post_studies_id_modify(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Modify study
+
+        Start a job that will modify all the DICOM instances within the study whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new study, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/studies/{id_}/modify",
+            json=json,
+        )
+
+    async def get_studies_id_module(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get study module
+
+        Get the study module of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM study
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/module",
+            params=params,
+        )
+
+    async def get_studies_id_module_patient(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get patient module of study
+
+        Get the patient module of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM study
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/module-patient",
+            params=params,
+        )
+
+    async def get_studies_id_patient(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get parent patient
+
+        Get detailed information about the parent patient of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the parent DICOM patient
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/patient",
+            params=params,
+        )
+
+    async def post_studies_id_reconstruct(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Reconstruct tags & optionally files of study
+
+        Reconstruct the main DICOM tags in DB of the study whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/studies/{id_}/reconstruct",
+            json=json,
+        )
+
+    async def get_studies_id_series(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get child series
+
+        Get detailed information about the child series of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If false or missing, only retrieve the list of child series
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing information about the child DICOM series
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/series",
+            params=params,
+        )
+
+    async def get_studies_id_shared_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get shared tags
+
+        Extract the DICOM tags whose value is constant across all the child instances of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the values of the DICOM tags
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/shared-tags",
+            params=params,
+        )
+
+    async def post_studies_id_split(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Split study
+
+        Start a new job so as to split the DICOM study whose Orthanc identifier is provided in the URL, by taking some of its children series or instances out of it and putting them into a brand new study (this new study is created by setting the `StudyInstanceUID` tag to a random identifier): https://orthanc.uclouvain.be/book/users/anonymization.html#splitting
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Instances": The list of instances to be separated from the parent study. These instances must all be children of the same source study, that is specified in the URI.
+              "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+              "KeepSource": If set to `true`, instructs Orthanc to keep a copy of the original series/instances in the source study. By default, the original series/instances are deleted from Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Remove": List of tags that must be removed in the new study (from the same modules as in the `Replace` option)
+              "Replace": Associative array to change the value of some DICOM tags in the new study. These tags must be part of the "Patient Module Attributes" or the "General Study Module Attributes", as specified by the DICOM 2011 standard in Tables C.7-1 and C.7-3.
+              "Series": The list of series to be separated from the parent study. These series must all be children of the same source study, that is specified in the URI.
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/studies/{id_}/split",
+            json=json,
+        )
+
+    async def get_studies_id_statistics(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get study statistics
+
+        Get statistics about the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return await self._get(
+            route=f"{self.url}/studies/{id_}/statistics",
+        )
+
+    async def get_system(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get system information
+
+        Get system information about Orthanc
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return await self._get(
+            route=f"{self.url}/system",
+        )
+
+    async def get_tools(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) List operations
+
+        List the available operations under URI `/tools/`
+        Tags: Other
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return await self._get(
+            route=f"{self.url}/tools",
+        )
+
+    async def get_tools_accepted_transfer_syntaxes(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get accepted transfer syntaxes
+
+        Get the list of UIDs of the DICOM transfer syntaxes that are accepted by Orthanc C-STORE SCP. This corresponds to the configuration options `AcceptedTransferSyntaxes` and `XXXTransferSyntaxAccepted`.
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the transfer syntax UIDs
+        """
+        return await self._get(
+            route=f"{self.url}/tools/accepted-transfer-syntaxes",
+        )
+
+    async def put_tools_accepted_transfer_syntaxes(
+        self,
+        data: RequestData = None,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set accepted transfer syntaxes
+
+        Set the DICOM transfer syntaxes that accepted by Orthanc C-STORE SCP
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+
+        data
+            UID of the transfer syntax to be accepted. Wildcards `?` and `*` are accepted.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the now-accepted transfer syntax UIDs
+        """
+        if json is None:
+            json = {}
+        return await self._put(
+            route=f"{self.url}/tools/accepted-transfer-syntaxes",
+            data=data,
+            json=json,
+        )
+
+    async def post_tools_bulk_anonymize(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Anonymize a set of resources
+
+        Start a job that will anonymize all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field.
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+              "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The list of all the resources that have been created by this anonymization
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/tools/bulk-anonymize",
+            json=json,
+        )
+
+    async def post_tools_bulk_content(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Describe a set of resources
+
+        Get the content all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field, in one single call.
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+              "Level": This optional argument specifies the level of interest (can be `Patient`, `Study`, `Series` or `Instance`). Orthanc will loop over the items inside `Resources`, and explore upward or downward in the DICOM hierarchy in order to find the level of interest.
+              "Metadata": If set to `true` (default value), the metadata associated with the resources will also be retrieved.
+              "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+              "Short": If set to `true`, report the DICOM tags in hexadecimal format
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/tools/bulk-content",
+            json=json,
+        )
+
+    async def post_tools_bulk_delete(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Delete a set of resources
+
+        Delete all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field.
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/tools/bulk-delete",
+            json=json,
+        )
+
+    async def post_tools_bulk_modify(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Modify a set of resources
+
+        Start a job that will modify all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field.
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Level": Level of the modification (`Patient`, `Study`, `Series` or `Instance`). If absent, the level defaults to `Instance`, but is set to `Patient` if `PatientID` is modified, to `Study` if `StudyInstanceUID` is modified, or to `Series` if `SeriesInstancesUID` is modified. (new in Orthanc 1.9.7)
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The list of all the resources that have been altered by this modification
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/tools/bulk-modify",
+            json=json,
+        )
+
+    async def get_tools_create_archive(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create ZIP archive
+
+        Create a ZIP archive containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument
+        Tags: System
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "resources" (str): A comma separated list of Orthanc resource identifiers to include in the ZIP archive.
+                "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._get(
+            route=f"{self.url}/tools/create-archive",
+            params=params,
+        )
+
+    async def post_tools_create_archive(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create ZIP archive
+
+        Create a ZIP archive containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": The list of Orthanc identifiers of interest.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/tools/create-archive",
+            json=json,
+        )
+
+    async def post_tools_create_dicom(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create one DICOM instance
+
+        Create one DICOM instance, and store it into Orthanc
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Content": This field can be used to embed an image (pixel data encoded as PNG or JPEG), a PDF, or a 3D manufactoring model (MTL/OBJ/STL) inside the created DICOM instance. The file to be encapsulated must be provided using its [data URI scheme encoding](https://en.wikipedia.org/wiki/Data_URI_scheme). This field can possibly contain a JSON array, in which case a DICOM series is created containing one DICOM instance for each item in the `Content` field.
+              "Force": Avoid the consistency checks for the DICOM tags that enforce the DICOM model of the real-world. You can notably use this flag if you need to manually set the tags `StudyInstanceUID`, `SeriesInstanceUID`, or `SOPInstanceUID`. Be careful with this feature.
+              "InterpretBinaryTags": If some value in the `Tags` associative array is formatted according to some [data URI scheme encoding](https://en.wikipedia.org/wiki/Data_URI_scheme), whether this value is decoded to a binary value or kept as such (`true` by default)
+              "Parent": If present, the newly created instance will be attached to the parent DICOM resource whose Orthanc identifier is contained in this field. The DICOM tags of the parent modules in the DICOM hierarchy will be automatically copied to the newly created instance.
+              "PrivateCreator": The private creator to be used for private tags in `Tags`
+              "Tags": Associative array containing the tags of the new instance to be created
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/tools/create-dicom",
+            json=json,
+        )
+
+    async def get_tools_create_media(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument
+        Tags: System
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "resources" (str): A comma separated list of Orthanc resource identifiers to include in the DICOMDIR media.
+                "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._get(
+            route=f"{self.url}/tools/create-media",
+            params=params,
+        )
+
+    async def post_tools_create_media(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": The list of Orthanc identifiers of interest.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/tools/create-media",
+            json=json,
+        )
+
+    async def get_tools_create_media_extended(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument
+        Tags: System
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "resources" (str): A comma separated list of Orthanc resource identifiers to include in the DICOMDIR media.
+                "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._get(
+            route=f"{self.url}/tools/create-media-extended",
+            params=params,
+        )
+
+    async def post_tools_create_media_extended(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `true`.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": The list of Orthanc identifiers of interest.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/tools/create-media-extended",
+            json=json,
+        )
+
+    async def get_tools_default_encoding(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get default encoding
+
+        Get the default encoding that is used by Orthanc if parsing a DICOM instance without the `SpecificCharacterEncoding` tag, or during C-FIND. This corresponds to the configuration option `DefaultEncoding`.
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The name of the encoding
+        """
+        return await self._get(
+            route=f"{self.url}/tools/default-encoding",
+        )
+
+    async def put_tools_default_encoding(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set default encoding
+
+        Change the default encoding that is used by Orthanc if parsing a DICOM instance without the `SpecificCharacterEncoding` tag, or during C-FIND. This corresponds to the configuration option `DefaultEncoding`.
+        Tags: System
+
+        Parameters
+        ----------
+        data
+            The name of the encoding. Check out configuration option `DefaultEncoding` for the allowed values.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/tools/default-encoding",
+            data=data,
+        )
+
+    async def get_tools_dicom_conformance(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get DICOM conformance
+
+        Get the DICOM conformance statement of Orthanc
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The DICOM conformance statement
+        """
+        return await self._get(
+            route=f"{self.url}/tools/dicom-conformance",
+        )
+
+    async def post_tools_dicom_echo(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Trigger C-ECHO SCU
+
+        Trigger C-ECHO SCU command against a DICOM modality described in the POST body, without having to register the modality in some `/modalities/{id}` (new in Orthanc 1.8.1)
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "AET": AET of the remote DICOM modality
+              "CheckFind": Issue a dummy C-FIND command after the C-GET SCU, in order to check whether the remote modality knows about Orthanc. This field defaults to the value of the `DicomEchoChecksFind` configuration option. New in Orthanc 1.8.1.
+              "Host": Host address of the remote DICOM modality (typically, an IP address)
+              "Manufacturer": Manufacturer of the remote DICOM modality (check configuration option `DicomModalities` for possible values
+              "Port": TCP port of the remote DICOM modality
+              "Timeout": Timeout for the C-ECHO command, in seconds
+              "UseDicomTls": Whether to use DICOM TLS in the SCU connection initiated by Orthanc (new in Orthanc 1.9.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/tools/dicom-echo",
+            json=json,
+        )
+
+    async def post_tools_execute_script(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Execute Lua script
+
+        Execute the provided Lua script by the Orthanc server. This is very insecure for Orthanc servers that are remotely accessible.  Since Orthanc 1.5.8, this route is disabled by default and can be enabled thanks to the `ExecuteLuaEnabled` configuration.
+        Tags: System
+
+        Parameters
+        ----------
+        data
+            The Lua script to be executed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Output of the Lua script
+        """
+        return await self._post(
+            route=f"{self.url}/tools/execute-script",
+            data=data,
+        )
+
+    async def post_tools_find(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Look for local resources
+
+        This URI can be used to perform a search on the content of the local Orthanc server, in a way that is similar to querying remote DICOM modalities using C-FIND SCU: https://orthanc.uclouvain.be/book/users/rest.html#performing-finds-within-orthanc
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "CaseSensitive": Enable case-sensitive search for PN value representations (defaults to configuration option `CaseSensitivePN`)
+              "Expand": Also retrieve the content of the matching resources, not only their Orthanc identifiers
+              "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+              "Labels": List of strings specifying which labels to look for in the resources (new in Orthanc 1.12.0)
+              "LabelsConstraint": Constraint on the labels, can be `All`, `Any`, or `None` (defaults to `All`, new in Orthanc 1.12.0)
+              "Level": Level of the query (`Patient`, `Study`, `Series` or `Instance`)
+              "Limit": Limit the number of reported resources
+              "Query": Associative array containing the filter on the values of the DICOM tags
+              "RequestedTags": A list of DICOM tags to include in the response (applicable only if "Expand" is set to true).  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return all Main Dicom Tags to keep backward compatibility with Orthanc prior to 1.11.0.
+              "Short": If set to `true`, report the DICOM tags in hexadecimal format
+              "Since": Show only the resources since the provided index (in conjunction with `Limit`)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the Orthanc identifiers, or detailed information about the reported resources (if `Expand` argument is `true`)
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/tools/find",
+            json=json,
+        )
+
+    async def get_tools_generate_uid(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Generate an identifier
+
+        Generate a random DICOM identifier
+        Tags: System
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "level" (str): Type of DICOM resource among: `patient`, `study`, `series` or `instance`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The generated identifier
+        """
+        return await self._get(
+            route=f"{self.url}/tools/generate-uid_",
+            params=params,
+        )
+
+    async def post_tools_invalid_ate_tags(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Invalidate DICOM-as-JSON summaries
+
+        Remove all the attachments of the type "DICOM-as-JSON" that are associated will all the DICOM instances stored in Orthanc. These summaries will be automatically re-created on the next access. This is notably useful after changes to the `Dictionary` configuration option. https://orthanc.uclouvain.be/book/faq/orthanc-storage.html#storage-area
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/tools/invalid_ate-tags",
+        )
+
+    async def get_tools_labels(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get all the used labels
+
+        List all the labels that are associated with any resource of the Orthanc database
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the labels
+        """
+        return await self._get(
+            route=f"{self.url}/tools/labels",
+        )
+
+    async def get_tools_log_level(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get main log level
+
+        Get the main log level of Orthanc
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return await self._get(
+            route=f"{self.url}/tools/log-level",
+        )
+
+    async def put_tools_log_level(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set main log level
+
+        Set the main log level of Orthanc
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/tools/log-level",
+            data=data,
+        )
+
+    async def get_tools_log_level_dicom(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get log level for `dicom`
+
+        Get the log level of the log category `dicom`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return await self._get(
+            route=f"{self.url}/tools/log-level-dicom",
+        )
+
+    async def put_tools_log_level_dicom(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set log level for `dicom`
+
+        Set the log level of the log category `dicom`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/tools/log-level-dicom",
+            data=data,
+        )
+
+    async def get_tools_log_level_generic(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get log level for `generic`
+
+        Get the log level of the log category `generic`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return await self._get(
+            route=f"{self.url}/tools/log-level-generic",
+        )
+
+    async def put_tools_log_level_generic(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set log level for `generic`
+
+        Set the log level of the log category `generic`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/tools/log-level-generic",
+            data=data,
+        )
+
+    async def get_tools_log_level_http(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get log level for `http`
+
+        Get the log level of the log category `http`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return await self._get(
+            route=f"{self.url}/tools/log-level-http",
+        )
+
+    async def put_tools_log_level_http(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set log level for `http`
+
+        Set the log level of the log category `http`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/tools/log-level-http",
+            data=data,
+        )
+
+    async def get_tools_log_level_jobs(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get log level for `jobs`
+
+        Get the log level of the log category `jobs`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return await self._get(
+            route=f"{self.url}/tools/log-level-jobs",
+        )
+
+    async def put_tools_log_level_jobs(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set log level for `jobs`
+
+        Set the log level of the log category `jobs`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/tools/log-level-jobs",
+            data=data,
+        )
+
+    async def get_tools_log_level_lua(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get log level for `lua`
+
+        Get the log level of the log category `lua`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return await self._get(
+            route=f"{self.url}/tools/log-level-lua",
+        )
+
+    async def put_tools_log_level_lua(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set log level for `lua`
+
+        Set the log level of the log category `lua`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/tools/log-level-lua",
+            data=data,
+        )
+
+    async def get_tools_log_level_plugins(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get log level for `plugins`
+
+        Get the log level of the log category `plugins`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return await self._get(
+            route=f"{self.url}/tools/log-level-plugins",
+        )
+
+    async def put_tools_log_level_plugins(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set log level for `plugins`
+
+        Set the log level of the log category `plugins`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/tools/log-level-plugins",
+            data=data,
+        )
+
+    async def get_tools_log_level_sqlite(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get log level for `sqlite`
+
+        Get the log level of the log category `sqlite`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return await self._get(
+            route=f"{self.url}/tools/log-level-sqlite",
+        )
+
+    async def put_tools_log_level_sqlite(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set log level for `sqlite`
+
+        Set the log level of the log category `sqlite`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/tools/log-level-sqlite",
+            data=data,
+        )
+
+    async def post_tools_lookup(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Look for DICOM identifiers
+
+        This URI can be used to convert one DICOM identifier to a list of matching Orthanc resources
+        Tags: System
+
+        Parameters
+        ----------
+        data
+            The DICOM identifier of interest (i.e. the value of `PatientID`, `StudyInstanceUID`, `SeriesInstanceUID`, or `SOPInstanceUID`)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing a list of matching Orthanc resources, each item in the list corresponding to a JSON object with the fields `Type`, `ID` and `Path` identifying one DICOM resource that is stored by Orthanc
+        """
+        return await self._post(
+            route=f"{self.url}/tools/lookup",
+            data=data,
+        )
+
+    async def get_tools_metrics(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Are metrics collected?
+
+        Returns a Boolean specifying whether Prometheus metrics are collected and exposed at `/tools/metrics-prometheus`
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `1` if metrics are collected, `0` if metrics are disabled
+        """
+        return await self._get(
+            route=f"{self.url}/tools/metrics",
+        )
+
+    async def put_tools_metrics(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Enable collection of metrics
+
+        Enable or disable the collection and publication of metrics at `/tools/metrics-prometheus`
+        Tags: System
+
+        Parameters
+        ----------
+        data
+            `1` if metrics are collected, `0` if metrics are disabled
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/tools/metrics",
+            data=data,
+        )
+
+    async def get_tools_metrics_prometheus(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get usage metrics
+
+        Get usage metrics of Orthanc in the Prometheus file format (OpenMetrics): https://orthanc.uclouvain.be/book/users/advanced-rest.html#instrumentation-with-prometheus
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            No description
+        """
+        return await self._get(
+            route=f"{self.url}/tools/metrics-prometheus",
+        )
+
+    async def get_tools_now(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get UTC time
+
+        Get UTC time
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The UTC time
+        """
+        return await self._get(
+            route=f"{self.url}/tools/now",
+        )
+
+    async def get_tools_now_local(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Get local time
+
+        Get local time
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The local time
+        """
+        return await self._get(
+            route=f"{self.url}/tools/now-local",
+        )
+
+    async def post_tools_reconstruct(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Reconstruct all the index
+
+        Reconstruct the index of all the tags of all the DICOM instances that are stored in Orthanc. This is notably useful after the deletion of resources whose children resources have inconsistent values with their sibling resources. Beware that this is a highly time-consuming operation, as all the DICOM instances will be parsed again, and as all the Orthanc index will be regenerated. If you have a large database to process, it is advised to use the Housekeeper plugin to perform this action resource by resource
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return await self._post(
+            route=f"{self.url}/tools/reconstruct",
+            json=json,
+        )
+
+    async def post_tools_reset(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Restart Orthanc
+
+        Restart Orthanc
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/tools/reset",
+        )
+
+    async def post_tools_shutdown(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Shutdown Orthanc
+
+        Shutdown Orthanc
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._post(
+            route=f"{self.url}/tools/shutdown",
+        )
+
+    async def get_tools_unknown_sop_class_accepted(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Is unknown SOP class accepted?
+
+        Shall Orthanc C-STORE SCP accept DICOM instances with an unknown SOP class UID?
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `1` if accepted, `0` if not accepted
+        """
+        return await self._get(
+            route=f"{self.url}/tools/unknown-sop-class-accepted",
+        )
+
+    async def put_tools_unknown_sop_class_accepted(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """(async) Set unknown SOP class accepted
+
+        Set whether Orthanc C-STORE SCP should accept DICOM instances with an unknown SOP class UID
+        Tags: System
+
+        Parameters
+        ----------
+        data
+            `1` if accepted, `0` if not accepted
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return await self._put(
+            route=f"{self.url}/tools/unknown-sop-class-accepted",
+            data=data,
+        )
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ __init__(url, username=None, password=None, return_raw_response=False, *args, **kwargs) + +

+ + +
+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
url + str + +
+

server's URL

+
+
+ required +
username + Optional[str] + +
+

Orthanc's username

+
+
+ None +
password + Optional[str] + +
+

Orthanc's password

+
+
+ None +
return_raw_response + bool + +
+

All Orthanc's methods will return a raw httpx.Response rather than the serialized result

+
+
+ False +
*args + +
+

Parameters passed to the httpx.Client (headers, timeout, etc.)

+
+
+ () +
**kwargs + +
+

Parameters passed to the httpx.Client (headers, timeout, etc.)

+
+
+ () +
+ +
+ Source code in pyorthanc/async_client.py +
23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
def __init__(
+    self,
+    url: str,
+    username: Optional[str] = None,
+    password: Optional[str] = None,
+    return_raw_response: bool = False,
+    *args,
+    **kwargs,
+):
+    """
+    Parameters
+    ----------
+    url
+        server's URL
+    username
+        Orthanc's username
+    password
+        Orthanc's password
+    return_raw_response
+        All Orthanc's methods will return a raw httpx.Response rather than the serialized result
+    *args, **kwargs
+        Parameters passed to the httpx.Client (headers, timeout, etc.)
+    """
+    super().__init__(*args, **kwargs)
+    self.url = url
+    self.version = "1.12.3"
+    self.return_raw_response = return_raw_response
+
+    if username and password:
+        self.setup_credentials(username, password)
+
+
+
+ +
+ +
+ + +

+ delete_changes() + + + async + + +

+ + +
+ +

(async) Clear changes

+

Clear the full history stored in the changes log +Tags: Tracking changes

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
async def delete_changes(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Clear changes
+
+    Clear the full history stored in the changes log
+    Tags: Tracking changes
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/changes",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_exports() + + + async + + +

+ + +
+ +

(async) Clear exports

+

Clear the full history stored in the exports log +Tags: Tracking changes

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
async def delete_exports(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Clear exports
+
+    Clear the full history stored in the exports log
+    Tags: Tracking changes
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/exports",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_instances_id(id_) + + + async + + +

+ + +
+ +

(async) Delete some instance

+

Delete the DICOM instance whose Orthanc identifier is provided in the URL +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
async def delete_instances_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete some instance
+
+    Delete the DICOM instance whose Orthanc identifier is provided in the URL
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/instances/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_instances_id_attachments_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Delete attachment

+

Delete an attachment associated with the given DICOM instance. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024). +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
async def delete_instances_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete attachment
+
+    Delete an attachment associated with the given DICOM instance. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/instances/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_instances_id_labels_label(id_, label) + + + async + + +

+ + +
+ +

(async) Remove label

+

Remove a label associated with a instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be removed

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
async def delete_instances_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Remove label
+
+    Remove a label associated with a instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    label
+        The label to be removed
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/instances/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_instances_id_metadata_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Delete metadata

+

Delete some metadata associated with the given DICOM instance. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024). +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
async def delete_instances_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete metadata
+
+    Delete some metadata associated with the given DICOM instance. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/instances/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_jobs_id(id_) + + + async + + +

+ + +
+ +

(async) Delete a job from history

+

Delete the job from the jobs history. Only a completed job can be deleted. If the job has not run or not completed yet, you must cancel it first. If the job has outputs, all outputs will be deleted as well. +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
async def delete_jobs_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete a job from history
+
+    Delete the job from the jobs history.  Only a completed job can be deleted. If the job has not run or not completed yet, you must cancel it first. If the job has outputs, all outputs will be deleted as well.
+    Tags: Jobs
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/jobs/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_jobs_id_key(id_, key) + + + async + + +

+ + +
+ +

(async) Delete a job output

+

Delete the output produced by a job. As of Orthanc 1.12.1, only the jobs that generate a DICOMDIR media or a ZIP archive provide such an output (with key equals to archive). +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
key + str + +
+

Name of the output of interest

+
+
+ required +
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
async def delete_jobs_id_key(
+    self,
+    id_: str,
+    key: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete a job output
+
+    Delete the output produced by a job. As of Orthanc 1.12.1, only the jobs that generate a DICOMDIR media or a ZIP archive provide such an output (with `key` equals to `archive`).
+    Tags: Jobs
+
+    Parameters
+    ----------
+    key
+        Name of the output of interest
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/jobs/{id_}/{key}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_modalities_id(id_) + + + async + + +

+ + +
+ +

(async) Delete DICOM modality

+

Delete one DICOM modality. This change is permanent iff. DicomModalitiesInDatabase is true, otherwise it is lost at the next restart of Orthanc. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the DICOM modality of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
async def delete_modalities_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete DICOM modality
+
+    Delete one DICOM modality. This change is permanent iff. `DicomModalitiesInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the DICOM modality of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/modalities/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_patients_id(id_) + + + async + + +

+ + +
+ +

(async) Delete some patient

+

Delete the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
async def delete_patients_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete some patient
+
+    Delete the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/patients/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_patients_id_attachments_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Delete attachment

+

Delete an attachment associated with the given DICOM patient. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024). +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
+3149
+3150
+3151
+3152
async def delete_patients_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete attachment
+
+    Delete an attachment associated with the given DICOM patient. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/patients/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_patients_id_labels_label(id_, label) + + + async + + +

+ + +
+ +

(async) Remove label

+

Remove a label associated with a patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be removed

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
3628
+3629
+3630
+3631
+3632
+3633
+3634
+3635
+3636
+3637
+3638
+3639
+3640
+3641
+3642
+3643
+3644
+3645
+3646
+3647
+3648
+3649
+3650
+3651
async def delete_patients_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Remove label
+
+    Remove a label associated with a patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    label
+        The label to be removed
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/patients/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_patients_id_metadata_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Delete metadata

+

Delete some metadata associated with the given DICOM patient. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024). +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
3799
+3800
+3801
+3802
+3803
+3804
+3805
+3806
+3807
+3808
+3809
+3810
+3811
+3812
+3813
+3814
+3815
+3816
+3817
+3818
+3819
+3820
+3821
+3822
+3823
+3824
+3825
+3826
+3827
async def delete_patients_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete metadata
+
+    Delete some metadata associated with the given DICOM patient. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/patients/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_peers_id(id_) + + + async + + +

+ + +
+ +

(async) Delete Orthanc peer

+

Delete one Orthanc peer. This change is permanent iff. OrthancPeersInDatabase is true, otherwise it is lost at the next restart of Orthanc. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the Orthanc peer of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4180
+4181
+4182
+4183
+4184
+4185
+4186
+4187
+4188
+4189
+4190
+4191
+4192
+4193
+4194
+4195
+4196
+4197
+4198
+4199
+4200
async def delete_peers_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete Orthanc peer
+
+    Delete one Orthanc peer. This change is permanent iff. `OrthancPeersInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the Orthanc peer of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/peers/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_queries_id(id_) + + + async + + +

+ + +
+ +

(async) Delete a query

+

Delete the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4449
+4450
+4451
+4452
+4453
+4454
+4455
+4456
+4457
+4458
+4459
+4460
+4461
+4462
+4463
+4464
+4465
+4466
+4467
+4468
+4469
async def delete_queries_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete a query
+
+    Delete the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/queries/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_series_id(id_) + + + async + + +

+ + +
+ +

(async) Delete some series

+

Delete the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4879
+4880
+4881
+4882
+4883
+4884
+4885
+4886
+4887
+4888
+4889
+4890
+4891
+4892
+4893
+4894
+4895
+4896
+4897
+4898
+4899
async def delete_series_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete some series
+
+    Delete the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/series/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_series_id_attachments_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Delete attachment

+

Delete an attachment associated with the given DICOM series. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024). +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
5067
+5068
+5069
+5070
+5071
+5072
+5073
+5074
+5075
+5076
+5077
+5078
+5079
+5080
+5081
+5082
+5083
+5084
+5085
+5086
+5087
+5088
+5089
+5090
+5091
+5092
+5093
+5094
+5095
async def delete_series_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete attachment
+
+    Delete an attachment associated with the given DICOM series. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/series/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_series_id_labels_label(id_, label) + + + async + + +

+ + +
+ +

(async) Remove label

+

Remove a label associated with a series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be removed

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
5571
+5572
+5573
+5574
+5575
+5576
+5577
+5578
+5579
+5580
+5581
+5582
+5583
+5584
+5585
+5586
+5587
+5588
+5589
+5590
+5591
+5592
+5593
+5594
async def delete_series_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Remove label
+
+    Remove a label associated with a series
+    Tags: Series
+
+    Parameters
+    ----------
+    label
+        The label to be removed
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/series/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_series_id_metadata_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Delete metadata

+

Delete some metadata associated with the given DICOM series. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024). +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
5742
+5743
+5744
+5745
+5746
+5747
+5748
+5749
+5750
+5751
+5752
+5753
+5754
+5755
+5756
+5757
+5758
+5759
+5760
+5761
+5762
+5763
+5764
+5765
+5766
+5767
+5768
+5769
+5770
async def delete_series_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete metadata
+
+    Delete some metadata associated with the given DICOM series. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/series/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_studies_id(id_) + + + async + + +

+ + +
+ +

(async) Delete some study

+

Delete the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
6196
+6197
+6198
+6199
+6200
+6201
+6202
+6203
+6204
+6205
+6206
+6207
+6208
+6209
+6210
+6211
+6212
+6213
+6214
+6215
+6216
async def delete_studies_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete some study
+
+    Delete the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/studies/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_studies_id_attachments_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Delete attachment

+

Delete an attachment associated with the given DICOM study. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024). +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
6384
+6385
+6386
+6387
+6388
+6389
+6390
+6391
+6392
+6393
+6394
+6395
+6396
+6397
+6398
+6399
+6400
+6401
+6402
+6403
+6404
+6405
+6406
+6407
+6408
+6409
+6410
+6411
+6412
async def delete_studies_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete attachment
+
+    Delete an attachment associated with the given DICOM study. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/studies/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_studies_id_labels_label(id_, label) + + + async + + +

+ + +
+ +

(async) Remove label

+

Remove a label associated with a study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be removed

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
6888
+6889
+6890
+6891
+6892
+6893
+6894
+6895
+6896
+6897
+6898
+6899
+6900
+6901
+6902
+6903
+6904
+6905
+6906
+6907
+6908
+6909
+6910
+6911
async def delete_studies_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Remove label
+
+    Remove a label associated with a study
+    Tags: Studies
+
+    Parameters
+    ----------
+    label
+        The label to be removed
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/studies/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_studies_id_metadata_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Delete metadata

+

Delete some metadata associated with the given DICOM study. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024). +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7095
+7096
+7097
+7098
+7099
+7100
+7101
+7102
+7103
+7104
+7105
+7106
+7107
+7108
+7109
+7110
+7111
+7112
+7113
+7114
+7115
+7116
+7117
+7118
+7119
+7120
+7121
+7122
+7123
async def delete_studies_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete metadata
+
+    Delete some metadata associated with the given DICOM study. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._delete(
+        route=f"{self.url}/studies/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_changes(params=None) + + + async + + +

+ + +
+ +

(async) List changes

+

Whenever Orthanc receives a new DICOM instance, this event is recorded in the so-called Changes Log. This enables remote scripts to react to the arrival of new DICOM resources. A typical application is auto-routing, where an external script waits for a new DICOM instance to arrive into Orthanc, then forward this instance to another modality. +Tags: Tracking changes

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "limit" (float): Limit the number of results + "since" (float): Show only the resources since the provided index

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The list of changes

+
+
+ +
+ Source code in pyorthanc/async_client.py +
274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
async def get_changes(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List changes
+
+    Whenever Orthanc receives a new DICOM instance, this event is recorded in the so-called _Changes Log_. This enables remote scripts to react to the arrival of new DICOM resources. A typical application is auto-routing, where an external script waits for a new DICOM instance to arrive into Orthanc, then forward this instance to another modality.
+    Tags: Tracking changes
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "limit" (float): Limit the number of results
+            "since" (float): Show only the resources since the provided index
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The list of changes
+    """
+    return await self._get(
+        route=f"{self.url}/changes",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_exports(params=None) + + + async + + +

+ + +
+ +

(async) List exports

+

For medical traceability, Orthanc can be configured to store a log of all the resources that have been exported to remote modalities. In auto-routing scenarios, it is important to prevent this log to grow indefinitely as incoming instances are routed. You can either disable this logging by setting the option LogExportedResources to false in the configuration file, or periodically clear this log by DELETE-ing this URI. This route might be removed in future versions of Orthanc. +Tags: Tracking changes

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "limit" (float): Limit the number of results + "since" (float): Show only the resources since the provided index

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The list of exports

+
+
+ +
+ Source code in pyorthanc/async_client.py +
316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
async def get_exports(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List exports
+
+    For medical traceability, Orthanc can be configured to store a log of all the resources that have been exported to remote modalities. In auto-routing scenarios, it is important to prevent this log to grow indefinitely as incoming instances are routed. You can either disable this logging by setting the option `LogExportedResources` to `false` in the configuration file, or periodically clear this log by `DELETE`-ing this URI. This route might be removed in future versions of Orthanc.
+    Tags: Tracking changes
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "limit" (float): Limit the number of results
+            "since" (float): Show only the resources since the provided index
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The list of exports
+    """
+    return await self._get(
+        route=f"{self.url}/exports",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances(params=None) + + + async + + +

+ + +
+ +

(async) List the available instances

+

List the Orthanc identifiers of all the available DICOM instances +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual instances + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "limit" (float): Limit the number of results + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format + "since" (float): Show only the resources since the provided index

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the Orthanc identifiers, or detailed information about the reported instances (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
async def get_instances(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List the available instances
+
+    List the Orthanc identifiers of all the available DICOM instances
+    Tags: Instances
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual instances
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "limit" (float): Limit the number of results
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "since" (float): Show only the resources since the provided index
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the Orthanc identifiers, or detailed information about the reported instances (if `expand` argument is provided)
+    """
+    return await self._get(
+        route=f"{self.url}/instances",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get information about some instance

+

Get detailed information about the DICOM instance whose Orthanc identifier is provided in the URL +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM instance

+
+
+ +
+ Source code in pyorthanc/async_client.py +
413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
async def get_instances_id(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get information about some instance
+
+    Get detailed information about the DICOM instance whose Orthanc identifier is provided in the URL
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM instance
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments(id_, params=None) + + + async + + +

+ + +
+ +

(async) List attachments

+

Get the list of attachments that are associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (str): If present, retrieve the attachments list and their numerical ids

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the attachments

+
+
+ +
+ Source code in pyorthanc/async_client.py +
483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
async def get_instances_id_attachments(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List attachments
+
+    Get the list of attachments that are associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "full" (str): If present, retrieve the attachments list and their numerical ids
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the attachments
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/attachments",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) List operations on attachments

+

Get the list of the operations that are available for attachments associated with the given instance +Tags: Other

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/async_client.py +
541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
async def get_instances_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List operations on attachments
+
+    Get the list of the operations that are available for attachments associated with the given instance
+    Tags: Other
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_compressed_data(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get attachment (no decompression)

+

Get the (binary) content of one attachment associated with the given instance. The attachment will not be decompressed if StorageCompression is true. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
async def get_instances_id_attachments_name_compressed_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get attachment (no decompression)
+
+    Get the (binary) content of one attachment associated with the given instance. The attachment will not be decompressed if `StorageCompression` is `true`.
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/compressed-data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_compressed_md5(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get MD5 of attachment on disk

+

Get the MD5 hash of one attachment associated with the given instance, as stored on the disk. This is different from .../md5 iff EnableStorage is true. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/async_client.py +
663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
async def get_instances_id_attachments_name_compressed_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get MD5 of attachment on disk
+
+    Get the MD5 hash of one attachment associated with the given instance, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment, as stored on the disk
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/compressed-md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_compressed_size(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get size of attachment on disk

+

Get the size of one attachment associated with the given instance, as stored on the disk. This is different from .../size iff EnableStorage is true. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/async_client.py +
694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
async def get_instances_id_attachments_name_compressed_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get size of attachment on disk
+
+    Get the size of one attachment associated with the given instance, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment, as stored on the disk
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/compressed-size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_data(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get attachment

+

Get the (binary) content of one attachment associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
async def get_instances_id_attachments_name_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get attachment
+
+    Get the (binary) content of one attachment associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_info(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get info about the attachment

+

Get all the information about the attachment associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the information about the attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
async def get_instances_id_attachments_name_info(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get info about the attachment
+
+    Get all the information about the attachment associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the information about the attachment
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/info",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_is_compressed(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Is attachment compressed?

+

Test whether the attachment has been stored as a compressed file on the disk. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

0 if the attachment was stored uncompressed, 1 if it was compressed

+
+
+ +
+ Source code in pyorthanc/async_client.py +
787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
async def get_instances_id_attachments_name_is_compressed(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Is attachment compressed?
+
+    Test whether the attachment has been stored as a compressed file on the disk.
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `0` if the attachment was stored uncompressed, `1` if it was compressed
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/is-compressed",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_md5(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get MD5 of attachment

+

Get the MD5 hash of one attachment associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
async def get_instances_id_attachments_name_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get MD5 of attachment
+
+    Get the MD5 hash of one attachment associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_size(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get size of attachment

+

Get the size of one attachment associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
async def get_instances_id_attachments_name_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get size of attachment
+
+    Get the size of one attachment associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_content_path(id_, path) + + + async + + +

+ + +
+ +

(async) Get raw tag

+

Get the raw content of one DICOM tag in the hierarchy of DICOM dataset +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
path + str + +
+

Path to the DICOM tag. This is the interleaving of one DICOM tag, possibly followed by an index for sequences. Sequences are accessible as, for instance, /0008-1140/1/0008-1150

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The raw value of the tag of intereset (binary data, whose memory layout depends on the underlying transfer syntax), or JSON array containing the list of available tags if accessing a dataset

+
+
+ +
+ Source code in pyorthanc/async_client.py +
931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
async def get_instances_id_content_path(
+    self,
+    id_: str,
+    path: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get raw tag
+
+    Get the raw content of one DICOM tag in the hierarchy of DICOM dataset
+    Tags: Instances
+
+    Parameters
+    ----------
+    path
+        Path to the DICOM tag. This is the interleaving of one DICOM tag, possibly followed by an index for sequences. Sequences are accessible as, for instance, `/0008-1140/1/0008-1150`
+    id_
+        Orthanc identifier of the DICOM instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The raw value of the tag of intereset (binary data, whose memory layout depends on the underlying transfer syntax), or JSON array containing the list of available tags if accessing a dataset
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/content/{path}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_file(id_, params=None, headers=None) + + + async + + +

+ + +
+ +

(async) Download DICOM

+

Download one DICOM instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "transcode" (str): If present, the DICOM file will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): This HTTP header can be set to retrieve the DICOM instance in DICOMweb format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The DICOM instance +The DICOM instance, in DICOMweb JSON format +The DICOM instance, in DICOMweb XML format

+
+
+ +
+ Source code in pyorthanc/async_client.py +
 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
async def get_instances_id_file(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Download DICOM
+
+    Download one DICOM instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "transcode" (str): If present, the DICOM file will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): This HTTP header can be set to retrieve the DICOM instance in DICOMweb format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The DICOM instance
+        The DICOM instance, in DICOMweb JSON format
+        The DICOM instance, in DICOMweb XML format
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/file",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames(id_) + + + async + + +

+ + +
+ +

(async) List available frames

+

List the frames that are available in the DICOM instance of interest +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The list of the indices of the available frames

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
async def get_instances_id_frames(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List available frames
+
+    List the frames that are available in the DICOM instance of interest
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The list of the indices of the available frames
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/frames",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame(frame, id_) + + + async + + +

+ + +
+ +

(async) List operations

+

List the available operations under URI /instances/{id}/frames/{frame}/ +Tags: Other

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + str + +
+ +
+
+ required +
id_ + str + +
+ +
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
async def get_instances_id_frames_frame(
+    self,
+    frame: str,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List operations
+
+    List the available operations under URI `/instances/{id}/frames/{frame}/`
+    Tags: Other
+
+    Parameters
+    ----------
+    frame
+
+    id_
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_image_int16(frame, id_, params=None, headers=None) + + + async + + +

+ + +
+ +

(async) Decode a frame (int16)

+

Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [-32768,32767] range. Negative values must be interpreted according to two's complement. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
async def get_instances_id_frames_frame_image_int16(
+    self,
+    frame: float,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode a frame (int16)
+
+    Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [-32768,32767] range. Negative values must be interpreted according to two's complement.
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/image-int16",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_image_uint16(frame, id_, params=None, headers=None) + + + async + + +

+ + +
+ +

(async) Decode a frame (uint16)

+

Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [0,65535] range. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
async def get_instances_id_frames_frame_image_uint16(
+    self,
+    frame: float,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode a frame (uint16)
+
+    Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [0,65535] range.
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/image-uint16",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_image_uint8(frame, id_, params=None, headers=None) + + + async + + +

+ + +
+ +

(async) Decode a frame (uint8)

+

Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [0,255] range. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
async def get_instances_id_frames_frame_image_uint8(
+    self,
+    frame: float,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode a frame (uint8)
+
+    Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [0,255] range.
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/image-uint8",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_matlab(frame, id_) + + + async + + +

+ + +
+ +

(async) Decode frame for Matlab

+

Decode one frame of interest from the given DICOM instance, and export this frame as a Octave/Matlab matrix to be imported with eval(): https://orthanc.uclouvain.be/book/faq/matlab.html +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Octave/Matlab matrix

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
async def get_instances_id_frames_frame_matlab(
+    self,
+    frame: float,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode frame for Matlab
+
+    Decode one frame of interest from the given DICOM instance, and export this frame as a Octave/Matlab matrix to be imported with `eval()`: https://orthanc.uclouvain.be/book/faq/matlab.html
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Octave/Matlab matrix
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/matlab",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_numpy(frame, id_, params=None) + + + async + + +

+ + +
+ +

(async) Decode frame for numpy

+

Decode one frame of interest from the given DICOM instance, for use with numpy in Python. The numpy array has 3 dimensions: (height, width, color channel). +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM resource of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "compress" (bool): Compress the file as .npz + "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
async def get_instances_id_frames_frame_numpy(
+    self,
+    frame: float,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode frame for numpy
+
+    Decode one frame of interest from the given DICOM instance, for use with numpy in Python. The numpy array has 3 dimensions: (height, width, color channel).
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM resource of interest
+    params
+        Dictionary of optional parameters:
+            "compress" (bool): Compress the file as `.npz`
+            "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/numpy",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_preview(frame, id_, params=None, headers=None) + + + async + + +

+ + +
+ +

(async) Decode a frame (preview)

+

Decode one frame of interest from the given DICOM instance. The full dynamic range of grayscale images is rescaled to the [0,255] range. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
async def get_instances_id_frames_frame_preview(
+    self,
+    frame: float,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode a frame (preview)
+
+    Decode one frame of interest from the given DICOM instance. The full dynamic range of grayscale images is rescaled to the [0,255] range.
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/preview",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_raw(frame, id_) + + + async + + +

+ + +
+ +

(async) Access raw frame

+

Access the raw content of one individual frame of the DICOM instance of interest, bypassing image decoding. This is notably useful to access the source files in compressed transfer syntaxes. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The raw frame

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
async def get_instances_id_frames_frame_raw(
+    self,
+    frame: float,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Access raw frame
+
+    Access the raw content of one individual frame of the DICOM instance of interest, bypassing image decoding. This is notably useful to access the source files in compressed transfer syntaxes.
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The raw frame
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/raw",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_raw_gz(frame, id_) + + + async + + +

+ + +
+ +

(async) Access raw frame (compressed)

+

Access the raw content of one individual frame of the DICOM instance of interest, bypassing image decoding. This is notably useful to access the source files in compressed transfer syntaxes. The image is compressed using gzip +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The raw frame, compressed using gzip

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
async def get_instances_id_frames_frame_raw_gz(
+    self,
+    frame: float,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Access raw frame (compressed)
+
+    Access the raw content of one individual frame of the DICOM instance of interest, bypassing image decoding. This is notably useful to access the source files in compressed transfer syntaxes. The image is compressed using gzip
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The raw frame, compressed using gzip
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/raw.gz",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_rendered(frame, id_, params=None, headers=None) + + + async + + +

+ + +
+ +

(async) Render a frame

+

Render one frame of interest from the given DICOM instance. This function takes scaling into account (RescaleSlope and RescaleIntercept tags), as well as the default windowing stored in the DICOM file (WindowCenter and WindowWidthtags), and can be used to resize the resulting image. Color images are not affected by windowing. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "height" (float): Height of the resized image + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false) + "smooth" (bool): Whether to smooth image on resize + "width" (float): Width of the resized image + "window-center" (float): Windowing center + "window-width" (float): Windowing width

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
async def get_instances_id_frames_frame_rendered(
+    self,
+    frame: float,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Render a frame
+
+    Render one frame of interest from the given DICOM instance. This function takes scaling into account (`RescaleSlope` and `RescaleIntercept` tags), as well as the default windowing stored in the DICOM file (`WindowCenter` and `WindowWidth`tags), and can be used to resize the resulting image. Color images are not affected by windowing.
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "height" (float): Height of the resized image
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+            "smooth" (bool): Whether to smooth image on resize
+            "width" (float): Width of the resized image
+            "window-center" (float): Windowing center
+            "window-width" (float): Windowing width
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/rendered",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_header(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get DICOM meta-header

+

Get the DICOM tags in the meta-header of the DICOM instance. By default, the full format is used, which combines hexadecimal tags with human-readable description. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the DICOM tags and their associated value

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
async def get_instances_id_header(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get DICOM meta-header
+
+    Get the DICOM tags in the meta-header of the DICOM instance. By default, the `full` format is used, which combines hexadecimal tags with human-readable description.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the DICOM tags and their associated value
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/header",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_image_int16(id_, params=None, headers=None) + + + async + + +

+ + +
+ +

(async) Decode an image (int16)

+

Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [-32768,32767] range. Negative values must be interpreted according to two's complement. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
async def get_instances_id_image_int16(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode an image (int16)
+
+    Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [-32768,32767] range. Negative values must be interpreted according to two's complement.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/image-int16",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_image_uint16(id_, params=None, headers=None) + + + async + + +

+ + +
+ +

(async) Decode an image (uint16)

+

Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [0,65535] range. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
async def get_instances_id_image_uint16(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode an image (uint16)
+
+    Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [0,65535] range.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/image-uint16",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_image_uint8(id_, params=None, headers=None) + + + async + + +

+ + +
+ +

(async) Decode an image (uint8)

+

Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [0,255] range. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
async def get_instances_id_image_uint8(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode an image (uint8)
+
+    Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [0,255] range.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/image-uint8",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_labels(id_) + + + async + + +

+ + +
+ +

(async) List labels

+

Get the labels that are associated with the given instance (new in Orthanc 1.12.0) +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the labels

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
async def get_instances_id_labels(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List labels
+
+    Get the labels that are associated with the given instance (new in Orthanc 1.12.0)
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the labels
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/labels",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_labels_label(id_, label) + + + async + + +

+ + +
+ +

(async) Test label

+

Test whether the instance is associated with the given label +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label of interest

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty string is returned in the case of presence, error 404 in the case of absence

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
async def get_instances_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Test label
+
+    Test whether the instance is associated with the given label
+    Tags: Instances
+
+    Parameters
+    ----------
+    label
+        The label of interest
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty string is returned in the case of presence, error 404 in the case of absence
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_matlab(id_) + + + async + + +

+ + +
+ +

(async) Decode frame for Matlab

+

Decode the first frame of the given DICOM instance., and export this frame as a Octave/Matlab matrix to be imported with eval(): https://orthanc.uclouvain.be/book/faq/matlab.html +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Octave/Matlab matrix

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
async def get_instances_id_matlab(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode frame for Matlab
+
+    Decode the first frame of the given DICOM instance., and export this frame as a Octave/Matlab matrix to be imported with `eval()`: https://orthanc.uclouvain.be/book/faq/matlab.html
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Octave/Matlab matrix
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/matlab",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_metadata(id_, params=None) + + + async + + +

+ + +
+ +

(async) List metadata

+

Get the list of metadata that are associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, also retrieve the value of the individual metadata + "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
async def get_instances_id_metadata(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List metadata
+
+    Get the list of metadata that are associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, also retrieve the value of the individual metadata
+            "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/metadata",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_metadata_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get metadata

+

Get the value of a metadata that is associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Value of the metadata

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
async def get_instances_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get metadata
+
+    Get the value of a metadata that is associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Value of the metadata
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_module(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get instance module

+

Get the instance module of the DICOM instance whose Orthanc identifier is provided in the URL +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM instance

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
async def get_instances_id_module(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get instance module
+
+    Get the instance module of the DICOM instance whose Orthanc identifier is provided in the URL
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM instance
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/module",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_numpy(id_, params=None) + + + async + + +

+ + +
+ +

(async) Decode instance for numpy

+

Decode the given DICOM instance, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel). +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM resource of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "compress" (bool): Compress the file as .npz + "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
async def get_instances_id_numpy(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode instance for numpy
+
+    Decode the given DICOM instance, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel).
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM resource of interest
+    params
+        Dictionary of optional parameters:
+            "compress" (bool): Compress the file as `.npz`
+            "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/numpy",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_patient(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get parent patient

+

Get detailed information about the parent patient of the DICOM instance whose Orthanc identifier is provided in the URL +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the parent DICOM patient

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
async def get_instances_id_patient(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get parent patient
+
+    Get detailed information about the parent patient of the DICOM instance whose Orthanc identifier is provided in the URL
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the parent DICOM patient
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/patient",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_pdf(id_) + + + async + + +

+ + +
+ +

(async) Get embedded PDF

+

Get the PDF file that is embedded in one DICOM instance. If the DICOM instance doesn't contain the EncapsulatedDocument tag or if the MIMETypeOfEncapsulatedDocument tag doesn't correspond to the PDF type, a 404 HTTP error is raised. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

PDF file

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
async def get_instances_id_pdf(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get embedded PDF
+
+    Get the PDF file that is embedded in one DICOM instance. If the DICOM instance doesn't contain the `EncapsulatedDocument` tag or if the `MIMETypeOfEncapsulatedDocument` tag doesn't correspond to the PDF type, a `404` HTTP error is raised.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        PDF file
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/pdf",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_preview(id_, params=None, headers=None) + + + async + + +

+ + +
+ +

(async) Decode an image (preview)

+

Decode the first frame of the given DICOM instance. The full dynamic range of grayscale images is rescaled to the [0,255] range. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
async def get_instances_id_preview(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode an image (preview)
+
+    Decode the first frame of the given DICOM instance. The full dynamic range of grayscale images is rescaled to the [0,255] range.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/preview",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_rendered(id_, params=None, headers=None) + + + async + + +

+ + +
+ +

(async) Render an image

+

Render the first frame of the given DICOM instance. This function takes scaling into account (RescaleSlope and RescaleIntercept tags), as well as the default windowing stored in the DICOM file (WindowCenter and WindowWidthtags), and can be used to resize the resulting image. Color images are not affected by windowing. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "height" (float): Height of the resized image + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false) + "smooth" (bool): Whether to smooth image on resize + "width" (float): Width of the resized image + "window-center" (float): Windowing center + "window-width" (float): Windowing width

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
async def get_instances_id_rendered(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Render an image
+
+    Render the first frame of the given DICOM instance. This function takes scaling into account (`RescaleSlope` and `RescaleIntercept` tags), as well as the default windowing stored in the DICOM file (`WindowCenter` and `WindowWidth`tags), and can be used to resize the resulting image. Color images are not affected by windowing.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "height" (float): Height of the resized image
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+            "smooth" (bool): Whether to smooth image on resize
+            "width" (float): Width of the resized image
+            "window-center" (float): Windowing center
+            "window-width" (float): Windowing width
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/rendered",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_series(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get parent series

+

Get detailed information about the parent series of the DICOM instance whose Orthanc identifier is provided in the URL +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the parent DICOM series

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
async def get_instances_id_series(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get parent series
+
+    Get detailed information about the parent series of the DICOM instance whose Orthanc identifier is provided in the URL
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the parent DICOM series
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/series",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_simplified_tags(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get human-readable tags

+

Get the DICOM tags in human-readable format (same as the /instances/{id}/tags?simplify route) +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the DICOM tags and their associated value

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
async def get_instances_id_simplified_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get human-readable tags
+
+    Get the DICOM tags in human-readable format (same as the `/instances/{id}/tags?simplify` route)
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the DICOM tags and their associated value
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/simplified-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_statistics(id_) + + + async + + +

+ + +
+ +

(async) Get instance statistics

+

Get statistics about the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
async def get_instances_id_statistics(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get instance statistics
+
+    Get statistics about the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/statistics",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_study(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get parent study

+

Get detailed information about the parent study of the DICOM instance whose Orthanc identifier is provided in the URL +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the parent DICOM study

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
async def get_instances_id_study(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get parent study
+
+    Get detailed information about the parent study of the DICOM instance whose Orthanc identifier is provided in the URL
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the parent DICOM study
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/study",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_tags(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get DICOM tags

+

Get the DICOM tags in the specified format. By default, the full format is used, which combines hexadecimal tags with human-readable description. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the DICOM tags and their associated value

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
async def get_instances_id_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get DICOM tags
+
+    Get the DICOM tags in the specified format. By default, the `full` format is used, which combines hexadecimal tags with human-readable description.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the DICOM tags and their associated value
+    """
+    return await self._get(
+        route=f"{self.url}/instances/{id_}/tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_jobs(params=None) + + + async + + +

+ + +
+ +

(async) List jobs

+

List all the available jobs +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual jobs

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the jobs identifiers, or detailed information about the reported jobs (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
async def get_jobs(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List jobs
+
+    List all the available jobs
+    Tags: Jobs
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual jobs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the jobs identifiers, or detailed information about the reported jobs (if `expand` argument is provided)
+    """
+    return await self._get(
+        route=f"{self.url}/jobs",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_jobs_id(id_) + + + async + + +

+ + +
+ +

(async) Get job

+

Retrieve detailed information about the job whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object detailing the job

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
async def get_jobs_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get job
+
+    Retrieve detailed information about the job whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+    Tags: Jobs
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object detailing the job
+    """
+    return await self._get(
+        route=f"{self.url}/jobs/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_jobs_id_key(id_, key) + + + async + + +

+ + +
+ +

(async) Get job output

+

Retrieve some output produced by a job. As of Orthanc 1.8.2, only the jobs that generate a DICOMDIR media or a ZIP archive provide such an output (with key equals to archive). +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
key + str + +
+

Name of the output of interest

+
+
+ required +
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Content of the output of the job

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
async def get_jobs_id_key(
+    self,
+    id_: str,
+    key: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get job output
+
+    Retrieve some output produced by a job. As of Orthanc 1.8.2, only the jobs that generate a DICOMDIR media or a ZIP archive provide such an output (with `key` equals to `archive`).
+    Tags: Jobs
+
+    Parameters
+    ----------
+    key
+        Name of the output of interest
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Content of the output of the job
+    """
+    return await self._get(
+        route=f"{self.url}/jobs/{id_}/{key}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_modalities(params=None) + + + async + + +

+ + +
+ +

(async) List DICOM modalities

+

List all the DICOM modalities that are known to Orthanc. This corresponds either to the content of the DicomModalities configuration option, or to the information stored in the database if DicomModalitiesInDatabase is true. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual DICOM modalities

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the identifiers of the modalities, or detailed information about the modalities (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
async def get_modalities(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List DICOM modalities
+
+    List all the DICOM modalities that are known to Orthanc. This corresponds either to the content of the `DicomModalities` configuration option, or to the information stored in the database if `DicomModalitiesInDatabase` is `true`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual DICOM modalities
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the identifiers of the modalities, or detailed information about the modalities (if `expand` argument is provided)
+    """
+    return await self._get(
+        route=f"{self.url}/modalities",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_modalities_id(id_) + + + async + + +

+ + +
+ +

(async) List operations on modality

+

List the operations that are available for a DICOM modality. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the DICOM modality of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
async def get_modalities_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List operations on modality
+
+    List the operations that are available for a DICOM modality.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the DICOM modality of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return await self._get(
+        route=f"{self.url}/modalities/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_modalities_id_configuration(id_) + + + async + + +

+ + +
+ +

(async) Get modality configuration

+

Get detailed information about the configuration of some DICOM modality +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Configuration of the modality

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
async def get_modalities_id_configuration(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get modality configuration
+
+    Get detailed information about the configuration of some DICOM modality
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Configuration of the modality
+    """
+    return await self._get(
+        route=f"{self.url}/modalities/{id_}/configuration",
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients(params=None) + + + async + + +

+ + +
+ +

(async) List the available patients

+

List the Orthanc identifiers of all the available DICOM patients +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual patients + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "limit" (float): Limit the number of results + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format + "since" (float): Show only the resources since the provided index

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the Orthanc identifiers, or detailed information about the reported patients (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
async def get_patients(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List the available patients
+
+    List the Orthanc identifiers of all the available DICOM patients
+    Tags: Patients
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual patients
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "limit" (float): Limit the number of results
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "since" (float): Show only the resources since the provided index
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the Orthanc identifiers, or detailed information about the reported patients (if `expand` argument is provided)
+    """
+    return await self._get(
+        route=f"{self.url}/patients",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get information about some patient

+

Get detailed information about the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM patient

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
async def get_patients_id(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get information about some patient
+
+    Get detailed information about the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM patient
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_archive(id_, params=None) + + + async + + +

+ + +
+ +

(async) Create ZIP archive

+

Synchronously create a ZIP archive containing the DICOM patient whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might not be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using POST method. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension) + "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
+3056
+3057
+3058
+3059
async def get_patients_id_archive(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create ZIP archive
+
+    Synchronously create a ZIP archive containing the DICOM patient whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+            "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        ZIP file containing the archive
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/archive",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments(id_, params=None) + + + async + + +

+ + +
+ +

(async) List attachments

+

Get the list of attachments that are associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (str): If present, retrieve the attachments list and their numerical ids

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the attachments

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
+3119
+3120
+3121
+3122
async def get_patients_id_attachments(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List attachments
+
+    Get the list of attachments that are associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "full" (str): If present, retrieve the attachments list and their numerical ids
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the attachments
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/attachments",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) List operations on attachments

+

Get the list of the operations that are available for attachments associated with the given patient +Tags: Other

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+3168
+3169
+3170
+3171
+3172
+3173
+3174
+3175
+3176
+3177
+3178
+3179
+3180
+3181
+3182
+3183
async def get_patients_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List operations on attachments
+
+    Get the list of the operations that are available for attachments associated with the given patient
+    Tags: Other
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_compressed_data(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get attachment (no decompression)

+

Get the (binary) content of one attachment associated with the given patient. The attachment will not be decompressed if StorageCompression is true. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3245
+3246
+3247
+3248
+3249
+3250
+3251
+3252
+3253
+3254
+3255
+3256
+3257
+3258
+3259
+3260
+3261
+3262
+3263
+3264
+3265
+3266
+3267
+3268
+3269
+3270
+3271
+3272
+3273
+3274
async def get_patients_id_attachments_name_compressed_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get attachment (no decompression)
+
+    Get the (binary) content of one attachment associated with the given patient. The attachment will not be decompressed if `StorageCompression` is `true`.
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/compressed-data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_compressed_md5(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get MD5 of attachment on disk

+

Get the MD5 hash of one attachment associated with the given patient, as stored on the disk. This is different from .../md5 iff EnableStorage is true. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3276
+3277
+3278
+3279
+3280
+3281
+3282
+3283
+3284
+3285
+3286
+3287
+3288
+3289
+3290
+3291
+3292
+3293
+3294
+3295
+3296
+3297
+3298
+3299
+3300
+3301
+3302
+3303
+3304
+3305
async def get_patients_id_attachments_name_compressed_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get MD5 of attachment on disk
+
+    Get the MD5 hash of one attachment associated with the given patient, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment, as stored on the disk
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/compressed-md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_compressed_size(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get size of attachment on disk

+

Get the size of one attachment associated with the given patient, as stored on the disk. This is different from .../size iff EnableStorage is true. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3307
+3308
+3309
+3310
+3311
+3312
+3313
+3314
+3315
+3316
+3317
+3318
+3319
+3320
+3321
+3322
+3323
+3324
+3325
+3326
+3327
+3328
+3329
+3330
+3331
+3332
+3333
+3334
+3335
+3336
async def get_patients_id_attachments_name_compressed_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get size of attachment on disk
+
+    Get the size of one attachment associated with the given patient, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment, as stored on the disk
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/compressed-size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_data(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get attachment

+

Get the (binary) content of one attachment associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3338
+3339
+3340
+3341
+3342
+3343
+3344
+3345
+3346
+3347
+3348
+3349
+3350
+3351
+3352
+3353
+3354
+3355
+3356
+3357
+3358
+3359
+3360
+3361
+3362
+3363
+3364
+3365
+3366
+3367
async def get_patients_id_attachments_name_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get attachment
+
+    Get the (binary) content of one attachment associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_info(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get info about the attachment

+

Get all the information about the attachment associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the information about the attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3369
+3370
+3371
+3372
+3373
+3374
+3375
+3376
+3377
+3378
+3379
+3380
+3381
+3382
+3383
+3384
+3385
+3386
+3387
+3388
+3389
+3390
+3391
+3392
+3393
+3394
+3395
+3396
+3397
+3398
async def get_patients_id_attachments_name_info(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get info about the attachment
+
+    Get all the information about the attachment associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the information about the attachment
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/info",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_is_compressed(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Is attachment compressed?

+

Test whether the attachment has been stored as a compressed file on the disk. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

0 if the attachment was stored uncompressed, 1 if it was compressed

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3400
+3401
+3402
+3403
+3404
+3405
+3406
+3407
+3408
+3409
+3410
+3411
+3412
+3413
+3414
+3415
+3416
+3417
+3418
+3419
+3420
+3421
+3422
+3423
+3424
+3425
+3426
+3427
+3428
+3429
async def get_patients_id_attachments_name_is_compressed(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Is attachment compressed?
+
+    Test whether the attachment has been stored as a compressed file on the disk.
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `0` if the attachment was stored uncompressed, `1` if it was compressed
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/is-compressed",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_md5(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get MD5 of attachment

+

Get the MD5 hash of one attachment associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3431
+3432
+3433
+3434
+3435
+3436
+3437
+3438
+3439
+3440
+3441
+3442
+3443
+3444
+3445
+3446
+3447
+3448
+3449
+3450
+3451
+3452
+3453
+3454
+3455
+3456
+3457
+3458
+3459
+3460
async def get_patients_id_attachments_name_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get MD5 of attachment
+
+    Get the MD5 hash of one attachment associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_size(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get size of attachment

+

Get the size of one attachment associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3462
+3463
+3464
+3465
+3466
+3467
+3468
+3469
+3470
+3471
+3472
+3473
+3474
+3475
+3476
+3477
+3478
+3479
+3480
+3481
+3482
+3483
+3484
+3485
+3486
+3487
+3488
+3489
+3490
+3491
async def get_patients_id_attachments_name_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get size of attachment
+
+    Get the size of one attachment associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_instances(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get child instances

+

Get detailed information about the child instances of the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If false or missing, only retrieve the list of child instances + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing information about the child DICOM instances

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3544
+3545
+3546
+3547
+3548
+3549
+3550
+3551
+3552
+3553
+3554
+3555
+3556
+3557
+3558
+3559
+3560
+3561
+3562
+3563
+3564
+3565
+3566
+3567
+3568
+3569
+3570
+3571
+3572
+3573
async def get_patients_id_instances(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get child instances
+
+    Get detailed information about the child instances of the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If false or missing, only retrieve the list of child instances
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing information about the child DICOM instances
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/instances",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_instances_tags(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get tags of instances

+

Get the tags of all the child instances of the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3575
+3576
+3577
+3578
+3579
+3580
+3581
+3582
+3583
+3584
+3585
+3586
+3587
+3588
+3589
+3590
+3591
+3592
+3593
+3594
+3595
+3596
+3597
+3598
+3599
+3600
+3601
+3602
+3603
async def get_patients_id_instances_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get tags of instances
+
+    Get the tags of all the child instances of the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/instances-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_labels(id_) + + + async + + +

+ + +
+ +

(async) List labels

+

Get the labels that are associated with the given patient (new in Orthanc 1.12.0) +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the labels

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3605
+3606
+3607
+3608
+3609
+3610
+3611
+3612
+3613
+3614
+3615
+3616
+3617
+3618
+3619
+3620
+3621
+3622
+3623
+3624
+3625
+3626
async def get_patients_id_labels(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List labels
+
+    Get the labels that are associated with the given patient (new in Orthanc 1.12.0)
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the labels
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/labels",
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_labels_label(id_, label) + + + async + + +

+ + +
+ +

(async) Test label

+

Test whether the patient is associated with the given label +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label of interest

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty string is returned in the case of presence, error 404 in the case of absence

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3653
+3654
+3655
+3656
+3657
+3658
+3659
+3660
+3661
+3662
+3663
+3664
+3665
+3666
+3667
+3668
+3669
+3670
+3671
+3672
+3673
+3674
+3675
+3676
+3677
async def get_patients_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Test label
+
+    Test whether the patient is associated with the given label
+    Tags: Patients
+
+    Parameters
+    ----------
+    label
+        The label of interest
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty string is returned in the case of presence, error 404 in the case of absence
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_media(id_, params=None) + + + async + + +

+ + +
+ +

(async) Create DICOMDIR media

+

Synchronously create a DICOMDIR media containing the DICOM patient whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might not be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using POST method. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "extended" (str): If present, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR + "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension) + "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3704
+3705
+3706
+3707
+3708
+3709
+3710
+3711
+3712
+3713
+3714
+3715
+3716
+3717
+3718
+3719
+3720
+3721
+3722
+3723
+3724
+3725
+3726
+3727
+3728
+3729
+3730
+3731
+3732
async def get_patients_id_media(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create DICOMDIR media
+
+    Synchronously create a DICOMDIR media containing the DICOM patient whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "extended" (str): If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*
+            "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+            "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        ZIP file containing the archive
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/media",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_metadata(id_, params=None) + + + async + + +

+ + +
+ +

(async) List metadata

+

Get the list of metadata that are associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, also retrieve the value of the individual metadata + "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3770
+3771
+3772
+3773
+3774
+3775
+3776
+3777
+3778
+3779
+3780
+3781
+3782
+3783
+3784
+3785
+3786
+3787
+3788
+3789
+3790
+3791
+3792
+3793
+3794
+3795
+3796
+3797
async def get_patients_id_metadata(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List metadata
+
+    Get the list of metadata that are associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, also retrieve the value of the individual metadata
+            "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/metadata",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_metadata_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get metadata

+

Get the value of a metadata that is associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Value of the metadata

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3829
+3830
+3831
+3832
+3833
+3834
+3835
+3836
+3837
+3838
+3839
+3840
+3841
+3842
+3843
+3844
+3845
+3846
+3847
+3848
+3849
+3850
+3851
+3852
+3853
+3854
+3855
+3856
+3857
+3858
async def get_patients_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get metadata
+
+    Get the value of a metadata that is associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Value of the metadata
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_module(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get patient module

+

Get the patient module of the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM patient

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3936
+3937
+3938
+3939
+3940
+3941
+3942
+3943
+3944
+3945
+3946
+3947
+3948
+3949
+3950
+3951
+3952
+3953
+3954
+3955
+3956
+3957
+3958
+3959
+3960
+3961
+3962
+3963
+3964
async def get_patients_id_module(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get patient module
+
+    Get the patient module of the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM patient
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/module",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_protected(id_) + + + async + + +

+ + +
+ +

(async) Is the patient protected against recycling?

+

Is the patient protected against recycling? +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

1 if protected, 0 if not protected

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3966
+3967
+3968
+3969
+3970
+3971
+3972
+3973
+3974
+3975
+3976
+3977
+3978
+3979
+3980
+3981
+3982
+3983
+3984
+3985
+3986
+3987
async def get_patients_id_protected(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Is the patient protected against recycling?
+
+    Is the patient protected against recycling?
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `1` if protected, `0` if not protected
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/protected",
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_series(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get child series

+

Get detailed information about the child series of the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If false or missing, only retrieve the list of child series + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing information about the child DICOM series

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4041
+4042
+4043
+4044
+4045
+4046
+4047
+4048
+4049
+4050
+4051
+4052
+4053
+4054
+4055
+4056
+4057
+4058
+4059
+4060
+4061
+4062
+4063
+4064
+4065
+4066
+4067
+4068
+4069
+4070
async def get_patients_id_series(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get child series
+
+    Get detailed information about the child series of the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If false or missing, only retrieve the list of child series
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing information about the child DICOM series
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/series",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_shared_tags(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get shared tags

+

Extract the DICOM tags whose value is constant across all the child instances of the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the values of the DICOM tags

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4072
+4073
+4074
+4075
+4076
+4077
+4078
+4079
+4080
+4081
+4082
+4083
+4084
+4085
+4086
+4087
+4088
+4089
+4090
+4091
+4092
+4093
+4094
+4095
+4096
+4097
+4098
+4099
async def get_patients_id_shared_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get shared tags
+
+    Extract the DICOM tags whose value is constant across all the child instances of the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the values of the DICOM tags
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/shared-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_statistics(id_) + + + async + + +

+ + +
+ +

(async) Get patient statistics

+

Get statistics about the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4101
+4102
+4103
+4104
+4105
+4106
+4107
+4108
+4109
+4110
+4111
+4112
+4113
+4114
+4115
+4116
+4117
+4118
+4119
+4120
+4121
+4122
async def get_patients_id_statistics(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get patient statistics
+
+    Get statistics about the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/statistics",
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_studies(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get child studies

+

Get detailed information about the child studies of the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If false or missing, only retrieve the list of child studies + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing information about the child DICOM studies

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4124
+4125
+4126
+4127
+4128
+4129
+4130
+4131
+4132
+4133
+4134
+4135
+4136
+4137
+4138
+4139
+4140
+4141
+4142
+4143
+4144
+4145
+4146
+4147
+4148
+4149
+4150
+4151
+4152
+4153
async def get_patients_id_studies(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get child studies
+
+    Get detailed information about the child studies of the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If false or missing, only retrieve the list of child studies
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing information about the child DICOM studies
+    """
+    return await self._get(
+        route=f"{self.url}/patients/{id_}/studies",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_peers(params=None) + + + async + + +

+ + +
+ +

(async) List Orthanc peers

+

List all the Orthanc peers that are known to Orthanc. This corresponds either to the content of the OrthancPeers configuration option, or to the information stored in the database if OrthancPeersInDatabase is true. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual Orthanc peers

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the identifiers of the peers, or detailed information about the peers (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4155
+4156
+4157
+4158
+4159
+4160
+4161
+4162
+4163
+4164
+4165
+4166
+4167
+4168
+4169
+4170
+4171
+4172
+4173
+4174
+4175
+4176
+4177
+4178
async def get_peers(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List Orthanc peers
+
+    List all the Orthanc peers that are known to Orthanc. This corresponds either to the content of the `OrthancPeers` configuration option, or to the information stored in the database if `OrthancPeersInDatabase` is `true`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual Orthanc peers
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the identifiers of the peers, or detailed information about the peers (if `expand` argument is provided)
+    """
+    return await self._get(
+        route=f"{self.url}/peers",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_peers_id(id_) + + + async + + +

+ + +
+ +

(async) List operations on peer

+

List the operations that are available for an Orthanc peer. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the peer of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4202
+4203
+4204
+4205
+4206
+4207
+4208
+4209
+4210
+4211
+4212
+4213
+4214
+4215
+4216
+4217
+4218
+4219
+4220
+4221
+4222
+4223
async def get_peers_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List operations on peer
+
+    List the operations that are available for an Orthanc peer.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the peer of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return await self._get(
+        route=f"{self.url}/peers/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_peers_id_configuration(id_) + + + async + + +

+ + +
+ +

(async) Get peer configuration

+

Get detailed information about the configuration of some Orthanc peer +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the peer of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Configuration of the peer

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4261
+4262
+4263
+4264
+4265
+4266
+4267
+4268
+4269
+4270
+4271
+4272
+4273
+4274
+4275
+4276
+4277
+4278
+4279
+4280
+4281
+4282
async def get_peers_id_configuration(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get peer configuration
+
+    Get detailed information about the configuration of some Orthanc peer
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the peer of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Configuration of the peer
+    """
+    return await self._get(
+        route=f"{self.url}/peers/{id_}/configuration",
+    )
+
+
+
+ +
+ +
+ + +

+ get_peers_id_system(id_) + + + async + + +

+ + +
+ +

(async) Get peer system information

+

Get system information about some Orthanc peer. This corresponds to doing a GET request against the /system URI of the remote peer. This route can be used to test connectivity. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the peer of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

System information about the peer

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4352
+4353
+4354
+4355
+4356
+4357
+4358
+4359
+4360
+4361
+4362
+4363
+4364
+4365
+4366
+4367
+4368
+4369
+4370
+4371
+4372
+4373
async def get_peers_id_system(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get peer system information
+
+    Get system information about some Orthanc peer. This corresponds to doing a `GET` request against the `/system` URI of the remote peer. This route can be used to test connectivity.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the peer of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        System information about the peer
+    """
+    return await self._get(
+        route=f"{self.url}/peers/{id_}/system",
+    )
+
+
+
+ +
+ +
+ + +

+ get_plugins() + + + async + + +

+ + +
+ +

(async) List plugins

+

List all the installed plugins +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the identifiers of the installed plugins

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4375
+4376
+4377
+4378
+4379
+4380
+4381
+4382
+4383
+4384
+4385
+4386
+4387
+4388
+4389
+4390
async def get_plugins(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List plugins
+
+    List all the installed plugins
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the identifiers of the installed plugins
+    """
+    return await self._get(
+        route=f"{self.url}/plugins",
+    )
+
+
+
+ +
+ +
+ + +

+ get_plugins_explorer_js() + + + async + + +

+ + +
+ +

(async) JavaScript extensions to Orthanc Explorer

+

Get the JavaScript extensions that are installed by all the plugins using the OrthancPluginExtendOrthancExplorer() function of the plugin SDK. This route is for internal use of Orthanc Explorer. +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The JavaScript extensions

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4392
+4393
+4394
+4395
+4396
+4397
+4398
+4399
+4400
+4401
+4402
+4403
+4404
+4405
+4406
+4407
async def get_plugins_explorer_js(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) JavaScript extensions to Orthanc Explorer
+
+    Get the JavaScript extensions that are installed by all the plugins using the `OrthancPluginExtendOrthancExplorer()` function of the plugin SDK. This route is for internal use of Orthanc Explorer.
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The JavaScript extensions
+    """
+    return await self._get(
+        route=f"{self.url}/plugins/explorer.js",
+    )
+
+
+
+ +
+ +
+ + +

+ get_plugins_id(id_) + + + async + + +

+ + +
+ +

(async) Get plugin

+

Get system information about the plugin whose identifier is provided in the URL +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing information about the plugin

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4409
+4410
+4411
+4412
+4413
+4414
+4415
+4416
+4417
+4418
+4419
+4420
+4421
+4422
+4423
+4424
+4425
+4426
+4427
+4428
+4429
+4430
async def get_plugins_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get plugin
+
+    Get system information about the plugin whose identifier is provided in the URL
+    Tags: System
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing information about the plugin
+    """
+    return await self._get(
+        route=f"{self.url}/plugins/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries() + + + async + + +

+ + +
+ +

(async) List query/retrieve operations

+

List the identifiers of all the query/retrieve operations on DICOM modalities, as initiated by calls to /modalities/{id}/query. The length of this list is bounded by the QueryRetrieveSize configuration option of Orthanc. https://orthanc.uclouvain.be/book/users/rest.html#performing-query-retrieve-c-find-and-find-with-rest +Tags: Networking

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the identifiers

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4432
+4433
+4434
+4435
+4436
+4437
+4438
+4439
+4440
+4441
+4442
+4443
+4444
+4445
+4446
+4447
async def get_queries(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List query/retrieve operations
+
+    List the identifiers of all the query/retrieve operations on DICOM modalities, as initiated by calls to `/modalities/{id}/query`. The length of this list is bounded by the `QueryRetrieveSize` configuration option of Orthanc. https://orthanc.uclouvain.be/book/users/rest.html#performing-query-retrieve-c-find-and-find-with-rest
+    Tags: Networking
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the identifiers
+    """
+    return await self._get(
+        route=f"{self.url}/queries",
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id(id_) + + + async + + +

+ + +
+ +

(async) List operations on a query

+

List the available operations for the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the list of operations

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4471
+4472
+4473
+4474
+4475
+4476
+4477
+4478
+4479
+4480
+4481
+4482
+4483
+4484
+4485
+4486
+4487
+4488
+4489
+4490
+4491
+4492
async def get_queries_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List operations on a query
+
+    List the available operations for the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the list of operations
+    """
+    return await self._get(
+        route=f"{self.url}/queries/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id_answers(id_, params=None) + + + async + + +

+ + +
+ +

(async) List answers to a query

+

List the indices of all the available answers resulting from a query/retrieve operation on some DICOM modality, whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual answers + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the indices of the answers, or detailed information about the reported answers (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4494
+4495
+4496
+4497
+4498
+4499
+4500
+4501
+4502
+4503
+4504
+4505
+4506
+4507
+4508
+4509
+4510
+4511
+4512
+4513
+4514
+4515
+4516
+4517
+4518
+4519
+4520
+4521
+4522
async def get_queries_id_answers(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List answers to a query
+
+    List the indices of all the available answers resulting from a query/retrieve operation on some DICOM modality, whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual answers
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the indices of the answers, or detailed information about the reported answers (if `expand` argument is provided)
+    """
+    return await self._get(
+        route=f"{self.url}/queries/{id_}/answers",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id_answers_index(id_, index) + + + async + + +

+ + +
+ +

(async) List operations on an answer

+

List the available operations on an answer associated with the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
index + str + +
+

Index of the answer

+
+
+ required +
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the list of operations

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4524
+4525
+4526
+4527
+4528
+4529
+4530
+4531
+4532
+4533
+4534
+4535
+4536
+4537
+4538
+4539
+4540
+4541
+4542
+4543
+4544
+4545
+4546
+4547
+4548
async def get_queries_id_answers_index(
+    self,
+    id_: str,
+    index: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List operations on an answer
+
+    List the available operations on an answer associated with the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    index
+        Index of the answer
+    id_
+        Identifier of the query of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the list of operations
+    """
+    return await self._get(
+        route=f"{self.url}/queries/{id_}/answers/{index}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id_answers_index_content(id_, index, params=None) + + + async + + +

+ + +
+ +

(async) Get one answer

+

Get the content (DICOM tags) of one answer associated with the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
index + str + +
+

Index of the answer

+
+
+ required +
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the DICOM tags of the answer

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4550
+4551
+4552
+4553
+4554
+4555
+4556
+4557
+4558
+4559
+4560
+4561
+4562
+4563
+4564
+4565
+4566
+4567
+4568
+4569
+4570
+4571
+4572
+4573
+4574
+4575
+4576
+4577
+4578
+4579
+4580
async def get_queries_id_answers_index_content(
+    self,
+    id_: str,
+    index: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get one answer
+
+    Get the content (DICOM tags) of one answer associated with the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    index
+        Index of the answer
+    id_
+        Identifier of the query of interest
+    params
+        Dictionary of optional parameters:
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the DICOM tags of the answer
+    """
+    return await self._get(
+        route=f"{self.url}/queries/{id_}/answers/{index}/content",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id_level(id_) + + + async + + +

+ + +
+ +

(async) Get level of original query

+

Get the query level (value of the QueryRetrieveLevel tag) of the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The level

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4732
+4733
+4734
+4735
+4736
+4737
+4738
+4739
+4740
+4741
+4742
+4743
+4744
+4745
+4746
+4747
+4748
+4749
+4750
+4751
+4752
+4753
async def get_queries_id_level(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get level of original query
+
+    Get the query level (value of the `QueryRetrieveLevel` tag) of the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The level
+    """
+    return await self._get(
+        route=f"{self.url}/queries/{id_}/level",
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id_modality(id_) + + + async + + +

+ + +
+ +

(async) Get modality of original query

+

Get the identifier of the DICOM modality that was targeted by the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The identifier of the DICOM modality

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4755
+4756
+4757
+4758
+4759
+4760
+4761
+4762
+4763
+4764
+4765
+4766
+4767
+4768
+4769
+4770
+4771
+4772
+4773
+4774
+4775
+4776
async def get_queries_id_modality(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get modality of original query
+
+    Get the identifier of the DICOM modality that was targeted by the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The identifier of the DICOM modality
+    """
+    return await self._get(
+        route=f"{self.url}/queries/{id_}/modality",
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id_query(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get original query arguments

+

Get the original DICOM filter associated with the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Content of the original query

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4778
+4779
+4780
+4781
+4782
+4783
+4784
+4785
+4786
+4787
+4788
+4789
+4790
+4791
+4792
+4793
+4794
+4795
+4796
+4797
+4798
+4799
+4800
+4801
+4802
+4803
+4804
+4805
async def get_queries_id_query(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get original query arguments
+
+    Get the original DICOM filter associated with the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+    params
+        Dictionary of optional parameters:
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Content of the original query
+    """
+    return await self._get(
+        route=f"{self.url}/queries/{id_}/query",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series(params=None) + + + async + + +

+ + +
+ +

(async) List the available series

+

List the Orthanc identifiers of all the available DICOM series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual series + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "limit" (float): Limit the number of results + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format + "since" (float): Show only the resources since the provided index

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the Orthanc identifiers, or detailed information about the reported series (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4849
+4850
+4851
+4852
+4853
+4854
+4855
+4856
+4857
+4858
+4859
+4860
+4861
+4862
+4863
+4864
+4865
+4866
+4867
+4868
+4869
+4870
+4871
+4872
+4873
+4874
+4875
+4876
+4877
async def get_series(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List the available series
+
+    List the Orthanc identifiers of all the available DICOM series
+    Tags: Series
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual series
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "limit" (float): Limit the number of results
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "since" (float): Show only the resources since the provided index
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the Orthanc identifiers, or detailed information about the reported series (if `expand` argument is provided)
+    """
+    return await self._get(
+        route=f"{self.url}/series",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get information about some series

+

Get detailed information about the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM series

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4901
+4902
+4903
+4904
+4905
+4906
+4907
+4908
+4909
+4910
+4911
+4912
+4913
+4914
+4915
+4916
+4917
+4918
+4919
+4920
+4921
+4922
+4923
+4924
+4925
+4926
+4927
+4928
+4929
async def get_series_id(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get information about some series
+
+    Get detailed information about the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM series
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_archive(id_, params=None) + + + async + + +

+ + +
+ +

(async) Create ZIP archive

+

Synchronously create a ZIP archive containing the DICOM series whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might not be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using POST method. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension) + "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
4975
+4976
+4977
+4978
+4979
+4980
+4981
+4982
+4983
+4984
+4985
+4986
+4987
+4988
+4989
+4990
+4991
+4992
+4993
+4994
+4995
+4996
+4997
+4998
+4999
+5000
+5001
+5002
async def get_series_id_archive(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create ZIP archive
+
+    Synchronously create a ZIP archive containing the DICOM series whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+            "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        ZIP file containing the archive
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/archive",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments(id_, params=None) + + + async + + +

+ + +
+ +

(async) List attachments

+

Get the list of attachments that are associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (str): If present, retrieve the attachments list and their numerical ids

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the attachments

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5039
+5040
+5041
+5042
+5043
+5044
+5045
+5046
+5047
+5048
+5049
+5050
+5051
+5052
+5053
+5054
+5055
+5056
+5057
+5058
+5059
+5060
+5061
+5062
+5063
+5064
+5065
async def get_series_id_attachments(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List attachments
+
+    Get the list of attachments that are associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "full" (str): If present, retrieve the attachments list and their numerical ids
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the attachments
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/attachments",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) List operations on attachments

+

Get the list of the operations that are available for attachments associated with the given series +Tags: Other

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5097
+5098
+5099
+5100
+5101
+5102
+5103
+5104
+5105
+5106
+5107
+5108
+5109
+5110
+5111
+5112
+5113
+5114
+5115
+5116
+5117
+5118
+5119
+5120
+5121
+5122
+5123
+5124
+5125
+5126
async def get_series_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List operations on attachments
+
+    Get the list of the operations that are available for attachments associated with the given series
+    Tags: Other
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_compressed_data(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get attachment (no decompression)

+

Get the (binary) content of one attachment associated with the given series. The attachment will not be decompressed if StorageCompression is true. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5188
+5189
+5190
+5191
+5192
+5193
+5194
+5195
+5196
+5197
+5198
+5199
+5200
+5201
+5202
+5203
+5204
+5205
+5206
+5207
+5208
+5209
+5210
+5211
+5212
+5213
+5214
+5215
+5216
+5217
async def get_series_id_attachments_name_compressed_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get attachment (no decompression)
+
+    Get the (binary) content of one attachment associated with the given series. The attachment will not be decompressed if `StorageCompression` is `true`.
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/compressed-data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_compressed_md5(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get MD5 of attachment on disk

+

Get the MD5 hash of one attachment associated with the given series, as stored on the disk. This is different from .../md5 iff EnableStorage is true. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5219
+5220
+5221
+5222
+5223
+5224
+5225
+5226
+5227
+5228
+5229
+5230
+5231
+5232
+5233
+5234
+5235
+5236
+5237
+5238
+5239
+5240
+5241
+5242
+5243
+5244
+5245
+5246
+5247
+5248
async def get_series_id_attachments_name_compressed_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get MD5 of attachment on disk
+
+    Get the MD5 hash of one attachment associated with the given series, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment, as stored on the disk
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/compressed-md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_compressed_size(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get size of attachment on disk

+

Get the size of one attachment associated with the given series, as stored on the disk. This is different from .../size iff EnableStorage is true. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5250
+5251
+5252
+5253
+5254
+5255
+5256
+5257
+5258
+5259
+5260
+5261
+5262
+5263
+5264
+5265
+5266
+5267
+5268
+5269
+5270
+5271
+5272
+5273
+5274
+5275
+5276
+5277
+5278
+5279
async def get_series_id_attachments_name_compressed_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get size of attachment on disk
+
+    Get the size of one attachment associated with the given series, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment, as stored on the disk
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/compressed-size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_data(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get attachment

+

Get the (binary) content of one attachment associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5281
+5282
+5283
+5284
+5285
+5286
+5287
+5288
+5289
+5290
+5291
+5292
+5293
+5294
+5295
+5296
+5297
+5298
+5299
+5300
+5301
+5302
+5303
+5304
+5305
+5306
+5307
+5308
+5309
+5310
async def get_series_id_attachments_name_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get attachment
+
+    Get the (binary) content of one attachment associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_info(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get info about the attachment

+

Get all the information about the attachment associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the information about the attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5312
+5313
+5314
+5315
+5316
+5317
+5318
+5319
+5320
+5321
+5322
+5323
+5324
+5325
+5326
+5327
+5328
+5329
+5330
+5331
+5332
+5333
+5334
+5335
+5336
+5337
+5338
+5339
+5340
+5341
async def get_series_id_attachments_name_info(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get info about the attachment
+
+    Get all the information about the attachment associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the information about the attachment
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/info",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_is_compressed(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Is attachment compressed?

+

Test whether the attachment has been stored as a compressed file on the disk. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

0 if the attachment was stored uncompressed, 1 if it was compressed

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5343
+5344
+5345
+5346
+5347
+5348
+5349
+5350
+5351
+5352
+5353
+5354
+5355
+5356
+5357
+5358
+5359
+5360
+5361
+5362
+5363
+5364
+5365
+5366
+5367
+5368
+5369
+5370
+5371
+5372
async def get_series_id_attachments_name_is_compressed(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Is attachment compressed?
+
+    Test whether the attachment has been stored as a compressed file on the disk.
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `0` if the attachment was stored uncompressed, `1` if it was compressed
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/is-compressed",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_md5(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get MD5 of attachment

+

Get the MD5 hash of one attachment associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5374
+5375
+5376
+5377
+5378
+5379
+5380
+5381
+5382
+5383
+5384
+5385
+5386
+5387
+5388
+5389
+5390
+5391
+5392
+5393
+5394
+5395
+5396
+5397
+5398
+5399
+5400
+5401
+5402
+5403
async def get_series_id_attachments_name_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get MD5 of attachment
+
+    Get the MD5 hash of one attachment associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_size(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get size of attachment

+

Get the size of one attachment associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5405
+5406
+5407
+5408
+5409
+5410
+5411
+5412
+5413
+5414
+5415
+5416
+5417
+5418
+5419
+5420
+5421
+5422
+5423
+5424
+5425
+5426
+5427
+5428
+5429
+5430
+5431
+5432
+5433
+5434
async def get_series_id_attachments_name_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get size of attachment
+
+    Get the size of one attachment associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_instances(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get child instances

+

Get detailed information about the child instances of the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If false or missing, only retrieve the list of child instances + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing information about the child DICOM instances

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5487
+5488
+5489
+5490
+5491
+5492
+5493
+5494
+5495
+5496
+5497
+5498
+5499
+5500
+5501
+5502
+5503
+5504
+5505
+5506
+5507
+5508
+5509
+5510
+5511
+5512
+5513
+5514
+5515
+5516
async def get_series_id_instances(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get child instances
+
+    Get detailed information about the child instances of the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If false or missing, only retrieve the list of child instances
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing information about the child DICOM instances
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/instances",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_instances_tags(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get tags of instances

+

Get the tags of all the child instances of the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5518
+5519
+5520
+5521
+5522
+5523
+5524
+5525
+5526
+5527
+5528
+5529
+5530
+5531
+5532
+5533
+5534
+5535
+5536
+5537
+5538
+5539
+5540
+5541
+5542
+5543
+5544
+5545
+5546
async def get_series_id_instances_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get tags of instances
+
+    Get the tags of all the child instances of the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/instances-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_labels(id_) + + + async + + +

+ + +
+ +

(async) List labels

+

Get the labels that are associated with the given series (new in Orthanc 1.12.0) +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the labels

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5548
+5549
+5550
+5551
+5552
+5553
+5554
+5555
+5556
+5557
+5558
+5559
+5560
+5561
+5562
+5563
+5564
+5565
+5566
+5567
+5568
+5569
async def get_series_id_labels(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List labels
+
+    Get the labels that are associated with the given series (new in Orthanc 1.12.0)
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the labels
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/labels",
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_labels_label(id_, label) + + + async + + +

+ + +
+ +

(async) Test label

+

Test whether the series is associated with the given label +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label of interest

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty string is returned in the case of presence, error 404 in the case of absence

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5596
+5597
+5598
+5599
+5600
+5601
+5602
+5603
+5604
+5605
+5606
+5607
+5608
+5609
+5610
+5611
+5612
+5613
+5614
+5615
+5616
+5617
+5618
+5619
+5620
async def get_series_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Test label
+
+    Test whether the series is associated with the given label
+    Tags: Series
+
+    Parameters
+    ----------
+    label
+        The label of interest
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty string is returned in the case of presence, error 404 in the case of absence
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_media(id_, params=None) + + + async + + +

+ + +
+ +

(async) Create DICOMDIR media

+

Synchronously create a DICOMDIR media containing the DICOM series whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might not be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using POST method. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "extended" (str): If present, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR + "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension) + "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5647
+5648
+5649
+5650
+5651
+5652
+5653
+5654
+5655
+5656
+5657
+5658
+5659
+5660
+5661
+5662
+5663
+5664
+5665
+5666
+5667
+5668
+5669
+5670
+5671
+5672
+5673
+5674
+5675
async def get_series_id_media(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create DICOMDIR media
+
+    Synchronously create a DICOMDIR media containing the DICOM series whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "extended" (str): If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*
+            "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+            "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        ZIP file containing the archive
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/media",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_metadata(id_, params=None) + + + async + + +

+ + +
+ +

(async) List metadata

+

Get the list of metadata that are associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, also retrieve the value of the individual metadata + "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5713
+5714
+5715
+5716
+5717
+5718
+5719
+5720
+5721
+5722
+5723
+5724
+5725
+5726
+5727
+5728
+5729
+5730
+5731
+5732
+5733
+5734
+5735
+5736
+5737
+5738
+5739
+5740
async def get_series_id_metadata(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List metadata
+
+    Get the list of metadata that are associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, also retrieve the value of the individual metadata
+            "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/metadata",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_metadata_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get metadata

+

Get the value of a metadata that is associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Value of the metadata

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5772
+5773
+5774
+5775
+5776
+5777
+5778
+5779
+5780
+5781
+5782
+5783
+5784
+5785
+5786
+5787
+5788
+5789
+5790
+5791
+5792
+5793
+5794
+5795
+5796
+5797
+5798
+5799
+5800
+5801
async def get_series_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get metadata
+
+    Get the value of a metadata that is associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Value of the metadata
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_module(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get series module

+

Get the series module of the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM series

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5879
+5880
+5881
+5882
+5883
+5884
+5885
+5886
+5887
+5888
+5889
+5890
+5891
+5892
+5893
+5894
+5895
+5896
+5897
+5898
+5899
+5900
+5901
+5902
+5903
+5904
+5905
+5906
+5907
async def get_series_id_module(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get series module
+
+    Get the series module of the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM series
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/module",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_numpy(id_, params=None) + + + async + + +

+ + +
+ +

(async) Decode series for numpy

+

Decode the given DICOM series, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel). +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM resource of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "compress" (bool): Compress the file as .npz + "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5909
+5910
+5911
+5912
+5913
+5914
+5915
+5916
+5917
+5918
+5919
+5920
+5921
+5922
+5923
+5924
+5925
+5926
+5927
+5928
+5929
+5930
+5931
+5932
+5933
+5934
+5935
+5936
async def get_series_id_numpy(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Decode series for numpy
+
+    Decode the given DICOM series, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel).
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM resource of interest
+    params
+        Dictionary of optional parameters:
+            "compress" (bool): Compress the file as `.npz`
+            "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/numpy",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_ordered_slices(id_) + + + async + + +

+ + +
+ +

(async) Order the slices

+

Sort the instances and frames (slices) of the DICOM series whose Orthanc identifier is provided in the URL. This URI is essentially used by the Orthanc Web viewer and by the Osimis Web viewer. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
5938
+5939
+5940
+5941
+5942
+5943
+5944
+5945
+5946
+5947
+5948
+5949
+5950
+5951
+5952
+5953
+5954
+5955
+5956
+5957
+5958
+5959
+5960
async def get_series_id_ordered_slices(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Order the slices
+
+    Sort the instances and frames (slices) of the DICOM series whose Orthanc identifier is provided in the URL. This URI is essentially used by the Orthanc Web viewer and by the Osimis Web viewer.
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+    return await self._get(
+        route=f"{self.url}/series/{id_}/ordered-slices",
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_patient(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get parent patient

+

Get detailed information about the parent patient of the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the parent DICOM patient

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5962
+5963
+5964
+5965
+5966
+5967
+5968
+5969
+5970
+5971
+5972
+5973
+5974
+5975
+5976
+5977
+5978
+5979
+5980
+5981
+5982
+5983
+5984
+5985
+5986
+5987
+5988
+5989
+5990
async def get_series_id_patient(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get parent patient
+
+    Get detailed information about the parent patient of the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the parent DICOM patient
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/patient",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_shared_tags(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get shared tags

+

Extract the DICOM tags whose value is constant across all the child instances of the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the values of the DICOM tags

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6022
+6023
+6024
+6025
+6026
+6027
+6028
+6029
+6030
+6031
+6032
+6033
+6034
+6035
+6036
+6037
+6038
+6039
+6040
+6041
+6042
+6043
+6044
+6045
+6046
+6047
+6048
+6049
async def get_series_id_shared_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get shared tags
+
+    Extract the DICOM tags whose value is constant across all the child instances of the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the values of the DICOM tags
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/shared-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_statistics(id_) + + + async + + +

+ + +
+ +

(async) Get series statistics

+

Get statistics about the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
6051
+6052
+6053
+6054
+6055
+6056
+6057
+6058
+6059
+6060
+6061
+6062
+6063
+6064
+6065
+6066
+6067
+6068
+6069
+6070
+6071
+6072
async def get_series_id_statistics(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get series statistics
+
+    Get statistics about the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/statistics",
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_study(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get parent study

+

Get detailed information about the parent study of the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the parent DICOM study

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6074
+6075
+6076
+6077
+6078
+6079
+6080
+6081
+6082
+6083
+6084
+6085
+6086
+6087
+6088
+6089
+6090
+6091
+6092
+6093
+6094
+6095
+6096
+6097
+6098
+6099
+6100
+6101
+6102
async def get_series_id_study(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get parent study
+
+    Get detailed information about the parent study of the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the parent DICOM study
+    """
+    return await self._get(
+        route=f"{self.url}/series/{id_}/study",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_statistics() + + + async + + +

+ + +
+ +

(async) Get database statistics

+

Get statistics related to the database of Orthanc +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
6104
+6105
+6106
+6107
+6108
+6109
+6110
+6111
+6112
+6113
+6114
+6115
+6116
+6117
+6118
+6119
async def get_statistics(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get database statistics
+
+    Get statistics related to the database of Orthanc
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return await self._get(
+        route=f"{self.url}/statistics",
+    )
+
+
+
+ +
+ +
+ + +

+ get_storage_commitment_id(id_) + + + async + + +

+ + +
+ +

(async) Get storage commitment report

+

Get the storage commitment report whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/storage-commitment.html#storage-commitment-scu +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the storage commitment report

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
6121
+6122
+6123
+6124
+6125
+6126
+6127
+6128
+6129
+6130
+6131
+6132
+6133
+6134
+6135
+6136
+6137
+6138
+6139
+6140
+6141
+6142
async def get_storage_commitment_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get storage commitment report
+
+    Get the storage commitment report whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/storage-commitment.html#storage-commitment-scu
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the storage commitment report
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return await self._get(
+        route=f"{self.url}/storage-commitment/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies(params=None) + + + async + + +

+ + +
+ +

(async) List the available studies

+

List the Orthanc identifiers of all the available DICOM studies +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual studies + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "limit" (float): Limit the number of results + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format + "since" (float): Show only the resources since the provided index

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the Orthanc identifiers, or detailed information about the reported studies (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6166
+6167
+6168
+6169
+6170
+6171
+6172
+6173
+6174
+6175
+6176
+6177
+6178
+6179
+6180
+6181
+6182
+6183
+6184
+6185
+6186
+6187
+6188
+6189
+6190
+6191
+6192
+6193
+6194
async def get_studies(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List the available studies
+
+    List the Orthanc identifiers of all the available DICOM studies
+    Tags: Studies
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual studies
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "limit" (float): Limit the number of results
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "since" (float): Show only the resources since the provided index
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the Orthanc identifiers, or detailed information about the reported studies (if `expand` argument is provided)
+    """
+    return await self._get(
+        route=f"{self.url}/studies",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get information about some study

+

Get detailed information about the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM study

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6218
+6219
+6220
+6221
+6222
+6223
+6224
+6225
+6226
+6227
+6228
+6229
+6230
+6231
+6232
+6233
+6234
+6235
+6236
+6237
+6238
+6239
+6240
+6241
+6242
+6243
+6244
+6245
+6246
async def get_studies_id(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get information about some study
+
+    Get detailed information about the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM study
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_archive(id_, params=None) + + + async + + +

+ + +
+ +

(async) Create ZIP archive

+

Synchronously create a ZIP archive containing the DICOM study whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might not be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using POST method. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension) + "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6292
+6293
+6294
+6295
+6296
+6297
+6298
+6299
+6300
+6301
+6302
+6303
+6304
+6305
+6306
+6307
+6308
+6309
+6310
+6311
+6312
+6313
+6314
+6315
+6316
+6317
+6318
+6319
async def get_studies_id_archive(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create ZIP archive
+
+    Synchronously create a ZIP archive containing the DICOM study whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+            "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        ZIP file containing the archive
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/archive",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments(id_, params=None) + + + async + + +

+ + +
+ +

(async) List attachments

+

Get the list of attachments that are associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (str): If present, retrieve the attachments list and their numerical ids

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the attachments

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6356
+6357
+6358
+6359
+6360
+6361
+6362
+6363
+6364
+6365
+6366
+6367
+6368
+6369
+6370
+6371
+6372
+6373
+6374
+6375
+6376
+6377
+6378
+6379
+6380
+6381
+6382
async def get_studies_id_attachments(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List attachments
+
+    Get the list of attachments that are associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "full" (str): If present, retrieve the attachments list and their numerical ids
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the attachments
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/attachments",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) List operations on attachments

+

Get the list of the operations that are available for attachments associated with the given study +Tags: Other

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6414
+6415
+6416
+6417
+6418
+6419
+6420
+6421
+6422
+6423
+6424
+6425
+6426
+6427
+6428
+6429
+6430
+6431
+6432
+6433
+6434
+6435
+6436
+6437
+6438
+6439
+6440
+6441
+6442
+6443
async def get_studies_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List operations on attachments
+
+    Get the list of the operations that are available for attachments associated with the given study
+    Tags: Other
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_compressed_data(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get attachment (no decompression)

+

Get the (binary) content of one attachment associated with the given study. The attachment will not be decompressed if StorageCompression is true. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6505
+6506
+6507
+6508
+6509
+6510
+6511
+6512
+6513
+6514
+6515
+6516
+6517
+6518
+6519
+6520
+6521
+6522
+6523
+6524
+6525
+6526
+6527
+6528
+6529
+6530
+6531
+6532
+6533
+6534
async def get_studies_id_attachments_name_compressed_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get attachment (no decompression)
+
+    Get the (binary) content of one attachment associated with the given study. The attachment will not be decompressed if `StorageCompression` is `true`.
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/compressed-data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_compressed_md5(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get MD5 of attachment on disk

+

Get the MD5 hash of one attachment associated with the given study, as stored on the disk. This is different from .../md5 iff EnableStorage is true. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6536
+6537
+6538
+6539
+6540
+6541
+6542
+6543
+6544
+6545
+6546
+6547
+6548
+6549
+6550
+6551
+6552
+6553
+6554
+6555
+6556
+6557
+6558
+6559
+6560
+6561
+6562
+6563
+6564
+6565
async def get_studies_id_attachments_name_compressed_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get MD5 of attachment on disk
+
+    Get the MD5 hash of one attachment associated with the given study, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment, as stored on the disk
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/compressed-md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_compressed_size(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get size of attachment on disk

+

Get the size of one attachment associated with the given study, as stored on the disk. This is different from .../size iff EnableStorage is true. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6567
+6568
+6569
+6570
+6571
+6572
+6573
+6574
+6575
+6576
+6577
+6578
+6579
+6580
+6581
+6582
+6583
+6584
+6585
+6586
+6587
+6588
+6589
+6590
+6591
+6592
+6593
+6594
+6595
+6596
async def get_studies_id_attachments_name_compressed_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get size of attachment on disk
+
+    Get the size of one attachment associated with the given study, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment, as stored on the disk
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/compressed-size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_data(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get attachment

+

Get the (binary) content of one attachment associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6598
+6599
+6600
+6601
+6602
+6603
+6604
+6605
+6606
+6607
+6608
+6609
+6610
+6611
+6612
+6613
+6614
+6615
+6616
+6617
+6618
+6619
+6620
+6621
+6622
+6623
+6624
+6625
+6626
+6627
async def get_studies_id_attachments_name_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get attachment
+
+    Get the (binary) content of one attachment associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_info(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get info about the attachment

+

Get all the information about the attachment associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the information about the attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6629
+6630
+6631
+6632
+6633
+6634
+6635
+6636
+6637
+6638
+6639
+6640
+6641
+6642
+6643
+6644
+6645
+6646
+6647
+6648
+6649
+6650
+6651
+6652
+6653
+6654
+6655
+6656
+6657
+6658
async def get_studies_id_attachments_name_info(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get info about the attachment
+
+    Get all the information about the attachment associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the information about the attachment
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/info",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_is_compressed(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Is attachment compressed?

+

Test whether the attachment has been stored as a compressed file on the disk. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

0 if the attachment was stored uncompressed, 1 if it was compressed

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6660
+6661
+6662
+6663
+6664
+6665
+6666
+6667
+6668
+6669
+6670
+6671
+6672
+6673
+6674
+6675
+6676
+6677
+6678
+6679
+6680
+6681
+6682
+6683
+6684
+6685
+6686
+6687
+6688
+6689
async def get_studies_id_attachments_name_is_compressed(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Is attachment compressed?
+
+    Test whether the attachment has been stored as a compressed file on the disk.
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `0` if the attachment was stored uncompressed, `1` if it was compressed
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/is-compressed",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_md5(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get MD5 of attachment

+

Get the MD5 hash of one attachment associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6691
+6692
+6693
+6694
+6695
+6696
+6697
+6698
+6699
+6700
+6701
+6702
+6703
+6704
+6705
+6706
+6707
+6708
+6709
+6710
+6711
+6712
+6713
+6714
+6715
+6716
+6717
+6718
+6719
+6720
async def get_studies_id_attachments_name_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get MD5 of attachment
+
+    Get the MD5 hash of one attachment associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_size(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get size of attachment

+

Get the size of one attachment associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6722
+6723
+6724
+6725
+6726
+6727
+6728
+6729
+6730
+6731
+6732
+6733
+6734
+6735
+6736
+6737
+6738
+6739
+6740
+6741
+6742
+6743
+6744
+6745
+6746
+6747
+6748
+6749
+6750
+6751
async def get_studies_id_attachments_name_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get size of attachment
+
+    Get the size of one attachment associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_instances(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get child instances

+

Get detailed information about the child instances of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If false or missing, only retrieve the list of child instances + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing information about the child DICOM instances

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6804
+6805
+6806
+6807
+6808
+6809
+6810
+6811
+6812
+6813
+6814
+6815
+6816
+6817
+6818
+6819
+6820
+6821
+6822
+6823
+6824
+6825
+6826
+6827
+6828
+6829
+6830
+6831
+6832
+6833
async def get_studies_id_instances(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get child instances
+
+    Get detailed information about the child instances of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If false or missing, only retrieve the list of child instances
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing information about the child DICOM instances
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/instances",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_instances_tags(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get tags of instances

+

Get the tags of all the child instances of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6835
+6836
+6837
+6838
+6839
+6840
+6841
+6842
+6843
+6844
+6845
+6846
+6847
+6848
+6849
+6850
+6851
+6852
+6853
+6854
+6855
+6856
+6857
+6858
+6859
+6860
+6861
+6862
+6863
async def get_studies_id_instances_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get tags of instances
+
+    Get the tags of all the child instances of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/instances-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_labels(id_) + + + async + + +

+ + +
+ +

(async) List labels

+

Get the labels that are associated with the given study (new in Orthanc 1.12.0) +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the labels

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6865
+6866
+6867
+6868
+6869
+6870
+6871
+6872
+6873
+6874
+6875
+6876
+6877
+6878
+6879
+6880
+6881
+6882
+6883
+6884
+6885
+6886
async def get_studies_id_labels(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List labels
+
+    Get the labels that are associated with the given study (new in Orthanc 1.12.0)
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the labels
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/labels",
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_labels_label(id_, label) + + + async + + +

+ + +
+ +

(async) Test label

+

Test whether the study is associated with the given label +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label of interest

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty string is returned in the case of presence, error 404 in the case of absence

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6913
+6914
+6915
+6916
+6917
+6918
+6919
+6920
+6921
+6922
+6923
+6924
+6925
+6926
+6927
+6928
+6929
+6930
+6931
+6932
+6933
+6934
+6935
+6936
+6937
async def get_studies_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Test label
+
+    Test whether the study is associated with the given label
+    Tags: Studies
+
+    Parameters
+    ----------
+    label
+        The label of interest
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty string is returned in the case of presence, error 404 in the case of absence
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_media(id_, params=None) + + + async + + +

+ + +
+ +

(async) Create DICOMDIR media

+

Synchronously create a DICOMDIR media containing the DICOM study whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might not be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using POST method. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "extended" (str): If present, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR + "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension) + "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6964
+6965
+6966
+6967
+6968
+6969
+6970
+6971
+6972
+6973
+6974
+6975
+6976
+6977
+6978
+6979
+6980
+6981
+6982
+6983
+6984
+6985
+6986
+6987
+6988
+6989
+6990
+6991
+6992
async def get_studies_id_media(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create DICOMDIR media
+
+    Synchronously create a DICOMDIR media containing the DICOM study whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "extended" (str): If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*
+            "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+            "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        ZIP file containing the archive
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/media",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_metadata(id_, params=None) + + + async + + +

+ + +
+ +

(async) List metadata

+

Get the list of metadata that are associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, also retrieve the value of the individual metadata + "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7066
+7067
+7068
+7069
+7070
+7071
+7072
+7073
+7074
+7075
+7076
+7077
+7078
+7079
+7080
+7081
+7082
+7083
+7084
+7085
+7086
+7087
+7088
+7089
+7090
+7091
+7092
+7093
async def get_studies_id_metadata(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List metadata
+
+    Get the list of metadata that are associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, also retrieve the value of the individual metadata
+            "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/metadata",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_metadata_name(id_, name, headers=None) + + + async + + +

+ + +
+ +

(async) Get metadata

+

Get the value of a metadata that is associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Value of the metadata

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7125
+7126
+7127
+7128
+7129
+7130
+7131
+7132
+7133
+7134
+7135
+7136
+7137
+7138
+7139
+7140
+7141
+7142
+7143
+7144
+7145
+7146
+7147
+7148
+7149
+7150
+7151
+7152
+7153
+7154
async def get_studies_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get metadata
+
+    Get the value of a metadata that is associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Value of the metadata
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_module(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get study module

+

Get the study module of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM study

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7232
+7233
+7234
+7235
+7236
+7237
+7238
+7239
+7240
+7241
+7242
+7243
+7244
+7245
+7246
+7247
+7248
+7249
+7250
+7251
+7252
+7253
+7254
+7255
+7256
+7257
+7258
+7259
+7260
async def get_studies_id_module(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get study module
+
+    Get the study module of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM study
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/module",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_module_patient(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get patient module of study

+

Get the patient module of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM study

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7262
+7263
+7264
+7265
+7266
+7267
+7268
+7269
+7270
+7271
+7272
+7273
+7274
+7275
+7276
+7277
+7278
+7279
+7280
+7281
+7282
+7283
+7284
+7285
+7286
+7287
+7288
+7289
+7290
async def get_studies_id_module_patient(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get patient module of study
+
+    Get the patient module of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM study
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/module-patient",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_patient(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get parent patient

+

Get detailed information about the parent patient of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the parent DICOM patient

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7292
+7293
+7294
+7295
+7296
+7297
+7298
+7299
+7300
+7301
+7302
+7303
+7304
+7305
+7306
+7307
+7308
+7309
+7310
+7311
+7312
+7313
+7314
+7315
+7316
+7317
+7318
+7319
+7320
async def get_studies_id_patient(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get parent patient
+
+    Get detailed information about the parent patient of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the parent DICOM patient
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/patient",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_series(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get child series

+

Get detailed information about the child series of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If false or missing, only retrieve the list of child series + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing information about the child DICOM series

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7352
+7353
+7354
+7355
+7356
+7357
+7358
+7359
+7360
+7361
+7362
+7363
+7364
+7365
+7366
+7367
+7368
+7369
+7370
+7371
+7372
+7373
+7374
+7375
+7376
+7377
+7378
+7379
+7380
+7381
async def get_studies_id_series(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get child series
+
+    Get detailed information about the child series of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If false or missing, only retrieve the list of child series
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing information about the child DICOM series
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/series",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_shared_tags(id_, params=None) + + + async + + +

+ + +
+ +

(async) Get shared tags

+

Extract the DICOM tags whose value is constant across all the child instances of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the values of the DICOM tags

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7383
+7384
+7385
+7386
+7387
+7388
+7389
+7390
+7391
+7392
+7393
+7394
+7395
+7396
+7397
+7398
+7399
+7400
+7401
+7402
+7403
+7404
+7405
+7406
+7407
+7408
+7409
+7410
async def get_studies_id_shared_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get shared tags
+
+    Extract the DICOM tags whose value is constant across all the child instances of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the values of the DICOM tags
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/shared-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_statistics(id_) + + + async + + +

+ + +
+ +

(async) Get study statistics

+

Get statistics about the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7452
+7453
+7454
+7455
+7456
+7457
+7458
+7459
+7460
+7461
+7462
+7463
+7464
+7465
+7466
+7467
+7468
+7469
+7470
+7471
+7472
+7473
async def get_studies_id_statistics(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get study statistics
+
+    Get statistics about the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return await self._get(
+        route=f"{self.url}/studies/{id_}/statistics",
+    )
+
+
+
+ +
+ +
+ + +

+ get_system() + + + async + + +

+ + +
+ +

(async) Get system information

+

Get system information about Orthanc +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7475
+7476
+7477
+7478
+7479
+7480
+7481
+7482
+7483
+7484
+7485
+7486
+7487
+7488
+7489
+7490
async def get_system(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get system information
+
+    Get system information about Orthanc
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return await self._get(
+        route=f"{self.url}/system",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools() + + + async + + +

+ + +
+ +

(async) List operations

+

List the available operations under URI /tools/ +Tags: Other

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7492
+7493
+7494
+7495
+7496
+7497
+7498
+7499
+7500
+7501
+7502
+7503
+7504
+7505
+7506
+7507
async def get_tools(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) List operations
+
+    List the available operations under URI `/tools/`
+    Tags: Other
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return await self._get(
+        route=f"{self.url}/tools",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_accepted_transfer_syntaxes() + + + async + + +

+ + +
+ +

(async) Get accepted transfer syntaxes

+

Get the list of UIDs of the DICOM transfer syntaxes that are accepted by Orthanc C-STORE SCP. This corresponds to the configuration options AcceptedTransferSyntaxes and XXXTransferSyntaxAccepted. +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the transfer syntax UIDs

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7509
+7510
+7511
+7512
+7513
+7514
+7515
+7516
+7517
+7518
+7519
+7520
+7521
+7522
+7523
+7524
async def get_tools_accepted_transfer_syntaxes(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get accepted transfer syntaxes
+
+    Get the list of UIDs of the DICOM transfer syntaxes that are accepted by Orthanc C-STORE SCP. This corresponds to the configuration options `AcceptedTransferSyntaxes` and `XXXTransferSyntaxAccepted`.
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the transfer syntax UIDs
+    """
+    return await self._get(
+        route=f"{self.url}/tools/accepted-transfer-syntaxes",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_create_archive(params=None) + + + async + + +

+ + +
+ +

(async) Create ZIP archive

+

Create a ZIP archive containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "resources" (str): A comma separated list of Orthanc resource identifiers to include in the ZIP archive. + "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7698
+7699
+7700
+7701
+7702
+7703
+7704
+7705
+7706
+7707
+7708
+7709
+7710
+7711
+7712
+7713
+7714
+7715
+7716
+7717
+7718
+7719
+7720
+7721
async def get_tools_create_archive(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create ZIP archive
+
+    Create a ZIP archive containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument
+    Tags: System
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "resources" (str): A comma separated list of Orthanc resource identifiers to include in the ZIP archive.
+            "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._get(
+        route=f"{self.url}/tools/create-archive",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_create_media(params=None) + + + async + + +

+ + +
+ +

(async) Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "resources" (str): A comma separated list of Orthanc resource identifiers to include in the DICOMDIR media. + "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7789
+7790
+7791
+7792
+7793
+7794
+7795
+7796
+7797
+7798
+7799
+7800
+7801
+7802
+7803
+7804
+7805
+7806
+7807
+7808
+7809
+7810
+7811
+7812
async def get_tools_create_media(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument
+    Tags: System
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "resources" (str): A comma separated list of Orthanc resource identifiers to include in the DICOMDIR media.
+            "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._get(
+        route=f"{self.url}/tools/create-media",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_create_media_extended(params=None) + + + async + + +

+ + +
+ +

(async) Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "resources" (str): A comma separated list of Orthanc resource identifiers to include in the DICOMDIR media. + "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7848
+7849
+7850
+7851
+7852
+7853
+7854
+7855
+7856
+7857
+7858
+7859
+7860
+7861
+7862
+7863
+7864
+7865
+7866
+7867
+7868
+7869
+7870
+7871
async def get_tools_create_media_extended(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument
+    Tags: System
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "resources" (str): A comma separated list of Orthanc resource identifiers to include in the DICOMDIR media.
+            "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._get(
+        route=f"{self.url}/tools/create-media-extended",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_default_encoding() + + + async + + +

+ + +
+ +

(async) Get default encoding

+

Get the default encoding that is used by Orthanc if parsing a DICOM instance without the SpecificCharacterEncoding tag, or during C-FIND. This corresponds to the configuration option DefaultEncoding. +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The name of the encoding

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7907
+7908
+7909
+7910
+7911
+7912
+7913
+7914
+7915
+7916
+7917
+7918
+7919
+7920
+7921
+7922
async def get_tools_default_encoding(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get default encoding
+
+    Get the default encoding that is used by Orthanc if parsing a DICOM instance without the `SpecificCharacterEncoding` tag, or during C-FIND. This corresponds to the configuration option `DefaultEncoding`.
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The name of the encoding
+    """
+    return await self._get(
+        route=f"{self.url}/tools/default-encoding",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_dicom_conformance() + + + async + + +

+ + +
+ +

(async) Get DICOM conformance

+

Get the DICOM conformance statement of Orthanc +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The DICOM conformance statement

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7947
+7948
+7949
+7950
+7951
+7952
+7953
+7954
+7955
+7956
+7957
+7958
+7959
+7960
+7961
+7962
async def get_tools_dicom_conformance(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get DICOM conformance
+
+    Get the DICOM conformance statement of Orthanc
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The DICOM conformance statement
+    """
+    return await self._get(
+        route=f"{self.url}/tools/dicom-conformance",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_generate_uid(params=None) + + + async + + +

+ + +
+ +

(async) Generate an identifier

+

Generate a random DICOM identifier +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "level" (str): Type of DICOM resource among: patient, study, series or instance

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The generated identifier

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8059
+8060
+8061
+8062
+8063
+8064
+8065
+8066
+8067
+8068
+8069
+8070
+8071
+8072
+8073
+8074
+8075
+8076
+8077
+8078
+8079
+8080
+8081
+8082
async def get_tools_generate_uid(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Generate an identifier
+
+    Generate a random DICOM identifier
+    Tags: System
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "level" (str): Type of DICOM resource among: `patient`, `study`, `series` or `instance`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The generated identifier
+    """
+    return await self._get(
+        route=f"{self.url}/tools/generate-uid_",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_labels() + + + async + + +

+ + +
+ +

(async) Get all the used labels

+

List all the labels that are associated with any resource of the Orthanc database +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the labels

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8100
+8101
+8102
+8103
+8104
+8105
+8106
+8107
+8108
+8109
+8110
+8111
+8112
+8113
+8114
+8115
async def get_tools_labels(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get all the used labels
+
+    List all the labels that are associated with any resource of the Orthanc database
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the labels
+    """
+    return await self._get(
+        route=f"{self.url}/tools/labels",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level() + + + async + + +

+ + +
+ +

(async) Get main log level

+

Get the main log level of Orthanc +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8117
+8118
+8119
+8120
+8121
+8122
+8123
+8124
+8125
+8126
+8127
+8128
+8129
+8130
+8131
+8132
async def get_tools_log_level(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get main log level
+
+    Get the main log level of Orthanc
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return await self._get(
+        route=f"{self.url}/tools/log-level",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_dicom() + + + async + + +

+ + +
+ +

(async) Get log level for dicom

+

Get the log level of the log category dicom +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8157
+8158
+8159
+8160
+8161
+8162
+8163
+8164
+8165
+8166
+8167
+8168
+8169
+8170
+8171
+8172
async def get_tools_log_level_dicom(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get log level for `dicom`
+
+    Get the log level of the log category `dicom`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return await self._get(
+        route=f"{self.url}/tools/log-level-dicom",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_generic() + + + async + + +

+ + +
+ +

(async) Get log level for generic

+

Get the log level of the log category generic +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8197
+8198
+8199
+8200
+8201
+8202
+8203
+8204
+8205
+8206
+8207
+8208
+8209
+8210
+8211
+8212
async def get_tools_log_level_generic(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get log level for `generic`
+
+    Get the log level of the log category `generic`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return await self._get(
+        route=f"{self.url}/tools/log-level-generic",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_http() + + + async + + +

+ + +
+ +

(async) Get log level for http

+

Get the log level of the log category http +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8237
+8238
+8239
+8240
+8241
+8242
+8243
+8244
+8245
+8246
+8247
+8248
+8249
+8250
+8251
+8252
async def get_tools_log_level_http(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get log level for `http`
+
+    Get the log level of the log category `http`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return await self._get(
+        route=f"{self.url}/tools/log-level-http",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_jobs() + + + async + + +

+ + +
+ +

(async) Get log level for jobs

+

Get the log level of the log category jobs +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8277
+8278
+8279
+8280
+8281
+8282
+8283
+8284
+8285
+8286
+8287
+8288
+8289
+8290
+8291
+8292
async def get_tools_log_level_jobs(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get log level for `jobs`
+
+    Get the log level of the log category `jobs`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return await self._get(
+        route=f"{self.url}/tools/log-level-jobs",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_lua() + + + async + + +

+ + +
+ +

(async) Get log level for lua

+

Get the log level of the log category lua +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8317
+8318
+8319
+8320
+8321
+8322
+8323
+8324
+8325
+8326
+8327
+8328
+8329
+8330
+8331
+8332
async def get_tools_log_level_lua(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get log level for `lua`
+
+    Get the log level of the log category `lua`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return await self._get(
+        route=f"{self.url}/tools/log-level-lua",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_plugins() + + + async + + +

+ + +
+ +

(async) Get log level for plugins

+

Get the log level of the log category plugins +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8357
+8358
+8359
+8360
+8361
+8362
+8363
+8364
+8365
+8366
+8367
+8368
+8369
+8370
+8371
+8372
async def get_tools_log_level_plugins(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get log level for `plugins`
+
+    Get the log level of the log category `plugins`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return await self._get(
+        route=f"{self.url}/tools/log-level-plugins",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_sqlite() + + + async + + +

+ + +
+ +

(async) Get log level for sqlite

+

Get the log level of the log category sqlite +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8397
+8398
+8399
+8400
+8401
+8402
+8403
+8404
+8405
+8406
+8407
+8408
+8409
+8410
+8411
+8412
async def get_tools_log_level_sqlite(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get log level for `sqlite`
+
+    Get the log level of the log category `sqlite`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return await self._get(
+        route=f"{self.url}/tools/log-level-sqlite",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_metrics() + + + async + + +

+ + +
+ +

(async) Are metrics collected?

+

Returns a Boolean specifying whether Prometheus metrics are collected and exposed at /tools/metrics-prometheus +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

1 if metrics are collected, 0 if metrics are disabled

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8461
+8462
+8463
+8464
+8465
+8466
+8467
+8468
+8469
+8470
+8471
+8472
+8473
+8474
+8475
+8476
async def get_tools_metrics(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Are metrics collected?
+
+    Returns a Boolean specifying whether Prometheus metrics are collected and exposed at `/tools/metrics-prometheus`
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `1` if metrics are collected, `0` if metrics are disabled
+    """
+    return await self._get(
+        route=f"{self.url}/tools/metrics",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_metrics_prometheus() + + + async + + +

+ + +
+ +

(async) Get usage metrics

+

Get usage metrics of Orthanc in the Prometheus file format (OpenMetrics): https://orthanc.uclouvain.be/book/users/advanced-rest.html#instrumentation-with-prometheus +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

No description

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8501
+8502
+8503
+8504
+8505
+8506
+8507
+8508
+8509
+8510
+8511
+8512
+8513
+8514
+8515
+8516
async def get_tools_metrics_prometheus(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get usage metrics
+
+    Get usage metrics of Orthanc in the Prometheus file format (OpenMetrics): https://orthanc.uclouvain.be/book/users/advanced-rest.html#instrumentation-with-prometheus
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        No description
+    """
+    return await self._get(
+        route=f"{self.url}/tools/metrics-prometheus",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_now() + + + async + + +

+ + +
+ +

(async) Get UTC time

+

Get UTC time +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The UTC time

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8518
+8519
+8520
+8521
+8522
+8523
+8524
+8525
+8526
+8527
+8528
+8529
+8530
+8531
+8532
+8533
async def get_tools_now(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get UTC time
+
+    Get UTC time
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The UTC time
+    """
+    return await self._get(
+        route=f"{self.url}/tools/now",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_now_local() + + + async + + +

+ + +
+ +

(async) Get local time

+

Get local time +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The local time

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8535
+8536
+8537
+8538
+8539
+8540
+8541
+8542
+8543
+8544
+8545
+8546
+8547
+8548
+8549
+8550
async def get_tools_now_local(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Get local time
+
+    Get local time
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The local time
+    """
+    return await self._get(
+        route=f"{self.url}/tools/now-local",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_unknown_sop_class_accepted() + + + async + + +

+ + +
+ +

(async) Is unknown SOP class accepted?

+

Shall Orthanc C-STORE SCP accept DICOM instances with an unknown SOP class UID? +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

1 if accepted, 0 if not accepted

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8611
+8612
+8613
+8614
+8615
+8616
+8617
+8618
+8619
+8620
+8621
+8622
+8623
+8624
+8625
+8626
async def get_tools_unknown_sop_class_accepted(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Is unknown SOP class accepted?
+
+    Shall Orthanc C-STORE SCP accept DICOM instances with an unknown SOP class UID?
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `1` if accepted, `0` if not accepted
+    """
+    return await self._get(
+        route=f"{self.url}/tools/unknown-sop-class-accepted",
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances(content=None) + + + async + + +

+ + +
+ +

(async) Upload DICOM instances

+

Upload DICOM instances +Tags: Instances

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the uploaded instance, or list of information for each uploaded instance in the case of ZIP archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
async def post_instances(
+    self,
+    content: RequestContent = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Upload DICOM instances
+
+    Upload DICOM instances
+    Tags: Instances
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the uploaded instance, or list of information for each uploaded instance in the case of ZIP archive
+    """
+    return await self._post(
+        route=f"{self.url}/instances",
+        content=content,
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_anonymize(id_, json=None) + + + async + + +

+ + +
+ +

(async) Anonymize instance

+

Download an anonymized version of the DICOM instance whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-a-single-instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option DeidentifyLogsDicomVersion for possible values. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "KeepLabels": Keep the labels of all resources level (defaults to false) + "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to false) + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The anonymized DICOM instance

+
+
+ +
+ Source code in pyorthanc/async_client.py +
443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
async def post_instances_id_anonymize(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Anonymize instance
+
+    Download an anonymized version of the DICOM instance whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-a-single-instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    json
+        Dictionary with the following keys:
+          "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+          "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The anonymized DICOM instance
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/instances/{id_}/anonymize",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_attachments_name_compress(id_, name) + + + async + + +

+ + +
+ +

(async) Compress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
async def post_instances_id_attachments_name_compress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Compress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/compress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_attachments_name_uncompress(id_, name) + + + async + + +

+ + +
+ +

(async) Uncompress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
async def post_instances_id_attachments_name_uncompress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Uncompress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/uncompress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_attachments_name_verify_md5(id_, name) + + + async + + +

+ + +
+ +

(async) Verify attachment

+

Verify that the attachment is not corrupted, by validating its MD5 hash +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

On success, a valid JSON object is returned

+
+
+ +
+ Source code in pyorthanc/async_client.py +
905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
async def post_instances_id_attachments_name_verify_md5(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Verify attachment
+
+    Verify that the attachment is not corrupted, by validating its MD5 hash
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        On success, a valid JSON object is returned
+    """
+    return await self._post(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/verify-md5",
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_export(id_, data=None) + + + async + + +

+ + +
+ +

(async) Write DICOM onto filesystem

+

Write the DICOM file onto the filesystem where Orthanc is running. This is insecure for Orthanc servers that are remotely accessible since one could overwrite any system file. Since Orthanc 1.12.0, this route is disabled by default, but can be enabled using the RestApiWriteToFileSystemEnabled configuration option. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
data + RequestData + +
+

Target path on the filesystem

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
async def post_instances_id_export(
+    self,
+    id_: str,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Write DICOM onto filesystem
+
+    Write the DICOM file onto the filesystem where Orthanc is running.  This is insecure for Orthanc servers that are remotely accessible since one could overwrite any system file.  Since Orthanc 1.12.0, this route is disabled by default, but can be enabled using the `RestApiWriteToFileSystemEnabled` configuration option.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    data
+        Target path on the filesystem
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/instances/{id_}/export",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_modify(id_, json=None) + + + async + + +

+ + +
+ +

(async) Modify instance

+

Download a modified version of the DICOM instance whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-a-single-instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world. + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to false) + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The modified DICOM instance

+
+
+ +
+ Source code in pyorthanc/async_client.py +
1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
async def post_instances_id_modify(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Modify instance
+
+    Download a modified version of the DICOM instance whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-a-single-instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    json
+        Dictionary with the following keys:
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The modified DICOM instance
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/instances/{id_}/modify",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_reconstruct(id_, json=None) + + + async + + +

+ + +
+ +

(async) Reconstruct tags & optionally files of instance

+

Reconstruct the main DICOM tags in DB of the instance whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
async def post_instances_id_reconstruct(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Reconstruct tags & optionally files of instance
+
+    Reconstruct the main DICOM tags in DB of the instance whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    json
+        Dictionary with the following keys:
+          "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/instances/{id_}/reconstruct",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_jobs_id_cancel(id_) + + + async + + +

+ + +
+ +

(async) Cancel job

+

Cancel the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
async def post_jobs_id_cancel(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Cancel job
+
+    Cancel the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+    Tags: Jobs
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return await self._post(
+        route=f"{self.url}/jobs/{id_}/cancel",
+    )
+
+
+
+ +
+ +
+ + +

+ post_jobs_id_pause(id_) + + + async + + +

+ + +
+ +

(async) Pause job

+

Pause the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
async def post_jobs_id_pause(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Pause job
+
+    Pause the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+    Tags: Jobs
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return await self._post(
+        route=f"{self.url}/jobs/{id_}/pause",
+    )
+
+
+
+ +
+ +
+ + +

+ post_jobs_id_resubmit(id_) + + + async + + +

+ + +
+ +

(async) Resubmit job

+

Resubmit the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
async def post_jobs_id_resubmit(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Resubmit job
+
+    Resubmit the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+    Tags: Jobs
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return await self._post(
+        route=f"{self.url}/jobs/{id_}/resubmit",
+    )
+
+
+
+ +
+ +
+ + +

+ post_jobs_id_resume(id_) + + + async + + +

+ + +
+ +

(async) Resume job

+

Resume the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
async def post_jobs_id_resume(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Resume job
+
+    Resume the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+    Tags: Jobs
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return await self._post(
+        route=f"{self.url}/jobs/{id_}/resume",
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_echo(id_, json=None) + + + async + + +

+ + +
+ +

(async) Trigger C-ECHO SCU

+

Trigger C-ECHO SCU command against the DICOM modality whose identifier is provided in URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-c-echo +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "CheckFind": Issue a dummy C-FIND command after the C-GET SCU, in order to check whether the remote modality knows about Orthanc. This field defaults to the value of the DicomEchoChecksFind configuration option. New in Orthanc 1.8.1. + "Timeout": Timeout for the C-ECHO command, in seconds

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
async def post_modalities_id_echo(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Trigger C-ECHO SCU
+
+    Trigger C-ECHO SCU command against the DICOM modality whose identifier is provided in URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-c-echo
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "CheckFind": Issue a dummy C-FIND command after the C-GET SCU, in order to check whether the remote modality knows about Orthanc. This field defaults to the value of the `DicomEchoChecksFind` configuration option. New in Orthanc 1.8.1.
+          "Timeout": Timeout for the C-ECHO command, in seconds
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/modalities/{id_}/echo",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_find(id_, json=None) + + + async + + +

+ + +
+ +

(async) Hierarchical C-FIND SCU

+

Trigger a sequence of C-FIND SCU commands against the DICOM modality whose identifier is provided in URL, in order to discover a hierarchy of matching patients/studies/series. Deprecated in favor of /modalities/{id}/query. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys:

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array describing the DICOM tags of the matching patients, embedding the matching studies, then the matching series.

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
async def post_modalities_id_find(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Hierarchical C-FIND SCU
+
+    Trigger a sequence of C-FIND SCU commands against the DICOM modality whose identifier is provided in URL, in order to discover a hierarchy of matching patients/studies/series. Deprecated in favor of `/modalities/{id}/query`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array describing the DICOM tags of the matching patients, embedding the matching studies, then the matching series.
+    """
+    warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/modalities/{id_}/find",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_find_instance(id_, json=None) + + + async + + +

+ + +
+ +

(async) C-FIND SCU for instances

+

Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find an instance. Deprecated in favor of /modalities/{id}/query. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys:

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array describing the DICOM tags of the matching instances

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
async def post_modalities_id_find_instance(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) C-FIND SCU for instances
+
+    Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find an instance. Deprecated in favor of `/modalities/{id}/query`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array describing the DICOM tags of the matching instances
+    """
+    warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/modalities/{id_}/find-instance",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_find_patient(id_, json=None) + + + async + + +

+ + +
+ +

(async) C-FIND SCU for patients

+

Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a patient. Deprecated in favor of /modalities/{id}/query. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys:

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array describing the DICOM tags of the matching patients

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
async def post_modalities_id_find_patient(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) C-FIND SCU for patients
+
+    Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a patient. Deprecated in favor of `/modalities/{id}/query`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array describing the DICOM tags of the matching patients
+    """
+    warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/modalities/{id_}/find-patient",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_find_series(id_, json=None) + + + async + + +

+ + +
+ +

(async) C-FIND SCU for series

+

Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a series. Deprecated in favor of /modalities/{id}/query. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys:

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array describing the DICOM tags of the matching series

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
async def post_modalities_id_find_series(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) C-FIND SCU for series
+
+    Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a series. Deprecated in favor of `/modalities/{id}/query`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array describing the DICOM tags of the matching series
+    """
+    warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/modalities/{id_}/find-series",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_find_study(id_, json=None) + + + async + + +

+ + +
+ +

(async) C-FIND SCU for studies

+

Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a study. Deprecated in favor of /modalities/{id}/query. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys:

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array describing the DICOM tags of the matching studies

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
async def post_modalities_id_find_study(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) C-FIND SCU for studies
+
+    Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a study. Deprecated in favor of `/modalities/{id}/query`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array describing the DICOM tags of the matching studies
+    """
+    warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/modalities/{id_}/find-study",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_find_worklist(id_, json=None) + + + async + + +

+ + +
+ +

(async) C-FIND SCU for worklist

+

Trigger C-FIND SCU command against the remote worklists of the DICOM modality whose identifier is provided in URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Full": If set to true, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "Query": Associative array containing the filter on the values of the DICOM tags + "Short": If set to true, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array describing the DICOM tags of the matching worklists

+
+
+ +
+ Source code in pyorthanc/async_client.py +
2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
async def post_modalities_id_find_worklist(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) C-FIND SCU for worklist
+
+    Trigger C-FIND SCU command against the remote worklists of the DICOM modality whose identifier is provided in URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+          "Query": Associative array containing the filter on the values of the DICOM tags
+          "Short": If set to `true`, report the DICOM tags in hexadecimal format
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array describing the DICOM tags of the matching worklists
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/modalities/{id_}/find-worklist",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_move(id_, json=None) + + + async + + +

+ + +
+ +

(async) Trigger C-MOVE SCU

+

Start a C-MOVE SCU command as a job, in order to drive the execution of a sequence of C-STORE commands by some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-c-move +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Level": Level of the query (Patient, Study, Series or Instance) + "LocalAet": Local AET that is used for this commands, defaults to DicomAet configuration option. Ignored if DicomModalities already sets LocalAet for this modality. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": List of queries identifying all the DICOM resources to be sent + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "TargetAet": Target AET that will be used by the remote DICOM modality as a target for its C-STORE SCU commands, defaults to DicomAet configuration option in order to do a simple query/retrieve + "Timeout": Timeout for the C-MOVE command, in seconds

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
async def post_modalities_id_move(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Trigger C-MOVE SCU
+
+    Start a C-MOVE SCU command as a job, in order to drive the execution of a sequence of C-STORE commands by some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-c-move
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Level": Level of the query (`Patient`, `Study`, `Series` or `Instance`)
+          "LocalAet": Local AET that is used for this commands, defaults to `DicomAet` configuration option. Ignored if `DicomModalities` already sets `LocalAet` for this modality.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": List of queries identifying all the DICOM resources to be sent
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "TargetAet": Target AET that will be used by the remote DICOM modality as a target for its C-STORE SCU commands, defaults to `DicomAet` configuration option in order to do a simple query/retrieve
+          "Timeout": Timeout for the C-MOVE command, in seconds
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/modalities/{id_}/move",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_query(id_, json=None) + + + async + + +

+ + +
+ +

(async) Trigger C-FIND SCU

+

Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-query-retrieve-c-find-and-find-with-rest +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Level": Level of the query (Patient, Study, Series or Instance) + "LocalAet": Local AET that is used for this commands, defaults to DicomAet configuration option. Ignored if DicomModalities already sets LocalAet for this modality. + "Normalize": Whether to normalize the query, i.e. whether to wipe out from the query, the DICOM tags that are not applicable for the query-retrieve level of interest + "Query": Associative array containing the filter on the values of the DICOM tags + "Timeout": Timeout for the C-FIND command and subsequent C-MOVE retrievals, in seconds (new in Orthanc 1.9.1)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
async def post_modalities_id_query(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Trigger C-FIND SCU
+
+    Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-query-retrieve-c-find-and-find-with-rest
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "Level": Level of the query (`Patient`, `Study`, `Series` or `Instance`)
+          "LocalAet": Local AET that is used for this commands, defaults to `DicomAet` configuration option. Ignored if `DicomModalities` already sets `LocalAet` for this modality.
+          "Normalize": Whether to normalize the query, i.e. whether to wipe out from the query, the DICOM tags that are not applicable for the query-retrieve level of interest
+          "Query": Associative array containing the filter on the values of the DICOM tags
+          "Timeout": Timeout for the C-FIND command and subsequent C-MOVE retrievals, in seconds (new in Orthanc 1.9.1)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/modalities/{id_}/query",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_storage_commitment(id_, json=None) + + + async + + +

+ + +
+ +

(async) Trigger storage commitment request

+

Trigger a storage commitment request to some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/storage-commitment.html#storage-commitment-scu +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "DicomInstances": List of DICOM resources that are not necessarily stored within Orthanc, but that must be checked by storage commitment. This is a list of JSON objects that must contain the SOPClassUID and SOPInstanceUID fields. + "Resources": List of the Orthanc identifiers of the DICOM resources to be checked by storage commitment + "Timeout": Timeout for the storage commitment command (new in Orthanc 1.9.1)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
async def post_modalities_id_storage_commitment(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Trigger storage commitment request
+
+    Trigger a storage commitment request to some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/storage-commitment.html#storage-commitment-scu
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "DicomInstances": List of DICOM resources that are not necessarily stored within Orthanc, but that must be checked by storage commitment. This is a list of JSON objects that must contain the `SOPClassUID` and `SOPInstanceUID` fields.
+          "Resources": List of the Orthanc identifiers of the DICOM resources to be checked by storage commitment
+          "Timeout": Timeout for the storage commitment command (new in Orthanc 1.9.1)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/modalities/{id_}/storage-commitment",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_store(id_, data=None, json=None) + + + async + + +

+ + +
+ +

(async) Trigger C-STORE SCU

+

Start a C-STORE SCU command as a job, in order to send DICOM resources stored locally to some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#rest-store-scu +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "CalledAet": Called AET that is used for this commands, defaults to AET configuration option. Allows you to overwrite the destination AET for a specific operation. + "Host": Host that is used for this commands, defaults to Host configuration option. Allows you to overwrite the destination host for a specific operation. + "LocalAet": Local AET that is used for this commands, defaults to DicomAet configuration option. Ignored if DicomModalities already sets LocalAet for this modality. + "MoveOriginatorAet": Move originator AET that is used for this commands, in order to fake a C-MOVE SCU + "MoveOriginatorID": Move originator ID that is used for this commands, in order to fake a C-MOVE SCU + "Permissive": If true, ignore errors during the individual steps of the job. + "Port": Port that is used for this command, defaults to Port configuration option. Allows you to overwrite the destination port for a specific operation. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": List of the Orthanc identifiers of all the DICOM resources to be sent + "StorageCommitment": Whether to chain C-STORE with DICOM storage commitment to validate the success of the transmission: https://orthanc.uclouvain.be/book/users/storage-commitment.html#chaining-c-store-with-storage-commitment + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Timeout": Timeout for the C-STORE command, in seconds

+
+
+ None +
data + RequestData + +
+

The Orthanc identifier of one resource to be sent

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
async def post_modalities_id_store(
+    self,
+    id_: str,
+    data: RequestData = None,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Trigger C-STORE SCU
+
+    Start a C-STORE SCU command as a job, in order to send DICOM resources stored locally to some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#rest-store-scu
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "CalledAet": Called AET that is used for this commands, defaults to `AET` configuration option. Allows you to overwrite the destination AET for a specific operation.
+          "Host": Host that is used for this commands, defaults to `Host` configuration option. Allows you to overwrite the destination host for a specific operation.
+          "LocalAet": Local AET that is used for this commands, defaults to `DicomAet` configuration option. Ignored if `DicomModalities` already sets `LocalAet` for this modality.
+          "MoveOriginatorAet": Move originator AET that is used for this commands, in order to fake a C-MOVE SCU
+          "MoveOriginatorID": Move originator ID that is used for this commands, in order to fake a C-MOVE SCU
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Port": Port that is used for this command, defaults to `Port` configuration option. Allows you to overwrite the destination port for a specific operation.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": List of the Orthanc identifiers of all the DICOM resources to be sent
+          "StorageCommitment": Whether to chain C-STORE with DICOM storage commitment to validate the success of the transmission: https://orthanc.uclouvain.be/book/users/storage-commitment.html#chaining-c-store-with-storage-commitment
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Timeout": Timeout for the C-STORE command, in seconds
+
+    data
+        The Orthanc identifier of one resource to be sent
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/modalities/{id_}/store",
+        data=data,
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_store_straight(id_, content=None) + + + async + + +

+ + +
+ +

(async) Straight C-STORE SCU

+

Synchronously send the DICOM instance in the POST body to the remote DICOM modality whose identifier is provided in URL, without having to first store it locally within Orthanc. This is an alternative to command-line tools such as storescu from DCMTK or dcm4che. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
content + RequestContent + +
+
- (Content-Type: "application/dicom") DICOM instance to be sent
+
+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
async def post_modalities_id_store_straight(
+    self,
+    id_: str,
+    content: RequestContent = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Straight C-STORE SCU
+
+    Synchronously send the DICOM instance in the POST body to the remote DICOM modality whose identifier is provided in URL, without having to first store it locally within Orthanc. This is an alternative to command-line tools such as `storescu` from DCMTK or dcm4che.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    content
+            - (Content-Type: "application/dicom") DICOM instance to be sent
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return await self._post(
+        route=f"{self.url}/modalities/{id_}/store-straight",
+        content=content,
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_anonymize(id_, json=None) + + + async + + +

+ + +
+ +

(async) Anonymize patient

+

Start a job that will anonymize all the DICOM instances within the patient whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new patient, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option DeidentifyLogsDicomVersion for possible values. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "KeepLabels": Keep the labels of all resources level (defaults to false) + "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to false) + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
async def post_patients_id_anonymize(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Anonymize patient
+
+    Start a job that will anonymize all the DICOM instances within the patient whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new patient, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+          "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/patients/{id_}/anonymize",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_archive(id_, json=None) + + + async + + +

+ + +
+ +

(async) Create ZIP archive

+

Create a ZIP archive containing the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
+3091
+3092
+3093
+3094
async def post_patients_id_archive(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create ZIP archive
+
+    Create a ZIP archive containing the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/patients/{id_}/archive",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_attachments_name_compress(id_, name) + + + async + + +

+ + +
+ +

(async) Compress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
3220
+3221
+3222
+3223
+3224
+3225
+3226
+3227
+3228
+3229
+3230
+3231
+3232
+3233
+3234
+3235
+3236
+3237
+3238
+3239
+3240
+3241
+3242
+3243
async def post_patients_id_attachments_name_compress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Compress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/compress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_attachments_name_uncompress(id_, name) + + + async + + +

+ + +
+ +

(async) Uncompress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
3493
+3494
+3495
+3496
+3497
+3498
+3499
+3500
+3501
+3502
+3503
+3504
+3505
+3506
+3507
+3508
+3509
+3510
+3511
+3512
+3513
+3514
+3515
+3516
async def post_patients_id_attachments_name_uncompress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Uncompress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/uncompress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_attachments_name_verify_md5(id_, name) + + + async + + +

+ + +
+ +

(async) Verify attachment

+

Verify that the attachment is not corrupted, by validating its MD5 hash +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

On success, a valid JSON object is returned

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3518
+3519
+3520
+3521
+3522
+3523
+3524
+3525
+3526
+3527
+3528
+3529
+3530
+3531
+3532
+3533
+3534
+3535
+3536
+3537
+3538
+3539
+3540
+3541
+3542
async def post_patients_id_attachments_name_verify_md5(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Verify attachment
+
+    Verify that the attachment is not corrupted, by validating its MD5 hash
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        On success, a valid JSON object is returned
+    """
+    return await self._post(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/verify-md5",
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_media(id_, json=None) + + + async + + +

+ + +
+ +

(async) Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Extended": If true, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR. Default value is false. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3734
+3735
+3736
+3737
+3738
+3739
+3740
+3741
+3742
+3743
+3744
+3745
+3746
+3747
+3748
+3749
+3750
+3751
+3752
+3753
+3754
+3755
+3756
+3757
+3758
+3759
+3760
+3761
+3762
+3763
+3764
+3765
+3766
+3767
+3768
async def post_patients_id_media(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/patients/{id_}/media",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_modify(id_, json=None) + + + async + + +

+ + +
+ +

(async) Modify patient

+

Start a job that will modify all the DICOM instances within the patient whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new patient, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world. + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to false) + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
3894
+3895
+3896
+3897
+3898
+3899
+3900
+3901
+3902
+3903
+3904
+3905
+3906
+3907
+3908
+3909
+3910
+3911
+3912
+3913
+3914
+3915
+3916
+3917
+3918
+3919
+3920
+3921
+3922
+3923
+3924
+3925
+3926
+3927
+3928
+3929
+3930
+3931
+3932
+3933
+3934
async def post_patients_id_modify(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Modify patient
+
+    Start a job that will modify all the DICOM instances within the patient whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new patient, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/patients/{id_}/modify",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_reconstruct(id_, json=None) + + + async + + +

+ + +
+ +

(async) Reconstruct tags & optionally files of patient

+

Reconstruct the main DICOM tags in DB of the patient whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4011
+4012
+4013
+4014
+4015
+4016
+4017
+4018
+4019
+4020
+4021
+4022
+4023
+4024
+4025
+4026
+4027
+4028
+4029
+4030
+4031
+4032
+4033
+4034
+4035
+4036
+4037
+4038
+4039
async def post_patients_id_reconstruct(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Reconstruct tags & optionally files of patient
+
+    Reconstruct the main DICOM tags in DB of the patient whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    json
+        Dictionary with the following keys:
+          "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/patients/{id_}/reconstruct",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_peers_id_store(id_, data=None, json=None) + + + async + + +

+ + +
+ +

(async) Send to Orthanc peer

+

Send DICOM resources stored locally to some remote Orthanc peer whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#sending-one-resource +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Compress": Whether to compress the DICOM instances using gzip before the actual sending + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": List of the Orthanc identifiers of all the DICOM resources to be sent + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode to the provided DICOM transfer syntax before the actual sending

+
+
+ None +
data + RequestData + +
+

The Orthanc identifier of one resource to be sent

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4284
+4285
+4286
+4287
+4288
+4289
+4290
+4291
+4292
+4293
+4294
+4295
+4296
+4297
+4298
+4299
+4300
+4301
+4302
+4303
+4304
+4305
+4306
+4307
+4308
+4309
+4310
+4311
+4312
+4313
+4314
+4315
+4316
+4317
+4318
+4319
+4320
+4321
+4322
+4323
async def post_peers_id_store(
+    self,
+    id_: str,
+    data: RequestData = None,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Send to Orthanc peer
+
+    Send DICOM resources stored locally to some remote Orthanc peer whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#sending-one-resource
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Compress": Whether to compress the DICOM instances using gzip before the actual sending
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": List of the Orthanc identifiers of all the DICOM resources to be sent
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode to the provided DICOM transfer syntax before the actual sending
+
+    data
+        The Orthanc identifier of one resource to be sent
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/peers/{id_}/store",
+        data=data,
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_peers_id_store_straight(id_, content=None) + + + async + + +

+ + +
+ +

(async) Straight store to peer

+

Synchronously send the DICOM instance in the POST body to the Orthanc peer whose identifier is provided in URL, without having to first store it locally within Orthanc. This is an alternative to command-line tools such as curl. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
content + RequestContent + +
+
- (Content-Type: "application/dicom") DICOM instance to be sent
+
+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4325
+4326
+4327
+4328
+4329
+4330
+4331
+4332
+4333
+4334
+4335
+4336
+4337
+4338
+4339
+4340
+4341
+4342
+4343
+4344
+4345
+4346
+4347
+4348
+4349
+4350
async def post_peers_id_store_straight(
+    self,
+    id_: str,
+    content: RequestContent = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Straight store to peer
+
+    Synchronously send the DICOM instance in the POST body to the Orthanc peer whose identifier is provided in URL, without having to first store it locally within Orthanc. This is an alternative to command-line tools such as `curl`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    content
+            - (Content-Type: "application/dicom") DICOM instance to be sent
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return await self._post(
+        route=f"{self.url}/peers/{id_}/store-straight",
+        content=content,
+    )
+
+
+
+ +
+ +
+ + +

+ post_queries_id_answers_index_query_instances(id_, index, json=None) + + + async + + +

+ + +
+ +

(async) Query the child instances of an answer

+

Issue a second DICOM C-FIND operation, in order to query the child instances associated with one answer to some query/retrieve operation whose identifiers are provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
index + str + +
+

Index of the answer

+
+
+ required +
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Query": Associative array containing the filter on the values of the DICOM tags + "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4582
+4583
+4584
+4585
+4586
+4587
+4588
+4589
+4590
+4591
+4592
+4593
+4594
+4595
+4596
+4597
+4598
+4599
+4600
+4601
+4602
+4603
+4604
+4605
+4606
+4607
+4608
+4609
+4610
+4611
+4612
+4613
+4614
+4615
async def post_queries_id_answers_index_query_instances(
+    self,
+    id_: str,
+    index: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Query the child instances of an answer
+
+    Issue a second DICOM C-FIND operation, in order to query the child instances associated with one answer to some query/retrieve operation whose identifiers are provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    index
+        Index of the answer
+    id_
+        Identifier of the query of interest
+    json
+        Dictionary with the following keys:
+          "Query": Associative array containing the filter on the values of the DICOM tags
+          "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/queries/{id_}/answers/{index}/query-instances",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_queries_id_answers_index_query_series(id_, index, json=None) + + + async + + +

+ + +
+ +

(async) Query the child series of an answer

+

Issue a second DICOM C-FIND operation, in order to query the child series associated with one answer to some query/retrieve operation whose identifiers are provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
index + str + +
+

Index of the answer

+
+
+ required +
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Query": Associative array containing the filter on the values of the DICOM tags + "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4617
+4618
+4619
+4620
+4621
+4622
+4623
+4624
+4625
+4626
+4627
+4628
+4629
+4630
+4631
+4632
+4633
+4634
+4635
+4636
+4637
+4638
+4639
+4640
+4641
+4642
+4643
+4644
+4645
+4646
+4647
+4648
+4649
+4650
async def post_queries_id_answers_index_query_series(
+    self,
+    id_: str,
+    index: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Query the child series of an answer
+
+    Issue a second DICOM C-FIND operation, in order to query the child series associated with one answer to some query/retrieve operation whose identifiers are provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    index
+        Index of the answer
+    id_
+        Identifier of the query of interest
+    json
+        Dictionary with the following keys:
+          "Query": Associative array containing the filter on the values of the DICOM tags
+          "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/queries/{id_}/answers/{index}/query-series",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_queries_id_answers_index_query_studies(id_, index, json=None) + + + async + + +

+ + +
+ +

(async) Query the child studies of an answer

+

Issue a second DICOM C-FIND operation, in order to query the child studies associated with one answer to some query/retrieve operation whose identifiers are provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
index + str + +
+

Index of the answer

+
+
+ required +
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Query": Associative array containing the filter on the values of the DICOM tags + "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4652
+4653
+4654
+4655
+4656
+4657
+4658
+4659
+4660
+4661
+4662
+4663
+4664
+4665
+4666
+4667
+4668
+4669
+4670
+4671
+4672
+4673
+4674
+4675
+4676
+4677
+4678
+4679
+4680
+4681
+4682
+4683
+4684
+4685
async def post_queries_id_answers_index_query_studies(
+    self,
+    id_: str,
+    index: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Query the child studies of an answer
+
+    Issue a second DICOM C-FIND operation, in order to query the child studies associated with one answer to some query/retrieve operation whose identifiers are provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    index
+        Index of the answer
+    id_
+        Identifier of the query of interest
+    json
+        Dictionary with the following keys:
+          "Query": Associative array containing the filter on the values of the DICOM tags
+          "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/queries/{id_}/answers/{index}/query-studies",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_queries_id_answers_index_retrieve(id_, index, data=None, json=None) + + + async + + +

+ + +
+ +

(async) Retrieve one answer

+

Start a C-MOVE SCU command as a job, in order to retrieve one answer associated with the query/retrieve operation whose identifiers are provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-retrieve-c-move +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
index + str + +
+

Index of the answer

+
+
+ required +
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Full": If set to true, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Simplify": If set to true, report the DICOM tags in human-readable format (using the symbolic name of the tags) + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "TargetAet": AET of the target modality. By default, the AET of Orthanc is used, as defined in the DicomAet configuration option. + "Timeout": Timeout for the C-MOVE command, in seconds

+
+
+ None +
data + RequestData + +
+

AET of the target modality

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4687
+4688
+4689
+4690
+4691
+4692
+4693
+4694
+4695
+4696
+4697
+4698
+4699
+4700
+4701
+4702
+4703
+4704
+4705
+4706
+4707
+4708
+4709
+4710
+4711
+4712
+4713
+4714
+4715
+4716
+4717
+4718
+4719
+4720
+4721
+4722
+4723
+4724
+4725
+4726
+4727
+4728
+4729
+4730
async def post_queries_id_answers_index_retrieve(
+    self,
+    id_: str,
+    index: str,
+    data: RequestData = None,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Retrieve one answer
+
+    Start a C-MOVE SCU command as a job, in order to retrieve one answer associated with the query/retrieve operation whose identifiers are provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-retrieve-c-move
+    Tags: Networking
+
+    Parameters
+    ----------
+    index
+        Index of the answer
+    id_
+        Identifier of the query of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Simplify": If set to `true`, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "TargetAet": AET of the target modality. By default, the AET of Orthanc is used, as defined in the `DicomAet` configuration option.
+          "Timeout": Timeout for the C-MOVE command, in seconds
+
+    data
+        AET of the target modality
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/queries/{id_}/answers/{index}/retrieve",
+        data=data,
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_queries_id_retrieve(id_, data=None, json=None) + + + async + + +

+ + +
+ +

(async) Retrieve all answers

+

Start a C-MOVE SCU command as a job, in order to retrieve all the answers associated with the query/retrieve operation whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-retrieve-c-move +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Full": If set to true, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Simplify": If set to true, report the DICOM tags in human-readable format (using the symbolic name of the tags) + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "TargetAet": AET of the target modality. By default, the AET of Orthanc is used, as defined in the DicomAet configuration option. + "Timeout": Timeout for the C-MOVE command, in seconds

+
+
+ None +
data + RequestData + +
+

AET of the target modality

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4807
+4808
+4809
+4810
+4811
+4812
+4813
+4814
+4815
+4816
+4817
+4818
+4819
+4820
+4821
+4822
+4823
+4824
+4825
+4826
+4827
+4828
+4829
+4830
+4831
+4832
+4833
+4834
+4835
+4836
+4837
+4838
+4839
+4840
+4841
+4842
+4843
+4844
+4845
+4846
+4847
async def post_queries_id_retrieve(
+    self,
+    id_: str,
+    data: RequestData = None,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Retrieve all answers
+
+    Start a C-MOVE SCU command as a job, in order to retrieve all the answers associated with the query/retrieve operation whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-retrieve-c-move
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Simplify": If set to `true`, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "TargetAet": AET of the target modality. By default, the AET of Orthanc is used, as defined in the `DicomAet` configuration option.
+          "Timeout": Timeout for the C-MOVE command, in seconds
+
+    data
+        AET of the target modality
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/queries/{id_}/retrieve",
+        data=data,
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_anonymize(id_, json=None) + + + async + + +

+ + +
+ +

(async) Anonymize series

+

Start a job that will anonymize all the DICOM instances within the series whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new series, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option DeidentifyLogsDicomVersion for possible values. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "KeepLabels": Keep the labels of all resources level (defaults to false) + "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to false) + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4931
+4932
+4933
+4934
+4935
+4936
+4937
+4938
+4939
+4940
+4941
+4942
+4943
+4944
+4945
+4946
+4947
+4948
+4949
+4950
+4951
+4952
+4953
+4954
+4955
+4956
+4957
+4958
+4959
+4960
+4961
+4962
+4963
+4964
+4965
+4966
+4967
+4968
+4969
+4970
+4971
+4972
+4973
async def post_series_id_anonymize(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Anonymize series
+
+    Start a job that will anonymize all the DICOM instances within the series whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new series, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+          "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/series/{id_}/anonymize",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_archive(id_, json=None) + + + async + + +

+ + +
+ +

(async) Create ZIP archive

+

Create a ZIP archive containing the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5004
+5005
+5006
+5007
+5008
+5009
+5010
+5011
+5012
+5013
+5014
+5015
+5016
+5017
+5018
+5019
+5020
+5021
+5022
+5023
+5024
+5025
+5026
+5027
+5028
+5029
+5030
+5031
+5032
+5033
+5034
+5035
+5036
+5037
async def post_series_id_archive(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create ZIP archive
+
+    Create a ZIP archive containing the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/series/{id_}/archive",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_attachments_name_compress(id_, name) + + + async + + +

+ + +
+ +

(async) Compress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
5163
+5164
+5165
+5166
+5167
+5168
+5169
+5170
+5171
+5172
+5173
+5174
+5175
+5176
+5177
+5178
+5179
+5180
+5181
+5182
+5183
+5184
+5185
+5186
async def post_series_id_attachments_name_compress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Compress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/series/{id_}/attachments/{name}/compress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_attachments_name_uncompress(id_, name) + + + async + + +

+ + +
+ +

(async) Uncompress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
5436
+5437
+5438
+5439
+5440
+5441
+5442
+5443
+5444
+5445
+5446
+5447
+5448
+5449
+5450
+5451
+5452
+5453
+5454
+5455
+5456
+5457
+5458
+5459
async def post_series_id_attachments_name_uncompress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Uncompress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/series/{id_}/attachments/{name}/uncompress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_attachments_name_verify_md5(id_, name) + + + async + + +

+ + +
+ +

(async) Verify attachment

+

Verify that the attachment is not corrupted, by validating its MD5 hash +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

On success, a valid JSON object is returned

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5461
+5462
+5463
+5464
+5465
+5466
+5467
+5468
+5469
+5470
+5471
+5472
+5473
+5474
+5475
+5476
+5477
+5478
+5479
+5480
+5481
+5482
+5483
+5484
+5485
async def post_series_id_attachments_name_verify_md5(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Verify attachment
+
+    Verify that the attachment is not corrupted, by validating its MD5 hash
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        On success, a valid JSON object is returned
+    """
+    return await self._post(
+        route=f"{self.url}/series/{id_}/attachments/{name}/verify-md5",
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_media(id_, json=None) + + + async + + +

+ + +
+ +

(async) Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Extended": If true, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR. Default value is false. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5677
+5678
+5679
+5680
+5681
+5682
+5683
+5684
+5685
+5686
+5687
+5688
+5689
+5690
+5691
+5692
+5693
+5694
+5695
+5696
+5697
+5698
+5699
+5700
+5701
+5702
+5703
+5704
+5705
+5706
+5707
+5708
+5709
+5710
+5711
async def post_series_id_media(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/series/{id_}/media",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_modify(id_, json=None) + + + async + + +

+ + +
+ +

(async) Modify series

+

Start a job that will modify all the DICOM instances within the series whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new series, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world. + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to false) + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
5837
+5838
+5839
+5840
+5841
+5842
+5843
+5844
+5845
+5846
+5847
+5848
+5849
+5850
+5851
+5852
+5853
+5854
+5855
+5856
+5857
+5858
+5859
+5860
+5861
+5862
+5863
+5864
+5865
+5866
+5867
+5868
+5869
+5870
+5871
+5872
+5873
+5874
+5875
+5876
+5877
async def post_series_id_modify(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Modify series
+
+    Start a job that will modify all the DICOM instances within the series whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new series, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/series/{id_}/modify",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_reconstruct(id_, json=None) + + + async + + +

+ + +
+ +

(async) Reconstruct tags & optionally files of series

+

Reconstruct the main DICOM tags in DB of the series whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
5992
+5993
+5994
+5995
+5996
+5997
+5998
+5999
+6000
+6001
+6002
+6003
+6004
+6005
+6006
+6007
+6008
+6009
+6010
+6011
+6012
+6013
+6014
+6015
+6016
+6017
+6018
+6019
+6020
async def post_series_id_reconstruct(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Reconstruct tags & optionally files of series
+
+    Reconstruct the main DICOM tags in DB of the series whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    json
+        Dictionary with the following keys:
+          "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/series/{id_}/reconstruct",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_storage_commitment_id_remove(id_) + + + async + + +

+ + +
+ +

(async) Remove after storage commitment

+

Remove out of Orthanc, the DICOM instances that have been reported to have been properly received the storage commitment report whose identifier is provided in the URL. This is only possible if the Status of the storage commitment report is Success. https://orthanc.uclouvain.be/book/users/storage-commitment.html#removing-the-instances +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the storage commitment report

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
6144
+6145
+6146
+6147
+6148
+6149
+6150
+6151
+6152
+6153
+6154
+6155
+6156
+6157
+6158
+6159
+6160
+6161
+6162
+6163
+6164
async def post_storage_commitment_id_remove(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Remove after storage commitment
+
+    Remove out of Orthanc, the DICOM instances that have been reported to have been properly received the storage commitment report whose identifier is provided in the URL. This is only possible if the `Status` of the storage commitment report is `Success`. https://orthanc.uclouvain.be/book/users/storage-commitment.html#removing-the-instances
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the storage commitment report
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/storage-commitment/{id_}/remove",
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_anonymize(id_, json=None) + + + async + + +

+ + +
+ +

(async) Anonymize study

+

Start a job that will anonymize all the DICOM instances within the study whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new study, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option DeidentifyLogsDicomVersion for possible values. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "KeepLabels": Keep the labels of all resources level (defaults to false) + "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to false) + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
6248
+6249
+6250
+6251
+6252
+6253
+6254
+6255
+6256
+6257
+6258
+6259
+6260
+6261
+6262
+6263
+6264
+6265
+6266
+6267
+6268
+6269
+6270
+6271
+6272
+6273
+6274
+6275
+6276
+6277
+6278
+6279
+6280
+6281
+6282
+6283
+6284
+6285
+6286
+6287
+6288
+6289
+6290
async def post_studies_id_anonymize(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Anonymize study
+
+    Start a job that will anonymize all the DICOM instances within the study whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new study, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+          "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/studies/{id_}/anonymize",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_archive(id_, json=None) + + + async + + +

+ + +
+ +

(async) Create ZIP archive

+

Create a ZIP archive containing the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6321
+6322
+6323
+6324
+6325
+6326
+6327
+6328
+6329
+6330
+6331
+6332
+6333
+6334
+6335
+6336
+6337
+6338
+6339
+6340
+6341
+6342
+6343
+6344
+6345
+6346
+6347
+6348
+6349
+6350
+6351
+6352
+6353
+6354
async def post_studies_id_archive(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create ZIP archive
+
+    Create a ZIP archive containing the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/studies/{id_}/archive",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_attachments_name_compress(id_, name) + + + async + + +

+ + +
+ +

(async) Compress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
6480
+6481
+6482
+6483
+6484
+6485
+6486
+6487
+6488
+6489
+6490
+6491
+6492
+6493
+6494
+6495
+6496
+6497
+6498
+6499
+6500
+6501
+6502
+6503
async def post_studies_id_attachments_name_compress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Compress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/compress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_attachments_name_uncompress(id_, name) + + + async + + +

+ + +
+ +

(async) Uncompress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
6753
+6754
+6755
+6756
+6757
+6758
+6759
+6760
+6761
+6762
+6763
+6764
+6765
+6766
+6767
+6768
+6769
+6770
+6771
+6772
+6773
+6774
+6775
+6776
async def post_studies_id_attachments_name_uncompress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Uncompress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/uncompress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_attachments_name_verify_md5(id_, name) + + + async + + +

+ + +
+ +

(async) Verify attachment

+

Verify that the attachment is not corrupted, by validating its MD5 hash +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

On success, a valid JSON object is returned

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6778
+6779
+6780
+6781
+6782
+6783
+6784
+6785
+6786
+6787
+6788
+6789
+6790
+6791
+6792
+6793
+6794
+6795
+6796
+6797
+6798
+6799
+6800
+6801
+6802
async def post_studies_id_attachments_name_verify_md5(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Verify attachment
+
+    Verify that the attachment is not corrupted, by validating its MD5 hash
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        On success, a valid JSON object is returned
+    """
+    return await self._post(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/verify-md5",
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_media(id_, json=None) + + + async + + +

+ + +
+ +

(async) Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Extended": If true, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR. Default value is false. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6994
+6995
+6996
+6997
+6998
+6999
+7000
+7001
+7002
+7003
+7004
+7005
+7006
+7007
+7008
+7009
+7010
+7011
+7012
+7013
+7014
+7015
+7016
+7017
+7018
+7019
+7020
+7021
+7022
+7023
+7024
+7025
+7026
+7027
+7028
async def post_studies_id_media(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/studies/{id_}/media",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_merge(id_, json=None) + + + async + + +

+ + +
+ +

(async) Merge study

+

Start a new job so as to move some DICOM resources into the DICOM study whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#merging +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "KeepSource": If set to true, instructs Orthanc to keep a copy of the original resources in their source study. By default, the original resources are deleted from Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": The list of DICOM resources (studies, series, and/or instances) to be merged into the study of interest (mandatory option) + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7030
+7031
+7032
+7033
+7034
+7035
+7036
+7037
+7038
+7039
+7040
+7041
+7042
+7043
+7044
+7045
+7046
+7047
+7048
+7049
+7050
+7051
+7052
+7053
+7054
+7055
+7056
+7057
+7058
+7059
+7060
+7061
+7062
+7063
+7064
async def post_studies_id_merge(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Merge study
+
+    Start a new job so as to move some DICOM resources into the DICOM study whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#merging
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "KeepSource": If set to `true`, instructs Orthanc to keep a copy of the original resources in their source study. By default, the original resources are deleted from Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": The list of DICOM resources (studies, series, and/or instances) to be merged into the study of interest (mandatory option)
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/studies/{id_}/merge",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_modify(id_, json=None) + + + async + + +

+ + +
+ +

(async) Modify study

+

Start a job that will modify all the DICOM instances within the study whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new study, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world. + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to false) + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7190
+7191
+7192
+7193
+7194
+7195
+7196
+7197
+7198
+7199
+7200
+7201
+7202
+7203
+7204
+7205
+7206
+7207
+7208
+7209
+7210
+7211
+7212
+7213
+7214
+7215
+7216
+7217
+7218
+7219
+7220
+7221
+7222
+7223
+7224
+7225
+7226
+7227
+7228
+7229
+7230
async def post_studies_id_modify(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Modify study
+
+    Start a job that will modify all the DICOM instances within the study whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new study, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/studies/{id_}/modify",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_reconstruct(id_, json=None) + + + async + + +

+ + +
+ +

(async) Reconstruct tags & optionally files of study

+

Reconstruct the main DICOM tags in DB of the study whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7322
+7323
+7324
+7325
+7326
+7327
+7328
+7329
+7330
+7331
+7332
+7333
+7334
+7335
+7336
+7337
+7338
+7339
+7340
+7341
+7342
+7343
+7344
+7345
+7346
+7347
+7348
+7349
+7350
async def post_studies_id_reconstruct(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Reconstruct tags & optionally files of study
+
+    Reconstruct the main DICOM tags in DB of the study whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/studies/{id_}/reconstruct",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_split(id_, json=None) + + + async + + +

+ + +
+ +

(async) Split study

+

Start a new job so as to split the DICOM study whose Orthanc identifier is provided in the URL, by taking some of its children series or instances out of it and putting them into a brand new study (this new study is created by setting the StudyInstanceUID tag to a random identifier): https://orthanc.uclouvain.be/book/users/anonymization.html#splitting +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Instances": The list of instances to be separated from the parent study. These instances must all be children of the same source study, that is specified in the URI. + "KeepLabels": Keep the labels of all resources level (defaults to false) + "KeepSource": If set to true, instructs Orthanc to keep a copy of the original series/instances in the source study. By default, the original series/instances are deleted from Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Remove": List of tags that must be removed in the new study (from the same modules as in the Replace option) + "Replace": Associative array to change the value of some DICOM tags in the new study. These tags must be part of the "Patient Module Attributes" or the "General Study Module Attributes", as specified by the DICOM 2011 standard in Tables C.7-1 and C.7-3. + "Series": The list of series to be separated from the parent study. These series must all be children of the same source study, that is specified in the URI. + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7412
+7413
+7414
+7415
+7416
+7417
+7418
+7419
+7420
+7421
+7422
+7423
+7424
+7425
+7426
+7427
+7428
+7429
+7430
+7431
+7432
+7433
+7434
+7435
+7436
+7437
+7438
+7439
+7440
+7441
+7442
+7443
+7444
+7445
+7446
+7447
+7448
+7449
+7450
async def post_studies_id_split(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Split study
+
+    Start a new job so as to split the DICOM study whose Orthanc identifier is provided in the URL, by taking some of its children series or instances out of it and putting them into a brand new study (this new study is created by setting the `StudyInstanceUID` tag to a random identifier): https://orthanc.uclouvain.be/book/users/anonymization.html#splitting
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Instances": The list of instances to be separated from the parent study. These instances must all be children of the same source study, that is specified in the URI.
+          "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+          "KeepSource": If set to `true`, instructs Orthanc to keep a copy of the original series/instances in the source study. By default, the original series/instances are deleted from Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Remove": List of tags that must be removed in the new study (from the same modules as in the `Replace` option)
+          "Replace": Associative array to change the value of some DICOM tags in the new study. These tags must be part of the "Patient Module Attributes" or the "General Study Module Attributes", as specified by the DICOM 2011 standard in Tables C.7-1 and C.7-3.
+          "Series": The list of series to be separated from the parent study. These series must all be children of the same source study, that is specified in the URI.
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/studies/{id_}/split",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_bulk_anonymize(json=None) + + + async + + +

+ + +
+ +

(async) Anonymize a set of resources

+

Start a job that will anonymize all the DICOM patients, studies, series or instances whose identifiers are provided in the Resources field. +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option DeidentifyLogsDicomVersion for possible values. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "KeepLabels": Keep the labels of all resources level (defaults to false) + "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to false) + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest. + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The list of all the resources that have been created by this anonymization

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7557
+7558
+7559
+7560
+7561
+7562
+7563
+7564
+7565
+7566
+7567
+7568
+7569
+7570
+7571
+7572
+7573
+7574
+7575
+7576
+7577
+7578
+7579
+7580
+7581
+7582
+7583
+7584
+7585
+7586
+7587
+7588
+7589
+7590
+7591
+7592
+7593
+7594
+7595
+7596
+7597
async def post_tools_bulk_anonymize(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Anonymize a set of resources
+
+    Start a job that will anonymize all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field.
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+          "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The list of all the resources that have been created by this anonymization
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/tools/bulk-anonymize",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_bulk_content(json=None) + + + async + + +

+ + +
+ +

(async) Describe a set of resources

+

Get the content all the DICOM patients, studies, series or instances whose identifiers are provided in the Resources field, in one single call. +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Full": If set to true, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "Level": This optional argument specifies the level of interest (can be Patient, Study, Series or Instance). Orthanc will loop over the items inside Resources, and explore upward or downward in the DICOM hierarchy in order to find the level of interest. + "Metadata": If set to true (default value), the metadata associated with the resources will also be retrieved. + "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest. + "Short": If set to true, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7599
+7600
+7601
+7602
+7603
+7604
+7605
+7606
+7607
+7608
+7609
+7610
+7611
+7612
+7613
+7614
+7615
+7616
+7617
+7618
+7619
+7620
+7621
+7622
+7623
+7624
+7625
+7626
+7627
+7628
async def post_tools_bulk_content(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Describe a set of resources
+
+    Get the content all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field, in one single call.
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+          "Level": This optional argument specifies the level of interest (can be `Patient`, `Study`, `Series` or `Instance`). Orthanc will loop over the items inside `Resources`, and explore upward or downward in the DICOM hierarchy in order to find the level of interest.
+          "Metadata": If set to `true` (default value), the metadata associated with the resources will also be retrieved.
+          "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+          "Short": If set to `true`, report the DICOM tags in hexadecimal format
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/tools/bulk-content",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_bulk_delete(json=None) + + + async + + +

+ + +
+ +

(async) Delete a set of resources

+

Delete all the DICOM patients, studies, series or instances whose identifiers are provided in the Resources field. +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7630
+7631
+7632
+7633
+7634
+7635
+7636
+7637
+7638
+7639
+7640
+7641
+7642
+7643
+7644
+7645
+7646
+7647
+7648
+7649
+7650
+7651
+7652
+7653
+7654
+7655
async def post_tools_bulk_delete(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Delete a set of resources
+
+    Delete all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field.
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/tools/bulk-delete",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_bulk_modify(json=None) + + + async + + +

+ + +
+ +

(async) Modify a set of resources

+

Start a job that will modify all the DICOM patients, studies, series or instances whose identifiers are provided in the Resources field. +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world. + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Level": Level of the modification (Patient, Study, Series or Instance). If absent, the level defaults to Instance, but is set to Patient if PatientID is modified, to Study if StudyInstanceUID is modified, or to Series if SeriesInstancesUID is modified. (new in Orthanc 1.9.7) + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to false) + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest. + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The list of all the resources that have been altered by this modification

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7657
+7658
+7659
+7660
+7661
+7662
+7663
+7664
+7665
+7666
+7667
+7668
+7669
+7670
+7671
+7672
+7673
+7674
+7675
+7676
+7677
+7678
+7679
+7680
+7681
+7682
+7683
+7684
+7685
+7686
+7687
+7688
+7689
+7690
+7691
+7692
+7693
+7694
+7695
+7696
async def post_tools_bulk_modify(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Modify a set of resources
+
+    Start a job that will modify all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field.
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Level": Level of the modification (`Patient`, `Study`, `Series` or `Instance`). If absent, the level defaults to `Instance`, but is set to `Patient` if `PatientID` is modified, to `Study` if `StudyInstanceUID` is modified, or to `Series` if `SeriesInstancesUID` is modified. (new in Orthanc 1.9.7)
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The list of all the resources that have been altered by this modification
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/tools/bulk-modify",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_create_archive(json=None) + + + async + + +

+ + +
+ +

(async) Create ZIP archive

+

Create a ZIP archive containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": The list of Orthanc identifiers of interest. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7723
+7724
+7725
+7726
+7727
+7728
+7729
+7730
+7731
+7732
+7733
+7734
+7735
+7736
+7737
+7738
+7739
+7740
+7741
+7742
+7743
+7744
+7745
+7746
+7747
+7748
+7749
+7750
+7751
+7752
+7753
+7754
async def post_tools_create_archive(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create ZIP archive
+
+    Create a ZIP archive containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": The list of Orthanc identifiers of interest.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/tools/create-archive",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_create_dicom(json=None) + + + async + + +

+ + +
+ +

(async) Create one DICOM instance

+

Create one DICOM instance, and store it into Orthanc +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Content": This field can be used to embed an image (pixel data encoded as PNG or JPEG), a PDF, or a 3D manufactoring model (MTL/OBJ/STL) inside the created DICOM instance. The file to be encapsulated must be provided using its data URI scheme encoding. This field can possibly contain a JSON array, in which case a DICOM series is created containing one DICOM instance for each item in the Content field. + "Force": Avoid the consistency checks for the DICOM tags that enforce the DICOM model of the real-world. You can notably use this flag if you need to manually set the tags StudyInstanceUID, SeriesInstanceUID, or SOPInstanceUID. Be careful with this feature. + "InterpretBinaryTags": If some value in the Tags associative array is formatted according to some data URI scheme encoding, whether this value is decoded to a binary value or kept as such (true by default) + "Parent": If present, the newly created instance will be attached to the parent DICOM resource whose Orthanc identifier is contained in this field. The DICOM tags of the parent modules in the DICOM hierarchy will be automatically copied to the newly created instance. + "PrivateCreator": The private creator to be used for private tags in Tags + "Tags": Associative array containing the tags of the new instance to be created

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7756
+7757
+7758
+7759
+7760
+7761
+7762
+7763
+7764
+7765
+7766
+7767
+7768
+7769
+7770
+7771
+7772
+7773
+7774
+7775
+7776
+7777
+7778
+7779
+7780
+7781
+7782
+7783
+7784
+7785
+7786
+7787
async def post_tools_create_dicom(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create one DICOM instance
+
+    Create one DICOM instance, and store it into Orthanc
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Content": This field can be used to embed an image (pixel data encoded as PNG or JPEG), a PDF, or a 3D manufactoring model (MTL/OBJ/STL) inside the created DICOM instance. The file to be encapsulated must be provided using its [data URI scheme encoding](https://en.wikipedia.org/wiki/Data_URI_scheme). This field can possibly contain a JSON array, in which case a DICOM series is created containing one DICOM instance for each item in the `Content` field.
+          "Force": Avoid the consistency checks for the DICOM tags that enforce the DICOM model of the real-world. You can notably use this flag if you need to manually set the tags `StudyInstanceUID`, `SeriesInstanceUID`, or `SOPInstanceUID`. Be careful with this feature.
+          "InterpretBinaryTags": If some value in the `Tags` associative array is formatted according to some [data URI scheme encoding](https://en.wikipedia.org/wiki/Data_URI_scheme), whether this value is decoded to a binary value or kept as such (`true` by default)
+          "Parent": If present, the newly created instance will be attached to the parent DICOM resource whose Orthanc identifier is contained in this field. The DICOM tags of the parent modules in the DICOM hierarchy will be automatically copied to the newly created instance.
+          "PrivateCreator": The private creator to be used for private tags in `Tags`
+          "Tags": Associative array containing the tags of the new instance to be created
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/tools/create-dicom",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_create_media(json=None) + + + async + + +

+ + +
+ +

(async) Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Extended": If true, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR. Default value is false. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": The list of Orthanc identifiers of interest. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7814
+7815
+7816
+7817
+7818
+7819
+7820
+7821
+7822
+7823
+7824
+7825
+7826
+7827
+7828
+7829
+7830
+7831
+7832
+7833
+7834
+7835
+7836
+7837
+7838
+7839
+7840
+7841
+7842
+7843
+7844
+7845
+7846
async def post_tools_create_media(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": The list of Orthanc identifiers of interest.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/tools/create-media",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_create_media_extended(json=None) + + + async + + +

+ + +
+ +

(async) Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Extended": If true, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR. Default value is true. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": The list of Orthanc identifiers of interest. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7873
+7874
+7875
+7876
+7877
+7878
+7879
+7880
+7881
+7882
+7883
+7884
+7885
+7886
+7887
+7888
+7889
+7890
+7891
+7892
+7893
+7894
+7895
+7896
+7897
+7898
+7899
+7900
+7901
+7902
+7903
+7904
+7905
async def post_tools_create_media_extended(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `true`.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": The list of Orthanc identifiers of interest.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/tools/create-media-extended",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_dicom_echo(json=None) + + + async + + +

+ + +
+ +

(async) Trigger C-ECHO SCU

+

Trigger C-ECHO SCU command against a DICOM modality described in the POST body, without having to register the modality in some /modalities/{id} (new in Orthanc 1.8.1) +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "AET": AET of the remote DICOM modality + "CheckFind": Issue a dummy C-FIND command after the C-GET SCU, in order to check whether the remote modality knows about Orthanc. This field defaults to the value of the DicomEchoChecksFind configuration option. New in Orthanc 1.8.1. + "Host": Host address of the remote DICOM modality (typically, an IP address) + "Manufacturer": Manufacturer of the remote DICOM modality (check configuration option DicomModalities for possible values + "Port": TCP port of the remote DICOM modality + "Timeout": Timeout for the C-ECHO command, in seconds + "UseDicomTls": Whether to use DICOM TLS in the SCU connection initiated by Orthanc (new in Orthanc 1.9.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7964
+7965
+7966
+7967
+7968
+7969
+7970
+7971
+7972
+7973
+7974
+7975
+7976
+7977
+7978
+7979
+7980
+7981
+7982
+7983
+7984
+7985
+7986
+7987
+7988
+7989
+7990
+7991
+7992
+7993
+7994
+7995
async def post_tools_dicom_echo(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Trigger C-ECHO SCU
+
+    Trigger C-ECHO SCU command against a DICOM modality described in the POST body, without having to register the modality in some `/modalities/{id}` (new in Orthanc 1.8.1)
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "AET": AET of the remote DICOM modality
+          "CheckFind": Issue a dummy C-FIND command after the C-GET SCU, in order to check whether the remote modality knows about Orthanc. This field defaults to the value of the `DicomEchoChecksFind` configuration option. New in Orthanc 1.8.1.
+          "Host": Host address of the remote DICOM modality (typically, an IP address)
+          "Manufacturer": Manufacturer of the remote DICOM modality (check configuration option `DicomModalities` for possible values
+          "Port": TCP port of the remote DICOM modality
+          "Timeout": Timeout for the C-ECHO command, in seconds
+          "UseDicomTls": Whether to use DICOM TLS in the SCU connection initiated by Orthanc (new in Orthanc 1.9.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/tools/dicom-echo",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_execute_script(data=None) + + + async + + +

+ + +
+ +

(async) Execute Lua script

+

Execute the provided Lua script by the Orthanc server. This is very insecure for Orthanc servers that are remotely accessible. Since Orthanc 1.5.8, this route is disabled by default and can be enabled thanks to the ExecuteLuaEnabled configuration. +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

The Lua script to be executed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Output of the Lua script

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7997
+7998
+7999
+8000
+8001
+8002
+8003
+8004
+8005
+8006
+8007
+8008
+8009
+8010
+8011
+8012
+8013
+8014
+8015
+8016
+8017
+8018
+8019
async def post_tools_execute_script(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Execute Lua script
+
+    Execute the provided Lua script by the Orthanc server. This is very insecure for Orthanc servers that are remotely accessible.  Since Orthanc 1.5.8, this route is disabled by default and can be enabled thanks to the `ExecuteLuaEnabled` configuration.
+    Tags: System
+
+    Parameters
+    ----------
+    data
+        The Lua script to be executed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Output of the Lua script
+    """
+    return await self._post(
+        route=f"{self.url}/tools/execute-script",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_find(json=None) + + + async + + +

+ + +
+ +

(async) Look for local resources

+

This URI can be used to perform a search on the content of the local Orthanc server, in a way that is similar to querying remote DICOM modalities using C-FIND SCU: https://orthanc.uclouvain.be/book/users/rest.html#performing-finds-within-orthanc +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "CaseSensitive": Enable case-sensitive search for PN value representations (defaults to configuration option CaseSensitivePN) + "Expand": Also retrieve the content of the matching resources, not only their Orthanc identifiers + "Full": If set to true, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "Labels": List of strings specifying which labels to look for in the resources (new in Orthanc 1.12.0) + "LabelsConstraint": Constraint on the labels, can be All, Any, or None (defaults to All, new in Orthanc 1.12.0) + "Level": Level of the query (Patient, Study, Series or Instance) + "Limit": Limit the number of reported resources + "Query": Associative array containing the filter on the values of the DICOM tags + "RequestedTags": A list of DICOM tags to include in the response (applicable only if "Expand" is set to true). The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return all Main Dicom Tags to keep backward compatibility with Orthanc prior to 1.11.0. + "Short": If set to true, report the DICOM tags in hexadecimal format + "Since": Show only the resources since the provided index (in conjunction with Limit)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the Orthanc identifiers, or detailed information about the reported resources (if Expand argument is true)

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8021
+8022
+8023
+8024
+8025
+8026
+8027
+8028
+8029
+8030
+8031
+8032
+8033
+8034
+8035
+8036
+8037
+8038
+8039
+8040
+8041
+8042
+8043
+8044
+8045
+8046
+8047
+8048
+8049
+8050
+8051
+8052
+8053
+8054
+8055
+8056
+8057
async def post_tools_find(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Look for local resources
+
+    This URI can be used to perform a search on the content of the local Orthanc server, in a way that is similar to querying remote DICOM modalities using C-FIND SCU: https://orthanc.uclouvain.be/book/users/rest.html#performing-finds-within-orthanc
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "CaseSensitive": Enable case-sensitive search for PN value representations (defaults to configuration option `CaseSensitivePN`)
+          "Expand": Also retrieve the content of the matching resources, not only their Orthanc identifiers
+          "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+          "Labels": List of strings specifying which labels to look for in the resources (new in Orthanc 1.12.0)
+          "LabelsConstraint": Constraint on the labels, can be `All`, `Any`, or `None` (defaults to `All`, new in Orthanc 1.12.0)
+          "Level": Level of the query (`Patient`, `Study`, `Series` or `Instance`)
+          "Limit": Limit the number of reported resources
+          "Query": Associative array containing the filter on the values of the DICOM tags
+          "RequestedTags": A list of DICOM tags to include in the response (applicable only if "Expand" is set to true).  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return all Main Dicom Tags to keep backward compatibility with Orthanc prior to 1.11.0.
+          "Short": If set to `true`, report the DICOM tags in hexadecimal format
+          "Since": Show only the resources since the provided index (in conjunction with `Limit`)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the Orthanc identifiers, or detailed information about the reported resources (if `Expand` argument is `true`)
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/tools/find",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_invalid_ate_tags() + + + async + + +

+ + +
+ +

(async) Invalidate DICOM-as-JSON summaries

+

Remove all the attachments of the type "DICOM-as-JSON" that are associated will all the DICOM instances stored in Orthanc. These summaries will be automatically re-created on the next access. This is notably useful after changes to the Dictionary configuration option. https://orthanc.uclouvain.be/book/faq/orthanc-storage.html#storage-area +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8084
+8085
+8086
+8087
+8088
+8089
+8090
+8091
+8092
+8093
+8094
+8095
+8096
+8097
+8098
async def post_tools_invalid_ate_tags(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Invalidate DICOM-as-JSON summaries
+
+    Remove all the attachments of the type "DICOM-as-JSON" that are associated will all the DICOM instances stored in Orthanc. These summaries will be automatically re-created on the next access. This is notably useful after changes to the `Dictionary` configuration option. https://orthanc.uclouvain.be/book/faq/orthanc-storage.html#storage-area
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/tools/invalid_ate-tags",
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_lookup(data=None) + + + async + + +

+ + +
+ +

(async) Look for DICOM identifiers

+

This URI can be used to convert one DICOM identifier to a list of matching Orthanc resources +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

The DICOM identifier of interest (i.e. the value of PatientID, StudyInstanceUID, SeriesInstanceUID, or SOPInstanceUID)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing a list of matching Orthanc resources, each item in the list corresponding to a JSON object with the fields Type, ID and Path identifying one DICOM resource that is stored by Orthanc

+
+
+ +
+ Source code in pyorthanc/async_client.py +
8437
+8438
+8439
+8440
+8441
+8442
+8443
+8444
+8445
+8446
+8447
+8448
+8449
+8450
+8451
+8452
+8453
+8454
+8455
+8456
+8457
+8458
+8459
async def post_tools_lookup(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Look for DICOM identifiers
+
+    This URI can be used to convert one DICOM identifier to a list of matching Orthanc resources
+    Tags: System
+
+    Parameters
+    ----------
+    data
+        The DICOM identifier of interest (i.e. the value of `PatientID`, `StudyInstanceUID`, `SeriesInstanceUID`, or `SOPInstanceUID`)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing a list of matching Orthanc resources, each item in the list corresponding to a JSON object with the fields `Type`, `ID` and `Path` identifying one DICOM resource that is stored by Orthanc
+    """
+    return await self._post(
+        route=f"{self.url}/tools/lookup",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_reconstruct(json=None) + + + async + + +

+ + +
+ +

(async) Reconstruct all the index

+

Reconstruct the index of all the tags of all the DICOM instances that are stored in Orthanc. This is notably useful after the deletion of resources whose children resources have inconsistent values with their sibling resources. Beware that this is a highly time-consuming operation, as all the DICOM instances will be parsed again, and as all the Orthanc index will be regenerated. If you have a large database to process, it is advised to use the Housekeeper plugin to perform this action resource by resource +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8552
+8553
+8554
+8555
+8556
+8557
+8558
+8559
+8560
+8561
+8562
+8563
+8564
+8565
+8566
+8567
+8568
+8569
+8570
+8571
+8572
+8573
+8574
+8575
+8576
+8577
async def post_tools_reconstruct(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Reconstruct all the index
+
+    Reconstruct the index of all the tags of all the DICOM instances that are stored in Orthanc. This is notably useful after the deletion of resources whose children resources have inconsistent values with their sibling resources. Beware that this is a highly time-consuming operation, as all the DICOM instances will be parsed again, and as all the Orthanc index will be regenerated. If you have a large database to process, it is advised to use the Housekeeper plugin to perform this action resource by resource
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return await self._post(
+        route=f"{self.url}/tools/reconstruct",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_reset() + + + async + + +

+ + +
+ +

(async) Restart Orthanc

+

Restart Orthanc +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8579
+8580
+8581
+8582
+8583
+8584
+8585
+8586
+8587
+8588
+8589
+8590
+8591
+8592
+8593
async def post_tools_reset(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Restart Orthanc
+
+    Restart Orthanc
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/tools/reset",
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_shutdown() + + + async + + +

+ + +
+ +

(async) Shutdown Orthanc

+

Shutdown Orthanc +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8595
+8596
+8597
+8598
+8599
+8600
+8601
+8602
+8603
+8604
+8605
+8606
+8607
+8608
+8609
async def post_tools_shutdown(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Shutdown Orthanc
+
+    Shutdown Orthanc
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._post(
+        route=f"{self.url}/tools/shutdown",
+    )
+
+
+
+ +
+ +
+ + +

+ put_instances_id_attachments_name(id_, name, content=None, headers=None) + + + async + + +

+ + +
+ +

(async) Set attachment

+

Attach a file to the given DICOM instance. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024). +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
content + RequestContent + +
+
- (Content-Type: "application/octet-stream") Binary data containing the attachment
+
+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/async_client.py +
572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
async def put_instances_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    content: RequestContent = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set attachment
+
+    Attach a file to the given DICOM instance. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    content
+            - (Content-Type: "application/octet-stream") Binary data containing the attachment
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return await self._put(
+        route=f"{self.url}/instances/{id_}/attachments/{name}",
+        content=content,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_instances_id_labels_label(id_, label) + + + async + + +

+ + +
+ +

(async) Add label

+

Associate a label with a instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be added

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
async def put_instances_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Add label
+
+    Associate a label with a instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    label
+        The label to be added
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/instances/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ put_instances_id_metadata_name(id_, name, data=None, headers=None) + + + async + + +

+ + +
+ +

(async) Set metadata

+

Set the value of some metadata in the given DICOM instance. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024). +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
data + RequestData + +
+

String value of the metadata

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
async def put_instances_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    data: RequestData = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set metadata
+
+    Set the value of some metadata in the given DICOM instance. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    data
+        String value of the metadata
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/instances/{id_}/metadata/{name}",
+        data=data,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_modalities_id(id_, json=None) + + + async + + +

+ + +
+ +

(async) Update DICOM modality

+

Define a new DICOM modality, or update an existing one. This change is permanent iff. DicomModalitiesInDatabase is true, otherwise it is lost at the next restart of Orthanc. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the new/updated DICOM modality

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "AET": AET of the remote DICOM modality + "AllowEcho": Whether to accept C-ECHO SCU commands issued by the remote modality + "AllowFind": Whether to accept C-FIND SCU commands issued by the remote modality + "AllowFindWorklist": Whether to accept C-FIND SCU commands for worklists issued by the remote modality + "AllowGet": Whether to accept C-GET SCU commands issued by the remote modality + "AllowMove": Whether to accept C-MOVE SCU commands issued by the remote modality + "AllowStorageCommitment": Whether to accept storage commitment requests issued by the remote modality + "AllowStore": Whether to accept C-STORE SCU commands issued by the remote modality + "AllowTranscoding": Whether to allow transcoding for operations initiated by this modality. This option applies to Orthanc C-GET SCP and to Orthanc C-STORE SCU. It only has an effect if the global option EnableTranscoding is set to true. + "Host": Host address of the remote DICOM modality (typically, an IP address) + "Manufacturer": Manufacturer of the remote DICOM modality (check configuration option DicomModalities for possible values + "Port": TCP port of the remote DICOM modality + "UseDicomTls": Whether to use DICOM TLS in the SCU connection initiated by Orthanc (new in Orthanc 1.9.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
async def put_modalities_id(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Update DICOM modality
+
+    Define a new DICOM modality, or update an existing one. This change is permanent iff. `DicomModalitiesInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the new/updated DICOM modality
+    json
+        Dictionary with the following keys:
+          "AET": AET of the remote DICOM modality
+          "AllowEcho": Whether to accept C-ECHO SCU commands issued by the remote modality
+          "AllowFind": Whether to accept C-FIND SCU commands issued by the remote modality
+          "AllowFindWorklist": Whether to accept C-FIND SCU commands for worklists issued by the remote modality
+          "AllowGet": Whether to accept C-GET SCU commands issued by the remote modality
+          "AllowMove": Whether to accept C-MOVE SCU commands issued by the remote modality
+          "AllowStorageCommitment": Whether to accept storage commitment requests issued by the remote modality
+          "AllowStore": Whether to accept C-STORE SCU commands issued by the remote modality
+          "AllowTranscoding": Whether to allow transcoding for operations initiated by this modality. This option applies to Orthanc C-GET SCP and to Orthanc C-STORE SCU. It only has an effect if the global option `EnableTranscoding` is set to `true`.
+          "Host": Host address of the remote DICOM modality (typically, an IP address)
+          "Manufacturer": Manufacturer of the remote DICOM modality (check configuration option `DicomModalities` for possible values
+          "Port": TCP port of the remote DICOM modality
+          "UseDicomTls": Whether to use DICOM TLS in the SCU connection initiated by Orthanc (new in Orthanc 1.9.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return await self._put(
+        route=f"{self.url}/modalities/{id_}",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ put_patients_id_attachments_name(id_, name, content=None, headers=None) + + + async + + +

+ + +
+ +

(async) Set attachment

+

Attach a file to the given DICOM patient. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024). +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
content + RequestContent + +
+
- (Content-Type: "application/octet-stream") Binary data containing the attachment
+
+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/async_client.py +
3185
+3186
+3187
+3188
+3189
+3190
+3191
+3192
+3193
+3194
+3195
+3196
+3197
+3198
+3199
+3200
+3201
+3202
+3203
+3204
+3205
+3206
+3207
+3208
+3209
+3210
+3211
+3212
+3213
+3214
+3215
+3216
+3217
+3218
async def put_patients_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    content: RequestContent = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set attachment
+
+    Attach a file to the given DICOM patient. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    content
+            - (Content-Type: "application/octet-stream") Binary data containing the attachment
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return await self._put(
+        route=f"{self.url}/patients/{id_}/attachments/{name}",
+        content=content,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_patients_id_labels_label(id_, label) + + + async + + +

+ + +
+ +

(async) Add label

+

Associate a label with a patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be added

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
3679
+3680
+3681
+3682
+3683
+3684
+3685
+3686
+3687
+3688
+3689
+3690
+3691
+3692
+3693
+3694
+3695
+3696
+3697
+3698
+3699
+3700
+3701
+3702
async def put_patients_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Add label
+
+    Associate a label with a patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    label
+        The label to be added
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/patients/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ put_patients_id_metadata_name(id_, name, data=None, headers=None) + + + async + + +

+ + +
+ +

(async) Set metadata

+

Set the value of some metadata in the given DICOM patient. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024). +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
data + RequestData + +
+

String value of the metadata

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
3860
+3861
+3862
+3863
+3864
+3865
+3866
+3867
+3868
+3869
+3870
+3871
+3872
+3873
+3874
+3875
+3876
+3877
+3878
+3879
+3880
+3881
+3882
+3883
+3884
+3885
+3886
+3887
+3888
+3889
+3890
+3891
+3892
async def put_patients_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    data: RequestData = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set metadata
+
+    Set the value of some metadata in the given DICOM patient. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    data
+        String value of the metadata
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/patients/{id_}/metadata/{name}",
+        data=data,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_patients_id_protected(id_) + + + async + + +

+ + +
+ +

(async) Protect/Unprotect a patient against recycling

+

Protects a patient by sending 1 or true in the payload request. Unprotects a patient by sending 0 or false in the payload requests. More info: https://orthanc.uclouvain.be/book/faq/features.html#recycling-protection +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
3989
+3990
+3991
+3992
+3993
+3994
+3995
+3996
+3997
+3998
+3999
+4000
+4001
+4002
+4003
+4004
+4005
+4006
+4007
+4008
+4009
async def put_patients_id_protected(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Protect/Unprotect a patient against recycling
+
+    Protects a patient by sending `1` or `true` in the payload request. Unprotects a patient by sending `0` or `false` in the payload requests. More info: https://orthanc.uclouvain.be/book/faq/features.html#recycling-protection
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/patients/{id_}/protected",
+    )
+
+
+
+ +
+ +
+ + +

+ put_peers_id(id_, json=None) + + + async + + +

+ + +
+ +

(async) Update Orthanc peer

+

Define a new Orthanc peer, or update an existing one. This change is permanent iff. OrthancPeersInDatabase is true, otherwise it is lost at the next restart of Orthanc. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the new/updated Orthanc peer

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "CertificateFile": SSL certificate for the HTTPS connections + "CertificateKeyFile": Key file for the SSL certificate for the HTTPS connections + "CertificateKeyPassword": Key password for the SSL certificate for the HTTPS connections + "HttpHeaders": HTTP headers to be used for the connections to the remote peer + "Password": Password for the credentials + "URL": URL of the root of the REST API of the remote Orthanc peer, for instance http://localhost:8042/ + "Username": Username for the credentials

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
4225
+4226
+4227
+4228
+4229
+4230
+4231
+4232
+4233
+4234
+4235
+4236
+4237
+4238
+4239
+4240
+4241
+4242
+4243
+4244
+4245
+4246
+4247
+4248
+4249
+4250
+4251
+4252
+4253
+4254
+4255
+4256
+4257
+4258
+4259
async def put_peers_id(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Update Orthanc peer
+
+    Define a new Orthanc peer, or update an existing one. This change is permanent iff. `OrthancPeersInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the new/updated Orthanc peer
+    json
+        Dictionary with the following keys:
+          "CertificateFile": SSL certificate for the HTTPS connections
+          "CertificateKeyFile": Key file for the SSL certificate for the HTTPS connections
+          "CertificateKeyPassword": Key password for the SSL certificate for the HTTPS connections
+          "HttpHeaders": HTTP headers to be used for the connections to the remote peer
+          "Password": Password for the credentials
+          "URL": URL of the root of the REST API of the remote Orthanc peer, for instance `http://localhost:8042/`
+          "Username": Username for the credentials
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return await self._put(
+        route=f"{self.url}/peers/{id_}",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ put_series_id_attachments_name(id_, name, content=None, headers=None) + + + async + + +

+ + +
+ +

(async) Set attachment

+

Attach a file to the given DICOM series. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024). +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
content + RequestContent + +
+
- (Content-Type: "application/octet-stream") Binary data containing the attachment
+
+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/async_client.py +
5128
+5129
+5130
+5131
+5132
+5133
+5134
+5135
+5136
+5137
+5138
+5139
+5140
+5141
+5142
+5143
+5144
+5145
+5146
+5147
+5148
+5149
+5150
+5151
+5152
+5153
+5154
+5155
+5156
+5157
+5158
+5159
+5160
+5161
async def put_series_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    content: RequestContent = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set attachment
+
+    Attach a file to the given DICOM series. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    content
+            - (Content-Type: "application/octet-stream") Binary data containing the attachment
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return await self._put(
+        route=f"{self.url}/series/{id_}/attachments/{name}",
+        content=content,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_series_id_labels_label(id_, label) + + + async + + +

+ + +
+ +

(async) Add label

+

Associate a label with a series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be added

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
5622
+5623
+5624
+5625
+5626
+5627
+5628
+5629
+5630
+5631
+5632
+5633
+5634
+5635
+5636
+5637
+5638
+5639
+5640
+5641
+5642
+5643
+5644
+5645
async def put_series_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Add label
+
+    Associate a label with a series
+    Tags: Series
+
+    Parameters
+    ----------
+    label
+        The label to be added
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/series/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ put_series_id_metadata_name(id_, name, data=None, headers=None) + + + async + + +

+ + +
+ +

(async) Set metadata

+

Set the value of some metadata in the given DICOM series. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024). +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
data + RequestData + +
+

String value of the metadata

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
5803
+5804
+5805
+5806
+5807
+5808
+5809
+5810
+5811
+5812
+5813
+5814
+5815
+5816
+5817
+5818
+5819
+5820
+5821
+5822
+5823
+5824
+5825
+5826
+5827
+5828
+5829
+5830
+5831
+5832
+5833
+5834
+5835
async def put_series_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    data: RequestData = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set metadata
+
+    Set the value of some metadata in the given DICOM series. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    data
+        String value of the metadata
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/series/{id_}/metadata/{name}",
+        data=data,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_studies_id_attachments_name(id_, name, content=None, headers=None) + + + async + + +

+ + +
+ +

(async) Set attachment

+

Attach a file to the given DICOM study. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024). +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
content + RequestContent + +
+
- (Content-Type: "application/octet-stream") Binary data containing the attachment
+
+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/async_client.py +
6445
+6446
+6447
+6448
+6449
+6450
+6451
+6452
+6453
+6454
+6455
+6456
+6457
+6458
+6459
+6460
+6461
+6462
+6463
+6464
+6465
+6466
+6467
+6468
+6469
+6470
+6471
+6472
+6473
+6474
+6475
+6476
+6477
+6478
async def put_studies_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    content: RequestContent = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set attachment
+
+    Attach a file to the given DICOM study. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    content
+            - (Content-Type: "application/octet-stream") Binary data containing the attachment
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return await self._put(
+        route=f"{self.url}/studies/{id_}/attachments/{name}",
+        content=content,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_studies_id_labels_label(id_, label) + + + async + + +

+ + +
+ +

(async) Add label

+

Associate a label with a study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be added

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
6939
+6940
+6941
+6942
+6943
+6944
+6945
+6946
+6947
+6948
+6949
+6950
+6951
+6952
+6953
+6954
+6955
+6956
+6957
+6958
+6959
+6960
+6961
+6962
async def put_studies_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Add label
+
+    Associate a label with a study
+    Tags: Studies
+
+    Parameters
+    ----------
+    label
+        The label to be added
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/studies/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ put_studies_id_metadata_name(id_, name, data=None, headers=None) + + + async + + +

+ + +
+ +

(async) Set metadata

+

Set the value of some metadata in the given DICOM study. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024). +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
data + RequestData + +
+

String value of the metadata

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7156
+7157
+7158
+7159
+7160
+7161
+7162
+7163
+7164
+7165
+7166
+7167
+7168
+7169
+7170
+7171
+7172
+7173
+7174
+7175
+7176
+7177
+7178
+7179
+7180
+7181
+7182
+7183
+7184
+7185
+7186
+7187
+7188
async def put_studies_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    data: RequestData = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set metadata
+
+    Set the value of some metadata in the given DICOM study. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    data
+        String value of the metadata
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/studies/{id_}/metadata/{name}",
+        data=data,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_accepted_transfer_syntaxes(data=None, json=None) + + + async + + +

+ + +
+ +

(async) Set accepted transfer syntaxes

+

Set the DICOM transfer syntaxes that accepted by Orthanc C-STORE SCP +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys:

+
+
+ None +
data + RequestData + +
+

UID of the transfer syntax to be accepted. Wildcards ? and * are accepted.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the now-accepted transfer syntax UIDs

+
+
+ +
+ Source code in pyorthanc/async_client.py +
7526
+7527
+7528
+7529
+7530
+7531
+7532
+7533
+7534
+7535
+7536
+7537
+7538
+7539
+7540
+7541
+7542
+7543
+7544
+7545
+7546
+7547
+7548
+7549
+7550
+7551
+7552
+7553
+7554
+7555
async def put_tools_accepted_transfer_syntaxes(
+    self,
+    data: RequestData = None,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set accepted transfer syntaxes
+
+    Set the DICOM transfer syntaxes that accepted by Orthanc C-STORE SCP
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+
+    data
+        UID of the transfer syntax to be accepted. Wildcards `?` and `*` are accepted.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the now-accepted transfer syntax UIDs
+    """
+    if json is None:
+        json = {}
+    return await self._put(
+        route=f"{self.url}/tools/accepted-transfer-syntaxes",
+        data=data,
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_default_encoding(data=None) + + + async + + +

+ + +
+ +

(async) Set default encoding

+

Change the default encoding that is used by Orthanc if parsing a DICOM instance without the SpecificCharacterEncoding tag, or during C-FIND. This corresponds to the configuration option DefaultEncoding. +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

The name of the encoding. Check out configuration option DefaultEncoding for the allowed values.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
7924
+7925
+7926
+7927
+7928
+7929
+7930
+7931
+7932
+7933
+7934
+7935
+7936
+7937
+7938
+7939
+7940
+7941
+7942
+7943
+7944
+7945
async def put_tools_default_encoding(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set default encoding
+
+    Change the default encoding that is used by Orthanc if parsing a DICOM instance without the `SpecificCharacterEncoding` tag, or during C-FIND. This corresponds to the configuration option `DefaultEncoding`.
+    Tags: System
+
+    Parameters
+    ----------
+    data
+        The name of the encoding. Check out configuration option `DefaultEncoding` for the allowed values.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/tools/default-encoding",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level(data=None) + + + async + + +

+ + +
+ +

(async) Set main log level

+

Set the main log level of Orthanc +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8134
+8135
+8136
+8137
+8138
+8139
+8140
+8141
+8142
+8143
+8144
+8145
+8146
+8147
+8148
+8149
+8150
+8151
+8152
+8153
+8154
+8155
async def put_tools_log_level(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set main log level
+
+    Set the main log level of Orthanc
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/tools/log-level",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_dicom(data=None) + + + async + + +

+ + +
+ +

(async) Set log level for dicom

+

Set the log level of the log category dicom +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8174
+8175
+8176
+8177
+8178
+8179
+8180
+8181
+8182
+8183
+8184
+8185
+8186
+8187
+8188
+8189
+8190
+8191
+8192
+8193
+8194
+8195
async def put_tools_log_level_dicom(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set log level for `dicom`
+
+    Set the log level of the log category `dicom`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/tools/log-level-dicom",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_generic(data=None) + + + async + + +

+ + +
+ +

(async) Set log level for generic

+

Set the log level of the log category generic +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8214
+8215
+8216
+8217
+8218
+8219
+8220
+8221
+8222
+8223
+8224
+8225
+8226
+8227
+8228
+8229
+8230
+8231
+8232
+8233
+8234
+8235
async def put_tools_log_level_generic(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set log level for `generic`
+
+    Set the log level of the log category `generic`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/tools/log-level-generic",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_http(data=None) + + + async + + +

+ + +
+ +

(async) Set log level for http

+

Set the log level of the log category http +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8254
+8255
+8256
+8257
+8258
+8259
+8260
+8261
+8262
+8263
+8264
+8265
+8266
+8267
+8268
+8269
+8270
+8271
+8272
+8273
+8274
+8275
async def put_tools_log_level_http(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set log level for `http`
+
+    Set the log level of the log category `http`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/tools/log-level-http",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_jobs(data=None) + + + async + + +

+ + +
+ +

(async) Set log level for jobs

+

Set the log level of the log category jobs +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8294
+8295
+8296
+8297
+8298
+8299
+8300
+8301
+8302
+8303
+8304
+8305
+8306
+8307
+8308
+8309
+8310
+8311
+8312
+8313
+8314
+8315
async def put_tools_log_level_jobs(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set log level for `jobs`
+
+    Set the log level of the log category `jobs`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/tools/log-level-jobs",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_lua(data=None) + + + async + + +

+ + +
+ +

(async) Set log level for lua

+

Set the log level of the log category lua +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8334
+8335
+8336
+8337
+8338
+8339
+8340
+8341
+8342
+8343
+8344
+8345
+8346
+8347
+8348
+8349
+8350
+8351
+8352
+8353
+8354
+8355
async def put_tools_log_level_lua(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set log level for `lua`
+
+    Set the log level of the log category `lua`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/tools/log-level-lua",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_plugins(data=None) + + + async + + +

+ + +
+ +

(async) Set log level for plugins

+

Set the log level of the log category plugins +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8374
+8375
+8376
+8377
+8378
+8379
+8380
+8381
+8382
+8383
+8384
+8385
+8386
+8387
+8388
+8389
+8390
+8391
+8392
+8393
+8394
+8395
async def put_tools_log_level_plugins(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set log level for `plugins`
+
+    Set the log level of the log category `plugins`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/tools/log-level-plugins",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_sqlite(data=None) + + + async + + +

+ + +
+ +

(async) Set log level for sqlite

+

Set the log level of the log category sqlite +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8414
+8415
+8416
+8417
+8418
+8419
+8420
+8421
+8422
+8423
+8424
+8425
+8426
+8427
+8428
+8429
+8430
+8431
+8432
+8433
+8434
+8435
async def put_tools_log_level_sqlite(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set log level for `sqlite`
+
+    Set the log level of the log category `sqlite`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/tools/log-level-sqlite",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_metrics(data=None) + + + async + + +

+ + +
+ +

(async) Enable collection of metrics

+

Enable or disable the collection and publication of metrics at /tools/metrics-prometheus +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

1 if metrics are collected, 0 if metrics are disabled

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8478
+8479
+8480
+8481
+8482
+8483
+8484
+8485
+8486
+8487
+8488
+8489
+8490
+8491
+8492
+8493
+8494
+8495
+8496
+8497
+8498
+8499
async def put_tools_metrics(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Enable collection of metrics
+
+    Enable or disable the collection and publication of metrics at `/tools/metrics-prometheus`
+    Tags: System
+
+    Parameters
+    ----------
+    data
+        `1` if metrics are collected, `0` if metrics are disabled
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/tools/metrics",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_unknown_sop_class_accepted(data=None) + + + async + + +

+ + +
+ +

(async) Set unknown SOP class accepted

+

Set whether Orthanc C-STORE SCP should accept DICOM instances with an unknown SOP class UID +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

1 if accepted, 0 if not accepted

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/async_client.py +
8628
+8629
+8630
+8631
+8632
+8633
+8634
+8635
+8636
+8637
+8638
+8639
+8640
+8641
+8642
+8643
+8644
+8645
+8646
+8647
+8648
+8649
async def put_tools_unknown_sop_class_accepted(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """(async) Set unknown SOP class accepted
+
+    Set whether Orthanc C-STORE SCP should accept DICOM instances with an unknown SOP class UID
+    Tags: System
+
+    Parameters
+    ----------
+    data
+        `1` if accepted, `0` if not accepted
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return await self._put(
+        route=f"{self.url}/tools/unknown-sop-class-accepted",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ setup_credentials(username, password) + +

+ + +
+ +

Set credentials needed for HTTP requests

+ +
+ Source code in pyorthanc/async_client.py +
54
+55
+56
def setup_credentials(self, username: str, password: str) -> None:
+    """Set credentials needed for HTTP requests"""
+    self._auth = httpx.BasicAuth(username, password)
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/client/index.html b/api/client/index.html new file mode 100644 index 0000000..87febc9 --- /dev/null +++ b/api/client/index.html @@ -0,0 +1,65643 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Orthanc - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Orthanc

+ +
+ + + +

+ pyorthanc.Orthanc + + +

+ + +
+

+ Bases: Client

+ + +

Orthanc API

+

version 1.12.3 +This is the full documentation of the REST API of Orthanc.

This reference is automatically generated from the source code of Orthanc. A shorter cheat sheet is part of the Orthanc Book.

An earlier, manually crafted version from August 2019, is still available, but is not up-to-date anymore (source).

+ +
+ Source code in pyorthanc/client.py +
  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
+3056
+3057
+3058
+3059
+3060
+3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
+3091
+3092
+3093
+3094
+3095
+3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
+3119
+3120
+3121
+3122
+3123
+3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
+3149
+3150
+3151
+3152
+3153
+3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+3168
+3169
+3170
+3171
+3172
+3173
+3174
+3175
+3176
+3177
+3178
+3179
+3180
+3181
+3182
+3183
+3184
+3185
+3186
+3187
+3188
+3189
+3190
+3191
+3192
+3193
+3194
+3195
+3196
+3197
+3198
+3199
+3200
+3201
+3202
+3203
+3204
+3205
+3206
+3207
+3208
+3209
+3210
+3211
+3212
+3213
+3214
+3215
+3216
+3217
+3218
+3219
+3220
+3221
+3222
+3223
+3224
+3225
+3226
+3227
+3228
+3229
+3230
+3231
+3232
+3233
+3234
+3235
+3236
+3237
+3238
+3239
+3240
+3241
+3242
+3243
+3244
+3245
+3246
+3247
+3248
+3249
+3250
+3251
+3252
+3253
+3254
+3255
+3256
+3257
+3258
+3259
+3260
+3261
+3262
+3263
+3264
+3265
+3266
+3267
+3268
+3269
+3270
+3271
+3272
+3273
+3274
+3275
+3276
+3277
+3278
+3279
+3280
+3281
+3282
+3283
+3284
+3285
+3286
+3287
+3288
+3289
+3290
+3291
+3292
+3293
+3294
+3295
+3296
+3297
+3298
+3299
+3300
+3301
+3302
+3303
+3304
+3305
+3306
+3307
+3308
+3309
+3310
+3311
+3312
+3313
+3314
+3315
+3316
+3317
+3318
+3319
+3320
+3321
+3322
+3323
+3324
+3325
+3326
+3327
+3328
+3329
+3330
+3331
+3332
+3333
+3334
+3335
+3336
+3337
+3338
+3339
+3340
+3341
+3342
+3343
+3344
+3345
+3346
+3347
+3348
+3349
+3350
+3351
+3352
+3353
+3354
+3355
+3356
+3357
+3358
+3359
+3360
+3361
+3362
+3363
+3364
+3365
+3366
+3367
+3368
+3369
+3370
+3371
+3372
+3373
+3374
+3375
+3376
+3377
+3378
+3379
+3380
+3381
+3382
+3383
+3384
+3385
+3386
+3387
+3388
+3389
+3390
+3391
+3392
+3393
+3394
+3395
+3396
+3397
+3398
+3399
+3400
+3401
+3402
+3403
+3404
+3405
+3406
+3407
+3408
+3409
+3410
+3411
+3412
+3413
+3414
+3415
+3416
+3417
+3418
+3419
+3420
+3421
+3422
+3423
+3424
+3425
+3426
+3427
+3428
+3429
+3430
+3431
+3432
+3433
+3434
+3435
+3436
+3437
+3438
+3439
+3440
+3441
+3442
+3443
+3444
+3445
+3446
+3447
+3448
+3449
+3450
+3451
+3452
+3453
+3454
+3455
+3456
+3457
+3458
+3459
+3460
+3461
+3462
+3463
+3464
+3465
+3466
+3467
+3468
+3469
+3470
+3471
+3472
+3473
+3474
+3475
+3476
+3477
+3478
+3479
+3480
+3481
+3482
+3483
+3484
+3485
+3486
+3487
+3488
+3489
+3490
+3491
+3492
+3493
+3494
+3495
+3496
+3497
+3498
+3499
+3500
+3501
+3502
+3503
+3504
+3505
+3506
+3507
+3508
+3509
+3510
+3511
+3512
+3513
+3514
+3515
+3516
+3517
+3518
+3519
+3520
+3521
+3522
+3523
+3524
+3525
+3526
+3527
+3528
+3529
+3530
+3531
+3532
+3533
+3534
+3535
+3536
+3537
+3538
+3539
+3540
+3541
+3542
+3543
+3544
+3545
+3546
+3547
+3548
+3549
+3550
+3551
+3552
+3553
+3554
+3555
+3556
+3557
+3558
+3559
+3560
+3561
+3562
+3563
+3564
+3565
+3566
+3567
+3568
+3569
+3570
+3571
+3572
+3573
+3574
+3575
+3576
+3577
+3578
+3579
+3580
+3581
+3582
+3583
+3584
+3585
+3586
+3587
+3588
+3589
+3590
+3591
+3592
+3593
+3594
+3595
+3596
+3597
+3598
+3599
+3600
+3601
+3602
+3603
+3604
+3605
+3606
+3607
+3608
+3609
+3610
+3611
+3612
+3613
+3614
+3615
+3616
+3617
+3618
+3619
+3620
+3621
+3622
+3623
+3624
+3625
+3626
+3627
+3628
+3629
+3630
+3631
+3632
+3633
+3634
+3635
+3636
+3637
+3638
+3639
+3640
+3641
+3642
+3643
+3644
+3645
+3646
+3647
+3648
+3649
+3650
+3651
+3652
+3653
+3654
+3655
+3656
+3657
+3658
+3659
+3660
+3661
+3662
+3663
+3664
+3665
+3666
+3667
+3668
+3669
+3670
+3671
+3672
+3673
+3674
+3675
+3676
+3677
+3678
+3679
+3680
+3681
+3682
+3683
+3684
+3685
+3686
+3687
+3688
+3689
+3690
+3691
+3692
+3693
+3694
+3695
+3696
+3697
+3698
+3699
+3700
+3701
+3702
+3703
+3704
+3705
+3706
+3707
+3708
+3709
+3710
+3711
+3712
+3713
+3714
+3715
+3716
+3717
+3718
+3719
+3720
+3721
+3722
+3723
+3724
+3725
+3726
+3727
+3728
+3729
+3730
+3731
+3732
+3733
+3734
+3735
+3736
+3737
+3738
+3739
+3740
+3741
+3742
+3743
+3744
+3745
+3746
+3747
+3748
+3749
+3750
+3751
+3752
+3753
+3754
+3755
+3756
+3757
+3758
+3759
+3760
+3761
+3762
+3763
+3764
+3765
+3766
+3767
+3768
+3769
+3770
+3771
+3772
+3773
+3774
+3775
+3776
+3777
+3778
+3779
+3780
+3781
+3782
+3783
+3784
+3785
+3786
+3787
+3788
+3789
+3790
+3791
+3792
+3793
+3794
+3795
+3796
+3797
+3798
+3799
+3800
+3801
+3802
+3803
+3804
+3805
+3806
+3807
+3808
+3809
+3810
+3811
+3812
+3813
+3814
+3815
+3816
+3817
+3818
+3819
+3820
+3821
+3822
+3823
+3824
+3825
+3826
+3827
+3828
+3829
+3830
+3831
+3832
+3833
+3834
+3835
+3836
+3837
+3838
+3839
+3840
+3841
+3842
+3843
+3844
+3845
+3846
+3847
+3848
+3849
+3850
+3851
+3852
+3853
+3854
+3855
+3856
+3857
+3858
+3859
+3860
+3861
+3862
+3863
+3864
+3865
+3866
+3867
+3868
+3869
+3870
+3871
+3872
+3873
+3874
+3875
+3876
+3877
+3878
+3879
+3880
+3881
+3882
+3883
+3884
+3885
+3886
+3887
+3888
+3889
+3890
+3891
+3892
+3893
+3894
+3895
+3896
+3897
+3898
+3899
+3900
+3901
+3902
+3903
+3904
+3905
+3906
+3907
+3908
+3909
+3910
+3911
+3912
+3913
+3914
+3915
+3916
+3917
+3918
+3919
+3920
+3921
+3922
+3923
+3924
+3925
+3926
+3927
+3928
+3929
+3930
+3931
+3932
+3933
+3934
+3935
+3936
+3937
+3938
+3939
+3940
+3941
+3942
+3943
+3944
+3945
+3946
+3947
+3948
+3949
+3950
+3951
+3952
+3953
+3954
+3955
+3956
+3957
+3958
+3959
+3960
+3961
+3962
+3963
+3964
+3965
+3966
+3967
+3968
+3969
+3970
+3971
+3972
+3973
+3974
+3975
+3976
+3977
+3978
+3979
+3980
+3981
+3982
+3983
+3984
+3985
+3986
+3987
+3988
+3989
+3990
+3991
+3992
+3993
+3994
+3995
+3996
+3997
+3998
+3999
+4000
+4001
+4002
+4003
+4004
+4005
+4006
+4007
+4008
+4009
+4010
+4011
+4012
+4013
+4014
+4015
+4016
+4017
+4018
+4019
+4020
+4021
+4022
+4023
+4024
+4025
+4026
+4027
+4028
+4029
+4030
+4031
+4032
+4033
+4034
+4035
+4036
+4037
+4038
+4039
+4040
+4041
+4042
+4043
+4044
+4045
+4046
+4047
+4048
+4049
+4050
+4051
+4052
+4053
+4054
+4055
+4056
+4057
+4058
+4059
+4060
+4061
+4062
+4063
+4064
+4065
+4066
+4067
+4068
+4069
+4070
+4071
+4072
+4073
+4074
+4075
+4076
+4077
+4078
+4079
+4080
+4081
+4082
+4083
+4084
+4085
+4086
+4087
+4088
+4089
+4090
+4091
+4092
+4093
+4094
+4095
+4096
+4097
+4098
+4099
+4100
+4101
+4102
+4103
+4104
+4105
+4106
+4107
+4108
+4109
+4110
+4111
+4112
+4113
+4114
+4115
+4116
+4117
+4118
+4119
+4120
+4121
+4122
+4123
+4124
+4125
+4126
+4127
+4128
+4129
+4130
+4131
+4132
+4133
+4134
+4135
+4136
+4137
+4138
+4139
+4140
+4141
+4142
+4143
+4144
+4145
+4146
+4147
+4148
+4149
+4150
+4151
+4152
+4153
+4154
+4155
+4156
+4157
+4158
+4159
+4160
+4161
+4162
+4163
+4164
+4165
+4166
+4167
+4168
+4169
+4170
+4171
+4172
+4173
+4174
+4175
+4176
+4177
+4178
+4179
+4180
+4181
+4182
+4183
+4184
+4185
+4186
+4187
+4188
+4189
+4190
+4191
+4192
+4193
+4194
+4195
+4196
+4197
+4198
+4199
+4200
+4201
+4202
+4203
+4204
+4205
+4206
+4207
+4208
+4209
+4210
+4211
+4212
+4213
+4214
+4215
+4216
+4217
+4218
+4219
+4220
+4221
+4222
+4223
+4224
+4225
+4226
+4227
+4228
+4229
+4230
+4231
+4232
+4233
+4234
+4235
+4236
+4237
+4238
+4239
+4240
+4241
+4242
+4243
+4244
+4245
+4246
+4247
+4248
+4249
+4250
+4251
+4252
+4253
+4254
+4255
+4256
+4257
+4258
+4259
+4260
+4261
+4262
+4263
+4264
+4265
+4266
+4267
+4268
+4269
+4270
+4271
+4272
+4273
+4274
+4275
+4276
+4277
+4278
+4279
+4280
+4281
+4282
+4283
+4284
+4285
+4286
+4287
+4288
+4289
+4290
+4291
+4292
+4293
+4294
+4295
+4296
+4297
+4298
+4299
+4300
+4301
+4302
+4303
+4304
+4305
+4306
+4307
+4308
+4309
+4310
+4311
+4312
+4313
+4314
+4315
+4316
+4317
+4318
+4319
+4320
+4321
+4322
+4323
+4324
+4325
+4326
+4327
+4328
+4329
+4330
+4331
+4332
+4333
+4334
+4335
+4336
+4337
+4338
+4339
+4340
+4341
+4342
+4343
+4344
+4345
+4346
+4347
+4348
+4349
+4350
+4351
+4352
+4353
+4354
+4355
+4356
+4357
+4358
+4359
+4360
+4361
+4362
+4363
+4364
+4365
+4366
+4367
+4368
+4369
+4370
+4371
+4372
+4373
+4374
+4375
+4376
+4377
+4378
+4379
+4380
+4381
+4382
+4383
+4384
+4385
+4386
+4387
+4388
+4389
+4390
+4391
+4392
+4393
+4394
+4395
+4396
+4397
+4398
+4399
+4400
+4401
+4402
+4403
+4404
+4405
+4406
+4407
+4408
+4409
+4410
+4411
+4412
+4413
+4414
+4415
+4416
+4417
+4418
+4419
+4420
+4421
+4422
+4423
+4424
+4425
+4426
+4427
+4428
+4429
+4430
+4431
+4432
+4433
+4434
+4435
+4436
+4437
+4438
+4439
+4440
+4441
+4442
+4443
+4444
+4445
+4446
+4447
+4448
+4449
+4450
+4451
+4452
+4453
+4454
+4455
+4456
+4457
+4458
+4459
+4460
+4461
+4462
+4463
+4464
+4465
+4466
+4467
+4468
+4469
+4470
+4471
+4472
+4473
+4474
+4475
+4476
+4477
+4478
+4479
+4480
+4481
+4482
+4483
+4484
+4485
+4486
+4487
+4488
+4489
+4490
+4491
+4492
+4493
+4494
+4495
+4496
+4497
+4498
+4499
+4500
+4501
+4502
+4503
+4504
+4505
+4506
+4507
+4508
+4509
+4510
+4511
+4512
+4513
+4514
+4515
+4516
+4517
+4518
+4519
+4520
+4521
+4522
+4523
+4524
+4525
+4526
+4527
+4528
+4529
+4530
+4531
+4532
+4533
+4534
+4535
+4536
+4537
+4538
+4539
+4540
+4541
+4542
+4543
+4544
+4545
+4546
+4547
+4548
+4549
+4550
+4551
+4552
+4553
+4554
+4555
+4556
+4557
+4558
+4559
+4560
+4561
+4562
+4563
+4564
+4565
+4566
+4567
+4568
+4569
+4570
+4571
+4572
+4573
+4574
+4575
+4576
+4577
+4578
+4579
+4580
+4581
+4582
+4583
+4584
+4585
+4586
+4587
+4588
+4589
+4590
+4591
+4592
+4593
+4594
+4595
+4596
+4597
+4598
+4599
+4600
+4601
+4602
+4603
+4604
+4605
+4606
+4607
+4608
+4609
+4610
+4611
+4612
+4613
+4614
+4615
+4616
+4617
+4618
+4619
+4620
+4621
+4622
+4623
+4624
+4625
+4626
+4627
+4628
+4629
+4630
+4631
+4632
+4633
+4634
+4635
+4636
+4637
+4638
+4639
+4640
+4641
+4642
+4643
+4644
+4645
+4646
+4647
+4648
+4649
+4650
+4651
+4652
+4653
+4654
+4655
+4656
+4657
+4658
+4659
+4660
+4661
+4662
+4663
+4664
+4665
+4666
+4667
+4668
+4669
+4670
+4671
+4672
+4673
+4674
+4675
+4676
+4677
+4678
+4679
+4680
+4681
+4682
+4683
+4684
+4685
+4686
+4687
+4688
+4689
+4690
+4691
+4692
+4693
+4694
+4695
+4696
+4697
+4698
+4699
+4700
+4701
+4702
+4703
+4704
+4705
+4706
+4707
+4708
+4709
+4710
+4711
+4712
+4713
+4714
+4715
+4716
+4717
+4718
+4719
+4720
+4721
+4722
+4723
+4724
+4725
+4726
+4727
+4728
+4729
+4730
+4731
+4732
+4733
+4734
+4735
+4736
+4737
+4738
+4739
+4740
+4741
+4742
+4743
+4744
+4745
+4746
+4747
+4748
+4749
+4750
+4751
+4752
+4753
+4754
+4755
+4756
+4757
+4758
+4759
+4760
+4761
+4762
+4763
+4764
+4765
+4766
+4767
+4768
+4769
+4770
+4771
+4772
+4773
+4774
+4775
+4776
+4777
+4778
+4779
+4780
+4781
+4782
+4783
+4784
+4785
+4786
+4787
+4788
+4789
+4790
+4791
+4792
+4793
+4794
+4795
+4796
+4797
+4798
+4799
+4800
+4801
+4802
+4803
+4804
+4805
+4806
+4807
+4808
+4809
+4810
+4811
+4812
+4813
+4814
+4815
+4816
+4817
+4818
+4819
+4820
+4821
+4822
+4823
+4824
+4825
+4826
+4827
+4828
+4829
+4830
+4831
+4832
+4833
+4834
+4835
+4836
+4837
+4838
+4839
+4840
+4841
+4842
+4843
+4844
+4845
+4846
+4847
+4848
+4849
+4850
+4851
+4852
+4853
+4854
+4855
+4856
+4857
+4858
+4859
+4860
+4861
+4862
+4863
+4864
+4865
+4866
+4867
+4868
+4869
+4870
+4871
+4872
+4873
+4874
+4875
+4876
+4877
+4878
+4879
+4880
+4881
+4882
+4883
+4884
+4885
+4886
+4887
+4888
+4889
+4890
+4891
+4892
+4893
+4894
+4895
+4896
+4897
+4898
+4899
+4900
+4901
+4902
+4903
+4904
+4905
+4906
+4907
+4908
+4909
+4910
+4911
+4912
+4913
+4914
+4915
+4916
+4917
+4918
+4919
+4920
+4921
+4922
+4923
+4924
+4925
+4926
+4927
+4928
+4929
+4930
+4931
+4932
+4933
+4934
+4935
+4936
+4937
+4938
+4939
+4940
+4941
+4942
+4943
+4944
+4945
+4946
+4947
+4948
+4949
+4950
+4951
+4952
+4953
+4954
+4955
+4956
+4957
+4958
+4959
+4960
+4961
+4962
+4963
+4964
+4965
+4966
+4967
+4968
+4969
+4970
+4971
+4972
+4973
+4974
+4975
+4976
+4977
+4978
+4979
+4980
+4981
+4982
+4983
+4984
+4985
+4986
+4987
+4988
+4989
+4990
+4991
+4992
+4993
+4994
+4995
+4996
+4997
+4998
+4999
+5000
+5001
+5002
+5003
+5004
+5005
+5006
+5007
+5008
+5009
+5010
+5011
+5012
+5013
+5014
+5015
+5016
+5017
+5018
+5019
+5020
+5021
+5022
+5023
+5024
+5025
+5026
+5027
+5028
+5029
+5030
+5031
+5032
+5033
+5034
+5035
+5036
+5037
+5038
+5039
+5040
+5041
+5042
+5043
+5044
+5045
+5046
+5047
+5048
+5049
+5050
+5051
+5052
+5053
+5054
+5055
+5056
+5057
+5058
+5059
+5060
+5061
+5062
+5063
+5064
+5065
+5066
+5067
+5068
+5069
+5070
+5071
+5072
+5073
+5074
+5075
+5076
+5077
+5078
+5079
+5080
+5081
+5082
+5083
+5084
+5085
+5086
+5087
+5088
+5089
+5090
+5091
+5092
+5093
+5094
+5095
+5096
+5097
+5098
+5099
+5100
+5101
+5102
+5103
+5104
+5105
+5106
+5107
+5108
+5109
+5110
+5111
+5112
+5113
+5114
+5115
+5116
+5117
+5118
+5119
+5120
+5121
+5122
+5123
+5124
+5125
+5126
+5127
+5128
+5129
+5130
+5131
+5132
+5133
+5134
+5135
+5136
+5137
+5138
+5139
+5140
+5141
+5142
+5143
+5144
+5145
+5146
+5147
+5148
+5149
+5150
+5151
+5152
+5153
+5154
+5155
+5156
+5157
+5158
+5159
+5160
+5161
+5162
+5163
+5164
+5165
+5166
+5167
+5168
+5169
+5170
+5171
+5172
+5173
+5174
+5175
+5176
+5177
+5178
+5179
+5180
+5181
+5182
+5183
+5184
+5185
+5186
+5187
+5188
+5189
+5190
+5191
+5192
+5193
+5194
+5195
+5196
+5197
+5198
+5199
+5200
+5201
+5202
+5203
+5204
+5205
+5206
+5207
+5208
+5209
+5210
+5211
+5212
+5213
+5214
+5215
+5216
+5217
+5218
+5219
+5220
+5221
+5222
+5223
+5224
+5225
+5226
+5227
+5228
+5229
+5230
+5231
+5232
+5233
+5234
+5235
+5236
+5237
+5238
+5239
+5240
+5241
+5242
+5243
+5244
+5245
+5246
+5247
+5248
+5249
+5250
+5251
+5252
+5253
+5254
+5255
+5256
+5257
+5258
+5259
+5260
+5261
+5262
+5263
+5264
+5265
+5266
+5267
+5268
+5269
+5270
+5271
+5272
+5273
+5274
+5275
+5276
+5277
+5278
+5279
+5280
+5281
+5282
+5283
+5284
+5285
+5286
+5287
+5288
+5289
+5290
+5291
+5292
+5293
+5294
+5295
+5296
+5297
+5298
+5299
+5300
+5301
+5302
+5303
+5304
+5305
+5306
+5307
+5308
+5309
+5310
+5311
+5312
+5313
+5314
+5315
+5316
+5317
+5318
+5319
+5320
+5321
+5322
+5323
+5324
+5325
+5326
+5327
+5328
+5329
+5330
+5331
+5332
+5333
+5334
+5335
+5336
+5337
+5338
+5339
+5340
+5341
+5342
+5343
+5344
+5345
+5346
+5347
+5348
+5349
+5350
+5351
+5352
+5353
+5354
+5355
+5356
+5357
+5358
+5359
+5360
+5361
+5362
+5363
+5364
+5365
+5366
+5367
+5368
+5369
+5370
+5371
+5372
+5373
+5374
+5375
+5376
+5377
+5378
+5379
+5380
+5381
+5382
+5383
+5384
+5385
+5386
+5387
+5388
+5389
+5390
+5391
+5392
+5393
+5394
+5395
+5396
+5397
+5398
+5399
+5400
+5401
+5402
+5403
+5404
+5405
+5406
+5407
+5408
+5409
+5410
+5411
+5412
+5413
+5414
+5415
+5416
+5417
+5418
+5419
+5420
+5421
+5422
+5423
+5424
+5425
+5426
+5427
+5428
+5429
+5430
+5431
+5432
+5433
+5434
+5435
+5436
+5437
+5438
+5439
+5440
+5441
+5442
+5443
+5444
+5445
+5446
+5447
+5448
+5449
+5450
+5451
+5452
+5453
+5454
+5455
+5456
+5457
+5458
+5459
+5460
+5461
+5462
+5463
+5464
+5465
+5466
+5467
+5468
+5469
+5470
+5471
+5472
+5473
+5474
+5475
+5476
+5477
+5478
+5479
+5480
+5481
+5482
+5483
+5484
+5485
+5486
+5487
+5488
+5489
+5490
+5491
+5492
+5493
+5494
+5495
+5496
+5497
+5498
+5499
+5500
+5501
+5502
+5503
+5504
+5505
+5506
+5507
+5508
+5509
+5510
+5511
+5512
+5513
+5514
+5515
+5516
+5517
+5518
+5519
+5520
+5521
+5522
+5523
+5524
+5525
+5526
+5527
+5528
+5529
+5530
+5531
+5532
+5533
+5534
+5535
+5536
+5537
+5538
+5539
+5540
+5541
+5542
+5543
+5544
+5545
+5546
+5547
+5548
+5549
+5550
+5551
+5552
+5553
+5554
+5555
+5556
+5557
+5558
+5559
+5560
+5561
+5562
+5563
+5564
+5565
+5566
+5567
+5568
+5569
+5570
+5571
+5572
+5573
+5574
+5575
+5576
+5577
+5578
+5579
+5580
+5581
+5582
+5583
+5584
+5585
+5586
+5587
+5588
+5589
+5590
+5591
+5592
+5593
+5594
+5595
+5596
+5597
+5598
+5599
+5600
+5601
+5602
+5603
+5604
+5605
+5606
+5607
+5608
+5609
+5610
+5611
+5612
+5613
+5614
+5615
+5616
+5617
+5618
+5619
+5620
+5621
+5622
+5623
+5624
+5625
+5626
+5627
+5628
+5629
+5630
+5631
+5632
+5633
+5634
+5635
+5636
+5637
+5638
+5639
+5640
+5641
+5642
+5643
+5644
+5645
+5646
+5647
+5648
+5649
+5650
+5651
+5652
+5653
+5654
+5655
+5656
+5657
+5658
+5659
+5660
+5661
+5662
+5663
+5664
+5665
+5666
+5667
+5668
+5669
+5670
+5671
+5672
+5673
+5674
+5675
+5676
+5677
+5678
+5679
+5680
+5681
+5682
+5683
+5684
+5685
+5686
+5687
+5688
+5689
+5690
+5691
+5692
+5693
+5694
+5695
+5696
+5697
+5698
+5699
+5700
+5701
+5702
+5703
+5704
+5705
+5706
+5707
+5708
+5709
+5710
+5711
+5712
+5713
+5714
+5715
+5716
+5717
+5718
+5719
+5720
+5721
+5722
+5723
+5724
+5725
+5726
+5727
+5728
+5729
+5730
+5731
+5732
+5733
+5734
+5735
+5736
+5737
+5738
+5739
+5740
+5741
+5742
+5743
+5744
+5745
+5746
+5747
+5748
+5749
+5750
+5751
+5752
+5753
+5754
+5755
+5756
+5757
+5758
+5759
+5760
+5761
+5762
+5763
+5764
+5765
+5766
+5767
+5768
+5769
+5770
+5771
+5772
+5773
+5774
+5775
+5776
+5777
+5778
+5779
+5780
+5781
+5782
+5783
+5784
+5785
+5786
+5787
+5788
+5789
+5790
+5791
+5792
+5793
+5794
+5795
+5796
+5797
+5798
+5799
+5800
+5801
+5802
+5803
+5804
+5805
+5806
+5807
+5808
+5809
+5810
+5811
+5812
+5813
+5814
+5815
+5816
+5817
+5818
+5819
+5820
+5821
+5822
+5823
+5824
+5825
+5826
+5827
+5828
+5829
+5830
+5831
+5832
+5833
+5834
+5835
+5836
+5837
+5838
+5839
+5840
+5841
+5842
+5843
+5844
+5845
+5846
+5847
+5848
+5849
+5850
+5851
+5852
+5853
+5854
+5855
+5856
+5857
+5858
+5859
+5860
+5861
+5862
+5863
+5864
+5865
+5866
+5867
+5868
+5869
+5870
+5871
+5872
+5873
+5874
+5875
+5876
+5877
+5878
+5879
+5880
+5881
+5882
+5883
+5884
+5885
+5886
+5887
+5888
+5889
+5890
+5891
+5892
+5893
+5894
+5895
+5896
+5897
+5898
+5899
+5900
+5901
+5902
+5903
+5904
+5905
+5906
+5907
+5908
+5909
+5910
+5911
+5912
+5913
+5914
+5915
+5916
+5917
+5918
+5919
+5920
+5921
+5922
+5923
+5924
+5925
+5926
+5927
+5928
+5929
+5930
+5931
+5932
+5933
+5934
+5935
+5936
+5937
+5938
+5939
+5940
+5941
+5942
+5943
+5944
+5945
+5946
+5947
+5948
+5949
+5950
+5951
+5952
+5953
+5954
+5955
+5956
+5957
+5958
+5959
+5960
+5961
+5962
+5963
+5964
+5965
+5966
+5967
+5968
+5969
+5970
+5971
+5972
+5973
+5974
+5975
+5976
+5977
+5978
+5979
+5980
+5981
+5982
+5983
+5984
+5985
+5986
+5987
+5988
+5989
+5990
+5991
+5992
+5993
+5994
+5995
+5996
+5997
+5998
+5999
+6000
+6001
+6002
+6003
+6004
+6005
+6006
+6007
+6008
+6009
+6010
+6011
+6012
+6013
+6014
+6015
+6016
+6017
+6018
+6019
+6020
+6021
+6022
+6023
+6024
+6025
+6026
+6027
+6028
+6029
+6030
+6031
+6032
+6033
+6034
+6035
+6036
+6037
+6038
+6039
+6040
+6041
+6042
+6043
+6044
+6045
+6046
+6047
+6048
+6049
+6050
+6051
+6052
+6053
+6054
+6055
+6056
+6057
+6058
+6059
+6060
+6061
+6062
+6063
+6064
+6065
+6066
+6067
+6068
+6069
+6070
+6071
+6072
+6073
+6074
+6075
+6076
+6077
+6078
+6079
+6080
+6081
+6082
+6083
+6084
+6085
+6086
+6087
+6088
+6089
+6090
+6091
+6092
+6093
+6094
+6095
+6096
+6097
+6098
+6099
+6100
+6101
+6102
+6103
+6104
+6105
+6106
+6107
+6108
+6109
+6110
+6111
+6112
+6113
+6114
+6115
+6116
+6117
+6118
+6119
+6120
+6121
+6122
+6123
+6124
+6125
+6126
+6127
+6128
+6129
+6130
+6131
+6132
+6133
+6134
+6135
+6136
+6137
+6138
+6139
+6140
+6141
+6142
+6143
+6144
+6145
+6146
+6147
+6148
+6149
+6150
+6151
+6152
+6153
+6154
+6155
+6156
+6157
+6158
+6159
+6160
+6161
+6162
+6163
+6164
+6165
+6166
+6167
+6168
+6169
+6170
+6171
+6172
+6173
+6174
+6175
+6176
+6177
+6178
+6179
+6180
+6181
+6182
+6183
+6184
+6185
+6186
+6187
+6188
+6189
+6190
+6191
+6192
+6193
+6194
+6195
+6196
+6197
+6198
+6199
+6200
+6201
+6202
+6203
+6204
+6205
+6206
+6207
+6208
+6209
+6210
+6211
+6212
+6213
+6214
+6215
+6216
+6217
+6218
+6219
+6220
+6221
+6222
+6223
+6224
+6225
+6226
+6227
+6228
+6229
+6230
+6231
+6232
+6233
+6234
+6235
+6236
+6237
+6238
+6239
+6240
+6241
+6242
+6243
+6244
+6245
+6246
+6247
+6248
+6249
+6250
+6251
+6252
+6253
+6254
+6255
+6256
+6257
+6258
+6259
+6260
+6261
+6262
+6263
+6264
+6265
+6266
+6267
+6268
+6269
+6270
+6271
+6272
+6273
+6274
+6275
+6276
+6277
+6278
+6279
+6280
+6281
+6282
+6283
+6284
+6285
+6286
+6287
+6288
+6289
+6290
+6291
+6292
+6293
+6294
+6295
+6296
+6297
+6298
+6299
+6300
+6301
+6302
+6303
+6304
+6305
+6306
+6307
+6308
+6309
+6310
+6311
+6312
+6313
+6314
+6315
+6316
+6317
+6318
+6319
+6320
+6321
+6322
+6323
+6324
+6325
+6326
+6327
+6328
+6329
+6330
+6331
+6332
+6333
+6334
+6335
+6336
+6337
+6338
+6339
+6340
+6341
+6342
+6343
+6344
+6345
+6346
+6347
+6348
+6349
+6350
+6351
+6352
+6353
+6354
+6355
+6356
+6357
+6358
+6359
+6360
+6361
+6362
+6363
+6364
+6365
+6366
+6367
+6368
+6369
+6370
+6371
+6372
+6373
+6374
+6375
+6376
+6377
+6378
+6379
+6380
+6381
+6382
+6383
+6384
+6385
+6386
+6387
+6388
+6389
+6390
+6391
+6392
+6393
+6394
+6395
+6396
+6397
+6398
+6399
+6400
+6401
+6402
+6403
+6404
+6405
+6406
+6407
+6408
+6409
+6410
+6411
+6412
+6413
+6414
+6415
+6416
+6417
+6418
+6419
+6420
+6421
+6422
+6423
+6424
+6425
+6426
+6427
+6428
+6429
+6430
+6431
+6432
+6433
+6434
+6435
+6436
+6437
+6438
+6439
+6440
+6441
+6442
+6443
+6444
+6445
+6446
+6447
+6448
+6449
+6450
+6451
+6452
+6453
+6454
+6455
+6456
+6457
+6458
+6459
+6460
+6461
+6462
+6463
+6464
+6465
+6466
+6467
+6468
+6469
+6470
+6471
+6472
+6473
+6474
+6475
+6476
+6477
+6478
+6479
+6480
+6481
+6482
+6483
+6484
+6485
+6486
+6487
+6488
+6489
+6490
+6491
+6492
+6493
+6494
+6495
+6496
+6497
+6498
+6499
+6500
+6501
+6502
+6503
+6504
+6505
+6506
+6507
+6508
+6509
+6510
+6511
+6512
+6513
+6514
+6515
+6516
+6517
+6518
+6519
+6520
+6521
+6522
+6523
+6524
+6525
+6526
+6527
+6528
+6529
+6530
+6531
+6532
+6533
+6534
+6535
+6536
+6537
+6538
+6539
+6540
+6541
+6542
+6543
+6544
+6545
+6546
+6547
+6548
+6549
+6550
+6551
+6552
+6553
+6554
+6555
+6556
+6557
+6558
+6559
+6560
+6561
+6562
+6563
+6564
+6565
+6566
+6567
+6568
+6569
+6570
+6571
+6572
+6573
+6574
+6575
+6576
+6577
+6578
+6579
+6580
+6581
+6582
+6583
+6584
+6585
+6586
+6587
+6588
+6589
+6590
+6591
+6592
+6593
+6594
+6595
+6596
+6597
+6598
+6599
+6600
+6601
+6602
+6603
+6604
+6605
+6606
+6607
+6608
+6609
+6610
+6611
+6612
+6613
+6614
+6615
+6616
+6617
+6618
+6619
+6620
+6621
+6622
+6623
+6624
+6625
+6626
+6627
+6628
+6629
+6630
+6631
+6632
+6633
+6634
+6635
+6636
+6637
+6638
+6639
+6640
+6641
+6642
+6643
+6644
+6645
+6646
+6647
+6648
+6649
+6650
+6651
+6652
+6653
+6654
+6655
+6656
+6657
+6658
+6659
+6660
+6661
+6662
+6663
+6664
+6665
+6666
+6667
+6668
+6669
+6670
+6671
+6672
+6673
+6674
+6675
+6676
+6677
+6678
+6679
+6680
+6681
+6682
+6683
+6684
+6685
+6686
+6687
+6688
+6689
+6690
+6691
+6692
+6693
+6694
+6695
+6696
+6697
+6698
+6699
+6700
+6701
+6702
+6703
+6704
+6705
+6706
+6707
+6708
+6709
+6710
+6711
+6712
+6713
+6714
+6715
+6716
+6717
+6718
+6719
+6720
+6721
+6722
+6723
+6724
+6725
+6726
+6727
+6728
+6729
+6730
+6731
+6732
+6733
+6734
+6735
+6736
+6737
+6738
+6739
+6740
+6741
+6742
+6743
+6744
+6745
+6746
+6747
+6748
+6749
+6750
+6751
+6752
+6753
+6754
+6755
+6756
+6757
+6758
+6759
+6760
+6761
+6762
+6763
+6764
+6765
+6766
+6767
+6768
+6769
+6770
+6771
+6772
+6773
+6774
+6775
+6776
+6777
+6778
+6779
+6780
+6781
+6782
+6783
+6784
+6785
+6786
+6787
+6788
+6789
+6790
+6791
+6792
+6793
+6794
+6795
+6796
+6797
+6798
+6799
+6800
+6801
+6802
+6803
+6804
+6805
+6806
+6807
+6808
+6809
+6810
+6811
+6812
+6813
+6814
+6815
+6816
+6817
+6818
+6819
+6820
+6821
+6822
+6823
+6824
+6825
+6826
+6827
+6828
+6829
+6830
+6831
+6832
+6833
+6834
+6835
+6836
+6837
+6838
+6839
+6840
+6841
+6842
+6843
+6844
+6845
+6846
+6847
+6848
+6849
+6850
+6851
+6852
+6853
+6854
+6855
+6856
+6857
+6858
+6859
+6860
+6861
+6862
+6863
+6864
+6865
+6866
+6867
+6868
+6869
+6870
+6871
+6872
+6873
+6874
+6875
+6876
+6877
+6878
+6879
+6880
+6881
+6882
+6883
+6884
+6885
+6886
+6887
+6888
+6889
+6890
+6891
+6892
+6893
+6894
+6895
+6896
+6897
+6898
+6899
+6900
+6901
+6902
+6903
+6904
+6905
+6906
+6907
+6908
+6909
+6910
+6911
+6912
+6913
+6914
+6915
+6916
+6917
+6918
+6919
+6920
+6921
+6922
+6923
+6924
+6925
+6926
+6927
+6928
+6929
+6930
+6931
+6932
+6933
+6934
+6935
+6936
+6937
+6938
+6939
+6940
+6941
+6942
+6943
+6944
+6945
+6946
+6947
+6948
+6949
+6950
+6951
+6952
+6953
+6954
+6955
+6956
+6957
+6958
+6959
+6960
+6961
+6962
+6963
+6964
+6965
+6966
+6967
+6968
+6969
+6970
+6971
+6972
+6973
+6974
+6975
+6976
+6977
+6978
+6979
+6980
+6981
+6982
+6983
+6984
+6985
+6986
+6987
+6988
+6989
+6990
+6991
+6992
+6993
+6994
+6995
+6996
+6997
+6998
+6999
+7000
+7001
+7002
+7003
+7004
+7005
+7006
+7007
+7008
+7009
+7010
+7011
+7012
+7013
+7014
+7015
+7016
+7017
+7018
+7019
+7020
+7021
+7022
+7023
+7024
+7025
+7026
+7027
+7028
+7029
+7030
+7031
+7032
+7033
+7034
+7035
+7036
+7037
+7038
+7039
+7040
+7041
+7042
+7043
+7044
+7045
+7046
+7047
+7048
+7049
+7050
+7051
+7052
+7053
+7054
+7055
+7056
+7057
+7058
+7059
+7060
+7061
+7062
+7063
+7064
+7065
+7066
+7067
+7068
+7069
+7070
+7071
+7072
+7073
+7074
+7075
+7076
+7077
+7078
+7079
+7080
+7081
+7082
+7083
+7084
+7085
+7086
+7087
+7088
+7089
+7090
+7091
+7092
+7093
+7094
+7095
+7096
+7097
+7098
+7099
+7100
+7101
+7102
+7103
+7104
+7105
+7106
+7107
+7108
+7109
+7110
+7111
+7112
+7113
+7114
+7115
+7116
+7117
+7118
+7119
+7120
+7121
+7122
+7123
+7124
+7125
+7126
+7127
+7128
+7129
+7130
+7131
+7132
+7133
+7134
+7135
+7136
+7137
+7138
+7139
+7140
+7141
+7142
+7143
+7144
+7145
+7146
+7147
+7148
+7149
+7150
+7151
+7152
+7153
+7154
+7155
+7156
+7157
+7158
+7159
+7160
+7161
+7162
+7163
+7164
+7165
+7166
+7167
+7168
+7169
+7170
+7171
+7172
+7173
+7174
+7175
+7176
+7177
+7178
+7179
+7180
+7181
+7182
+7183
+7184
+7185
+7186
+7187
+7188
+7189
+7190
+7191
+7192
+7193
+7194
+7195
+7196
+7197
+7198
+7199
+7200
+7201
+7202
+7203
+7204
+7205
+7206
+7207
+7208
+7209
+7210
+7211
+7212
+7213
+7214
+7215
+7216
+7217
+7218
+7219
+7220
+7221
+7222
+7223
+7224
+7225
+7226
+7227
+7228
+7229
+7230
+7231
+7232
+7233
+7234
+7235
+7236
+7237
+7238
+7239
+7240
+7241
+7242
+7243
+7244
+7245
+7246
+7247
+7248
+7249
+7250
+7251
+7252
+7253
+7254
+7255
+7256
+7257
+7258
+7259
+7260
+7261
+7262
+7263
+7264
+7265
+7266
+7267
+7268
+7269
+7270
+7271
+7272
+7273
+7274
+7275
+7276
+7277
+7278
+7279
+7280
+7281
+7282
+7283
+7284
+7285
+7286
+7287
+7288
+7289
+7290
+7291
+7292
+7293
+7294
+7295
+7296
+7297
+7298
+7299
+7300
+7301
+7302
+7303
+7304
+7305
+7306
+7307
+7308
+7309
+7310
+7311
+7312
+7313
+7314
+7315
+7316
+7317
+7318
+7319
+7320
+7321
+7322
+7323
+7324
+7325
+7326
+7327
+7328
+7329
+7330
+7331
+7332
+7333
+7334
+7335
+7336
+7337
+7338
+7339
+7340
+7341
+7342
+7343
+7344
+7345
+7346
+7347
+7348
+7349
+7350
+7351
+7352
+7353
+7354
+7355
+7356
+7357
+7358
+7359
+7360
+7361
+7362
+7363
+7364
+7365
+7366
+7367
+7368
+7369
+7370
+7371
+7372
+7373
+7374
+7375
+7376
+7377
+7378
+7379
+7380
+7381
+7382
+7383
+7384
+7385
+7386
+7387
+7388
+7389
+7390
+7391
+7392
+7393
+7394
+7395
+7396
+7397
+7398
+7399
+7400
+7401
+7402
+7403
+7404
+7405
+7406
+7407
+7408
+7409
+7410
+7411
+7412
+7413
+7414
+7415
+7416
+7417
+7418
+7419
+7420
+7421
+7422
+7423
+7424
+7425
+7426
+7427
+7428
+7429
+7430
+7431
+7432
+7433
+7434
+7435
+7436
+7437
+7438
+7439
+7440
+7441
+7442
+7443
+7444
+7445
+7446
+7447
+7448
+7449
+7450
+7451
+7452
+7453
+7454
+7455
+7456
+7457
+7458
+7459
+7460
+7461
+7462
+7463
+7464
+7465
+7466
+7467
+7468
+7469
+7470
+7471
+7472
+7473
+7474
+7475
+7476
+7477
+7478
+7479
+7480
+7481
+7482
+7483
+7484
+7485
+7486
+7487
+7488
+7489
+7490
+7491
+7492
+7493
+7494
+7495
+7496
+7497
+7498
+7499
+7500
+7501
+7502
+7503
+7504
+7505
+7506
+7507
+7508
+7509
+7510
+7511
+7512
+7513
+7514
+7515
+7516
+7517
+7518
+7519
+7520
+7521
+7522
+7523
+7524
+7525
+7526
+7527
+7528
+7529
+7530
+7531
+7532
+7533
+7534
+7535
+7536
+7537
+7538
+7539
+7540
+7541
+7542
+7543
+7544
+7545
+7546
+7547
+7548
+7549
+7550
+7551
+7552
+7553
+7554
+7555
+7556
+7557
+7558
+7559
+7560
+7561
+7562
+7563
+7564
+7565
+7566
+7567
+7568
+7569
+7570
+7571
+7572
+7573
+7574
+7575
+7576
+7577
+7578
+7579
+7580
+7581
+7582
+7583
+7584
+7585
+7586
+7587
+7588
+7589
+7590
+7591
+7592
+7593
+7594
+7595
+7596
+7597
+7598
+7599
+7600
+7601
+7602
+7603
+7604
+7605
+7606
+7607
+7608
+7609
+7610
+7611
+7612
+7613
+7614
+7615
+7616
+7617
+7618
+7619
+7620
+7621
+7622
+7623
+7624
+7625
+7626
+7627
+7628
+7629
+7630
+7631
+7632
+7633
+7634
+7635
+7636
+7637
+7638
+7639
+7640
+7641
+7642
+7643
+7644
+7645
+7646
+7647
+7648
+7649
+7650
+7651
+7652
+7653
+7654
+7655
+7656
+7657
+7658
+7659
+7660
+7661
+7662
+7663
+7664
+7665
+7666
+7667
+7668
+7669
+7670
+7671
+7672
+7673
+7674
+7675
+7676
+7677
+7678
+7679
+7680
+7681
+7682
+7683
+7684
+7685
+7686
+7687
+7688
+7689
+7690
+7691
+7692
+7693
+7694
+7695
+7696
+7697
+7698
+7699
+7700
+7701
+7702
+7703
+7704
+7705
+7706
+7707
+7708
+7709
+7710
+7711
+7712
+7713
+7714
+7715
+7716
+7717
+7718
+7719
+7720
+7721
+7722
+7723
+7724
+7725
+7726
+7727
+7728
+7729
+7730
+7731
+7732
+7733
+7734
+7735
+7736
+7737
+7738
+7739
+7740
+7741
+7742
+7743
+7744
+7745
+7746
+7747
+7748
+7749
+7750
+7751
+7752
+7753
+7754
+7755
+7756
+7757
+7758
+7759
+7760
+7761
+7762
+7763
+7764
+7765
+7766
+7767
+7768
+7769
+7770
+7771
+7772
+7773
+7774
+7775
+7776
+7777
+7778
+7779
+7780
+7781
+7782
+7783
+7784
+7785
+7786
+7787
+7788
+7789
+7790
+7791
+7792
+7793
+7794
+7795
+7796
+7797
+7798
+7799
+7800
+7801
+7802
+7803
+7804
+7805
+7806
+7807
+7808
+7809
+7810
+7811
+7812
+7813
+7814
+7815
+7816
+7817
+7818
+7819
+7820
+7821
+7822
+7823
+7824
+7825
+7826
+7827
+7828
+7829
+7830
+7831
+7832
+7833
+7834
+7835
+7836
+7837
+7838
+7839
+7840
+7841
+7842
+7843
+7844
+7845
+7846
+7847
+7848
+7849
+7850
+7851
+7852
+7853
+7854
+7855
+7856
+7857
+7858
+7859
+7860
+7861
+7862
+7863
+7864
+7865
+7866
+7867
+7868
+7869
+7870
+7871
+7872
+7873
+7874
+7875
+7876
+7877
+7878
+7879
+7880
+7881
+7882
+7883
+7884
+7885
+7886
+7887
+7888
+7889
+7890
+7891
+7892
+7893
+7894
+7895
+7896
+7897
+7898
+7899
+7900
+7901
+7902
+7903
+7904
+7905
+7906
+7907
+7908
+7909
+7910
+7911
+7912
+7913
+7914
+7915
+7916
+7917
+7918
+7919
+7920
+7921
+7922
+7923
+7924
+7925
+7926
+7927
+7928
+7929
+7930
+7931
+7932
+7933
+7934
+7935
+7936
+7937
+7938
+7939
+7940
+7941
+7942
+7943
+7944
+7945
+7946
+7947
+7948
+7949
+7950
+7951
+7952
+7953
+7954
+7955
+7956
+7957
+7958
+7959
+7960
+7961
+7962
+7963
+7964
+7965
+7966
+7967
+7968
+7969
+7970
+7971
+7972
+7973
+7974
+7975
+7976
+7977
+7978
+7979
+7980
+7981
+7982
+7983
+7984
+7985
+7986
+7987
+7988
+7989
+7990
+7991
+7992
+7993
+7994
+7995
+7996
+7997
+7998
+7999
+8000
+8001
+8002
+8003
+8004
+8005
+8006
+8007
+8008
+8009
+8010
+8011
+8012
+8013
+8014
+8015
+8016
+8017
+8018
+8019
+8020
+8021
+8022
+8023
+8024
+8025
+8026
+8027
+8028
+8029
+8030
+8031
+8032
+8033
+8034
+8035
+8036
+8037
+8038
+8039
+8040
+8041
+8042
+8043
+8044
+8045
+8046
+8047
+8048
+8049
+8050
+8051
+8052
+8053
+8054
+8055
+8056
+8057
+8058
+8059
+8060
+8061
+8062
+8063
+8064
+8065
+8066
+8067
+8068
+8069
+8070
+8071
+8072
+8073
+8074
+8075
+8076
+8077
+8078
+8079
+8080
+8081
+8082
+8083
+8084
+8085
+8086
+8087
+8088
+8089
+8090
+8091
+8092
+8093
+8094
+8095
+8096
+8097
+8098
+8099
+8100
+8101
+8102
+8103
+8104
+8105
+8106
+8107
+8108
+8109
+8110
+8111
+8112
+8113
+8114
+8115
+8116
+8117
+8118
+8119
+8120
+8121
+8122
+8123
+8124
+8125
+8126
+8127
+8128
+8129
+8130
+8131
+8132
+8133
+8134
+8135
+8136
+8137
+8138
+8139
+8140
+8141
+8142
+8143
+8144
+8145
+8146
+8147
+8148
+8149
+8150
+8151
+8152
+8153
+8154
+8155
+8156
+8157
+8158
+8159
+8160
+8161
+8162
+8163
+8164
+8165
+8166
+8167
+8168
+8169
+8170
+8171
+8172
+8173
+8174
+8175
+8176
+8177
+8178
+8179
+8180
+8181
+8182
+8183
+8184
+8185
+8186
+8187
+8188
+8189
+8190
+8191
+8192
+8193
+8194
+8195
+8196
+8197
+8198
+8199
+8200
+8201
+8202
+8203
+8204
+8205
+8206
+8207
+8208
+8209
+8210
+8211
+8212
+8213
+8214
+8215
+8216
+8217
+8218
+8219
+8220
+8221
+8222
+8223
+8224
+8225
+8226
+8227
+8228
+8229
+8230
+8231
+8232
+8233
+8234
+8235
+8236
+8237
+8238
+8239
+8240
+8241
+8242
+8243
+8244
+8245
+8246
+8247
+8248
+8249
+8250
+8251
+8252
+8253
+8254
+8255
+8256
+8257
+8258
+8259
+8260
+8261
+8262
+8263
+8264
+8265
+8266
+8267
+8268
+8269
+8270
+8271
+8272
+8273
+8274
+8275
+8276
+8277
+8278
+8279
+8280
+8281
+8282
+8283
+8284
+8285
+8286
+8287
+8288
+8289
+8290
+8291
+8292
+8293
+8294
+8295
+8296
+8297
+8298
+8299
+8300
+8301
+8302
+8303
+8304
+8305
+8306
+8307
+8308
+8309
+8310
+8311
+8312
+8313
+8314
+8315
+8316
+8317
+8318
+8319
+8320
+8321
+8322
+8323
+8324
+8325
+8326
+8327
+8328
+8329
+8330
+8331
+8332
+8333
+8334
+8335
+8336
+8337
+8338
+8339
+8340
+8341
+8342
+8343
+8344
+8345
+8346
+8347
+8348
+8349
+8350
+8351
+8352
+8353
+8354
+8355
+8356
+8357
+8358
+8359
+8360
+8361
+8362
+8363
+8364
+8365
+8366
+8367
+8368
+8369
+8370
+8371
+8372
+8373
+8374
+8375
+8376
+8377
+8378
+8379
+8380
+8381
+8382
+8383
+8384
+8385
+8386
+8387
+8388
+8389
+8390
+8391
+8392
+8393
+8394
+8395
+8396
+8397
+8398
+8399
+8400
+8401
+8402
+8403
+8404
+8405
+8406
+8407
+8408
+8409
+8410
+8411
+8412
+8413
+8414
+8415
+8416
+8417
+8418
+8419
+8420
+8421
+8422
+8423
+8424
+8425
+8426
+8427
+8428
+8429
+8430
+8431
+8432
+8433
+8434
+8435
+8436
+8437
+8438
+8439
+8440
+8441
+8442
+8443
+8444
+8445
+8446
+8447
+8448
+8449
+8450
+8451
+8452
+8453
+8454
+8455
+8456
+8457
+8458
+8459
+8460
+8461
+8462
+8463
+8464
+8465
+8466
+8467
+8468
+8469
+8470
+8471
+8472
+8473
+8474
+8475
+8476
+8477
+8478
+8479
+8480
+8481
+8482
+8483
+8484
+8485
+8486
+8487
+8488
+8489
+8490
+8491
+8492
+8493
+8494
+8495
+8496
+8497
+8498
+8499
+8500
+8501
+8502
+8503
+8504
+8505
+8506
+8507
+8508
+8509
+8510
+8511
+8512
+8513
+8514
+8515
+8516
+8517
+8518
+8519
+8520
+8521
+8522
+8523
+8524
+8525
+8526
+8527
+8528
+8529
+8530
+8531
+8532
+8533
+8534
+8535
+8536
+8537
+8538
+8539
+8540
+8541
+8542
+8543
+8544
+8545
+8546
+8547
+8548
+8549
+8550
+8551
+8552
+8553
+8554
+8555
+8556
+8557
+8558
+8559
+8560
+8561
+8562
+8563
+8564
+8565
+8566
+8567
+8568
+8569
+8570
+8571
+8572
+8573
+8574
+8575
+8576
+8577
+8578
+8579
+8580
+8581
+8582
+8583
+8584
+8585
+8586
+8587
+8588
+8589
+8590
+8591
+8592
+8593
+8594
+8595
+8596
+8597
+8598
+8599
+8600
+8601
+8602
+8603
+8604
+8605
+8606
+8607
+8608
+8609
+8610
+8611
+8612
+8613
+8614
+8615
+8616
+8617
+8618
+8619
+8620
+8621
+8622
+8623
+8624
+8625
+8626
+8627
+8628
+8629
+8630
+8631
+8632
+8633
+8634
+8635
+8636
+8637
+8638
+8639
+8640
+8641
+8642
+8643
+8644
+8645
class Orthanc(httpx.Client):
+    """Orthanc API
+
+    version 1.12.3
+    This is the full documentation of the [REST API](https://orthanc.uclouvain.be/book/users/rest.html) of Orthanc.<p>This reference is automatically generated from the source code of Orthanc. A [shorter cheat sheet](https://orthanc.uclouvain.be/book/users/rest-cheatsheet.html) is part of the Orthanc Book.<p>An earlier, manually crafted version from August 2019, is [still available](2019-08-orthanc-openapi.html), but is not up-to-date anymore ([source](https://groups.google.com/g/orthanc-users/c/NUiJTEICSl8/m/xKeqMrbqAAAJ)).
+
+    """
+
+    def __init__(
+        self,
+        url: str,
+        username: Optional[str] = None,
+        password: Optional[str] = None,
+        return_raw_response: bool = False,
+        *args,
+        **kwargs,
+    ):
+        """
+        Parameters
+        ----------
+        url
+            server's URL
+        username
+            Orthanc's username
+        password
+            Orthanc's password
+        return_raw_response
+            All Orthanc's methods will return a raw httpx.Response rather than the serialized result
+        *args, **kwargs
+            Parameters passed to the httpx.Client (headers, timeout, etc.)
+        """
+        super().__init__(*args, **kwargs)
+        self.url = url
+        self.version = "1.12.3"
+        self.return_raw_response = return_raw_response
+
+        if username and password:
+            self.setup_credentials(username, password)
+
+    def setup_credentials(self, username: str, password: str) -> None:
+        """Set credentials needed for HTTP requests"""
+        self._auth = httpx.BasicAuth(username, password)
+
+    def _get(
+        self,
+        route: str,
+        params: Optional[QueryParamTypes] = None,
+        headers: Optional[HeaderTypes] = None,
+        cookies: Optional[CookieTypes] = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """GET request with specified route
+
+        Parameters
+        ----------
+        route
+            HTTP route.
+        params
+            Parameters for the HTTP request.
+        headers
+            Headers for the HTTP request.
+        cookies
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Serialized response of the HTTP GET request or httpx.Response.
+        """
+        response = self.get(url=route, params=params, headers=headers, cookies=cookies)
+
+        if self.return_raw_response:
+            return response
+
+        if 200 <= response.status_code < 300:
+            if "application/json" in response.headers["content-type"]:
+                return response.json()
+            elif "text/plain" in response.headers["content-type"]:
+                return response.text
+            else:
+                return response.content
+
+        raise httpx.HTTPError(
+            f"HTTP code: {response.status_code}, with content: {response.text}"
+        )
+
+    def _delete(
+        self,
+        route: str,
+        params: Optional[QueryParamTypes] = None,
+        headers: Optional[HeaderTypes] = None,
+        cookies: Optional[CookieTypes] = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """DELETE to specified route
+
+        Parameters
+        ----------
+        route
+            HTTP route.
+        params
+            Parameters for the HTTP request.
+        headers
+            Headers for the HTTP request.
+        cookies
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Serialized response of the HTTP DELETE request or httpx.Response.
+        """
+        response = self.delete(route, params=params, headers=headers, cookies=cookies)
+
+        if self.return_raw_response:
+            return response
+
+        if 200 <= response.status_code < 300:
+            if "application/json" in response.headers["content-type"]:
+                return response.json()
+            elif "text/plain" in response.headers["content-type"]:
+                return response.text
+            else:
+                return response.content
+
+        raise httpx.HTTPError(
+            f"HTTP code: {response.status_code}, with content: {response.text}"
+        )
+
+    def _post(
+        self,
+        route: str,
+        content: Optional[RequestContent] = None,
+        data: Optional[RequestData] = None,
+        files: Optional[RequestFiles] = None,
+        json: Optional[Any] = None,
+        params: Optional[QueryParamTypes] = None,
+        headers: Optional[HeaderTypes] = None,
+        cookies: Optional[CookieTypes] = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """POST to specified route
+
+        Parameters
+        ----------
+        route
+            HTTP route.
+        content
+        data
+            Dictionary to send in the body of request.
+        files
+        json
+        params
+        headers
+        cookies
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Serialized response of the HTTP POST request or httpx.Response.
+        """
+        response = self.post(
+            route,
+            content=content,
+            data=data,
+            files=files,
+            json=json,
+            params=params,
+            headers=headers,
+            cookies=cookies,
+        )
+
+        if self.return_raw_response:
+            return response
+
+        if 200 <= response.status_code < 300:
+            if "application/json" in response.headers["content-type"]:
+                return response.json()
+            elif "text/plain" in response.headers["content-type"]:
+                return response.text
+            else:
+                return response.content
+
+        raise httpx.HTTPError(
+            f"HTTP code: {response.status_code}, with text: {response.text}"
+        )
+
+    def _put(
+        self,
+        route: str,
+        content: RequestContent = None,
+        data: RequestData = None,
+        files: Optional[RequestFiles] = None,
+        json: Optional[Any] = None,
+        params: Optional[QueryParamTypes] = None,
+        headers: Optional[HeaderTypes] = None,
+        cookies: Optional[CookieTypes] = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """PUT to specified route
+
+        Parameters
+        ----------
+        route
+            HTTP route.
+        content
+        data
+            Dictionary to send in the body of request.
+        files
+        json
+        params
+        headers
+        cookies
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Serialized response of the HTTP PUT request or httpx.Response.
+        """
+        response = self.put(
+            route,
+            content=content,
+            data=data,
+            files=files,
+            json=json,
+            params=params,
+            headers=headers,
+            cookies=cookies,
+        )
+
+        if self.return_raw_response:
+            return response
+
+        if 200 <= response.status_code < 300:
+            if "application/json" in response.headers["content-type"]:
+                return response.json()
+            elif "text/plain" in response.headers["content-type"]:
+                return response.text
+            else:
+                return response.content
+
+        raise httpx.HTTPError(
+            f"HTTP code: {response.status_code}, with text: {response.text}"
+        )
+
+    def delete_changes(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Clear changes
+
+        Clear the full history stored in the changes log
+        Tags: Tracking changes
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/changes",
+        )
+
+    def get_changes(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List changes
+
+        Whenever Orthanc receives a new DICOM instance, this event is recorded in the so-called _Changes Log_. This enables remote scripts to react to the arrival of new DICOM resources. A typical application is auto-routing, where an external script waits for a new DICOM instance to arrive into Orthanc, then forward this instance to another modality.
+        Tags: Tracking changes
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "limit" (float): Limit the number of results
+                "since" (float): Show only the resources since the provided index
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The list of changes
+        """
+        return self._get(
+            route=f"{self.url}/changes",
+            params=params,
+        )
+
+    def delete_exports(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Clear exports
+
+        Clear the full history stored in the exports log
+        Tags: Tracking changes
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/exports",
+        )
+
+    def get_exports(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List exports
+
+        For medical traceability, Orthanc can be configured to store a log of all the resources that have been exported to remote modalities. In auto-routing scenarios, it is important to prevent this log to grow indefinitely as incoming instances are routed. You can either disable this logging by setting the option `LogExportedResources` to `false` in the configuration file, or periodically clear this log by `DELETE`-ing this URI. This route might be removed in future versions of Orthanc.
+        Tags: Tracking changes
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "limit" (float): Limit the number of results
+                "since" (float): Show only the resources since the provided index
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The list of exports
+        """
+        return self._get(
+            route=f"{self.url}/exports",
+            params=params,
+        )
+
+    def get_instances(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List the available instances
+
+        List the Orthanc identifiers of all the available DICOM instances
+        Tags: Instances
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual instances
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "limit" (float): Limit the number of results
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "since" (float): Show only the resources since the provided index
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the Orthanc identifiers, or detailed information about the reported instances (if `expand` argument is provided)
+        """
+        return self._get(
+            route=f"{self.url}/instances",
+            params=params,
+        )
+
+    def post_instances(
+        self,
+        content: RequestContent = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Upload DICOM instances
+
+        Upload DICOM instances
+        Tags: Instances
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the uploaded instance, or list of information for each uploaded instance in the case of ZIP archive
+        """
+        return self._post(
+            route=f"{self.url}/instances",
+            content=content,
+        )
+
+    def delete_instances_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete some instance
+
+        Delete the DICOM instance whose Orthanc identifier is provided in the URL
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/instances/{id_}",
+        )
+
+    def get_instances_id(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get information about some instance
+
+        Get detailed information about the DICOM instance whose Orthanc identifier is provided in the URL
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM instance
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}",
+            params=params,
+        )
+
+    def post_instances_id_anonymize(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Anonymize instance
+
+        Download an anonymized version of the DICOM instance whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-a-single-instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        json
+            Dictionary with the following keys:
+              "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+              "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The anonymized DICOM instance
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/instances/{id_}/anonymize",
+            json=json,
+        )
+
+    def get_instances_id_attachments(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List attachments
+
+        Get the list of attachments that are associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "full" (str): If present, retrieve the attachments list and their numerical ids
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the attachments
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/attachments",
+            params=params,
+        )
+
+    def delete_instances_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete attachment
+
+        Delete an attachment associated with the given DICOM instance. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/instances/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    def get_instances_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List operations on attachments
+
+        Get the list of the operations that are available for attachments associated with the given instance
+        Tags: Other
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    def put_instances_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        content: RequestContent = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set attachment
+
+        Attach a file to the given DICOM instance. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        content
+                - (Content-Type: "application/octet-stream") Binary data containing the attachment
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return self._put(
+            route=f"{self.url}/instances/{id_}/attachments/{name}",
+            content=content,
+            headers=headers,
+        )
+
+    def post_instances_id_attachments_name_compress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Compress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/compress",
+        )
+
+    def get_instances_id_attachments_name_compressed_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get attachment (no decompression)
+
+        Get the (binary) content of one attachment associated with the given instance. The attachment will not be decompressed if `StorageCompression` is `true`.
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/compressed-data",
+            headers=headers,
+        )
+
+    def get_instances_id_attachments_name_compressed_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get MD5 of attachment on disk
+
+        Get the MD5 hash of one attachment associated with the given instance, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment, as stored on the disk
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/compressed-md5",
+            headers=headers,
+        )
+
+    def get_instances_id_attachments_name_compressed_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get size of attachment on disk
+
+        Get the size of one attachment associated with the given instance, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment, as stored on the disk
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/compressed-size",
+            headers=headers,
+        )
+
+    def get_instances_id_attachments_name_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get attachment
+
+        Get the (binary) content of one attachment associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/data",
+            headers=headers,
+        )
+
+    def get_instances_id_attachments_name_info(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get info about the attachment
+
+        Get all the information about the attachment associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the information about the attachment
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/info",
+            headers=headers,
+        )
+
+    def get_instances_id_attachments_name_is_compressed(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Is attachment compressed?
+
+        Test whether the attachment has been stored as a compressed file on the disk.
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `0` if the attachment was stored uncompressed, `1` if it was compressed
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/is-compressed",
+            headers=headers,
+        )
+
+    def get_instances_id_attachments_name_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get MD5 of attachment
+
+        Get the MD5 hash of one attachment associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/md5",
+            headers=headers,
+        )
+
+    def get_instances_id_attachments_name_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get size of attachment
+
+        Get the size of one attachment associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/size",
+            headers=headers,
+        )
+
+    def post_instances_id_attachments_name_uncompress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Uncompress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/uncompress",
+        )
+
+    def post_instances_id_attachments_name_verify_md5(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Verify attachment
+
+        Verify that the attachment is not corrupted, by validating its MD5 hash
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            On success, a valid JSON object is returned
+        """
+        return self._post(
+            route=f"{self.url}/instances/{id_}/attachments/{name}/verify-md5",
+        )
+
+    def get_instances_id_content_path(
+        self,
+        id_: str,
+        path: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get raw tag
+
+        Get the raw content of one DICOM tag in the hierarchy of DICOM dataset
+        Tags: Instances
+
+        Parameters
+        ----------
+        path
+            Path to the DICOM tag. This is the interleaving of one DICOM tag, possibly followed by an index for sequences. Sequences are accessible as, for instance, `/0008-1140/1/0008-1150`
+        id_
+            Orthanc identifier of the DICOM instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The raw value of the tag of intereset (binary data, whose memory layout depends on the underlying transfer syntax), or JSON array containing the list of available tags if accessing a dataset
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/content/{path}",
+        )
+
+    def post_instances_id_export(
+        self,
+        id_: str,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Write DICOM onto filesystem
+
+        Write the DICOM file onto the filesystem where Orthanc is running.  This is insecure for Orthanc servers that are remotely accessible since one could overwrite any system file.  Since Orthanc 1.12.0, this route is disabled by default, but can be enabled using the `RestApiWriteToFileSystemEnabled` configuration option.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        data
+            Target path on the filesystem
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/instances/{id_}/export",
+            data=data,
+        )
+
+    def get_instances_id_file(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Download DICOM
+
+        Download one DICOM instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "transcode" (str): If present, the DICOM file will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): This HTTP header can be set to retrieve the DICOM instance in DICOMweb format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The DICOM instance
+            The DICOM instance, in DICOMweb JSON format
+            The DICOM instance, in DICOMweb XML format
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/file",
+            params=params,
+            headers=headers,
+        )
+
+    def get_instances_id_frames(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List available frames
+
+        List the frames that are available in the DICOM instance of interest
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The list of the indices of the available frames
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/frames",
+        )
+
+    def get_instances_id_frames_frame(
+        self,
+        frame: str,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List operations
+
+        List the available operations under URI `/instances/{id}/frames/{frame}/`
+        Tags: Other
+
+        Parameters
+        ----------
+        frame
+
+        id_
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}",
+        )
+
+    def get_instances_id_frames_frame_image_int16(
+        self,
+        frame: float,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode a frame (int16)
+
+        Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [-32768,32767] range. Negative values must be interpreted according to two's complement.
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/image-int16",
+            params=params,
+            headers=headers,
+        )
+
+    def get_instances_id_frames_frame_image_uint16(
+        self,
+        frame: float,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode a frame (uint16)
+
+        Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [0,65535] range.
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/image-uint16",
+            params=params,
+            headers=headers,
+        )
+
+    def get_instances_id_frames_frame_image_uint8(
+        self,
+        frame: float,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode a frame (uint8)
+
+        Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [0,255] range.
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/image-uint8",
+            params=params,
+            headers=headers,
+        )
+
+    def get_instances_id_frames_frame_matlab(
+        self,
+        frame: float,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode frame for Matlab
+
+        Decode one frame of interest from the given DICOM instance, and export this frame as a Octave/Matlab matrix to be imported with `eval()`: https://orthanc.uclouvain.be/book/faq/matlab.html
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Octave/Matlab matrix
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/matlab",
+        )
+
+    def get_instances_id_frames_frame_numpy(
+        self,
+        frame: float,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode frame for numpy
+
+        Decode one frame of interest from the given DICOM instance, for use with numpy in Python. The numpy array has 3 dimensions: (height, width, color channel).
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM resource of interest
+        params
+            Dictionary of optional parameters:
+                "compress" (bool): Compress the file as `.npz`
+                "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/numpy",
+            params=params,
+        )
+
+    def get_instances_id_frames_frame_preview(
+        self,
+        frame: float,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode a frame (preview)
+
+        Decode one frame of interest from the given DICOM instance. The full dynamic range of grayscale images is rescaled to the [0,255] range.
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/preview",
+            params=params,
+            headers=headers,
+        )
+
+    def get_instances_id_frames_frame_raw(
+        self,
+        frame: float,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Access raw frame
+
+        Access the raw content of one individual frame of the DICOM instance of interest, bypassing image decoding. This is notably useful to access the source files in compressed transfer syntaxes.
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The raw frame
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/raw",
+        )
+
+    def get_instances_id_frames_frame_raw_gz(
+        self,
+        frame: float,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Access raw frame (compressed)
+
+        Access the raw content of one individual frame of the DICOM instance of interest, bypassing image decoding. This is notably useful to access the source files in compressed transfer syntaxes. The image is compressed using gzip
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The raw frame, compressed using gzip
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/raw.gz",
+        )
+
+    def get_instances_id_frames_frame_rendered(
+        self,
+        frame: float,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Render a frame
+
+        Render one frame of interest from the given DICOM instance. This function takes scaling into account (`RescaleSlope` and `RescaleIntercept` tags), as well as the default windowing stored in the DICOM file (`WindowCenter` and `WindowWidth`tags), and can be used to resize the resulting image. Color images are not affected by windowing.
+        Tags: Instances
+
+        Parameters
+        ----------
+        frame
+            Index of the frame (starts at `0`)
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "height" (float): Height of the resized image
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+                "smooth" (bool): Whether to smooth image on resize
+                "width" (float): Width of the resized image
+                "window-center" (float): Windowing center
+                "window-width" (float): Windowing width
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/frames/{frame}/rendered",
+            params=params,
+            headers=headers,
+        )
+
+    def get_instances_id_header(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get DICOM meta-header
+
+        Get the DICOM tags in the meta-header of the DICOM instance. By default, the `full` format is used, which combines hexadecimal tags with human-readable description.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the DICOM tags and their associated value
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/header",
+            params=params,
+        )
+
+    def get_instances_id_image_int16(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode an image (int16)
+
+        Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [-32768,32767] range. Negative values must be interpreted according to two's complement.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/image-int16",
+            params=params,
+            headers=headers,
+        )
+
+    def get_instances_id_image_uint16(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode an image (uint16)
+
+        Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [0,65535] range.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/image-uint16",
+            params=params,
+            headers=headers,
+        )
+
+    def get_instances_id_image_uint8(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode an image (uint8)
+
+        Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [0,255] range.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/image-uint8",
+            params=params,
+            headers=headers,
+        )
+
+    def get_instances_id_labels(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List labels
+
+        Get the labels that are associated with the given instance (new in Orthanc 1.12.0)
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the labels
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/labels",
+        )
+
+    def delete_instances_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Remove label
+
+        Remove a label associated with a instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        label
+            The label to be removed
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/instances/{id_}/labels/{label}",
+        )
+
+    def get_instances_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Test label
+
+        Test whether the instance is associated with the given label
+        Tags: Instances
+
+        Parameters
+        ----------
+        label
+            The label of interest
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty string is returned in the case of presence, error 404 in the case of absence
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/labels/{label}",
+        )
+
+    def put_instances_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Add label
+
+        Associate a label with a instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        label
+            The label to be added
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/instances/{id_}/labels/{label}",
+        )
+
+    def get_instances_id_matlab(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode frame for Matlab
+
+        Decode the first frame of the given DICOM instance., and export this frame as a Octave/Matlab matrix to be imported with `eval()`: https://orthanc.uclouvain.be/book/faq/matlab.html
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Octave/Matlab matrix
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/matlab",
+        )
+
+    def get_instances_id_metadata(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List metadata
+
+        Get the list of metadata that are associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, also retrieve the value of the individual metadata
+                "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/metadata",
+            params=params,
+        )
+
+    def delete_instances_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete metadata
+
+        Delete some metadata associated with the given DICOM instance. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/instances/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    def get_instances_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get metadata
+
+        Get the value of a metadata that is associated with the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Value of the metadata
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    def put_instances_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        data: RequestData = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set metadata
+
+        Set the value of some metadata in the given DICOM instance. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+        Tags: Instances
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the instance of interest
+        data
+            String value of the metadata
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/instances/{id_}/metadata/{name}",
+            data=data,
+            headers=headers,
+        )
+
+    def post_instances_id_modify(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Modify instance
+
+        Download a modified version of the DICOM instance whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-a-single-instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        json
+            Dictionary with the following keys:
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The modified DICOM instance
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/instances/{id_}/modify",
+            json=json,
+        )
+
+    def get_instances_id_module(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get instance module
+
+        Get the instance module of the DICOM instance whose Orthanc identifier is provided in the URL
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM instance
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/module",
+            params=params,
+        )
+
+    def get_instances_id_numpy(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode instance for numpy
+
+        Decode the given DICOM instance, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel).
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM resource of interest
+        params
+            Dictionary of optional parameters:
+                "compress" (bool): Compress the file as `.npz`
+                "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/numpy",
+            params=params,
+        )
+
+    def get_instances_id_patient(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get parent patient
+
+        Get detailed information about the parent patient of the DICOM instance whose Orthanc identifier is provided in the URL
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the parent DICOM patient
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/patient",
+            params=params,
+        )
+
+    def get_instances_id_pdf(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get embedded PDF
+
+        Get the PDF file that is embedded in one DICOM instance. If the DICOM instance doesn't contain the `EncapsulatedDocument` tag or if the `MIMETypeOfEncapsulatedDocument` tag doesn't correspond to the PDF type, a `404` HTTP error is raised.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            PDF file
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/pdf",
+        )
+
+    def get_instances_id_preview(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode an image (preview)
+
+        Decode the first frame of the given DICOM instance. The full dynamic range of grayscale images is rescaled to the [0,255] range.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/preview",
+            params=params,
+            headers=headers,
+        )
+
+    def post_instances_id_reconstruct(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Reconstruct tags & optionally files of instance
+
+        Reconstruct the main DICOM tags in DB of the instance whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        json
+            Dictionary with the following keys:
+              "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/instances/{id_}/reconstruct",
+            json=json,
+        )
+
+    def get_instances_id_rendered(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Render an image
+
+        Render the first frame of the given DICOM instance. This function takes scaling into account (`RescaleSlope` and `RescaleIntercept` tags), as well as the default windowing stored in the DICOM file (`WindowCenter` and `WindowWidth`tags), and can be used to resize the resulting image. Color images are not affected by windowing.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "height" (float): Height of the resized image
+                "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+                "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+                "smooth" (bool): Whether to smooth image on resize
+                "width" (float): Width of the resized image
+                "window-center" (float): Windowing center
+                "window-width" (float): Windowing width
+        headers
+            Dictionary of optional headers:
+                "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JPEG image
+            PNG image
+            PAM image (Portable Arbitrary Map)
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/rendered",
+            params=params,
+            headers=headers,
+        )
+
+    def get_instances_id_series(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get parent series
+
+        Get detailed information about the parent series of the DICOM instance whose Orthanc identifier is provided in the URL
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the parent DICOM series
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/series",
+            params=params,
+        )
+
+    def get_instances_id_simplified_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get human-readable tags
+
+        Get the DICOM tags in human-readable format (same as the `/instances/{id}/tags?simplify` route)
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the DICOM tags and their associated value
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/simplified-tags",
+            params=params,
+        )
+
+    def get_instances_id_statistics(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get instance statistics
+
+        Get statistics about the given instance
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/statistics",
+        )
+
+    def get_instances_id_study(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get parent study
+
+        Get detailed information about the parent study of the DICOM instance whose Orthanc identifier is provided in the URL
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the instance of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the parent DICOM study
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/study",
+            params=params,
+        )
+
+    def get_instances_id_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get DICOM tags
+
+        Get the DICOM tags in the specified format. By default, the `full` format is used, which combines hexadecimal tags with human-readable description.
+        Tags: Instances
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM instance of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the DICOM tags and their associated value
+        """
+        return self._get(
+            route=f"{self.url}/instances/{id_}/tags",
+            params=params,
+        )
+
+    def get_jobs(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List jobs
+
+        List all the available jobs
+        Tags: Jobs
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual jobs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the jobs identifiers, or detailed information about the reported jobs (if `expand` argument is provided)
+        """
+        return self._get(
+            route=f"{self.url}/jobs",
+            params=params,
+        )
+
+    def delete_jobs_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete a job from history
+
+        Delete the job from the jobs history.  Only a completed job can be deleted. If the job has not run or not completed yet, you must cancel it first. If the job has outputs, all outputs will be deleted as well.
+        Tags: Jobs
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/jobs/{id_}",
+        )
+
+    def get_jobs_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get job
+
+        Retrieve detailed information about the job whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        Tags: Jobs
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object detailing the job
+        """
+        return self._get(
+            route=f"{self.url}/jobs/{id_}",
+        )
+
+    def post_jobs_id_cancel(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Cancel job
+
+        Cancel the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        Tags: Jobs
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return self._post(
+            route=f"{self.url}/jobs/{id_}/cancel",
+        )
+
+    def post_jobs_id_pause(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Pause job
+
+        Pause the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        Tags: Jobs
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return self._post(
+            route=f"{self.url}/jobs/{id_}/pause",
+        )
+
+    def post_jobs_id_resubmit(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Resubmit job
+
+        Resubmit the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        Tags: Jobs
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return self._post(
+            route=f"{self.url}/jobs/{id_}/resubmit",
+        )
+
+    def post_jobs_id_resume(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Resume job
+
+        Resume the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        Tags: Jobs
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return self._post(
+            route=f"{self.url}/jobs/{id_}/resume",
+        )
+
+    def delete_jobs_id_key(
+        self,
+        id_: str,
+        key: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete a job output
+
+        Delete the output produced by a job. As of Orthanc 1.12.1, only the jobs that generate a DICOMDIR media or a ZIP archive provide such an output (with `key` equals to `archive`).
+        Tags: Jobs
+
+        Parameters
+        ----------
+        key
+            Name of the output of interest
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/jobs/{id_}/{key}",
+        )
+
+    def get_jobs_id_key(
+        self,
+        id_: str,
+        key: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get job output
+
+        Retrieve some output produced by a job. As of Orthanc 1.8.2, only the jobs that generate a DICOMDIR media or a ZIP archive provide such an output (with `key` equals to `archive`).
+        Tags: Jobs
+
+        Parameters
+        ----------
+        key
+            Name of the output of interest
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Content of the output of the job
+        """
+        return self._get(
+            route=f"{self.url}/jobs/{id_}/{key}",
+        )
+
+    def get_modalities(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List DICOM modalities
+
+        List all the DICOM modalities that are known to Orthanc. This corresponds either to the content of the `DicomModalities` configuration option, or to the information stored in the database if `DicomModalitiesInDatabase` is `true`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual DICOM modalities
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the identifiers of the modalities, or detailed information about the modalities (if `expand` argument is provided)
+        """
+        return self._get(
+            route=f"{self.url}/modalities",
+            params=params,
+        )
+
+    def delete_modalities_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete DICOM modality
+
+        Delete one DICOM modality. This change is permanent iff. `DicomModalitiesInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the DICOM modality of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/modalities/{id_}",
+        )
+
+    def get_modalities_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List operations on modality
+
+        List the operations that are available for a DICOM modality.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the DICOM modality of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return self._get(
+            route=f"{self.url}/modalities/{id_}",
+        )
+
+    def put_modalities_id(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Update DICOM modality
+
+        Define a new DICOM modality, or update an existing one. This change is permanent iff. `DicomModalitiesInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the new/updated DICOM modality
+        json
+            Dictionary with the following keys:
+              "AET": AET of the remote DICOM modality
+              "AllowEcho": Whether to accept C-ECHO SCU commands issued by the remote modality
+              "AllowFind": Whether to accept C-FIND SCU commands issued by the remote modality
+              "AllowFindWorklist": Whether to accept C-FIND SCU commands for worklists issued by the remote modality
+              "AllowGet": Whether to accept C-GET SCU commands issued by the remote modality
+              "AllowMove": Whether to accept C-MOVE SCU commands issued by the remote modality
+              "AllowStorageCommitment": Whether to accept storage commitment requests issued by the remote modality
+              "AllowStore": Whether to accept C-STORE SCU commands issued by the remote modality
+              "AllowTranscoding": Whether to allow transcoding for operations initiated by this modality. This option applies to Orthanc C-GET SCP and to Orthanc C-STORE SCU. It only has an effect if the global option `EnableTranscoding` is set to `true`.
+              "Host": Host address of the remote DICOM modality (typically, an IP address)
+              "Manufacturer": Manufacturer of the remote DICOM modality (check configuration option `DicomModalities` for possible values
+              "Port": TCP port of the remote DICOM modality
+              "UseDicomTls": Whether to use DICOM TLS in the SCU connection initiated by Orthanc (new in Orthanc 1.9.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return self._put(
+            route=f"{self.url}/modalities/{id_}",
+            json=json,
+        )
+
+    def get_modalities_id_configuration(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get modality configuration
+
+        Get detailed information about the configuration of some DICOM modality
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Configuration of the modality
+        """
+        return self._get(
+            route=f"{self.url}/modalities/{id_}/configuration",
+        )
+
+    def post_modalities_id_echo(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Trigger C-ECHO SCU
+
+        Trigger C-ECHO SCU command against the DICOM modality whose identifier is provided in URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-c-echo
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "CheckFind": Issue a dummy C-FIND command after the C-GET SCU, in order to check whether the remote modality knows about Orthanc. This field defaults to the value of the `DicomEchoChecksFind` configuration option. New in Orthanc 1.8.1.
+              "Timeout": Timeout for the C-ECHO command, in seconds
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/modalities/{id_}/echo",
+            json=json,
+        )
+
+    def post_modalities_id_find(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Hierarchical C-FIND SCU
+
+        Trigger a sequence of C-FIND SCU commands against the DICOM modality whose identifier is provided in URL, in order to discover a hierarchy of matching patients/studies/series. Deprecated in favor of `/modalities/{id}/query`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array describing the DICOM tags of the matching patients, embedding the matching studies, then the matching series.
+        """
+        warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/modalities/{id_}/find",
+            json=json,
+        )
+
+    def post_modalities_id_find_instance(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """C-FIND SCU for instances
+
+        Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find an instance. Deprecated in favor of `/modalities/{id}/query`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array describing the DICOM tags of the matching instances
+        """
+        warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/modalities/{id_}/find-instance",
+            json=json,
+        )
+
+    def post_modalities_id_find_patient(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """C-FIND SCU for patients
+
+        Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a patient. Deprecated in favor of `/modalities/{id}/query`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array describing the DICOM tags of the matching patients
+        """
+        warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/modalities/{id_}/find-patient",
+            json=json,
+        )
+
+    def post_modalities_id_find_series(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """C-FIND SCU for series
+
+        Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a series. Deprecated in favor of `/modalities/{id}/query`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array describing the DICOM tags of the matching series
+        """
+        warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/modalities/{id_}/find-series",
+            json=json,
+        )
+
+    def post_modalities_id_find_study(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """C-FIND SCU for studies
+
+        Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a study. Deprecated in favor of `/modalities/{id}/query`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array describing the DICOM tags of the matching studies
+        """
+        warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/modalities/{id_}/find-study",
+            json=json,
+        )
+
+    def post_modalities_id_find_worklist(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """C-FIND SCU for worklist
+
+        Trigger C-FIND SCU command against the remote worklists of the DICOM modality whose identifier is provided in URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+              "Query": Associative array containing the filter on the values of the DICOM tags
+              "Short": If set to `true`, report the DICOM tags in hexadecimal format
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array describing the DICOM tags of the matching worklists
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/modalities/{id_}/find-worklist",
+            json=json,
+        )
+
+    def post_modalities_id_move(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Trigger C-MOVE SCU
+
+        Start a C-MOVE SCU command as a job, in order to drive the execution of a sequence of C-STORE commands by some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-c-move
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Level": Level of the query (`Patient`, `Study`, `Series` or `Instance`)
+              "LocalAet": Local AET that is used for this commands, defaults to `DicomAet` configuration option. Ignored if `DicomModalities` already sets `LocalAet` for this modality.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": List of queries identifying all the DICOM resources to be sent
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "TargetAet": Target AET that will be used by the remote DICOM modality as a target for its C-STORE SCU commands, defaults to `DicomAet` configuration option in order to do a simple query/retrieve
+              "Timeout": Timeout for the C-MOVE command, in seconds
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/modalities/{id_}/move",
+            json=json,
+        )
+
+    def post_modalities_id_query(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Trigger C-FIND SCU
+
+        Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-query-retrieve-c-find-and-find-with-rest
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "Level": Level of the query (`Patient`, `Study`, `Series` or `Instance`)
+              "LocalAet": Local AET that is used for this commands, defaults to `DicomAet` configuration option. Ignored if `DicomModalities` already sets `LocalAet` for this modality.
+              "Normalize": Whether to normalize the query, i.e. whether to wipe out from the query, the DICOM tags that are not applicable for the query-retrieve level of interest
+              "Query": Associative array containing the filter on the values of the DICOM tags
+              "Timeout": Timeout for the C-FIND command and subsequent C-MOVE retrievals, in seconds (new in Orthanc 1.9.1)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/modalities/{id_}/query",
+            json=json,
+        )
+
+    def post_modalities_id_storage_commitment(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Trigger storage commitment request
+
+        Trigger a storage commitment request to some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/storage-commitment.html#storage-commitment-scu
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "DicomInstances": List of DICOM resources that are not necessarily stored within Orthanc, but that must be checked by storage commitment. This is a list of JSON objects that must contain the `SOPClassUID` and `SOPInstanceUID` fields.
+              "Resources": List of the Orthanc identifiers of the DICOM resources to be checked by storage commitment
+              "Timeout": Timeout for the storage commitment command (new in Orthanc 1.9.1)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/modalities/{id_}/storage-commitment",
+            json=json,
+        )
+
+    def post_modalities_id_store(
+        self,
+        id_: str,
+        data: RequestData = None,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Trigger C-STORE SCU
+
+        Start a C-STORE SCU command as a job, in order to send DICOM resources stored locally to some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#rest-store-scu
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "CalledAet": Called AET that is used for this commands, defaults to `AET` configuration option. Allows you to overwrite the destination AET for a specific operation.
+              "Host": Host that is used for this commands, defaults to `Host` configuration option. Allows you to overwrite the destination host for a specific operation.
+              "LocalAet": Local AET that is used for this commands, defaults to `DicomAet` configuration option. Ignored if `DicomModalities` already sets `LocalAet` for this modality.
+              "MoveOriginatorAet": Move originator AET that is used for this commands, in order to fake a C-MOVE SCU
+              "MoveOriginatorID": Move originator ID that is used for this commands, in order to fake a C-MOVE SCU
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Port": Port that is used for this command, defaults to `Port` configuration option. Allows you to overwrite the destination port for a specific operation.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": List of the Orthanc identifiers of all the DICOM resources to be sent
+              "StorageCommitment": Whether to chain C-STORE with DICOM storage commitment to validate the success of the transmission: https://orthanc.uclouvain.be/book/users/storage-commitment.html#chaining-c-store-with-storage-commitment
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Timeout": Timeout for the C-STORE command, in seconds
+
+        data
+            The Orthanc identifier of one resource to be sent
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/modalities/{id_}/store",
+            data=data,
+            json=json,
+        )
+
+    def post_modalities_id_store_straight(
+        self,
+        id_: str,
+        content: RequestContent = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Straight C-STORE SCU
+
+        Synchronously send the DICOM instance in the POST body to the remote DICOM modality whose identifier is provided in URL, without having to first store it locally within Orthanc. This is an alternative to command-line tools such as `storescu` from DCMTK or dcm4che.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        content
+                - (Content-Type: "application/dicom") DICOM instance to be sent
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return self._post(
+            route=f"{self.url}/modalities/{id_}/store-straight",
+            content=content,
+        )
+
+    def get_patients(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List the available patients
+
+        List the Orthanc identifiers of all the available DICOM patients
+        Tags: Patients
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual patients
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "limit" (float): Limit the number of results
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "since" (float): Show only the resources since the provided index
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the Orthanc identifiers, or detailed information about the reported patients (if `expand` argument is provided)
+        """
+        return self._get(
+            route=f"{self.url}/patients",
+            params=params,
+        )
+
+    def delete_patients_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete some patient
+
+        Delete the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/patients/{id_}",
+        )
+
+    def get_patients_id(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get information about some patient
+
+        Get detailed information about the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM patient
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}",
+            params=params,
+        )
+
+    def post_patients_id_anonymize(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Anonymize patient
+
+        Start a job that will anonymize all the DICOM instances within the patient whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new patient, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+              "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/patients/{id_}/anonymize",
+            json=json,
+        )
+
+    def get_patients_id_archive(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create ZIP archive
+
+        Synchronously create a ZIP archive containing the DICOM patient whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+                "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            ZIP file containing the archive
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/archive",
+            params=params,
+        )
+
+    def post_patients_id_archive(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create ZIP archive
+
+        Create a ZIP archive containing the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/patients/{id_}/archive",
+            json=json,
+        )
+
+    def get_patients_id_attachments(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List attachments
+
+        Get the list of attachments that are associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "full" (str): If present, retrieve the attachments list and their numerical ids
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the attachments
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/attachments",
+            params=params,
+        )
+
+    def delete_patients_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete attachment
+
+        Delete an attachment associated with the given DICOM patient. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/patients/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    def get_patients_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List operations on attachments
+
+        Get the list of the operations that are available for attachments associated with the given patient
+        Tags: Other
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    def put_patients_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        content: RequestContent = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set attachment
+
+        Attach a file to the given DICOM patient. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        content
+                - (Content-Type: "application/octet-stream") Binary data containing the attachment
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return self._put(
+            route=f"{self.url}/patients/{id_}/attachments/{name}",
+            content=content,
+            headers=headers,
+        )
+
+    def post_patients_id_attachments_name_compress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Compress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/compress",
+        )
+
+    def get_patients_id_attachments_name_compressed_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get attachment (no decompression)
+
+        Get the (binary) content of one attachment associated with the given patient. The attachment will not be decompressed if `StorageCompression` is `true`.
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/compressed-data",
+            headers=headers,
+        )
+
+    def get_patients_id_attachments_name_compressed_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get MD5 of attachment on disk
+
+        Get the MD5 hash of one attachment associated with the given patient, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment, as stored on the disk
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/compressed-md5",
+            headers=headers,
+        )
+
+    def get_patients_id_attachments_name_compressed_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get size of attachment on disk
+
+        Get the size of one attachment associated with the given patient, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment, as stored on the disk
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/compressed-size",
+            headers=headers,
+        )
+
+    def get_patients_id_attachments_name_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get attachment
+
+        Get the (binary) content of one attachment associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/data",
+            headers=headers,
+        )
+
+    def get_patients_id_attachments_name_info(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get info about the attachment
+
+        Get all the information about the attachment associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the information about the attachment
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/info",
+            headers=headers,
+        )
+
+    def get_patients_id_attachments_name_is_compressed(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Is attachment compressed?
+
+        Test whether the attachment has been stored as a compressed file on the disk.
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `0` if the attachment was stored uncompressed, `1` if it was compressed
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/is-compressed",
+            headers=headers,
+        )
+
+    def get_patients_id_attachments_name_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get MD5 of attachment
+
+        Get the MD5 hash of one attachment associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/md5",
+            headers=headers,
+        )
+
+    def get_patients_id_attachments_name_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get size of attachment
+
+        Get the size of one attachment associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/size",
+            headers=headers,
+        )
+
+    def post_patients_id_attachments_name_uncompress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Uncompress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/uncompress",
+        )
+
+    def post_patients_id_attachments_name_verify_md5(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Verify attachment
+
+        Verify that the attachment is not corrupted, by validating its MD5 hash
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            On success, a valid JSON object is returned
+        """
+        return self._post(
+            route=f"{self.url}/patients/{id_}/attachments/{name}/verify-md5",
+        )
+
+    def get_patients_id_instances(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get child instances
+
+        Get detailed information about the child instances of the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If false or missing, only retrieve the list of child instances
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing information about the child DICOM instances
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/instances",
+            params=params,
+        )
+
+    def get_patients_id_instances_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get tags of instances
+
+        Get the tags of all the child instances of the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/instances-tags",
+            params=params,
+        )
+
+    def get_patients_id_labels(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List labels
+
+        Get the labels that are associated with the given patient (new in Orthanc 1.12.0)
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the labels
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/labels",
+        )
+
+    def delete_patients_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Remove label
+
+        Remove a label associated with a patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        label
+            The label to be removed
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/patients/{id_}/labels/{label}",
+        )
+
+    def get_patients_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Test label
+
+        Test whether the patient is associated with the given label
+        Tags: Patients
+
+        Parameters
+        ----------
+        label
+            The label of interest
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty string is returned in the case of presence, error 404 in the case of absence
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/labels/{label}",
+        )
+
+    def put_patients_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Add label
+
+        Associate a label with a patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        label
+            The label to be added
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/patients/{id_}/labels/{label}",
+        )
+
+    def get_patients_id_media(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create DICOMDIR media
+
+        Synchronously create a DICOMDIR media containing the DICOM patient whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "extended" (str): If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*
+                "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+                "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            ZIP file containing the archive
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/media",
+            params=params,
+        )
+
+    def post_patients_id_media(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/patients/{id_}/media",
+            json=json,
+        )
+
+    def get_patients_id_metadata(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List metadata
+
+        Get the list of metadata that are associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, also retrieve the value of the individual metadata
+                "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/metadata",
+            params=params,
+        )
+
+    def delete_patients_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete metadata
+
+        Delete some metadata associated with the given DICOM patient. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/patients/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    def get_patients_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get metadata
+
+        Get the value of a metadata that is associated with the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Value of the metadata
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    def put_patients_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        data: RequestData = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set metadata
+
+        Set the value of some metadata in the given DICOM patient. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+        Tags: Patients
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the patient of interest
+        data
+            String value of the metadata
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/patients/{id_}/metadata/{name}",
+            data=data,
+            headers=headers,
+        )
+
+    def post_patients_id_modify(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Modify patient
+
+        Start a job that will modify all the DICOM instances within the patient whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new patient, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/patients/{id_}/modify",
+            json=json,
+        )
+
+    def get_patients_id_module(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get patient module
+
+        Get the patient module of the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM patient
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/module",
+            params=params,
+        )
+
+    def get_patients_id_protected(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Is the patient protected against recycling?
+
+        Is the patient protected against recycling?
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `1` if protected, `0` if not protected
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/protected",
+        )
+
+    def put_patients_id_protected(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Protect/Unprotect a patient against recycling
+
+        Protects a patient by sending `1` or `true` in the payload request. Unprotects a patient by sending `0` or `false` in the payload requests. More info: https://orthanc.uclouvain.be/book/faq/features.html#recycling-protection
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/patients/{id_}/protected",
+        )
+
+    def post_patients_id_reconstruct(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Reconstruct tags & optionally files of patient
+
+        Reconstruct the main DICOM tags in DB of the patient whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        json
+            Dictionary with the following keys:
+              "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/patients/{id_}/reconstruct",
+            json=json,
+        )
+
+    def get_patients_id_series(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get child series
+
+        Get detailed information about the child series of the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If false or missing, only retrieve the list of child series
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing information about the child DICOM series
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/series",
+            params=params,
+        )
+
+    def get_patients_id_shared_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get shared tags
+
+        Extract the DICOM tags whose value is constant across all the child instances of the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the values of the DICOM tags
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/shared-tags",
+            params=params,
+        )
+
+    def get_patients_id_statistics(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get patient statistics
+
+        Get statistics about the given patient
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/statistics",
+        )
+
+    def get_patients_id_studies(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get child studies
+
+        Get detailed information about the child studies of the DICOM patient whose Orthanc identifier is provided in the URL
+        Tags: Patients
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the patient of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If false or missing, only retrieve the list of child studies
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing information about the child DICOM studies
+        """
+        return self._get(
+            route=f"{self.url}/patients/{id_}/studies",
+            params=params,
+        )
+
+    def get_peers(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List Orthanc peers
+
+        List all the Orthanc peers that are known to Orthanc. This corresponds either to the content of the `OrthancPeers` configuration option, or to the information stored in the database if `OrthancPeersInDatabase` is `true`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual Orthanc peers
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the identifiers of the peers, or detailed information about the peers (if `expand` argument is provided)
+        """
+        return self._get(
+            route=f"{self.url}/peers",
+            params=params,
+        )
+
+    def delete_peers_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete Orthanc peer
+
+        Delete one Orthanc peer. This change is permanent iff. `OrthancPeersInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the Orthanc peer of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/peers/{id_}",
+        )
+
+    def get_peers_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List operations on peer
+
+        List the operations that are available for an Orthanc peer.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the peer of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return self._get(
+            route=f"{self.url}/peers/{id_}",
+        )
+
+    def put_peers_id(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Update Orthanc peer
+
+        Define a new Orthanc peer, or update an existing one. This change is permanent iff. `OrthancPeersInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the new/updated Orthanc peer
+        json
+            Dictionary with the following keys:
+              "CertificateFile": SSL certificate for the HTTPS connections
+              "CertificateKeyFile": Key file for the SSL certificate for the HTTPS connections
+              "CertificateKeyPassword": Key password for the SSL certificate for the HTTPS connections
+              "HttpHeaders": HTTP headers to be used for the connections to the remote peer
+              "Password": Password for the credentials
+              "URL": URL of the root of the REST API of the remote Orthanc peer, for instance `http://localhost:8042/`
+              "Username": Username for the credentials
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return self._put(
+            route=f"{self.url}/peers/{id_}",
+            json=json,
+        )
+
+    def get_peers_id_configuration(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get peer configuration
+
+        Get detailed information about the configuration of some Orthanc peer
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the peer of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Configuration of the peer
+        """
+        return self._get(
+            route=f"{self.url}/peers/{id_}/configuration",
+        )
+
+    def post_peers_id_store(
+        self,
+        id_: str,
+        data: RequestData = None,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Send to Orthanc peer
+
+        Send DICOM resources stored locally to some remote Orthanc peer whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#sending-one-resource
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Compress": Whether to compress the DICOM instances using gzip before the actual sending
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": List of the Orthanc identifiers of all the DICOM resources to be sent
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode to the provided DICOM transfer syntax before the actual sending
+
+        data
+            The Orthanc identifier of one resource to be sent
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/peers/{id_}/store",
+            data=data,
+            json=json,
+        )
+
+    def post_peers_id_store_straight(
+        self,
+        id_: str,
+        content: RequestContent = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Straight store to peer
+
+        Synchronously send the DICOM instance in the POST body to the Orthanc peer whose identifier is provided in URL, without having to first store it locally within Orthanc. This is an alternative to command-line tools such as `curl`.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the modality of interest
+        content
+                - (Content-Type: "application/dicom") DICOM instance to be sent
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return self._post(
+            route=f"{self.url}/peers/{id_}/store-straight",
+            content=content,
+        )
+
+    def get_peers_id_system(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get peer system information
+
+        Get system information about some Orthanc peer. This corresponds to doing a `GET` request against the `/system` URI of the remote peer. This route can be used to test connectivity.
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the peer of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            System information about the peer
+        """
+        return self._get(
+            route=f"{self.url}/peers/{id_}/system",
+        )
+
+    def get_plugins(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List plugins
+
+        List all the installed plugins
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the identifiers of the installed plugins
+        """
+        return self._get(
+            route=f"{self.url}/plugins",
+        )
+
+    def get_plugins_explorer_js(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """JavaScript extensions to Orthanc Explorer
+
+        Get the JavaScript extensions that are installed by all the plugins using the `OrthancPluginExtendOrthancExplorer()` function of the plugin SDK. This route is for internal use of Orthanc Explorer.
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The JavaScript extensions
+        """
+        return self._get(
+            route=f"{self.url}/plugins/explorer.js",
+        )
+
+    def get_plugins_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get plugin
+
+        Get system information about the plugin whose identifier is provided in the URL
+        Tags: System
+
+        Parameters
+        ----------
+        id_
+            Identifier of the job of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing information about the plugin
+        """
+        return self._get(
+            route=f"{self.url}/plugins/{id_}",
+        )
+
+    def get_queries(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List query/retrieve operations
+
+        List the identifiers of all the query/retrieve operations on DICOM modalities, as initiated by calls to `/modalities/{id}/query`. The length of this list is bounded by the `QueryRetrieveSize` configuration option of Orthanc. https://orthanc.uclouvain.be/book/users/rest.html#performing-query-retrieve-c-find-and-find-with-rest
+        Tags: Networking
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the identifiers
+        """
+        return self._get(
+            route=f"{self.url}/queries",
+        )
+
+    def delete_queries_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete a query
+
+        Delete the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/queries/{id_}",
+        )
+
+    def get_queries_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List operations on a query
+
+        List the available operations for the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the list of operations
+        """
+        return self._get(
+            route=f"{self.url}/queries/{id_}",
+        )
+
+    def get_queries_id_answers(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List answers to a query
+
+        List the indices of all the available answers resulting from a query/retrieve operation on some DICOM modality, whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual answers
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the indices of the answers, or detailed information about the reported answers (if `expand` argument is provided)
+        """
+        return self._get(
+            route=f"{self.url}/queries/{id_}/answers",
+            params=params,
+        )
+
+    def get_queries_id_answers_index(
+        self,
+        id_: str,
+        index: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List operations on an answer
+
+        List the available operations on an answer associated with the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        index
+            Index of the answer
+        id_
+            Identifier of the query of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the list of operations
+        """
+        return self._get(
+            route=f"{self.url}/queries/{id_}/answers/{index}",
+        )
+
+    def get_queries_id_answers_index_content(
+        self,
+        id_: str,
+        index: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get one answer
+
+        Get the content (DICOM tags) of one answer associated with the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        index
+            Index of the answer
+        id_
+            Identifier of the query of interest
+        params
+            Dictionary of optional parameters:
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the DICOM tags of the answer
+        """
+        return self._get(
+            route=f"{self.url}/queries/{id_}/answers/{index}/content",
+            params=params,
+        )
+
+    def post_queries_id_answers_index_query_instances(
+        self,
+        id_: str,
+        index: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Query the child instances of an answer
+
+        Issue a second DICOM C-FIND operation, in order to query the child instances associated with one answer to some query/retrieve operation whose identifiers are provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        index
+            Index of the answer
+        id_
+            Identifier of the query of interest
+        json
+            Dictionary with the following keys:
+              "Query": Associative array containing the filter on the values of the DICOM tags
+              "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/queries/{id_}/answers/{index}/query-instances",
+            json=json,
+        )
+
+    def post_queries_id_answers_index_query_series(
+        self,
+        id_: str,
+        index: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Query the child series of an answer
+
+        Issue a second DICOM C-FIND operation, in order to query the child series associated with one answer to some query/retrieve operation whose identifiers are provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        index
+            Index of the answer
+        id_
+            Identifier of the query of interest
+        json
+            Dictionary with the following keys:
+              "Query": Associative array containing the filter on the values of the DICOM tags
+              "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/queries/{id_}/answers/{index}/query-series",
+            json=json,
+        )
+
+    def post_queries_id_answers_index_query_studies(
+        self,
+        id_: str,
+        index: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Query the child studies of an answer
+
+        Issue a second DICOM C-FIND operation, in order to query the child studies associated with one answer to some query/retrieve operation whose identifiers are provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        index
+            Index of the answer
+        id_
+            Identifier of the query of interest
+        json
+            Dictionary with the following keys:
+              "Query": Associative array containing the filter on the values of the DICOM tags
+              "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/queries/{id_}/answers/{index}/query-studies",
+            json=json,
+        )
+
+    def post_queries_id_answers_index_retrieve(
+        self,
+        id_: str,
+        index: str,
+        data: RequestData = None,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Retrieve one answer
+
+        Start a C-MOVE SCU command as a job, in order to retrieve one answer associated with the query/retrieve operation whose identifiers are provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-retrieve-c-move
+        Tags: Networking
+
+        Parameters
+        ----------
+        index
+            Index of the answer
+        id_
+            Identifier of the query of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Simplify": If set to `true`, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "TargetAet": AET of the target modality. By default, the AET of Orthanc is used, as defined in the `DicomAet` configuration option.
+              "Timeout": Timeout for the C-MOVE command, in seconds
+
+        data
+            AET of the target modality
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/queries/{id_}/answers/{index}/retrieve",
+            data=data,
+            json=json,
+        )
+
+    def get_queries_id_level(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get level of original query
+
+        Get the query level (value of the `QueryRetrieveLevel` tag) of the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The level
+        """
+        return self._get(
+            route=f"{self.url}/queries/{id_}/level",
+        )
+
+    def get_queries_id_modality(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get modality of original query
+
+        Get the identifier of the DICOM modality that was targeted by the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The identifier of the DICOM modality
+        """
+        return self._get(
+            route=f"{self.url}/queries/{id_}/modality",
+        )
+
+    def get_queries_id_query(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get original query arguments
+
+        Get the original DICOM filter associated with the query/retrieve operation whose identifier is provided in the URL
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+        params
+            Dictionary of optional parameters:
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Content of the original query
+        """
+        return self._get(
+            route=f"{self.url}/queries/{id_}/query",
+            params=params,
+        )
+
+    def post_queries_id_retrieve(
+        self,
+        id_: str,
+        data: RequestData = None,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Retrieve all answers
+
+        Start a C-MOVE SCU command as a job, in order to retrieve all the answers associated with the query/retrieve operation whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-retrieve-c-move
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the query of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Simplify": If set to `true`, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "TargetAet": AET of the target modality. By default, the AET of Orthanc is used, as defined in the `DicomAet` configuration option.
+              "Timeout": Timeout for the C-MOVE command, in seconds
+
+        data
+            AET of the target modality
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/queries/{id_}/retrieve",
+            data=data,
+            json=json,
+        )
+
+    def get_series(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List the available series
+
+        List the Orthanc identifiers of all the available DICOM series
+        Tags: Series
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual series
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "limit" (float): Limit the number of results
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "since" (float): Show only the resources since the provided index
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the Orthanc identifiers, or detailed information about the reported series (if `expand` argument is provided)
+        """
+        return self._get(
+            route=f"{self.url}/series",
+            params=params,
+        )
+
+    def delete_series_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete some series
+
+        Delete the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/series/{id_}",
+        )
+
+    def get_series_id(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get information about some series
+
+        Get detailed information about the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM series
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}",
+            params=params,
+        )
+
+    def post_series_id_anonymize(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Anonymize series
+
+        Start a job that will anonymize all the DICOM instances within the series whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new series, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+              "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/series/{id_}/anonymize",
+            json=json,
+        )
+
+    def get_series_id_archive(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create ZIP archive
+
+        Synchronously create a ZIP archive containing the DICOM series whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+                "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            ZIP file containing the archive
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/archive",
+            params=params,
+        )
+
+    def post_series_id_archive(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create ZIP archive
+
+        Create a ZIP archive containing the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/series/{id_}/archive",
+            json=json,
+        )
+
+    def get_series_id_attachments(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List attachments
+
+        Get the list of attachments that are associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "full" (str): If present, retrieve the attachments list and their numerical ids
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the attachments
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/attachments",
+            params=params,
+        )
+
+    def delete_series_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete attachment
+
+        Delete an attachment associated with the given DICOM series. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/series/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    def get_series_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List operations on attachments
+
+        Get the list of the operations that are available for attachments associated with the given series
+        Tags: Other
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    def put_series_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        content: RequestContent = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set attachment
+
+        Attach a file to the given DICOM series. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        content
+                - (Content-Type: "application/octet-stream") Binary data containing the attachment
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return self._put(
+            route=f"{self.url}/series/{id_}/attachments/{name}",
+            content=content,
+            headers=headers,
+        )
+
+    def post_series_id_attachments_name_compress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Compress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/series/{id_}/attachments/{name}/compress",
+        )
+
+    def get_series_id_attachments_name_compressed_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get attachment (no decompression)
+
+        Get the (binary) content of one attachment associated with the given series. The attachment will not be decompressed if `StorageCompression` is `true`.
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/compressed-data",
+            headers=headers,
+        )
+
+    def get_series_id_attachments_name_compressed_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get MD5 of attachment on disk
+
+        Get the MD5 hash of one attachment associated with the given series, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment, as stored on the disk
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/compressed-md5",
+            headers=headers,
+        )
+
+    def get_series_id_attachments_name_compressed_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get size of attachment on disk
+
+        Get the size of one attachment associated with the given series, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment, as stored on the disk
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/compressed-size",
+            headers=headers,
+        )
+
+    def get_series_id_attachments_name_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get attachment
+
+        Get the (binary) content of one attachment associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/data",
+            headers=headers,
+        )
+
+    def get_series_id_attachments_name_info(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get info about the attachment
+
+        Get all the information about the attachment associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the information about the attachment
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/info",
+            headers=headers,
+        )
+
+    def get_series_id_attachments_name_is_compressed(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Is attachment compressed?
+
+        Test whether the attachment has been stored as a compressed file on the disk.
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `0` if the attachment was stored uncompressed, `1` if it was compressed
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/is-compressed",
+            headers=headers,
+        )
+
+    def get_series_id_attachments_name_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get MD5 of attachment
+
+        Get the MD5 hash of one attachment associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/md5",
+            headers=headers,
+        )
+
+    def get_series_id_attachments_name_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get size of attachment
+
+        Get the size of one attachment associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/attachments/{name}/size",
+            headers=headers,
+        )
+
+    def post_series_id_attachments_name_uncompress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Uncompress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/series/{id_}/attachments/{name}/uncompress",
+        )
+
+    def post_series_id_attachments_name_verify_md5(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Verify attachment
+
+        Verify that the attachment is not corrupted, by validating its MD5 hash
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            On success, a valid JSON object is returned
+        """
+        return self._post(
+            route=f"{self.url}/series/{id_}/attachments/{name}/verify-md5",
+        )
+
+    def get_series_id_instances(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get child instances
+
+        Get detailed information about the child instances of the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If false or missing, only retrieve the list of child instances
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing information about the child DICOM instances
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/instances",
+            params=params,
+        )
+
+    def get_series_id_instances_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get tags of instances
+
+        Get the tags of all the child instances of the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/instances-tags",
+            params=params,
+        )
+
+    def get_series_id_labels(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List labels
+
+        Get the labels that are associated with the given series (new in Orthanc 1.12.0)
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the labels
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/labels",
+        )
+
+    def delete_series_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Remove label
+
+        Remove a label associated with a series
+        Tags: Series
+
+        Parameters
+        ----------
+        label
+            The label to be removed
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/series/{id_}/labels/{label}",
+        )
+
+    def get_series_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Test label
+
+        Test whether the series is associated with the given label
+        Tags: Series
+
+        Parameters
+        ----------
+        label
+            The label of interest
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty string is returned in the case of presence, error 404 in the case of absence
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/labels/{label}",
+        )
+
+    def put_series_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Add label
+
+        Associate a label with a series
+        Tags: Series
+
+        Parameters
+        ----------
+        label
+            The label to be added
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/series/{id_}/labels/{label}",
+        )
+
+    def get_series_id_media(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create DICOMDIR media
+
+        Synchronously create a DICOMDIR media containing the DICOM series whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "extended" (str): If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*
+                "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+                "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            ZIP file containing the archive
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/media",
+            params=params,
+        )
+
+    def post_series_id_media(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/series/{id_}/media",
+            json=json,
+        )
+
+    def get_series_id_metadata(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List metadata
+
+        Get the list of metadata that are associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, also retrieve the value of the individual metadata
+                "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/metadata",
+            params=params,
+        )
+
+    def delete_series_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete metadata
+
+        Delete some metadata associated with the given DICOM series. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/series/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    def get_series_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get metadata
+
+        Get the value of a metadata that is associated with the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Value of the metadata
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    def put_series_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        data: RequestData = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set metadata
+
+        Set the value of some metadata in the given DICOM series. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+        Tags: Series
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the series of interest
+        data
+            String value of the metadata
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/series/{id_}/metadata/{name}",
+            data=data,
+            headers=headers,
+        )
+
+    def post_series_id_modify(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Modify series
+
+        Start a job that will modify all the DICOM instances within the series whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new series, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/series/{id_}/modify",
+            json=json,
+        )
+
+    def get_series_id_module(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get series module
+
+        Get the series module of the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM series
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/module",
+            params=params,
+        )
+
+    def get_series_id_numpy(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Decode series for numpy
+
+        Decode the given DICOM series, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel).
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the DICOM resource of interest
+        params
+            Dictionary of optional parameters:
+                "compress" (bool): Compress the file as `.npz`
+                "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/numpy",
+            params=params,
+        )
+
+    def get_series_id_ordered_slices(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Order the slices
+
+        Sort the instances and frames (slices) of the DICOM series whose Orthanc identifier is provided in the URL. This URI is essentially used by the Orthanc Web viewer and by the Osimis Web viewer.
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+        return self._get(
+            route=f"{self.url}/series/{id_}/ordered-slices",
+        )
+
+    def get_series_id_patient(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get parent patient
+
+        Get detailed information about the parent patient of the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the parent DICOM patient
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/patient",
+            params=params,
+        )
+
+    def post_series_id_reconstruct(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Reconstruct tags & optionally files of series
+
+        Reconstruct the main DICOM tags in DB of the series whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        json
+            Dictionary with the following keys:
+              "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/series/{id_}/reconstruct",
+            json=json,
+        )
+
+    def get_series_id_shared_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get shared tags
+
+        Extract the DICOM tags whose value is constant across all the child instances of the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the values of the DICOM tags
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/shared-tags",
+            params=params,
+        )
+
+    def get_series_id_statistics(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get series statistics
+
+        Get statistics about the given series
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/statistics",
+        )
+
+    def get_series_id_study(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get parent study
+
+        Get detailed information about the parent study of the DICOM series whose Orthanc identifier is provided in the URL
+        Tags: Series
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the series of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the parent DICOM study
+        """
+        return self._get(
+            route=f"{self.url}/series/{id_}/study",
+            params=params,
+        )
+
+    def get_statistics(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get database statistics
+
+        Get statistics related to the database of Orthanc
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return self._get(
+            route=f"{self.url}/statistics",
+        )
+
+    def get_storage_commitment_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get storage commitment report
+
+        Get the storage commitment report whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/storage-commitment.html#storage-commitment-scu
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the storage commitment report
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return self._get(
+            route=f"{self.url}/storage-commitment/{id_}",
+        )
+
+    def post_storage_commitment_id_remove(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Remove after storage commitment
+
+        Remove out of Orthanc, the DICOM instances that have been reported to have been properly received the storage commitment report whose identifier is provided in the URL. This is only possible if the `Status` of the storage commitment report is `Success`. https://orthanc.uclouvain.be/book/users/storage-commitment.html#removing-the-instances
+        Tags: Networking
+
+        Parameters
+        ----------
+        id_
+            Identifier of the storage commitment report
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/storage-commitment/{id_}/remove",
+        )
+
+    def get_studies(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List the available studies
+
+        List the Orthanc identifiers of all the available DICOM studies
+        Tags: Studies
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, retrieve detailed information about the individual studies
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "limit" (float): Limit the number of results
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "since" (float): Show only the resources since the provided index
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the Orthanc identifiers, or detailed information about the reported studies (if `expand` argument is provided)
+        """
+        return self._get(
+            route=f"{self.url}/studies",
+            params=params,
+        )
+
+    def delete_studies_id(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete some study
+
+        Delete the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/studies/{id_}",
+        )
+
+    def get_studies_id(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get information about some study
+
+        Get detailed information about the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM study
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}",
+            params=params,
+        )
+
+    def post_studies_id_anonymize(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Anonymize study
+
+        Start a job that will anonymize all the DICOM instances within the study whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new study, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+              "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/studies/{id_}/anonymize",
+            json=json,
+        )
+
+    def get_studies_id_archive(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create ZIP archive
+
+        Synchronously create a ZIP archive containing the DICOM study whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+                "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            ZIP file containing the archive
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/archive",
+            params=params,
+        )
+
+    def post_studies_id_archive(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create ZIP archive
+
+        Create a ZIP archive containing the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/studies/{id_}/archive",
+            json=json,
+        )
+
+    def get_studies_id_attachments(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List attachments
+
+        Get the list of attachments that are associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "full" (str): If present, retrieve the attachments list and their numerical ids
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the attachments
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/attachments",
+            params=params,
+        )
+
+    def delete_studies_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete attachment
+
+        Delete an attachment associated with the given DICOM study. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/studies/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    def get_studies_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List operations on attachments
+
+        Get the list of the operations that are available for attachments associated with the given study
+        Tags: Other
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}",
+            headers=headers,
+        )
+
+    def put_studies_id_attachments_name(
+        self,
+        id_: str,
+        name: str,
+        content: RequestContent = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set attachment
+
+        Attach a file to the given DICOM study. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        content
+                - (Content-Type: "application/octet-stream") Binary data containing the attachment
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty JSON object in the case of a success
+        """
+        return self._put(
+            route=f"{self.url}/studies/{id_}/attachments/{name}",
+            content=content,
+            headers=headers,
+        )
+
+    def post_studies_id_attachments_name_compress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Compress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/compress",
+        )
+
+    def get_studies_id_attachments_name_compressed_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get attachment (no decompression)
+
+        Get the (binary) content of one attachment associated with the given study. The attachment will not be decompressed if `StorageCompression` is `true`.
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/compressed-data",
+            headers=headers,
+        )
+
+    def get_studies_id_attachments_name_compressed_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get MD5 of attachment on disk
+
+        Get the MD5 hash of one attachment associated with the given study, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment, as stored on the disk
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/compressed-md5",
+            headers=headers,
+        )
+
+    def get_studies_id_attachments_name_compressed_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get size of attachment on disk
+
+        Get the size of one attachment associated with the given study, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment, as stored on the disk
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/compressed-size",
+            headers=headers,
+        )
+
+    def get_studies_id_attachments_name_data(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get attachment
+
+        Get the (binary) content of one attachment associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The attachment
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/data",
+            headers=headers,
+        )
+
+    def get_studies_id_attachments_name_info(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get info about the attachment
+
+        Get all the information about the attachment associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the information about the attachment
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/info",
+            headers=headers,
+        )
+
+    def get_studies_id_attachments_name_is_compressed(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Is attachment compressed?
+
+        Test whether the attachment has been stored as a compressed file on the disk.
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `0` if the attachment was stored uncompressed, `1` if it was compressed
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/is-compressed",
+            headers=headers,
+        )
+
+    def get_studies_id_attachments_name_md5(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get MD5 of attachment
+
+        Get the MD5 hash of one attachment associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The MD5 of the attachment
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/md5",
+            headers=headers,
+        )
+
+    def get_studies_id_attachments_name_size(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get size of attachment
+
+        Get the size of one attachment associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The size of the attachment
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/size",
+            headers=headers,
+        )
+
+    def post_studies_id_attachments_name_uncompress(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Uncompress attachment
+
+        Change the compression scheme that is used to store an attachment.
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/uncompress",
+        )
+
+    def post_studies_id_attachments_name_verify_md5(
+        self,
+        id_: str,
+        name: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Verify attachment
+
+        Verify that the attachment is not corrupted, by validating its MD5 hash
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the attachment, or its index (cf. `UserContentType` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            On success, a valid JSON object is returned
+        """
+        return self._post(
+            route=f"{self.url}/studies/{id_}/attachments/{name}/verify-md5",
+        )
+
+    def get_studies_id_instances(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get child instances
+
+        Get detailed information about the child instances of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If false or missing, only retrieve the list of child instances
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing information about the child DICOM instances
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/instances",
+            params=params,
+        )
+
+    def get_studies_id_instances_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get tags of instances
+
+        Get the tags of all the child instances of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/instances-tags",
+            params=params,
+        )
+
+    def get_studies_id_labels(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List labels
+
+        Get the labels that are associated with the given study (new in Orthanc 1.12.0)
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the labels
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/labels",
+        )
+
+    def delete_studies_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Remove label
+
+        Remove a label associated with a study
+        Tags: Studies
+
+        Parameters
+        ----------
+        label
+            The label to be removed
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/studies/{id_}/labels/{label}",
+        )
+
+    def get_studies_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Test label
+
+        Test whether the study is associated with the given label
+        Tags: Studies
+
+        Parameters
+        ----------
+        label
+            The label of interest
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Empty string is returned in the case of presence, error 404 in the case of absence
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/labels/{label}",
+        )
+
+    def put_studies_id_labels_label(
+        self,
+        id_: str,
+        label: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Add label
+
+        Associate a label with a study
+        Tags: Studies
+
+        Parameters
+        ----------
+        label
+            The label to be added
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/studies/{id_}/labels/{label}",
+        )
+
+    def get_studies_id_media(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create DICOMDIR media
+
+        Synchronously create a DICOMDIR media containing the DICOM study whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "extended" (str): If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*
+                "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+                "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            ZIP file containing the archive
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/media",
+            params=params,
+        )
+
+    def post_studies_id_media(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/studies/{id_}/media",
+            json=json,
+        )
+
+    def post_studies_id_merge(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Merge study
+
+        Start a new job so as to move some DICOM resources into the DICOM study whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#merging
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "KeepSource": If set to `true`, instructs Orthanc to keep a copy of the original resources in their source study. By default, the original resources are deleted from Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": The list of DICOM resources (studies, series, and/or instances) to be merged into the study of interest (mandatory option)
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/studies/{id_}/merge",
+            json=json,
+        )
+
+    def get_studies_id_metadata(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List metadata
+
+        Get the list of metadata that are associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If present, also retrieve the value of the individual metadata
+                "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/metadata",
+            params=params,
+        )
+
+    def delete_studies_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete metadata
+
+        Delete some metadata associated with the given DICOM study. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._delete(
+            route=f"{self.url}/studies/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    def get_studies_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get metadata
+
+        Get the value of a metadata that is associated with the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        headers
+            Dictionary of optional headers:
+                "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Value of the metadata
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/metadata/{name}",
+            headers=headers,
+        )
+
+    def put_studies_id_metadata_name(
+        self,
+        id_: str,
+        name: str,
+        data: RequestData = None,
+        headers: HeaderTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set metadata
+
+        Set the value of some metadata in the given DICOM study. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+        Tags: Studies
+
+        Parameters
+        ----------
+        name
+            The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+        id_
+            Orthanc identifier of the study of interest
+        data
+            String value of the metadata
+        headers
+            Dictionary of optional headers:
+                "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/studies/{id_}/metadata/{name}",
+            data=data,
+            headers=headers,
+        )
+
+    def post_studies_id_modify(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Modify study
+
+        Start a job that will modify all the DICOM instances within the study whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new study, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/studies/{id_}/modify",
+            json=json,
+        )
+
+    def get_studies_id_module(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get study module
+
+        Get the study module of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM study
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/module",
+            params=params,
+        )
+
+    def get_studies_id_module_patient(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get patient module of study
+
+        Get the patient module of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the DICOM study
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/module-patient",
+            params=params,
+        )
+
+    def get_studies_id_patient(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get parent patient
+
+        Get detailed information about the parent patient of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Information about the parent DICOM patient
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/patient",
+            params=params,
+        )
+
+    def post_studies_id_reconstruct(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Reconstruct tags & optionally files of study
+
+        Reconstruct the main DICOM tags in DB of the study whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/studies/{id_}/reconstruct",
+            json=json,
+        )
+
+    def get_studies_id_series(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get child series
+
+        Get detailed information about the child series of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "expand" (str): If false or missing, only retrieve the list of child series
+                "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+                "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing information about the child DICOM series
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/series",
+            params=params,
+        )
+
+    def get_studies_id_shared_tags(
+        self,
+        id_: str,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get shared tags
+
+        Extract the DICOM tags whose value is constant across all the child instances of the DICOM study whose Orthanc identifier is provided in the URL
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        params
+            Dictionary of optional parameters:
+                "short" (bool): If present, report the DICOM tags in hexadecimal format
+                "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON object containing the values of the DICOM tags
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/shared-tags",
+            params=params,
+        )
+
+    def post_studies_id_split(
+        self,
+        id_: str,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Split study
+
+        Start a new job so as to split the DICOM study whose Orthanc identifier is provided in the URL, by taking some of its children series or instances out of it and putting them into a brand new study (this new study is created by setting the `StudyInstanceUID` tag to a random identifier): https://orthanc.uclouvain.be/book/users/anonymization.html#splitting
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Instances": The list of instances to be separated from the parent study. These instances must all be children of the same source study, that is specified in the URI.
+              "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+              "KeepSource": If set to `true`, instructs Orthanc to keep a copy of the original series/instances in the source study. By default, the original series/instances are deleted from Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Remove": List of tags that must be removed in the new study (from the same modules as in the `Replace` option)
+              "Replace": Associative array to change the value of some DICOM tags in the new study. These tags must be part of the "Patient Module Attributes" or the "General Study Module Attributes", as specified by the DICOM 2011 standard in Tables C.7-1 and C.7-3.
+              "Series": The list of series to be separated from the parent study. These series must all be children of the same source study, that is specified in the URI.
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/studies/{id_}/split",
+            json=json,
+        )
+
+    def get_studies_id_statistics(
+        self,
+        id_: str,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get study statistics
+
+        Get statistics about the given study
+        Tags: Studies
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the study of interest
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return self._get(
+            route=f"{self.url}/studies/{id_}/statistics",
+        )
+
+    def get_system(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get system information
+
+        Get system information about Orthanc
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        return self._get(
+            route=f"{self.url}/system",
+        )
+
+    def get_tools(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """List operations
+
+        List the available operations under URI `/tools/`
+        Tags: Other
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            List of the available operations
+        """
+        return self._get(
+            route=f"{self.url}/tools",
+        )
+
+    def get_tools_accepted_transfer_syntaxes(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get accepted transfer syntaxes
+
+        Get the list of UIDs of the DICOM transfer syntaxes that are accepted by Orthanc C-STORE SCP. This corresponds to the configuration options `AcceptedTransferSyntaxes` and `XXXTransferSyntaxAccepted`.
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the transfer syntax UIDs
+        """
+        return self._get(
+            route=f"{self.url}/tools/accepted-transfer-syntaxes",
+        )
+
+    def put_tools_accepted_transfer_syntaxes(
+        self,
+        data: RequestData = None,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set accepted transfer syntaxes
+
+        Set the DICOM transfer syntaxes that accepted by Orthanc C-STORE SCP
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+
+        data
+            UID of the transfer syntax to be accepted. Wildcards `?` and `*` are accepted.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the now-accepted transfer syntax UIDs
+        """
+        if json is None:
+            json = {}
+        return self._put(
+            route=f"{self.url}/tools/accepted-transfer-syntaxes",
+            data=data,
+            json=json,
+        )
+
+    def post_tools_bulk_anonymize(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Anonymize a set of resources
+
+        Start a job that will anonymize all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field.
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+              "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The list of all the resources that have been created by this anonymization
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/tools/bulk-anonymize",
+            json=json,
+        )
+
+    def post_tools_bulk_content(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Describe a set of resources
+
+        Get the content all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field, in one single call.
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+              "Level": This optional argument specifies the level of interest (can be `Patient`, `Study`, `Series` or `Instance`). Orthanc will loop over the items inside `Resources`, and explore upward or downward in the DICOM hierarchy in order to find the level of interest.
+              "Metadata": If set to `true` (default value), the metadata associated with the resources will also be retrieved.
+              "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+              "Short": If set to `true`, report the DICOM tags in hexadecimal format
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/tools/bulk-content",
+            json=json,
+        )
+
+    def post_tools_bulk_delete(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Delete a set of resources
+
+        Delete all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field.
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/tools/bulk-delete",
+            json=json,
+        )
+
+    def post_tools_bulk_modify(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Modify a set of resources
+
+        Start a job that will modify all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field.
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+              "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+              "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+              "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+              "Level": Level of the modification (`Patient`, `Study`, `Series` or `Instance`). If absent, the level defaults to `Instance`, but is set to `Patient` if `PatientID` is modified, to `Study` if `StudyInstanceUID` is modified, or to `Series` if `SeriesInstancesUID` is modified. (new in Orthanc 1.9.7)
+              "Permissive": If `true`, ignore errors during the individual steps of the job.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "PrivateCreator": The private creator to be used for private tags in `Replace`
+              "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+              "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+              "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+              "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+              "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The list of all the resources that have been altered by this modification
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/tools/bulk-modify",
+            json=json,
+        )
+
+    def get_tools_create_archive(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create ZIP archive
+
+        Create a ZIP archive containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument
+        Tags: System
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "resources" (str): A comma separated list of Orthanc resource identifiers to include in the ZIP archive.
+                "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._get(
+            route=f"{self.url}/tools/create-archive",
+            params=params,
+        )
+
+    def post_tools_create_archive(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create ZIP archive
+
+        Create a ZIP archive containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": The list of Orthanc identifiers of interest.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/tools/create-archive",
+            json=json,
+        )
+
+    def post_tools_create_dicom(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create one DICOM instance
+
+        Create one DICOM instance, and store it into Orthanc
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Content": This field can be used to embed an image (pixel data encoded as PNG or JPEG), a PDF, or a 3D manufactoring model (MTL/OBJ/STL) inside the created DICOM instance. The file to be encapsulated must be provided using its [data URI scheme encoding](https://en.wikipedia.org/wiki/Data_URI_scheme). This field can possibly contain a JSON array, in which case a DICOM series is created containing one DICOM instance for each item in the `Content` field.
+              "Force": Avoid the consistency checks for the DICOM tags that enforce the DICOM model of the real-world. You can notably use this flag if you need to manually set the tags `StudyInstanceUID`, `SeriesInstanceUID`, or `SOPInstanceUID`. Be careful with this feature.
+              "InterpretBinaryTags": If some value in the `Tags` associative array is formatted according to some [data URI scheme encoding](https://en.wikipedia.org/wiki/Data_URI_scheme), whether this value is decoded to a binary value or kept as such (`true` by default)
+              "Parent": If present, the newly created instance will be attached to the parent DICOM resource whose Orthanc identifier is contained in this field. The DICOM tags of the parent modules in the DICOM hierarchy will be automatically copied to the newly created instance.
+              "PrivateCreator": The private creator to be used for private tags in `Tags`
+              "Tags": Associative array containing the tags of the new instance to be created
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/tools/create-dicom",
+            json=json,
+        )
+
+    def get_tools_create_media(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument
+        Tags: System
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "resources" (str): A comma separated list of Orthanc resource identifiers to include in the DICOMDIR media.
+                "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._get(
+            route=f"{self.url}/tools/create-media",
+            params=params,
+        )
+
+    def post_tools_create_media(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": The list of Orthanc identifiers of interest.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/tools/create-media",
+            json=json,
+        )
+
+    def get_tools_create_media_extended(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument
+        Tags: System
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "resources" (str): A comma separated list of Orthanc resource identifiers to include in the DICOMDIR media.
+                "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._get(
+            route=f"{self.url}/tools/create-media-extended",
+            params=params,
+        )
+
+    def post_tools_create_media_extended(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Create DICOMDIR media
+
+        Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+              "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `true`.
+              "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+              "Resources": The list of Orthanc identifiers of interest.
+              "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+              "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+            In synchronous mode, the ZIP file containing the archive
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/tools/create-media-extended",
+            json=json,
+        )
+
+    def get_tools_default_encoding(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get default encoding
+
+        Get the default encoding that is used by Orthanc if parsing a DICOM instance without the `SpecificCharacterEncoding` tag, or during C-FIND. This corresponds to the configuration option `DefaultEncoding`.
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The name of the encoding
+        """
+        return self._get(
+            route=f"{self.url}/tools/default-encoding",
+        )
+
+    def put_tools_default_encoding(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set default encoding
+
+        Change the default encoding that is used by Orthanc if parsing a DICOM instance without the `SpecificCharacterEncoding` tag, or during C-FIND. This corresponds to the configuration option `DefaultEncoding`.
+        Tags: System
+
+        Parameters
+        ----------
+        data
+            The name of the encoding. Check out configuration option `DefaultEncoding` for the allowed values.
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/tools/default-encoding",
+            data=data,
+        )
+
+    def get_tools_dicom_conformance(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get DICOM conformance
+
+        Get the DICOM conformance statement of Orthanc
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The DICOM conformance statement
+        """
+        return self._get(
+            route=f"{self.url}/tools/dicom-conformance",
+        )
+
+    def post_tools_dicom_echo(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Trigger C-ECHO SCU
+
+        Trigger C-ECHO SCU command against a DICOM modality described in the POST body, without having to register the modality in some `/modalities/{id}` (new in Orthanc 1.8.1)
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "AET": AET of the remote DICOM modality
+              "CheckFind": Issue a dummy C-FIND command after the C-GET SCU, in order to check whether the remote modality knows about Orthanc. This field defaults to the value of the `DicomEchoChecksFind` configuration option. New in Orthanc 1.8.1.
+              "Host": Host address of the remote DICOM modality (typically, an IP address)
+              "Manufacturer": Manufacturer of the remote DICOM modality (check configuration option `DicomModalities` for possible values
+              "Port": TCP port of the remote DICOM modality
+              "Timeout": Timeout for the C-ECHO command, in seconds
+              "UseDicomTls": Whether to use DICOM TLS in the SCU connection initiated by Orthanc (new in Orthanc 1.9.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/tools/dicom-echo",
+            json=json,
+        )
+
+    def post_tools_execute_script(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Execute Lua script
+
+        Execute the provided Lua script by the Orthanc server. This is very insecure for Orthanc servers that are remotely accessible.  Since Orthanc 1.5.8, this route is disabled by default and can be enabled thanks to the `ExecuteLuaEnabled` configuration.
+        Tags: System
+
+        Parameters
+        ----------
+        data
+            The Lua script to be executed
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Output of the Lua script
+        """
+        return self._post(
+            route=f"{self.url}/tools/execute-script",
+            data=data,
+        )
+
+    def post_tools_find(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Look for local resources
+
+        This URI can be used to perform a search on the content of the local Orthanc server, in a way that is similar to querying remote DICOM modalities using C-FIND SCU: https://orthanc.uclouvain.be/book/users/rest.html#performing-finds-within-orthanc
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "CaseSensitive": Enable case-sensitive search for PN value representations (defaults to configuration option `CaseSensitivePN`)
+              "Expand": Also retrieve the content of the matching resources, not only their Orthanc identifiers
+              "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+              "Labels": List of strings specifying which labels to look for in the resources (new in Orthanc 1.12.0)
+              "LabelsConstraint": Constraint on the labels, can be `All`, `Any`, or `None` (defaults to `All`, new in Orthanc 1.12.0)
+              "Level": Level of the query (`Patient`, `Study`, `Series` or `Instance`)
+              "Limit": Limit the number of reported resources
+              "Query": Associative array containing the filter on the values of the DICOM tags
+              "RequestedTags": A list of DICOM tags to include in the response (applicable only if "Expand" is set to true).  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return all Main Dicom Tags to keep backward compatibility with Orthanc prior to 1.11.0.
+              "Short": If set to `true`, report the DICOM tags in hexadecimal format
+              "Since": Show only the resources since the provided index (in conjunction with `Limit`)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing either the Orthanc identifiers, or detailed information about the reported resources (if `Expand` argument is `true`)
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/tools/find",
+            json=json,
+        )
+
+    def get_tools_generate_uid(
+        self,
+        params: QueryParamTypes = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Generate an identifier
+
+        Generate a random DICOM identifier
+        Tags: System
+
+        Parameters
+        ----------
+        params
+            Dictionary of optional parameters:
+                "level" (str): Type of DICOM resource among: `patient`, `study`, `series` or `instance`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The generated identifier
+        """
+        return self._get(
+            route=f"{self.url}/tools/generate-uid_",
+            params=params,
+        )
+
+    def post_tools_invalid_ate_tags(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Invalidate DICOM-as-JSON summaries
+
+        Remove all the attachments of the type "DICOM-as-JSON" that are associated will all the DICOM instances stored in Orthanc. These summaries will be automatically re-created on the next access. This is notably useful after changes to the `Dictionary` configuration option. https://orthanc.uclouvain.be/book/faq/orthanc-storage.html#storage-area
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/tools/invalid_ate-tags",
+        )
+
+    def get_tools_labels(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get all the used labels
+
+        List all the labels that are associated with any resource of the Orthanc database
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing the labels
+        """
+        return self._get(
+            route=f"{self.url}/tools/labels",
+        )
+
+    def get_tools_log_level(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get main log level
+
+        Get the main log level of Orthanc
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return self._get(
+            route=f"{self.url}/tools/log-level",
+        )
+
+    def put_tools_log_level(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set main log level
+
+        Set the main log level of Orthanc
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/tools/log-level",
+            data=data,
+        )
+
+    def get_tools_log_level_dicom(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get log level for `dicom`
+
+        Get the log level of the log category `dicom`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return self._get(
+            route=f"{self.url}/tools/log-level-dicom",
+        )
+
+    def put_tools_log_level_dicom(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set log level for `dicom`
+
+        Set the log level of the log category `dicom`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/tools/log-level-dicom",
+            data=data,
+        )
+
+    def get_tools_log_level_generic(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get log level for `generic`
+
+        Get the log level of the log category `generic`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return self._get(
+            route=f"{self.url}/tools/log-level-generic",
+        )
+
+    def put_tools_log_level_generic(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set log level for `generic`
+
+        Set the log level of the log category `generic`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/tools/log-level-generic",
+            data=data,
+        )
+
+    def get_tools_log_level_http(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get log level for `http`
+
+        Get the log level of the log category `http`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return self._get(
+            route=f"{self.url}/tools/log-level-http",
+        )
+
+    def put_tools_log_level_http(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set log level for `http`
+
+        Set the log level of the log category `http`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/tools/log-level-http",
+            data=data,
+        )
+
+    def get_tools_log_level_jobs(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get log level for `jobs`
+
+        Get the log level of the log category `jobs`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return self._get(
+            route=f"{self.url}/tools/log-level-jobs",
+        )
+
+    def put_tools_log_level_jobs(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set log level for `jobs`
+
+        Set the log level of the log category `jobs`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/tools/log-level-jobs",
+            data=data,
+        )
+
+    def get_tools_log_level_lua(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get log level for `lua`
+
+        Get the log level of the log category `lua`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return self._get(
+            route=f"{self.url}/tools/log-level-lua",
+        )
+
+    def put_tools_log_level_lua(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set log level for `lua`
+
+        Set the log level of the log category `lua`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/tools/log-level-lua",
+            data=data,
+        )
+
+    def get_tools_log_level_plugins(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get log level for `plugins`
+
+        Get the log level of the log category `plugins`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return self._get(
+            route=f"{self.url}/tools/log-level-plugins",
+        )
+
+    def put_tools_log_level_plugins(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set log level for `plugins`
+
+        Set the log level of the log category `plugins`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/tools/log-level-plugins",
+            data=data,
+        )
+
+    def get_tools_log_level_sqlite(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get log level for `sqlite`
+
+        Get the log level of the log category `sqlite`
+        Tags: Logs
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            Possible values: `default`, `verbose` or `trace`
+        """
+        return self._get(
+            route=f"{self.url}/tools/log-level-sqlite",
+        )
+
+    def put_tools_log_level_sqlite(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set log level for `sqlite`
+
+        Set the log level of the log category `sqlite`
+        Tags: Logs
+
+        Parameters
+        ----------
+        data
+            Possible values: `default`, `verbose` or `trace`
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/tools/log-level-sqlite",
+            data=data,
+        )
+
+    def post_tools_lookup(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Look for DICOM identifiers
+
+        This URI can be used to convert one DICOM identifier to a list of matching Orthanc resources
+        Tags: System
+
+        Parameters
+        ----------
+        data
+            The DICOM identifier of interest (i.e. the value of `PatientID`, `StudyInstanceUID`, `SeriesInstanceUID`, or `SOPInstanceUID`)
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            JSON array containing a list of matching Orthanc resources, each item in the list corresponding to a JSON object with the fields `Type`, `ID` and `Path` identifying one DICOM resource that is stored by Orthanc
+        """
+        return self._post(
+            route=f"{self.url}/tools/lookup",
+            data=data,
+        )
+
+    def get_tools_metrics(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Are metrics collected?
+
+        Returns a Boolean specifying whether Prometheus metrics are collected and exposed at `/tools/metrics-prometheus`
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `1` if metrics are collected, `0` if metrics are disabled
+        """
+        return self._get(
+            route=f"{self.url}/tools/metrics",
+        )
+
+    def put_tools_metrics(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Enable collection of metrics
+
+        Enable or disable the collection and publication of metrics at `/tools/metrics-prometheus`
+        Tags: System
+
+        Parameters
+        ----------
+        data
+            `1` if metrics are collected, `0` if metrics are disabled
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/tools/metrics",
+            data=data,
+        )
+
+    def get_tools_metrics_prometheus(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get usage metrics
+
+        Get usage metrics of Orthanc in the Prometheus file format (OpenMetrics): https://orthanc.uclouvain.be/book/users/advanced-rest.html#instrumentation-with-prometheus
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            No description
+        """
+        return self._get(
+            route=f"{self.url}/tools/metrics-prometheus",
+        )
+
+    def get_tools_now(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get UTC time
+
+        Get UTC time
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The UTC time
+        """
+        return self._get(
+            route=f"{self.url}/tools/now",
+        )
+
+    def get_tools_now_local(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Get local time
+
+        Get local time
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            The local time
+        """
+        return self._get(
+            route=f"{self.url}/tools/now-local",
+        )
+
+    def post_tools_reconstruct(
+        self,
+        json: Any = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Reconstruct all the index
+
+        Reconstruct the index of all the tags of all the DICOM instances that are stored in Orthanc. This is notably useful after the deletion of resources whose children resources have inconsistent values with their sibling resources. Beware that this is a highly time-consuming operation, as all the DICOM instances will be parsed again, and as all the Orthanc index will be regenerated. If you have a large database to process, it is advised to use the Housekeeper plugin to perform this action resource by resource
+        Tags: System
+
+        Parameters
+        ----------
+        json
+            Dictionary with the following keys:
+              "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        if json is None:
+            json = {}
+        return self._post(
+            route=f"{self.url}/tools/reconstruct",
+            json=json,
+        )
+
+    def post_tools_reset(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Restart Orthanc
+
+        Restart Orthanc
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/tools/reset",
+        )
+
+    def post_tools_shutdown(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Shutdown Orthanc
+
+        Shutdown Orthanc
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._post(
+            route=f"{self.url}/tools/shutdown",
+        )
+
+    def get_tools_unknown_sop_class_accepted(
+        self,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Is unknown SOP class accepted?
+
+        Shall Orthanc C-STORE SCP accept DICOM instances with an unknown SOP class UID?
+        Tags: System
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+            `1` if accepted, `0` if not accepted
+        """
+        return self._get(
+            route=f"{self.url}/tools/unknown-sop-class-accepted",
+        )
+
+    def put_tools_unknown_sop_class_accepted(
+        self,
+        data: RequestData = None,
+    ) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+        """Set unknown SOP class accepted
+
+        Set whether Orthanc C-STORE SCP should accept DICOM instances with an unknown SOP class UID
+        Tags: System
+
+        Parameters
+        ----------
+        data
+            `1` if accepted, `0` if not accepted
+
+        Returns
+        -------
+        Union[Dict, List, str, bytes, int, httpx.Response]
+        """
+        return self._put(
+            route=f"{self.url}/tools/unknown-sop-class-accepted",
+            data=data,
+        )
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ __init__(url, username=None, password=None, return_raw_response=False, *args, **kwargs) + +

+ + +
+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
url + str + +
+

server's URL

+
+
+ required +
username + Optional[str] + +
+

Orthanc's username

+
+
+ None +
password + Optional[str] + +
+

Orthanc's password

+
+
+ None +
return_raw_response + bool + +
+

All Orthanc's methods will return a raw httpx.Response rather than the serialized result

+
+
+ False +
*args + +
+

Parameters passed to the httpx.Client (headers, timeout, etc.)

+
+
+ () +
**kwargs + +
+

Parameters passed to the httpx.Client (headers, timeout, etc.)

+
+
+ () +
+ +
+ Source code in pyorthanc/client.py +
23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
def __init__(
+    self,
+    url: str,
+    username: Optional[str] = None,
+    password: Optional[str] = None,
+    return_raw_response: bool = False,
+    *args,
+    **kwargs,
+):
+    """
+    Parameters
+    ----------
+    url
+        server's URL
+    username
+        Orthanc's username
+    password
+        Orthanc's password
+    return_raw_response
+        All Orthanc's methods will return a raw httpx.Response rather than the serialized result
+    *args, **kwargs
+        Parameters passed to the httpx.Client (headers, timeout, etc.)
+    """
+    super().__init__(*args, **kwargs)
+    self.url = url
+    self.version = "1.12.3"
+    self.return_raw_response = return_raw_response
+
+    if username and password:
+        self.setup_credentials(username, password)
+
+
+
+ +
+ +
+ + +

+ delete_changes() + +

+ + +
+ +

Clear changes

+

Clear the full history stored in the changes log +Tags: Tracking changes

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
def delete_changes(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Clear changes
+
+    Clear the full history stored in the changes log
+    Tags: Tracking changes
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/changes",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_exports() + +

+ + +
+ +

Clear exports

+

Clear the full history stored in the exports log +Tags: Tracking changes

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
def delete_exports(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Clear exports
+
+    Clear the full history stored in the exports log
+    Tags: Tracking changes
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/exports",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_instances_id(id_) + +

+ + +
+ +

Delete some instance

+

Delete the DICOM instance whose Orthanc identifier is provided in the URL +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
def delete_instances_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete some instance
+
+    Delete the DICOM instance whose Orthanc identifier is provided in the URL
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/instances/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_instances_id_attachments_name(id_, name, headers=None) + +

+ + +
+ +

Delete attachment

+

Delete an attachment associated with the given DICOM instance. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024). +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
def delete_instances_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete attachment
+
+    Delete an attachment associated with the given DICOM instance. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/instances/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_instances_id_labels_label(id_, label) + +

+ + +
+ +

Remove label

+

Remove a label associated with a instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be removed

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
def delete_instances_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Remove label
+
+    Remove a label associated with a instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    label
+        The label to be removed
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/instances/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_instances_id_metadata_name(id_, name, headers=None) + +

+ + +
+ +

Delete metadata

+

Delete some metadata associated with the given DICOM instance. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024). +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
def delete_instances_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete metadata
+
+    Delete some metadata associated with the given DICOM instance. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/instances/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_jobs_id(id_) + +

+ + +
+ +

Delete a job from history

+

Delete the job from the jobs history. Only a completed job can be deleted. If the job has not run or not completed yet, you must cancel it first. If the job has outputs, all outputs will be deleted as well. +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
def delete_jobs_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete a job from history
+
+    Delete the job from the jobs history.  Only a completed job can be deleted. If the job has not run or not completed yet, you must cancel it first. If the job has outputs, all outputs will be deleted as well.
+    Tags: Jobs
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/jobs/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_jobs_id_key(id_, key) + +

+ + +
+ +

Delete a job output

+

Delete the output produced by a job. As of Orthanc 1.12.1, only the jobs that generate a DICOMDIR media or a ZIP archive provide such an output (with key equals to archive). +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
key + str + +
+

Name of the output of interest

+
+
+ required +
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
def delete_jobs_id_key(
+    self,
+    id_: str,
+    key: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete a job output
+
+    Delete the output produced by a job. As of Orthanc 1.12.1, only the jobs that generate a DICOMDIR media or a ZIP archive provide such an output (with `key` equals to `archive`).
+    Tags: Jobs
+
+    Parameters
+    ----------
+    key
+        Name of the output of interest
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/jobs/{id_}/{key}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_modalities_id(id_) + +

+ + +
+ +

Delete DICOM modality

+

Delete one DICOM modality. This change is permanent iff. DicomModalitiesInDatabase is true, otherwise it is lost at the next restart of Orthanc. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the DICOM modality of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
def delete_modalities_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete DICOM modality
+
+    Delete one DICOM modality. This change is permanent iff. `DicomModalitiesInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the DICOM modality of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/modalities/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_patients_id(id_) + +

+ + +
+ +

Delete some patient

+

Delete the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
def delete_patients_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete some patient
+
+    Delete the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/patients/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_patients_id_attachments_name(id_, name, headers=None) + +

+ + +
+ +

Delete attachment

+

Delete an attachment associated with the given DICOM patient. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024). +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
3120
+3121
+3122
+3123
+3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
def delete_patients_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete attachment
+
+    Delete an attachment associated with the given DICOM patient. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/patients/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_patients_id_labels_label(id_, label) + +

+ + +
+ +

Remove label

+

Remove a label associated with a patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be removed

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
3624
+3625
+3626
+3627
+3628
+3629
+3630
+3631
+3632
+3633
+3634
+3635
+3636
+3637
+3638
+3639
+3640
+3641
+3642
+3643
+3644
+3645
+3646
+3647
def delete_patients_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Remove label
+
+    Remove a label associated with a patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    label
+        The label to be removed
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/patients/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_patients_id_metadata_name(id_, name, headers=None) + +

+ + +
+ +

Delete metadata

+

Delete some metadata associated with the given DICOM patient. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024). +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
3795
+3796
+3797
+3798
+3799
+3800
+3801
+3802
+3803
+3804
+3805
+3806
+3807
+3808
+3809
+3810
+3811
+3812
+3813
+3814
+3815
+3816
+3817
+3818
+3819
+3820
+3821
+3822
+3823
def delete_patients_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete metadata
+
+    Delete some metadata associated with the given DICOM patient. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/patients/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_peers_id(id_) + +

+ + +
+ +

Delete Orthanc peer

+

Delete one Orthanc peer. This change is permanent iff. OrthancPeersInDatabase is true, otherwise it is lost at the next restart of Orthanc. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the Orthanc peer of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4176
+4177
+4178
+4179
+4180
+4181
+4182
+4183
+4184
+4185
+4186
+4187
+4188
+4189
+4190
+4191
+4192
+4193
+4194
+4195
+4196
def delete_peers_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete Orthanc peer
+
+    Delete one Orthanc peer. This change is permanent iff. `OrthancPeersInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the Orthanc peer of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/peers/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_queries_id(id_) + +

+ + +
+ +

Delete a query

+

Delete the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4445
+4446
+4447
+4448
+4449
+4450
+4451
+4452
+4453
+4454
+4455
+4456
+4457
+4458
+4459
+4460
+4461
+4462
+4463
+4464
+4465
def delete_queries_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete a query
+
+    Delete the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/queries/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_series_id(id_) + +

+ + +
+ +

Delete some series

+

Delete the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4875
+4876
+4877
+4878
+4879
+4880
+4881
+4882
+4883
+4884
+4885
+4886
+4887
+4888
+4889
+4890
+4891
+4892
+4893
+4894
+4895
def delete_series_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete some series
+
+    Delete the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/series/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_series_id_attachments_name(id_, name, headers=None) + +

+ + +
+ +

Delete attachment

+

Delete an attachment associated with the given DICOM series. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024). +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
5063
+5064
+5065
+5066
+5067
+5068
+5069
+5070
+5071
+5072
+5073
+5074
+5075
+5076
+5077
+5078
+5079
+5080
+5081
+5082
+5083
+5084
+5085
+5086
+5087
+5088
+5089
+5090
+5091
def delete_series_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete attachment
+
+    Delete an attachment associated with the given DICOM series. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/series/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_series_id_labels_label(id_, label) + +

+ + +
+ +

Remove label

+

Remove a label associated with a series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be removed

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
5567
+5568
+5569
+5570
+5571
+5572
+5573
+5574
+5575
+5576
+5577
+5578
+5579
+5580
+5581
+5582
+5583
+5584
+5585
+5586
+5587
+5588
+5589
+5590
def delete_series_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Remove label
+
+    Remove a label associated with a series
+    Tags: Series
+
+    Parameters
+    ----------
+    label
+        The label to be removed
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/series/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_series_id_metadata_name(id_, name, headers=None) + +

+ + +
+ +

Delete metadata

+

Delete some metadata associated with the given DICOM series. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024). +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
5738
+5739
+5740
+5741
+5742
+5743
+5744
+5745
+5746
+5747
+5748
+5749
+5750
+5751
+5752
+5753
+5754
+5755
+5756
+5757
+5758
+5759
+5760
+5761
+5762
+5763
+5764
+5765
+5766
def delete_series_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete metadata
+
+    Delete some metadata associated with the given DICOM series. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/series/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_studies_id(id_) + +

+ + +
+ +

Delete some study

+

Delete the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
6192
+6193
+6194
+6195
+6196
+6197
+6198
+6199
+6200
+6201
+6202
+6203
+6204
+6205
+6206
+6207
+6208
+6209
+6210
+6211
+6212
def delete_studies_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete some study
+
+    Delete the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/studies/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_studies_id_attachments_name(id_, name, headers=None) + +

+ + +
+ +

Delete attachment

+

Delete an attachment associated with the given DICOM study. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024). +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
6380
+6381
+6382
+6383
+6384
+6385
+6386
+6387
+6388
+6389
+6390
+6391
+6392
+6393
+6394
+6395
+6396
+6397
+6398
+6399
+6400
+6401
+6402
+6403
+6404
+6405
+6406
+6407
+6408
def delete_studies_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete attachment
+
+    Delete an attachment associated with the given DICOM study. This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/studies/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ delete_studies_id_labels_label(id_, label) + +

+ + +
+ +

Remove label

+

Remove a label associated with a study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be removed

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
6884
+6885
+6886
+6887
+6888
+6889
+6890
+6891
+6892
+6893
+6894
+6895
+6896
+6897
+6898
+6899
+6900
+6901
+6902
+6903
+6904
+6905
+6906
+6907
def delete_studies_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Remove label
+
+    Remove a label associated with a study
+    Tags: Studies
+
+    Parameters
+    ----------
+    label
+        The label to be removed
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/studies/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ delete_studies_id_metadata_name(id_, name, headers=None) + +

+ + +
+ +

Delete metadata

+

Delete some metadata associated with the given DICOM study. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024). +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if CheckRevisions option is true.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7091
+7092
+7093
+7094
+7095
+7096
+7097
+7098
+7099
+7100
+7101
+7102
+7103
+7104
+7105
+7106
+7107
+7108
+7109
+7110
+7111
+7112
+7113
+7114
+7115
+7116
+7117
+7118
+7119
def delete_studies_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete metadata
+
+    Delete some metadata associated with the given DICOM study. This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, to check if its content has not changed and can be deleted. This header is mandatory if `CheckRevisions` option is `true`.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._delete(
+        route=f"{self.url}/studies/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_changes(params=None) + +

+ + +
+ +

List changes

+

Whenever Orthanc receives a new DICOM instance, this event is recorded in the so-called Changes Log. This enables remote scripts to react to the arrival of new DICOM resources. A typical application is auto-routing, where an external script waits for a new DICOM instance to arrive into Orthanc, then forward this instance to another modality. +Tags: Tracking changes

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "limit" (float): Limit the number of results + "since" (float): Show only the resources since the provided index

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The list of changes

+
+
+ +
+ Source code in pyorthanc/client.py +
270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
def get_changes(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List changes
+
+    Whenever Orthanc receives a new DICOM instance, this event is recorded in the so-called _Changes Log_. This enables remote scripts to react to the arrival of new DICOM resources. A typical application is auto-routing, where an external script waits for a new DICOM instance to arrive into Orthanc, then forward this instance to another modality.
+    Tags: Tracking changes
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "limit" (float): Limit the number of results
+            "since" (float): Show only the resources since the provided index
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The list of changes
+    """
+    return self._get(
+        route=f"{self.url}/changes",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_exports(params=None) + +

+ + +
+ +

List exports

+

For medical traceability, Orthanc can be configured to store a log of all the resources that have been exported to remote modalities. In auto-routing scenarios, it is important to prevent this log to grow indefinitely as incoming instances are routed. You can either disable this logging by setting the option LogExportedResources to false in the configuration file, or periodically clear this log by DELETE-ing this URI. This route might be removed in future versions of Orthanc. +Tags: Tracking changes

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "limit" (float): Limit the number of results + "since" (float): Show only the resources since the provided index

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The list of exports

+
+
+ +
+ Source code in pyorthanc/client.py +
312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
def get_exports(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List exports
+
+    For medical traceability, Orthanc can be configured to store a log of all the resources that have been exported to remote modalities. In auto-routing scenarios, it is important to prevent this log to grow indefinitely as incoming instances are routed. You can either disable this logging by setting the option `LogExportedResources` to `false` in the configuration file, or periodically clear this log by `DELETE`-ing this URI. This route might be removed in future versions of Orthanc.
+    Tags: Tracking changes
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "limit" (float): Limit the number of results
+            "since" (float): Show only the resources since the provided index
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The list of exports
+    """
+    return self._get(
+        route=f"{self.url}/exports",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances(params=None) + +

+ + +
+ +

List the available instances

+

List the Orthanc identifiers of all the available DICOM instances +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual instances + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "limit" (float): Limit the number of results + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format + "since" (float): Show only the resources since the provided index

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the Orthanc identifiers, or detailed information about the reported instances (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/client.py +
338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
def get_instances(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List the available instances
+
+    List the Orthanc identifiers of all the available DICOM instances
+    Tags: Instances
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual instances
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "limit" (float): Limit the number of results
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "since" (float): Show only the resources since the provided index
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the Orthanc identifiers, or detailed information about the reported instances (if `expand` argument is provided)
+    """
+    return self._get(
+        route=f"{self.url}/instances",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id(id_, params=None) + +

+ + +
+ +

Get information about some instance

+

Get detailed information about the DICOM instance whose Orthanc identifier is provided in the URL +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM instance

+
+
+ +
+ Source code in pyorthanc/client.py +
409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
def get_instances_id(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get information about some instance
+
+    Get detailed information about the DICOM instance whose Orthanc identifier is provided in the URL
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM instance
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments(id_, params=None) + +

+ + +
+ +

List attachments

+

Get the list of attachments that are associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (str): If present, retrieve the attachments list and their numerical ids

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the attachments

+
+
+ +
+ Source code in pyorthanc/client.py +
479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
def get_instances_id_attachments(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List attachments
+
+    Get the list of attachments that are associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "full" (str): If present, retrieve the attachments list and their numerical ids
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the attachments
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/attachments",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name(id_, name, headers=None) + +

+ + +
+ +

List operations on attachments

+

Get the list of the operations that are available for attachments associated with the given instance +Tags: Other

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/client.py +
537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
def get_instances_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List operations on attachments
+
+    Get the list of the operations that are available for attachments associated with the given instance
+    Tags: Other
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_compressed_data(id_, name, headers=None) + +

+ + +
+ +

Get attachment (no decompression)

+

Get the (binary) content of one attachment associated with the given instance. The attachment will not be decompressed if StorageCompression is true. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
def get_instances_id_attachments_name_compressed_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get attachment (no decompression)
+
+    Get the (binary) content of one attachment associated with the given instance. The attachment will not be decompressed if `StorageCompression` is `true`.
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/compressed-data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_compressed_md5(id_, name, headers=None) + +

+ + +
+ +

Get MD5 of attachment on disk

+

Get the MD5 hash of one attachment associated with the given instance, as stored on the disk. This is different from .../md5 iff EnableStorage is true. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/client.py +
659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
def get_instances_id_attachments_name_compressed_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get MD5 of attachment on disk
+
+    Get the MD5 hash of one attachment associated with the given instance, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment, as stored on the disk
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/compressed-md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_compressed_size(id_, name, headers=None) + +

+ + +
+ +

Get size of attachment on disk

+

Get the size of one attachment associated with the given instance, as stored on the disk. This is different from .../size iff EnableStorage is true. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/client.py +
690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
def get_instances_id_attachments_name_compressed_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get size of attachment on disk
+
+    Get the size of one attachment associated with the given instance, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment, as stored on the disk
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/compressed-size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_data(id_, name, headers=None) + +

+ + +
+ +

Get attachment

+

Get the (binary) content of one attachment associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
def get_instances_id_attachments_name_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get attachment
+
+    Get the (binary) content of one attachment associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_info(id_, name, headers=None) + +

+ + +
+ +

Get info about the attachment

+

Get all the information about the attachment associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the information about the attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
def get_instances_id_attachments_name_info(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get info about the attachment
+
+    Get all the information about the attachment associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the information about the attachment
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/info",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_is_compressed(id_, name, headers=None) + +

+ + +
+ +

Is attachment compressed?

+

Test whether the attachment has been stored as a compressed file on the disk. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

0 if the attachment was stored uncompressed, 1 if it was compressed

+
+
+ +
+ Source code in pyorthanc/client.py +
783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
def get_instances_id_attachments_name_is_compressed(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Is attachment compressed?
+
+    Test whether the attachment has been stored as a compressed file on the disk.
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `0` if the attachment was stored uncompressed, `1` if it was compressed
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/is-compressed",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_md5(id_, name, headers=None) + +

+ + +
+ +

Get MD5 of attachment

+

Get the MD5 hash of one attachment associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
def get_instances_id_attachments_name_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get MD5 of attachment
+
+    Get the MD5 hash of one attachment associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_attachments_name_size(id_, name, headers=None) + +

+ + +
+ +

Get size of attachment

+

Get the size of one attachment associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
def get_instances_id_attachments_name_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get size of attachment
+
+    Get the size of one attachment associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_content_path(id_, path) + +

+ + +
+ +

Get raw tag

+

Get the raw content of one DICOM tag in the hierarchy of DICOM dataset +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
path + str + +
+

Path to the DICOM tag. This is the interleaving of one DICOM tag, possibly followed by an index for sequences. Sequences are accessible as, for instance, /0008-1140/1/0008-1150

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The raw value of the tag of intereset (binary data, whose memory layout depends on the underlying transfer syntax), or JSON array containing the list of available tags if accessing a dataset

+
+
+ +
+ Source code in pyorthanc/client.py +
927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
def get_instances_id_content_path(
+    self,
+    id_: str,
+    path: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get raw tag
+
+    Get the raw content of one DICOM tag in the hierarchy of DICOM dataset
+    Tags: Instances
+
+    Parameters
+    ----------
+    path
+        Path to the DICOM tag. This is the interleaving of one DICOM tag, possibly followed by an index for sequences. Sequences are accessible as, for instance, `/0008-1140/1/0008-1150`
+    id_
+        Orthanc identifier of the DICOM instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The raw value of the tag of intereset (binary data, whose memory layout depends on the underlying transfer syntax), or JSON array containing the list of available tags if accessing a dataset
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/content/{path}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_file(id_, params=None, headers=None) + +

+ + +
+ +

Download DICOM

+

Download one DICOM instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "transcode" (str): If present, the DICOM file will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): This HTTP header can be set to retrieve the DICOM instance in DICOMweb format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The DICOM instance +The DICOM instance, in DICOMweb JSON format +The DICOM instance, in DICOMweb XML format

+
+
+ +
+ Source code in pyorthanc/client.py +
 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
def get_instances_id_file(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Download DICOM
+
+    Download one DICOM instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "transcode" (str): If present, the DICOM file will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): This HTTP header can be set to retrieve the DICOM instance in DICOMweb format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The DICOM instance
+        The DICOM instance, in DICOMweb JSON format
+        The DICOM instance, in DICOMweb XML format
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/file",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames(id_) + +

+ + +
+ +

List available frames

+

List the frames that are available in the DICOM instance of interest +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The list of the indices of the available frames

+
+
+ +
+ Source code in pyorthanc/client.py +
1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
def get_instances_id_frames(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List available frames
+
+    List the frames that are available in the DICOM instance of interest
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The list of the indices of the available frames
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/frames",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame(frame, id_) + +

+ + +
+ +

List operations

+

List the available operations under URI /instances/{id}/frames/{frame}/ +Tags: Other

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + str + +
+ +
+
+ required +
id_ + str + +
+ +
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/client.py +
1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
def get_instances_id_frames_frame(
+    self,
+    frame: str,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List operations
+
+    List the available operations under URI `/instances/{id}/frames/{frame}/`
+    Tags: Other
+
+    Parameters
+    ----------
+    frame
+
+    id_
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_image_int16(frame, id_, params=None, headers=None) + +

+ + +
+ +

Decode a frame (int16)

+

Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [-32768,32767] range. Negative values must be interpreted according to two's complement. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/client.py +
1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
def get_instances_id_frames_frame_image_int16(
+    self,
+    frame: float,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode a frame (int16)
+
+    Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [-32768,32767] range. Negative values must be interpreted according to two's complement.
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/image-int16",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_image_uint16(frame, id_, params=None, headers=None) + +

+ + +
+ +

Decode a frame (uint16)

+

Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [0,65535] range. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/client.py +
1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
def get_instances_id_frames_frame_image_uint16(
+    self,
+    frame: float,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode a frame (uint16)
+
+    Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [0,65535] range.
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/image-uint16",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_image_uint8(frame, id_, params=None, headers=None) + +

+ + +
+ +

Decode a frame (uint8)

+

Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [0,255] range. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/client.py +
1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
def get_instances_id_frames_frame_image_uint8(
+    self,
+    frame: float,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode a frame (uint8)
+
+    Decode one frame of interest from the given DICOM instance. Pixels of grayscale images are truncated to the [0,255] range.
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/image-uint8",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_matlab(frame, id_) + +

+ + +
+ +

Decode frame for Matlab

+

Decode one frame of interest from the given DICOM instance, and export this frame as a Octave/Matlab matrix to be imported with eval(): https://orthanc.uclouvain.be/book/faq/matlab.html +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Octave/Matlab matrix

+
+
+ +
+ Source code in pyorthanc/client.py +
1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
def get_instances_id_frames_frame_matlab(
+    self,
+    frame: float,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode frame for Matlab
+
+    Decode one frame of interest from the given DICOM instance, and export this frame as a Octave/Matlab matrix to be imported with `eval()`: https://orthanc.uclouvain.be/book/faq/matlab.html
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Octave/Matlab matrix
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/matlab",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_numpy(frame, id_, params=None) + +

+ + +
+ +

Decode frame for numpy

+

Decode one frame of interest from the given DICOM instance, for use with numpy in Python. The numpy array has 3 dimensions: (height, width, color channel). +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM resource of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "compress" (bool): Compress the file as .npz + "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html

+
+
+ +
+ Source code in pyorthanc/client.py +
1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
def get_instances_id_frames_frame_numpy(
+    self,
+    frame: float,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode frame for numpy
+
+    Decode one frame of interest from the given DICOM instance, for use with numpy in Python. The numpy array has 3 dimensions: (height, width, color channel).
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM resource of interest
+    params
+        Dictionary of optional parameters:
+            "compress" (bool): Compress the file as `.npz`
+            "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/numpy",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_preview(frame, id_, params=None, headers=None) + +

+ + +
+ +

Decode a frame (preview)

+

Decode one frame of interest from the given DICOM instance. The full dynamic range of grayscale images is rescaled to the [0,255] range. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/client.py +
1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
def get_instances_id_frames_frame_preview(
+    self,
+    frame: float,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode a frame (preview)
+
+    Decode one frame of interest from the given DICOM instance. The full dynamic range of grayscale images is rescaled to the [0,255] range.
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/preview",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_raw(frame, id_) + +

+ + +
+ +

Access raw frame

+

Access the raw content of one individual frame of the DICOM instance of interest, bypassing image decoding. This is notably useful to access the source files in compressed transfer syntaxes. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The raw frame

+
+
+ +
+ Source code in pyorthanc/client.py +
1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
def get_instances_id_frames_frame_raw(
+    self,
+    frame: float,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Access raw frame
+
+    Access the raw content of one individual frame of the DICOM instance of interest, bypassing image decoding. This is notably useful to access the source files in compressed transfer syntaxes.
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The raw frame
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/raw",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_raw_gz(frame, id_) + +

+ + +
+ +

Access raw frame (compressed)

+

Access the raw content of one individual frame of the DICOM instance of interest, bypassing image decoding. This is notably useful to access the source files in compressed transfer syntaxes. The image is compressed using gzip +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The raw frame, compressed using gzip

+
+
+ +
+ Source code in pyorthanc/client.py +
1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
def get_instances_id_frames_frame_raw_gz(
+    self,
+    frame: float,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Access raw frame (compressed)
+
+    Access the raw content of one individual frame of the DICOM instance of interest, bypassing image decoding. This is notably useful to access the source files in compressed transfer syntaxes. The image is compressed using gzip
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The raw frame, compressed using gzip
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/raw.gz",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_frames_frame_rendered(frame, id_, params=None, headers=None) + +

+ + +
+ +

Render a frame

+

Render one frame of interest from the given DICOM instance. This function takes scaling into account (RescaleSlope and RescaleIntercept tags), as well as the default windowing stored in the DICOM file (WindowCenter and WindowWidthtags), and can be used to resize the resulting image. Color images are not affected by windowing. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
frame + float + +
+

Index of the frame (starts at 0)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "height" (float): Height of the resized image + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false) + "smooth" (bool): Whether to smooth image on resize + "width" (float): Width of the resized image + "window-center" (float): Windowing center + "window-width" (float): Windowing width

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/client.py +
1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
def get_instances_id_frames_frame_rendered(
+    self,
+    frame: float,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Render a frame
+
+    Render one frame of interest from the given DICOM instance. This function takes scaling into account (`RescaleSlope` and `RescaleIntercept` tags), as well as the default windowing stored in the DICOM file (`WindowCenter` and `WindowWidth`tags), and can be used to resize the resulting image. Color images are not affected by windowing.
+    Tags: Instances
+
+    Parameters
+    ----------
+    frame
+        Index of the frame (starts at `0`)
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "height" (float): Height of the resized image
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+            "smooth" (bool): Whether to smooth image on resize
+            "width" (float): Width of the resized image
+            "window-center" (float): Windowing center
+            "window-width" (float): Windowing width
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/frames/{frame}/rendered",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_header(id_, params=None) + +

+ + +
+ +

Get DICOM meta-header

+

Get the DICOM tags in the meta-header of the DICOM instance. By default, the full format is used, which combines hexadecimal tags with human-readable description. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the DICOM tags and their associated value

+
+
+ +
+ Source code in pyorthanc/client.py +
1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
def get_instances_id_header(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get DICOM meta-header
+
+    Get the DICOM tags in the meta-header of the DICOM instance. By default, the `full` format is used, which combines hexadecimal tags with human-readable description.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the DICOM tags and their associated value
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/header",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_image_int16(id_, params=None, headers=None) + +

+ + +
+ +

Decode an image (int16)

+

Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [-32768,32767] range. Negative values must be interpreted according to two's complement. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/client.py +
1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
def get_instances_id_image_int16(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode an image (int16)
+
+    Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [-32768,32767] range. Negative values must be interpreted according to two's complement.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/image-int16",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_image_uint16(id_, params=None, headers=None) + +

+ + +
+ +

Decode an image (uint16)

+

Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [0,65535] range. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/client.py +
1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
def get_instances_id_image_uint16(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode an image (uint16)
+
+    Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [0,65535] range.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/image-uint16",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_image_uint8(id_, params=None, headers=None) + +

+ + +
+ +

Decode an image (uint8)

+

Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [0,255] range. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/client.py +
1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
def get_instances_id_image_uint8(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode an image (uint8)
+
+    Decode the first frame of the given DICOM instance. Pixels of grayscale images are truncated to the [0,255] range.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/image-uint8",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_labels(id_) + +

+ + +
+ +

List labels

+

Get the labels that are associated with the given instance (new in Orthanc 1.12.0) +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the labels

+
+
+ +
+ Source code in pyorthanc/client.py +
1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
def get_instances_id_labels(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List labels
+
+    Get the labels that are associated with the given instance (new in Orthanc 1.12.0)
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the labels
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/labels",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_labels_label(id_, label) + +

+ + +
+ +

Test label

+

Test whether the instance is associated with the given label +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label of interest

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty string is returned in the case of presence, error 404 in the case of absence

+
+
+ +
+ Source code in pyorthanc/client.py +
1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
def get_instances_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Test label
+
+    Test whether the instance is associated with the given label
+    Tags: Instances
+
+    Parameters
+    ----------
+    label
+        The label of interest
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty string is returned in the case of presence, error 404 in the case of absence
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_matlab(id_) + +

+ + +
+ +

Decode frame for Matlab

+

Decode the first frame of the given DICOM instance., and export this frame as a Octave/Matlab matrix to be imported with eval(): https://orthanc.uclouvain.be/book/faq/matlab.html +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Octave/Matlab matrix

+
+
+ +
+ Source code in pyorthanc/client.py +
1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
def get_instances_id_matlab(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode frame for Matlab
+
+    Decode the first frame of the given DICOM instance., and export this frame as a Octave/Matlab matrix to be imported with `eval()`: https://orthanc.uclouvain.be/book/faq/matlab.html
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Octave/Matlab matrix
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/matlab",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_metadata(id_, params=None) + +

+ + +
+ +

List metadata

+

Get the list of metadata that are associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, also retrieve the value of the individual metadata + "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/client.py +
1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
def get_instances_id_metadata(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List metadata
+
+    Get the list of metadata that are associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, also retrieve the value of the individual metadata
+            "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/metadata",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_metadata_name(id_, name, headers=None) + +

+ + +
+ +

Get metadata

+

Get the value of a metadata that is associated with the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Value of the metadata

+
+
+ +
+ Source code in pyorthanc/client.py +
1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
def get_instances_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get metadata
+
+    Get the value of a metadata that is associated with the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Value of the metadata
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_module(id_, params=None) + +

+ + +
+ +

Get instance module

+

Get the instance module of the DICOM instance whose Orthanc identifier is provided in the URL +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM instance

+
+
+ +
+ Source code in pyorthanc/client.py +
1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
def get_instances_id_module(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get instance module
+
+    Get the instance module of the DICOM instance whose Orthanc identifier is provided in the URL
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM instance
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/module",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_numpy(id_, params=None) + +

+ + +
+ +

Decode instance for numpy

+

Decode the given DICOM instance, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel). +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM resource of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "compress" (bool): Compress the file as .npz + "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html

+
+
+ +
+ Source code in pyorthanc/client.py +
1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
def get_instances_id_numpy(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode instance for numpy
+
+    Decode the given DICOM instance, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel).
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM resource of interest
+    params
+        Dictionary of optional parameters:
+            "compress" (bool): Compress the file as `.npz`
+            "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/numpy",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_patient(id_, params=None) + +

+ + +
+ +

Get parent patient

+

Get detailed information about the parent patient of the DICOM instance whose Orthanc identifier is provided in the URL +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the parent DICOM patient

+
+
+ +
+ Source code in pyorthanc/client.py +
1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
def get_instances_id_patient(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get parent patient
+
+    Get detailed information about the parent patient of the DICOM instance whose Orthanc identifier is provided in the URL
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the parent DICOM patient
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/patient",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_pdf(id_) + +

+ + +
+ +

Get embedded PDF

+

Get the PDF file that is embedded in one DICOM instance. If the DICOM instance doesn't contain the EncapsulatedDocument tag or if the MIMETypeOfEncapsulatedDocument tag doesn't correspond to the PDF type, a 404 HTTP error is raised. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

PDF file

+
+
+ +
+ Source code in pyorthanc/client.py +
1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
def get_instances_id_pdf(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get embedded PDF
+
+    Get the PDF file that is embedded in one DICOM instance. If the DICOM instance doesn't contain the `EncapsulatedDocument` tag or if the `MIMETypeOfEncapsulatedDocument` tag doesn't correspond to the PDF type, a `404` HTTP error is raised.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        PDF file
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/pdf",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_preview(id_, params=None, headers=None) + +

+ + +
+ +

Decode an image (preview)

+

Decode the first frame of the given DICOM instance. The full dynamic range of grayscale images is rescaled to the [0,255] range. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/client.py +
1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
def get_instances_id_preview(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode an image (preview)
+
+    Decode the first frame of the given DICOM instance. The full dynamic range of grayscale images is rescaled to the [0,255] range.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/preview",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_rendered(id_, params=None, headers=None) + +

+ + +
+ +

Render an image

+

Render the first frame of the given DICOM instance. This function takes scaling into account (RescaleSlope and RescaleIntercept tags), as well as the default windowing stored in the DICOM file (WindowCenter and WindowWidthtags), and can be used to resize the resulting image. Color images are not affected by windowing. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "height" (float): Height of the resized image + "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90) + "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false) + "smooth" (bool): Whether to smooth image on resize + "width" (float): Width of the resized image + "window-center" (float): Windowing center + "window-width" (float): Windowing width

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "Accept" (str): Format of the resulting image. Can be image/png (default), image/jpeg or image/x-portable-arbitrarymap

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JPEG image +PNG image +PAM image (Portable Arbitrary Map)

+
+
+ +
+ Source code in pyorthanc/client.py +
1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
def get_instances_id_rendered(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Render an image
+
+    Render the first frame of the given DICOM instance. This function takes scaling into account (`RescaleSlope` and `RescaleIntercept` tags), as well as the default windowing stored in the DICOM file (`WindowCenter` and `WindowWidth`tags), and can be used to resize the resulting image. Color images are not affected by windowing.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "height" (float): Height of the resized image
+            "quality" (float): Quality for JPEG images (between 1 and 100, defaults to 90)
+            "returnUnsupportedImage" (bool): Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)
+            "smooth" (bool): Whether to smooth image on resize
+            "width" (float): Width of the resized image
+            "window-center" (float): Windowing center
+            "window-width" (float): Windowing width
+    headers
+        Dictionary of optional headers:
+            "Accept" (str): Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JPEG image
+        PNG image
+        PAM image (Portable Arbitrary Map)
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/rendered",
+        params=params,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_series(id_, params=None) + +

+ + +
+ +

Get parent series

+

Get detailed information about the parent series of the DICOM instance whose Orthanc identifier is provided in the URL +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the parent DICOM series

+
+
+ +
+ Source code in pyorthanc/client.py +
2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
def get_instances_id_series(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get parent series
+
+    Get detailed information about the parent series of the DICOM instance whose Orthanc identifier is provided in the URL
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the parent DICOM series
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/series",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_simplified_tags(id_, params=None) + +

+ + +
+ +

Get human-readable tags

+

Get the DICOM tags in human-readable format (same as the /instances/{id}/tags?simplify route) +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the DICOM tags and their associated value

+
+
+ +
+ Source code in pyorthanc/client.py +
2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
def get_instances_id_simplified_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get human-readable tags
+
+    Get the DICOM tags in human-readable format (same as the `/instances/{id}/tags?simplify` route)
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the DICOM tags and their associated value
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/simplified-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_statistics(id_) + +

+ + +
+ +

Get instance statistics

+

Get statistics about the given instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
def get_instances_id_statistics(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get instance statistics
+
+    Get statistics about the given instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/statistics",
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_study(id_, params=None) + +

+ + +
+ +

Get parent study

+

Get detailed information about the parent study of the DICOM instance whose Orthanc identifier is provided in the URL +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the parent DICOM study

+
+
+ +
+ Source code in pyorthanc/client.py +
2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
def get_instances_id_study(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get parent study
+
+    Get detailed information about the parent study of the DICOM instance whose Orthanc identifier is provided in the URL
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the parent DICOM study
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/study",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_instances_id_tags(id_, params=None) + +

+ + +
+ +

Get DICOM tags

+

Get the DICOM tags in the specified format. By default, the full format is used, which combines hexadecimal tags with human-readable description. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the DICOM tags and their associated value

+
+
+ +
+ Source code in pyorthanc/client.py +
2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
def get_instances_id_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get DICOM tags
+
+    Get the DICOM tags in the specified format. By default, the `full` format is used, which combines hexadecimal tags with human-readable description.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the DICOM tags and their associated value
+    """
+    return self._get(
+        route=f"{self.url}/instances/{id_}/tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_jobs(params=None) + +

+ + +
+ +

List jobs

+

List all the available jobs +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual jobs

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the jobs identifiers, or detailed information about the reported jobs (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/client.py +
2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
def get_jobs(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List jobs
+
+    List all the available jobs
+    Tags: Jobs
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual jobs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the jobs identifiers, or detailed information about the reported jobs (if `expand` argument is provided)
+    """
+    return self._get(
+        route=f"{self.url}/jobs",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_jobs_id(id_) + +

+ + +
+ +

Get job

+

Retrieve detailed information about the job whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object detailing the job

+
+
+ +
+ Source code in pyorthanc/client.py +
2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
def get_jobs_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get job
+
+    Retrieve detailed information about the job whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+    Tags: Jobs
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object detailing the job
+    """
+    return self._get(
+        route=f"{self.url}/jobs/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_jobs_id_key(id_, key) + +

+ + +
+ +

Get job output

+

Retrieve some output produced by a job. As of Orthanc 1.8.2, only the jobs that generate a DICOMDIR media or a ZIP archive provide such an output (with key equals to archive). +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
key + str + +
+

Name of the output of interest

+
+
+ required +
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Content of the output of the job

+
+
+ +
+ Source code in pyorthanc/client.py +
2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
def get_jobs_id_key(
+    self,
+    id_: str,
+    key: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get job output
+
+    Retrieve some output produced by a job. As of Orthanc 1.8.2, only the jobs that generate a DICOMDIR media or a ZIP archive provide such an output (with `key` equals to `archive`).
+    Tags: Jobs
+
+    Parameters
+    ----------
+    key
+        Name of the output of interest
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Content of the output of the job
+    """
+    return self._get(
+        route=f"{self.url}/jobs/{id_}/{key}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_modalities(params=None) + +

+ + +
+ +

List DICOM modalities

+

List all the DICOM modalities that are known to Orthanc. This corresponds either to the content of the DicomModalities configuration option, or to the information stored in the database if DicomModalitiesInDatabase is true. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual DICOM modalities

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the identifiers of the modalities, or detailed information about the modalities (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/client.py +
2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
def get_modalities(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List DICOM modalities
+
+    List all the DICOM modalities that are known to Orthanc. This corresponds either to the content of the `DicomModalities` configuration option, or to the information stored in the database if `DicomModalitiesInDatabase` is `true`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual DICOM modalities
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the identifiers of the modalities, or detailed information about the modalities (if `expand` argument is provided)
+    """
+    return self._get(
+        route=f"{self.url}/modalities",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_modalities_id(id_) + +

+ + +
+ +

List operations on modality

+

List the operations that are available for a DICOM modality. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the DICOM modality of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/client.py +
2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
def get_modalities_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List operations on modality
+
+    List the operations that are available for a DICOM modality.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the DICOM modality of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return self._get(
+        route=f"{self.url}/modalities/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_modalities_id_configuration(id_) + +

+ + +
+ +

Get modality configuration

+

Get detailed information about the configuration of some DICOM modality +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Configuration of the modality

+
+
+ +
+ Source code in pyorthanc/client.py +
2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
def get_modalities_id_configuration(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get modality configuration
+
+    Get detailed information about the configuration of some DICOM modality
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Configuration of the modality
+    """
+    return self._get(
+        route=f"{self.url}/modalities/{id_}/configuration",
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients(params=None) + +

+ + +
+ +

List the available patients

+

List the Orthanc identifiers of all the available DICOM patients +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual patients + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "limit" (float): Limit the number of results + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format + "since" (float): Show only the resources since the provided index

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the Orthanc identifiers, or detailed information about the reported patients (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/client.py +
2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
def get_patients(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List the available patients
+
+    List the Orthanc identifiers of all the available DICOM patients
+    Tags: Patients
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual patients
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "limit" (float): Limit the number of results
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "since" (float): Show only the resources since the provided index
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the Orthanc identifiers, or detailed information about the reported patients (if `expand` argument is provided)
+    """
+    return self._get(
+        route=f"{self.url}/patients",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id(id_, params=None) + +

+ + +
+ +

Get information about some patient

+

Get detailed information about the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM patient

+
+
+ +
+ Source code in pyorthanc/client.py +
2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
def get_patients_id(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get information about some patient
+
+    Get detailed information about the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM patient
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_archive(id_, params=None) + +

+ + +
+ +

Create ZIP archive

+

Synchronously create a ZIP archive containing the DICOM patient whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might not be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using POST method. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension) + "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
def get_patients_id_archive(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create ZIP archive
+
+    Synchronously create a ZIP archive containing the DICOM patient whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+            "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        ZIP file containing the archive
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/archive",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments(id_, params=None) + +

+ + +
+ +

List attachments

+

Get the list of attachments that are associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (str): If present, retrieve the attachments list and their numerical ids

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the attachments

+
+
+ +
+ Source code in pyorthanc/client.py +
3092
+3093
+3094
+3095
+3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
def get_patients_id_attachments(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List attachments
+
+    Get the list of attachments that are associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "full" (str): If present, retrieve the attachments list and their numerical ids
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the attachments
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/attachments",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name(id_, name, headers=None) + +

+ + +
+ +

List operations on attachments

+

Get the list of the operations that are available for attachments associated with the given patient +Tags: Other

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/client.py +
3150
+3151
+3152
+3153
+3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+3168
+3169
+3170
+3171
+3172
+3173
+3174
+3175
+3176
+3177
+3178
+3179
def get_patients_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List operations on attachments
+
+    Get the list of the operations that are available for attachments associated with the given patient
+    Tags: Other
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_compressed_data(id_, name, headers=None) + +

+ + +
+ +

Get attachment (no decompression)

+

Get the (binary) content of one attachment associated with the given patient. The attachment will not be decompressed if StorageCompression is true. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
3241
+3242
+3243
+3244
+3245
+3246
+3247
+3248
+3249
+3250
+3251
+3252
+3253
+3254
+3255
+3256
+3257
+3258
+3259
+3260
+3261
+3262
+3263
+3264
+3265
+3266
+3267
+3268
+3269
+3270
def get_patients_id_attachments_name_compressed_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get attachment (no decompression)
+
+    Get the (binary) content of one attachment associated with the given patient. The attachment will not be decompressed if `StorageCompression` is `true`.
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/compressed-data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_compressed_md5(id_, name, headers=None) + +

+ + +
+ +

Get MD5 of attachment on disk

+

Get the MD5 hash of one attachment associated with the given patient, as stored on the disk. This is different from .../md5 iff EnableStorage is true. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/client.py +
3272
+3273
+3274
+3275
+3276
+3277
+3278
+3279
+3280
+3281
+3282
+3283
+3284
+3285
+3286
+3287
+3288
+3289
+3290
+3291
+3292
+3293
+3294
+3295
+3296
+3297
+3298
+3299
+3300
+3301
def get_patients_id_attachments_name_compressed_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get MD5 of attachment on disk
+
+    Get the MD5 hash of one attachment associated with the given patient, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment, as stored on the disk
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/compressed-md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_compressed_size(id_, name, headers=None) + +

+ + +
+ +

Get size of attachment on disk

+

Get the size of one attachment associated with the given patient, as stored on the disk. This is different from .../size iff EnableStorage is true. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/client.py +
3303
+3304
+3305
+3306
+3307
+3308
+3309
+3310
+3311
+3312
+3313
+3314
+3315
+3316
+3317
+3318
+3319
+3320
+3321
+3322
+3323
+3324
+3325
+3326
+3327
+3328
+3329
+3330
+3331
+3332
def get_patients_id_attachments_name_compressed_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get size of attachment on disk
+
+    Get the size of one attachment associated with the given patient, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment, as stored on the disk
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/compressed-size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_data(id_, name, headers=None) + +

+ + +
+ +

Get attachment

+

Get the (binary) content of one attachment associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
3334
+3335
+3336
+3337
+3338
+3339
+3340
+3341
+3342
+3343
+3344
+3345
+3346
+3347
+3348
+3349
+3350
+3351
+3352
+3353
+3354
+3355
+3356
+3357
+3358
+3359
+3360
+3361
+3362
+3363
def get_patients_id_attachments_name_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get attachment
+
+    Get the (binary) content of one attachment associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_info(id_, name, headers=None) + +

+ + +
+ +

Get info about the attachment

+

Get all the information about the attachment associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the information about the attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
3365
+3366
+3367
+3368
+3369
+3370
+3371
+3372
+3373
+3374
+3375
+3376
+3377
+3378
+3379
+3380
+3381
+3382
+3383
+3384
+3385
+3386
+3387
+3388
+3389
+3390
+3391
+3392
+3393
+3394
def get_patients_id_attachments_name_info(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get info about the attachment
+
+    Get all the information about the attachment associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the information about the attachment
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/info",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_is_compressed(id_, name, headers=None) + +

+ + +
+ +

Is attachment compressed?

+

Test whether the attachment has been stored as a compressed file on the disk. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

0 if the attachment was stored uncompressed, 1 if it was compressed

+
+
+ +
+ Source code in pyorthanc/client.py +
3396
+3397
+3398
+3399
+3400
+3401
+3402
+3403
+3404
+3405
+3406
+3407
+3408
+3409
+3410
+3411
+3412
+3413
+3414
+3415
+3416
+3417
+3418
+3419
+3420
+3421
+3422
+3423
+3424
+3425
def get_patients_id_attachments_name_is_compressed(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Is attachment compressed?
+
+    Test whether the attachment has been stored as a compressed file on the disk.
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `0` if the attachment was stored uncompressed, `1` if it was compressed
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/is-compressed",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_md5(id_, name, headers=None) + +

+ + +
+ +

Get MD5 of attachment

+

Get the MD5 hash of one attachment associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
3427
+3428
+3429
+3430
+3431
+3432
+3433
+3434
+3435
+3436
+3437
+3438
+3439
+3440
+3441
+3442
+3443
+3444
+3445
+3446
+3447
+3448
+3449
+3450
+3451
+3452
+3453
+3454
+3455
+3456
def get_patients_id_attachments_name_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get MD5 of attachment
+
+    Get the MD5 hash of one attachment associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_attachments_name_size(id_, name, headers=None) + +

+ + +
+ +

Get size of attachment

+

Get the size of one attachment associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
3458
+3459
+3460
+3461
+3462
+3463
+3464
+3465
+3466
+3467
+3468
+3469
+3470
+3471
+3472
+3473
+3474
+3475
+3476
+3477
+3478
+3479
+3480
+3481
+3482
+3483
+3484
+3485
+3486
+3487
def get_patients_id_attachments_name_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get size of attachment
+
+    Get the size of one attachment associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_instances(id_, params=None) + +

+ + +
+ +

Get child instances

+

Get detailed information about the child instances of the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If false or missing, only retrieve the list of child instances + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing information about the child DICOM instances

+
+
+ +
+ Source code in pyorthanc/client.py +
3540
+3541
+3542
+3543
+3544
+3545
+3546
+3547
+3548
+3549
+3550
+3551
+3552
+3553
+3554
+3555
+3556
+3557
+3558
+3559
+3560
+3561
+3562
+3563
+3564
+3565
+3566
+3567
+3568
+3569
def get_patients_id_instances(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get child instances
+
+    Get detailed information about the child instances of the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If false or missing, only retrieve the list of child instances
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing information about the child DICOM instances
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/instances",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_instances_tags(id_, params=None) + +

+ + +
+ +

Get tags of instances

+

Get the tags of all the child instances of the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags

+
+
+ +
+ Source code in pyorthanc/client.py +
3571
+3572
+3573
+3574
+3575
+3576
+3577
+3578
+3579
+3580
+3581
+3582
+3583
+3584
+3585
+3586
+3587
+3588
+3589
+3590
+3591
+3592
+3593
+3594
+3595
+3596
+3597
+3598
+3599
def get_patients_id_instances_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get tags of instances
+
+    Get the tags of all the child instances of the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/instances-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_labels(id_) + +

+ + +
+ +

List labels

+

Get the labels that are associated with the given patient (new in Orthanc 1.12.0) +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the labels

+
+
+ +
+ Source code in pyorthanc/client.py +
3601
+3602
+3603
+3604
+3605
+3606
+3607
+3608
+3609
+3610
+3611
+3612
+3613
+3614
+3615
+3616
+3617
+3618
+3619
+3620
+3621
+3622
def get_patients_id_labels(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List labels
+
+    Get the labels that are associated with the given patient (new in Orthanc 1.12.0)
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the labels
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/labels",
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_labels_label(id_, label) + +

+ + +
+ +

Test label

+

Test whether the patient is associated with the given label +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label of interest

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty string is returned in the case of presence, error 404 in the case of absence

+
+
+ +
+ Source code in pyorthanc/client.py +
3649
+3650
+3651
+3652
+3653
+3654
+3655
+3656
+3657
+3658
+3659
+3660
+3661
+3662
+3663
+3664
+3665
+3666
+3667
+3668
+3669
+3670
+3671
+3672
+3673
def get_patients_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Test label
+
+    Test whether the patient is associated with the given label
+    Tags: Patients
+
+    Parameters
+    ----------
+    label
+        The label of interest
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty string is returned in the case of presence, error 404 in the case of absence
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_media(id_, params=None) + +

+ + +
+ +

Create DICOMDIR media

+

Synchronously create a DICOMDIR media containing the DICOM patient whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might not be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using POST method. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "extended" (str): If present, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR + "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension) + "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
3700
+3701
+3702
+3703
+3704
+3705
+3706
+3707
+3708
+3709
+3710
+3711
+3712
+3713
+3714
+3715
+3716
+3717
+3718
+3719
+3720
+3721
+3722
+3723
+3724
+3725
+3726
+3727
+3728
def get_patients_id_media(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create DICOMDIR media
+
+    Synchronously create a DICOMDIR media containing the DICOM patient whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "extended" (str): If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*
+            "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+            "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        ZIP file containing the archive
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/media",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_metadata(id_, params=None) + +

+ + +
+ +

List metadata

+

Get the list of metadata that are associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, also retrieve the value of the individual metadata + "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/client.py +
3766
+3767
+3768
+3769
+3770
+3771
+3772
+3773
+3774
+3775
+3776
+3777
+3778
+3779
+3780
+3781
+3782
+3783
+3784
+3785
+3786
+3787
+3788
+3789
+3790
+3791
+3792
+3793
def get_patients_id_metadata(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List metadata
+
+    Get the list of metadata that are associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, also retrieve the value of the individual metadata
+            "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/metadata",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_metadata_name(id_, name, headers=None) + +

+ + +
+ +

Get metadata

+

Get the value of a metadata that is associated with the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Value of the metadata

+
+
+ +
+ Source code in pyorthanc/client.py +
3825
+3826
+3827
+3828
+3829
+3830
+3831
+3832
+3833
+3834
+3835
+3836
+3837
+3838
+3839
+3840
+3841
+3842
+3843
+3844
+3845
+3846
+3847
+3848
+3849
+3850
+3851
+3852
+3853
+3854
def get_patients_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get metadata
+
+    Get the value of a metadata that is associated with the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Value of the metadata
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_module(id_, params=None) + +

+ + +
+ +

Get patient module

+

Get the patient module of the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM patient

+
+
+ +
+ Source code in pyorthanc/client.py +
3932
+3933
+3934
+3935
+3936
+3937
+3938
+3939
+3940
+3941
+3942
+3943
+3944
+3945
+3946
+3947
+3948
+3949
+3950
+3951
+3952
+3953
+3954
+3955
+3956
+3957
+3958
+3959
+3960
def get_patients_id_module(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get patient module
+
+    Get the patient module of the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM patient
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/module",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_protected(id_) + +

+ + +
+ +

Is the patient protected against recycling?

+

Is the patient protected against recycling? +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

1 if protected, 0 if not protected

+
+
+ +
+ Source code in pyorthanc/client.py +
3962
+3963
+3964
+3965
+3966
+3967
+3968
+3969
+3970
+3971
+3972
+3973
+3974
+3975
+3976
+3977
+3978
+3979
+3980
+3981
+3982
+3983
def get_patients_id_protected(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Is the patient protected against recycling?
+
+    Is the patient protected against recycling?
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `1` if protected, `0` if not protected
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/protected",
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_series(id_, params=None) + +

+ + +
+ +

Get child series

+

Get detailed information about the child series of the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If false or missing, only retrieve the list of child series + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing information about the child DICOM series

+
+
+ +
+ Source code in pyorthanc/client.py +
4037
+4038
+4039
+4040
+4041
+4042
+4043
+4044
+4045
+4046
+4047
+4048
+4049
+4050
+4051
+4052
+4053
+4054
+4055
+4056
+4057
+4058
+4059
+4060
+4061
+4062
+4063
+4064
+4065
+4066
def get_patients_id_series(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get child series
+
+    Get detailed information about the child series of the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If false or missing, only retrieve the list of child series
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing information about the child DICOM series
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/series",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_shared_tags(id_, params=None) + +

+ + +
+ +

Get shared tags

+

Extract the DICOM tags whose value is constant across all the child instances of the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the values of the DICOM tags

+
+
+ +
+ Source code in pyorthanc/client.py +
4068
+4069
+4070
+4071
+4072
+4073
+4074
+4075
+4076
+4077
+4078
+4079
+4080
+4081
+4082
+4083
+4084
+4085
+4086
+4087
+4088
+4089
+4090
+4091
+4092
+4093
+4094
+4095
def get_patients_id_shared_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get shared tags
+
+    Extract the DICOM tags whose value is constant across all the child instances of the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the values of the DICOM tags
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/shared-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_statistics(id_) + +

+ + +
+ +

Get patient statistics

+

Get statistics about the given patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4097
+4098
+4099
+4100
+4101
+4102
+4103
+4104
+4105
+4106
+4107
+4108
+4109
+4110
+4111
+4112
+4113
+4114
+4115
+4116
+4117
+4118
def get_patients_id_statistics(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get patient statistics
+
+    Get statistics about the given patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/statistics",
+    )
+
+
+
+ +
+ +
+ + +

+ get_patients_id_studies(id_, params=None) + +

+ + +
+ +

Get child studies

+

Get detailed information about the child studies of the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If false or missing, only retrieve the list of child studies + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing information about the child DICOM studies

+
+
+ +
+ Source code in pyorthanc/client.py +
4120
+4121
+4122
+4123
+4124
+4125
+4126
+4127
+4128
+4129
+4130
+4131
+4132
+4133
+4134
+4135
+4136
+4137
+4138
+4139
+4140
+4141
+4142
+4143
+4144
+4145
+4146
+4147
+4148
+4149
def get_patients_id_studies(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get child studies
+
+    Get detailed information about the child studies of the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If false or missing, only retrieve the list of child studies
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing information about the child DICOM studies
+    """
+    return self._get(
+        route=f"{self.url}/patients/{id_}/studies",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_peers(params=None) + +

+ + +
+ +

List Orthanc peers

+

List all the Orthanc peers that are known to Orthanc. This corresponds either to the content of the OrthancPeers configuration option, or to the information stored in the database if OrthancPeersInDatabase is true. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual Orthanc peers

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the identifiers of the peers, or detailed information about the peers (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/client.py +
4151
+4152
+4153
+4154
+4155
+4156
+4157
+4158
+4159
+4160
+4161
+4162
+4163
+4164
+4165
+4166
+4167
+4168
+4169
+4170
+4171
+4172
+4173
+4174
def get_peers(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List Orthanc peers
+
+    List all the Orthanc peers that are known to Orthanc. This corresponds either to the content of the `OrthancPeers` configuration option, or to the information stored in the database if `OrthancPeersInDatabase` is `true`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual Orthanc peers
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the identifiers of the peers, or detailed information about the peers (if `expand` argument is provided)
+    """
+    return self._get(
+        route=f"{self.url}/peers",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_peers_id(id_) + +

+ + +
+ +

List operations on peer

+

List the operations that are available for an Orthanc peer. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the peer of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/client.py +
4198
+4199
+4200
+4201
+4202
+4203
+4204
+4205
+4206
+4207
+4208
+4209
+4210
+4211
+4212
+4213
+4214
+4215
+4216
+4217
+4218
+4219
def get_peers_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List operations on peer
+
+    List the operations that are available for an Orthanc peer.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the peer of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return self._get(
+        route=f"{self.url}/peers/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_peers_id_configuration(id_) + +

+ + +
+ +

Get peer configuration

+

Get detailed information about the configuration of some Orthanc peer +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the peer of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Configuration of the peer

+
+
+ +
+ Source code in pyorthanc/client.py +
4257
+4258
+4259
+4260
+4261
+4262
+4263
+4264
+4265
+4266
+4267
+4268
+4269
+4270
+4271
+4272
+4273
+4274
+4275
+4276
+4277
+4278
def get_peers_id_configuration(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get peer configuration
+
+    Get detailed information about the configuration of some Orthanc peer
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the peer of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Configuration of the peer
+    """
+    return self._get(
+        route=f"{self.url}/peers/{id_}/configuration",
+    )
+
+
+
+ +
+ +
+ + +

+ get_peers_id_system(id_) + +

+ + +
+ +

Get peer system information

+

Get system information about some Orthanc peer. This corresponds to doing a GET request against the /system URI of the remote peer. This route can be used to test connectivity. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the peer of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

System information about the peer

+
+
+ +
+ Source code in pyorthanc/client.py +
4348
+4349
+4350
+4351
+4352
+4353
+4354
+4355
+4356
+4357
+4358
+4359
+4360
+4361
+4362
+4363
+4364
+4365
+4366
+4367
+4368
+4369
def get_peers_id_system(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get peer system information
+
+    Get system information about some Orthanc peer. This corresponds to doing a `GET` request against the `/system` URI of the remote peer. This route can be used to test connectivity.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the peer of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        System information about the peer
+    """
+    return self._get(
+        route=f"{self.url}/peers/{id_}/system",
+    )
+
+
+
+ +
+ +
+ + +

+ get_plugins() + +

+ + +
+ +

List plugins

+

List all the installed plugins +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the identifiers of the installed plugins

+
+
+ +
+ Source code in pyorthanc/client.py +
4371
+4372
+4373
+4374
+4375
+4376
+4377
+4378
+4379
+4380
+4381
+4382
+4383
+4384
+4385
+4386
def get_plugins(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List plugins
+
+    List all the installed plugins
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the identifiers of the installed plugins
+    """
+    return self._get(
+        route=f"{self.url}/plugins",
+    )
+
+
+
+ +
+ +
+ + +

+ get_plugins_explorer_js() + +

+ + +
+ +

JavaScript extensions to Orthanc Explorer

+

Get the JavaScript extensions that are installed by all the plugins using the OrthancPluginExtendOrthancExplorer() function of the plugin SDK. This route is for internal use of Orthanc Explorer. +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The JavaScript extensions

+
+
+ +
+ Source code in pyorthanc/client.py +
4388
+4389
+4390
+4391
+4392
+4393
+4394
+4395
+4396
+4397
+4398
+4399
+4400
+4401
+4402
+4403
def get_plugins_explorer_js(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """JavaScript extensions to Orthanc Explorer
+
+    Get the JavaScript extensions that are installed by all the plugins using the `OrthancPluginExtendOrthancExplorer()` function of the plugin SDK. This route is for internal use of Orthanc Explorer.
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The JavaScript extensions
+    """
+    return self._get(
+        route=f"{self.url}/plugins/explorer.js",
+    )
+
+
+
+ +
+ +
+ + +

+ get_plugins_id(id_) + +

+ + +
+ +

Get plugin

+

Get system information about the plugin whose identifier is provided in the URL +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing information about the plugin

+
+
+ +
+ Source code in pyorthanc/client.py +
4405
+4406
+4407
+4408
+4409
+4410
+4411
+4412
+4413
+4414
+4415
+4416
+4417
+4418
+4419
+4420
+4421
+4422
+4423
+4424
+4425
+4426
def get_plugins_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get plugin
+
+    Get system information about the plugin whose identifier is provided in the URL
+    Tags: System
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing information about the plugin
+    """
+    return self._get(
+        route=f"{self.url}/plugins/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries() + +

+ + +
+ +

List query/retrieve operations

+

List the identifiers of all the query/retrieve operations on DICOM modalities, as initiated by calls to /modalities/{id}/query. The length of this list is bounded by the QueryRetrieveSize configuration option of Orthanc. https://orthanc.uclouvain.be/book/users/rest.html#performing-query-retrieve-c-find-and-find-with-rest +Tags: Networking

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the identifiers

+
+
+ +
+ Source code in pyorthanc/client.py +
4428
+4429
+4430
+4431
+4432
+4433
+4434
+4435
+4436
+4437
+4438
+4439
+4440
+4441
+4442
+4443
def get_queries(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List query/retrieve operations
+
+    List the identifiers of all the query/retrieve operations on DICOM modalities, as initiated by calls to `/modalities/{id}/query`. The length of this list is bounded by the `QueryRetrieveSize` configuration option of Orthanc. https://orthanc.uclouvain.be/book/users/rest.html#performing-query-retrieve-c-find-and-find-with-rest
+    Tags: Networking
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the identifiers
+    """
+    return self._get(
+        route=f"{self.url}/queries",
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id(id_) + +

+ + +
+ +

List operations on a query

+

List the available operations for the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the list of operations

+
+
+ +
+ Source code in pyorthanc/client.py +
4467
+4468
+4469
+4470
+4471
+4472
+4473
+4474
+4475
+4476
+4477
+4478
+4479
+4480
+4481
+4482
+4483
+4484
+4485
+4486
+4487
+4488
def get_queries_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List operations on a query
+
+    List the available operations for the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the list of operations
+    """
+    return self._get(
+        route=f"{self.url}/queries/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id_answers(id_, params=None) + +

+ + +
+ +

List answers to a query

+

List the indices of all the available answers resulting from a query/retrieve operation on some DICOM modality, whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual answers + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the indices of the answers, or detailed information about the reported answers (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/client.py +
4490
+4491
+4492
+4493
+4494
+4495
+4496
+4497
+4498
+4499
+4500
+4501
+4502
+4503
+4504
+4505
+4506
+4507
+4508
+4509
+4510
+4511
+4512
+4513
+4514
+4515
+4516
+4517
+4518
def get_queries_id_answers(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List answers to a query
+
+    List the indices of all the available answers resulting from a query/retrieve operation on some DICOM modality, whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual answers
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the indices of the answers, or detailed information about the reported answers (if `expand` argument is provided)
+    """
+    return self._get(
+        route=f"{self.url}/queries/{id_}/answers",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id_answers_index(id_, index) + +

+ + +
+ +

List operations on an answer

+

List the available operations on an answer associated with the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
index + str + +
+

Index of the answer

+
+
+ required +
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the list of operations

+
+
+ +
+ Source code in pyorthanc/client.py +
4520
+4521
+4522
+4523
+4524
+4525
+4526
+4527
+4528
+4529
+4530
+4531
+4532
+4533
+4534
+4535
+4536
+4537
+4538
+4539
+4540
+4541
+4542
+4543
+4544
def get_queries_id_answers_index(
+    self,
+    id_: str,
+    index: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List operations on an answer
+
+    List the available operations on an answer associated with the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    index
+        Index of the answer
+    id_
+        Identifier of the query of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the list of operations
+    """
+    return self._get(
+        route=f"{self.url}/queries/{id_}/answers/{index}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id_answers_index_content(id_, index, params=None) + +

+ + +
+ +

Get one answer

+

Get the content (DICOM tags) of one answer associated with the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
index + str + +
+

Index of the answer

+
+
+ required +
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the DICOM tags of the answer

+
+
+ +
+ Source code in pyorthanc/client.py +
4546
+4547
+4548
+4549
+4550
+4551
+4552
+4553
+4554
+4555
+4556
+4557
+4558
+4559
+4560
+4561
+4562
+4563
+4564
+4565
+4566
+4567
+4568
+4569
+4570
+4571
+4572
+4573
+4574
+4575
+4576
def get_queries_id_answers_index_content(
+    self,
+    id_: str,
+    index: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get one answer
+
+    Get the content (DICOM tags) of one answer associated with the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    index
+        Index of the answer
+    id_
+        Identifier of the query of interest
+    params
+        Dictionary of optional parameters:
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the DICOM tags of the answer
+    """
+    return self._get(
+        route=f"{self.url}/queries/{id_}/answers/{index}/content",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id_level(id_) + +

+ + +
+ +

Get level of original query

+

Get the query level (value of the QueryRetrieveLevel tag) of the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The level

+
+
+ +
+ Source code in pyorthanc/client.py +
4728
+4729
+4730
+4731
+4732
+4733
+4734
+4735
+4736
+4737
+4738
+4739
+4740
+4741
+4742
+4743
+4744
+4745
+4746
+4747
+4748
+4749
def get_queries_id_level(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get level of original query
+
+    Get the query level (value of the `QueryRetrieveLevel` tag) of the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The level
+    """
+    return self._get(
+        route=f"{self.url}/queries/{id_}/level",
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id_modality(id_) + +

+ + +
+ +

Get modality of original query

+

Get the identifier of the DICOM modality that was targeted by the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The identifier of the DICOM modality

+
+
+ +
+ Source code in pyorthanc/client.py +
4751
+4752
+4753
+4754
+4755
+4756
+4757
+4758
+4759
+4760
+4761
+4762
+4763
+4764
+4765
+4766
+4767
+4768
+4769
+4770
+4771
+4772
def get_queries_id_modality(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get modality of original query
+
+    Get the identifier of the DICOM modality that was targeted by the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The identifier of the DICOM modality
+    """
+    return self._get(
+        route=f"{self.url}/queries/{id_}/modality",
+    )
+
+
+
+ +
+ +
+ + +

+ get_queries_id_query(id_, params=None) + +

+ + +
+ +

Get original query arguments

+

Get the original DICOM filter associated with the query/retrieve operation whose identifier is provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Content of the original query

+
+
+ +
+ Source code in pyorthanc/client.py +
4774
+4775
+4776
+4777
+4778
+4779
+4780
+4781
+4782
+4783
+4784
+4785
+4786
+4787
+4788
+4789
+4790
+4791
+4792
+4793
+4794
+4795
+4796
+4797
+4798
+4799
+4800
+4801
def get_queries_id_query(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get original query arguments
+
+    Get the original DICOM filter associated with the query/retrieve operation whose identifier is provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+    params
+        Dictionary of optional parameters:
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Content of the original query
+    """
+    return self._get(
+        route=f"{self.url}/queries/{id_}/query",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series(params=None) + +

+ + +
+ +

List the available series

+

List the Orthanc identifiers of all the available DICOM series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual series + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "limit" (float): Limit the number of results + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format + "since" (float): Show only the resources since the provided index

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the Orthanc identifiers, or detailed information about the reported series (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/client.py +
4845
+4846
+4847
+4848
+4849
+4850
+4851
+4852
+4853
+4854
+4855
+4856
+4857
+4858
+4859
+4860
+4861
+4862
+4863
+4864
+4865
+4866
+4867
+4868
+4869
+4870
+4871
+4872
+4873
def get_series(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List the available series
+
+    List the Orthanc identifiers of all the available DICOM series
+    Tags: Series
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual series
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "limit" (float): Limit the number of results
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "since" (float): Show only the resources since the provided index
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the Orthanc identifiers, or detailed information about the reported series (if `expand` argument is provided)
+    """
+    return self._get(
+        route=f"{self.url}/series",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id(id_, params=None) + +

+ + +
+ +

Get information about some series

+

Get detailed information about the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM series

+
+
+ +
+ Source code in pyorthanc/client.py +
4897
+4898
+4899
+4900
+4901
+4902
+4903
+4904
+4905
+4906
+4907
+4908
+4909
+4910
+4911
+4912
+4913
+4914
+4915
+4916
+4917
+4918
+4919
+4920
+4921
+4922
+4923
+4924
+4925
def get_series_id(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get information about some series
+
+    Get detailed information about the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM series
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_archive(id_, params=None) + +

+ + +
+ +

Create ZIP archive

+

Synchronously create a ZIP archive containing the DICOM series whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might not be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using POST method. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension) + "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
4971
+4972
+4973
+4974
+4975
+4976
+4977
+4978
+4979
+4980
+4981
+4982
+4983
+4984
+4985
+4986
+4987
+4988
+4989
+4990
+4991
+4992
+4993
+4994
+4995
+4996
+4997
+4998
def get_series_id_archive(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create ZIP archive
+
+    Synchronously create a ZIP archive containing the DICOM series whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+            "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        ZIP file containing the archive
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/archive",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments(id_, params=None) + +

+ + +
+ +

List attachments

+

Get the list of attachments that are associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (str): If present, retrieve the attachments list and their numerical ids

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the attachments

+
+
+ +
+ Source code in pyorthanc/client.py +
5035
+5036
+5037
+5038
+5039
+5040
+5041
+5042
+5043
+5044
+5045
+5046
+5047
+5048
+5049
+5050
+5051
+5052
+5053
+5054
+5055
+5056
+5057
+5058
+5059
+5060
+5061
def get_series_id_attachments(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List attachments
+
+    Get the list of attachments that are associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "full" (str): If present, retrieve the attachments list and their numerical ids
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the attachments
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/attachments",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name(id_, name, headers=None) + +

+ + +
+ +

List operations on attachments

+

Get the list of the operations that are available for attachments associated with the given series +Tags: Other

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/client.py +
5093
+5094
+5095
+5096
+5097
+5098
+5099
+5100
+5101
+5102
+5103
+5104
+5105
+5106
+5107
+5108
+5109
+5110
+5111
+5112
+5113
+5114
+5115
+5116
+5117
+5118
+5119
+5120
+5121
+5122
def get_series_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List operations on attachments
+
+    Get the list of the operations that are available for attachments associated with the given series
+    Tags: Other
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_compressed_data(id_, name, headers=None) + +

+ + +
+ +

Get attachment (no decompression)

+

Get the (binary) content of one attachment associated with the given series. The attachment will not be decompressed if StorageCompression is true. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
5184
+5185
+5186
+5187
+5188
+5189
+5190
+5191
+5192
+5193
+5194
+5195
+5196
+5197
+5198
+5199
+5200
+5201
+5202
+5203
+5204
+5205
+5206
+5207
+5208
+5209
+5210
+5211
+5212
+5213
def get_series_id_attachments_name_compressed_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get attachment (no decompression)
+
+    Get the (binary) content of one attachment associated with the given series. The attachment will not be decompressed if `StorageCompression` is `true`.
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/compressed-data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_compressed_md5(id_, name, headers=None) + +

+ + +
+ +

Get MD5 of attachment on disk

+

Get the MD5 hash of one attachment associated with the given series, as stored on the disk. This is different from .../md5 iff EnableStorage is true. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/client.py +
5215
+5216
+5217
+5218
+5219
+5220
+5221
+5222
+5223
+5224
+5225
+5226
+5227
+5228
+5229
+5230
+5231
+5232
+5233
+5234
+5235
+5236
+5237
+5238
+5239
+5240
+5241
+5242
+5243
+5244
def get_series_id_attachments_name_compressed_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get MD5 of attachment on disk
+
+    Get the MD5 hash of one attachment associated with the given series, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment, as stored on the disk
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/compressed-md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_compressed_size(id_, name, headers=None) + +

+ + +
+ +

Get size of attachment on disk

+

Get the size of one attachment associated with the given series, as stored on the disk. This is different from .../size iff EnableStorage is true. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/client.py +
5246
+5247
+5248
+5249
+5250
+5251
+5252
+5253
+5254
+5255
+5256
+5257
+5258
+5259
+5260
+5261
+5262
+5263
+5264
+5265
+5266
+5267
+5268
+5269
+5270
+5271
+5272
+5273
+5274
+5275
def get_series_id_attachments_name_compressed_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get size of attachment on disk
+
+    Get the size of one attachment associated with the given series, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment, as stored on the disk
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/compressed-size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_data(id_, name, headers=None) + +

+ + +
+ +

Get attachment

+

Get the (binary) content of one attachment associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
5277
+5278
+5279
+5280
+5281
+5282
+5283
+5284
+5285
+5286
+5287
+5288
+5289
+5290
+5291
+5292
+5293
+5294
+5295
+5296
+5297
+5298
+5299
+5300
+5301
+5302
+5303
+5304
+5305
+5306
def get_series_id_attachments_name_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get attachment
+
+    Get the (binary) content of one attachment associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_info(id_, name, headers=None) + +

+ + +
+ +

Get info about the attachment

+

Get all the information about the attachment associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the information about the attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
5308
+5309
+5310
+5311
+5312
+5313
+5314
+5315
+5316
+5317
+5318
+5319
+5320
+5321
+5322
+5323
+5324
+5325
+5326
+5327
+5328
+5329
+5330
+5331
+5332
+5333
+5334
+5335
+5336
+5337
def get_series_id_attachments_name_info(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get info about the attachment
+
+    Get all the information about the attachment associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the information about the attachment
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/info",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_is_compressed(id_, name, headers=None) + +

+ + +
+ +

Is attachment compressed?

+

Test whether the attachment has been stored as a compressed file on the disk. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

0 if the attachment was stored uncompressed, 1 if it was compressed

+
+
+ +
+ Source code in pyorthanc/client.py +
5339
+5340
+5341
+5342
+5343
+5344
+5345
+5346
+5347
+5348
+5349
+5350
+5351
+5352
+5353
+5354
+5355
+5356
+5357
+5358
+5359
+5360
+5361
+5362
+5363
+5364
+5365
+5366
+5367
+5368
def get_series_id_attachments_name_is_compressed(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Is attachment compressed?
+
+    Test whether the attachment has been stored as a compressed file on the disk.
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `0` if the attachment was stored uncompressed, `1` if it was compressed
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/is-compressed",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_md5(id_, name, headers=None) + +

+ + +
+ +

Get MD5 of attachment

+

Get the MD5 hash of one attachment associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
5370
+5371
+5372
+5373
+5374
+5375
+5376
+5377
+5378
+5379
+5380
+5381
+5382
+5383
+5384
+5385
+5386
+5387
+5388
+5389
+5390
+5391
+5392
+5393
+5394
+5395
+5396
+5397
+5398
+5399
def get_series_id_attachments_name_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get MD5 of attachment
+
+    Get the MD5 hash of one attachment associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_attachments_name_size(id_, name, headers=None) + +

+ + +
+ +

Get size of attachment

+

Get the size of one attachment associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
5401
+5402
+5403
+5404
+5405
+5406
+5407
+5408
+5409
+5410
+5411
+5412
+5413
+5414
+5415
+5416
+5417
+5418
+5419
+5420
+5421
+5422
+5423
+5424
+5425
+5426
+5427
+5428
+5429
+5430
def get_series_id_attachments_name_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get size of attachment
+
+    Get the size of one attachment associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/attachments/{name}/size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_instances(id_, params=None) + +

+ + +
+ +

Get child instances

+

Get detailed information about the child instances of the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If false or missing, only retrieve the list of child instances + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing information about the child DICOM instances

+
+
+ +
+ Source code in pyorthanc/client.py +
5483
+5484
+5485
+5486
+5487
+5488
+5489
+5490
+5491
+5492
+5493
+5494
+5495
+5496
+5497
+5498
+5499
+5500
+5501
+5502
+5503
+5504
+5505
+5506
+5507
+5508
+5509
+5510
+5511
+5512
def get_series_id_instances(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get child instances
+
+    Get detailed information about the child instances of the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If false or missing, only retrieve the list of child instances
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing information about the child DICOM instances
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/instances",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_instances_tags(id_, params=None) + +

+ + +
+ +

Get tags of instances

+

Get the tags of all the child instances of the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags

+
+
+ +
+ Source code in pyorthanc/client.py +
5514
+5515
+5516
+5517
+5518
+5519
+5520
+5521
+5522
+5523
+5524
+5525
+5526
+5527
+5528
+5529
+5530
+5531
+5532
+5533
+5534
+5535
+5536
+5537
+5538
+5539
+5540
+5541
+5542
def get_series_id_instances_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get tags of instances
+
+    Get the tags of all the child instances of the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/instances-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_labels(id_) + +

+ + +
+ +

List labels

+

Get the labels that are associated with the given series (new in Orthanc 1.12.0) +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the labels

+
+
+ +
+ Source code in pyorthanc/client.py +
5544
+5545
+5546
+5547
+5548
+5549
+5550
+5551
+5552
+5553
+5554
+5555
+5556
+5557
+5558
+5559
+5560
+5561
+5562
+5563
+5564
+5565
def get_series_id_labels(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List labels
+
+    Get the labels that are associated with the given series (new in Orthanc 1.12.0)
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the labels
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/labels",
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_labels_label(id_, label) + +

+ + +
+ +

Test label

+

Test whether the series is associated with the given label +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label of interest

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty string is returned in the case of presence, error 404 in the case of absence

+
+
+ +
+ Source code in pyorthanc/client.py +
5592
+5593
+5594
+5595
+5596
+5597
+5598
+5599
+5600
+5601
+5602
+5603
+5604
+5605
+5606
+5607
+5608
+5609
+5610
+5611
+5612
+5613
+5614
+5615
+5616
def get_series_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Test label
+
+    Test whether the series is associated with the given label
+    Tags: Series
+
+    Parameters
+    ----------
+    label
+        The label of interest
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty string is returned in the case of presence, error 404 in the case of absence
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_media(id_, params=None) + +

+ + +
+ +

Create DICOMDIR media

+

Synchronously create a DICOMDIR media containing the DICOM series whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might not be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using POST method. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "extended" (str): If present, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR + "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension) + "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
5643
+5644
+5645
+5646
+5647
+5648
+5649
+5650
+5651
+5652
+5653
+5654
+5655
+5656
+5657
+5658
+5659
+5660
+5661
+5662
+5663
+5664
+5665
+5666
+5667
+5668
+5669
+5670
+5671
def get_series_id_media(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create DICOMDIR media
+
+    Synchronously create a DICOMDIR media containing the DICOM series whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "extended" (str): If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*
+            "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+            "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        ZIP file containing the archive
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/media",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_metadata(id_, params=None) + +

+ + +
+ +

List metadata

+

Get the list of metadata that are associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, also retrieve the value of the individual metadata + "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/client.py +
5709
+5710
+5711
+5712
+5713
+5714
+5715
+5716
+5717
+5718
+5719
+5720
+5721
+5722
+5723
+5724
+5725
+5726
+5727
+5728
+5729
+5730
+5731
+5732
+5733
+5734
+5735
+5736
def get_series_id_metadata(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List metadata
+
+    Get the list of metadata that are associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, also retrieve the value of the individual metadata
+            "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/metadata",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_metadata_name(id_, name, headers=None) + +

+ + +
+ +

Get metadata

+

Get the value of a metadata that is associated with the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Value of the metadata

+
+
+ +
+ Source code in pyorthanc/client.py +
5768
+5769
+5770
+5771
+5772
+5773
+5774
+5775
+5776
+5777
+5778
+5779
+5780
+5781
+5782
+5783
+5784
+5785
+5786
+5787
+5788
+5789
+5790
+5791
+5792
+5793
+5794
+5795
+5796
+5797
def get_series_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get metadata
+
+    Get the value of a metadata that is associated with the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Value of the metadata
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_module(id_, params=None) + +

+ + +
+ +

Get series module

+

Get the series module of the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM series

+
+
+ +
+ Source code in pyorthanc/client.py +
5875
+5876
+5877
+5878
+5879
+5880
+5881
+5882
+5883
+5884
+5885
+5886
+5887
+5888
+5889
+5890
+5891
+5892
+5893
+5894
+5895
+5896
+5897
+5898
+5899
+5900
+5901
+5902
+5903
def get_series_id_module(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get series module
+
+    Get the series module of the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM series
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/module",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_numpy(id_, params=None) + +

+ + +
+ +

Decode series for numpy

+

Decode the given DICOM series, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel). +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM resource of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "compress" (bool): Compress the file as .npz + "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html

+
+
+ +
+ Source code in pyorthanc/client.py +
5905
+5906
+5907
+5908
+5909
+5910
+5911
+5912
+5913
+5914
+5915
+5916
+5917
+5918
+5919
+5920
+5921
+5922
+5923
+5924
+5925
+5926
+5927
+5928
+5929
+5930
+5931
+5932
def get_series_id_numpy(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Decode series for numpy
+
+    Decode the given DICOM series, for use with numpy in Python. The numpy array has 4 dimensions: (frame, height, width, color channel).
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM resource of interest
+    params
+        Dictionary of optional parameters:
+            "compress" (bool): Compress the file as `.npz`
+            "rescale" (bool): On grayscale images, apply the rescaling and return floating-point values
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/numpy",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_ordered_slices(id_) + +

+ + +
+ +

Order the slices

+

Sort the instances and frames (slices) of the DICOM series whose Orthanc identifier is provided in the URL. This URI is essentially used by the Orthanc Web viewer and by the Osimis Web viewer. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
5934
+5935
+5936
+5937
+5938
+5939
+5940
+5941
+5942
+5943
+5944
+5945
+5946
+5947
+5948
+5949
+5950
+5951
+5952
+5953
+5954
+5955
+5956
def get_series_id_ordered_slices(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Order the slices
+
+    Sort the instances and frames (slices) of the DICOM series whose Orthanc identifier is provided in the URL. This URI is essentially used by the Orthanc Web viewer and by the Osimis Web viewer.
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+    return self._get(
+        route=f"{self.url}/series/{id_}/ordered-slices",
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_patient(id_, params=None) + +

+ + +
+ +

Get parent patient

+

Get detailed information about the parent patient of the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the parent DICOM patient

+
+
+ +
+ Source code in pyorthanc/client.py +
5958
+5959
+5960
+5961
+5962
+5963
+5964
+5965
+5966
+5967
+5968
+5969
+5970
+5971
+5972
+5973
+5974
+5975
+5976
+5977
+5978
+5979
+5980
+5981
+5982
+5983
+5984
+5985
+5986
def get_series_id_patient(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get parent patient
+
+    Get detailed information about the parent patient of the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the parent DICOM patient
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/patient",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_shared_tags(id_, params=None) + +

+ + +
+ +

Get shared tags

+

Extract the DICOM tags whose value is constant across all the child instances of the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the values of the DICOM tags

+
+
+ +
+ Source code in pyorthanc/client.py +
6018
+6019
+6020
+6021
+6022
+6023
+6024
+6025
+6026
+6027
+6028
+6029
+6030
+6031
+6032
+6033
+6034
+6035
+6036
+6037
+6038
+6039
+6040
+6041
+6042
+6043
+6044
+6045
def get_series_id_shared_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get shared tags
+
+    Extract the DICOM tags whose value is constant across all the child instances of the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the values of the DICOM tags
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/shared-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_statistics(id_) + +

+ + +
+ +

Get series statistics

+

Get statistics about the given series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
6047
+6048
+6049
+6050
+6051
+6052
+6053
+6054
+6055
+6056
+6057
+6058
+6059
+6060
+6061
+6062
+6063
+6064
+6065
+6066
+6067
+6068
def get_series_id_statistics(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get series statistics
+
+    Get statistics about the given series
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/statistics",
+    )
+
+
+
+ +
+ +
+ + +

+ get_series_id_study(id_, params=None) + +

+ + +
+ +

Get parent study

+

Get detailed information about the parent study of the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the parent DICOM study

+
+
+ +
+ Source code in pyorthanc/client.py +
6070
+6071
+6072
+6073
+6074
+6075
+6076
+6077
+6078
+6079
+6080
+6081
+6082
+6083
+6084
+6085
+6086
+6087
+6088
+6089
+6090
+6091
+6092
+6093
+6094
+6095
+6096
+6097
+6098
def get_series_id_study(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get parent study
+
+    Get detailed information about the parent study of the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the parent DICOM study
+    """
+    return self._get(
+        route=f"{self.url}/series/{id_}/study",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_statistics() + +

+ + +
+ +

Get database statistics

+

Get statistics related to the database of Orthanc +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
6100
+6101
+6102
+6103
+6104
+6105
+6106
+6107
+6108
+6109
+6110
+6111
+6112
+6113
+6114
+6115
def get_statistics(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get database statistics
+
+    Get statistics related to the database of Orthanc
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return self._get(
+        route=f"{self.url}/statistics",
+    )
+
+
+
+ +
+ +
+ + +

+ get_storage_commitment_id(id_) + +

+ + +
+ +

Get storage commitment report

+

Get the storage commitment report whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/storage-commitment.html#storage-commitment-scu +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the storage commitment report

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
6117
+6118
+6119
+6120
+6121
+6122
+6123
+6124
+6125
+6126
+6127
+6128
+6129
+6130
+6131
+6132
+6133
+6134
+6135
+6136
+6137
+6138
def get_storage_commitment_id(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get storage commitment report
+
+    Get the storage commitment report whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/storage-commitment.html#storage-commitment-scu
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the storage commitment report
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return self._get(
+        route=f"{self.url}/storage-commitment/{id_}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies(params=None) + +

+ + +
+ +

List the available studies

+

List the Orthanc identifiers of all the available DICOM studies +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, retrieve detailed information about the individual studies + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "limit" (float): Limit the number of results + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format + "since" (float): Show only the resources since the provided index

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the Orthanc identifiers, or detailed information about the reported studies (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/client.py +
6162
+6163
+6164
+6165
+6166
+6167
+6168
+6169
+6170
+6171
+6172
+6173
+6174
+6175
+6176
+6177
+6178
+6179
+6180
+6181
+6182
+6183
+6184
+6185
+6186
+6187
+6188
+6189
+6190
def get_studies(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List the available studies
+
+    List the Orthanc identifiers of all the available DICOM studies
+    Tags: Studies
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, retrieve detailed information about the individual studies
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "limit" (float): Limit the number of results
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "since" (float): Show only the resources since the provided index
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the Orthanc identifiers, or detailed information about the reported studies (if `expand` argument is provided)
+    """
+    return self._get(
+        route=f"{self.url}/studies",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id(id_, params=None) + +

+ + +
+ +

Get information about some study

+

Get detailed information about the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM study

+
+
+ +
+ Source code in pyorthanc/client.py +
6214
+6215
+6216
+6217
+6218
+6219
+6220
+6221
+6222
+6223
+6224
+6225
+6226
+6227
+6228
+6229
+6230
+6231
+6232
+6233
+6234
+6235
+6236
+6237
+6238
+6239
+6240
+6241
+6242
def get_studies_id(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get information about some study
+
+    Get detailed information about the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM study
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_archive(id_, params=None) + +

+ + +
+ +

Create ZIP archive

+

Synchronously create a ZIP archive containing the DICOM study whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might not be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using POST method. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension) + "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
6288
+6289
+6290
+6291
+6292
+6293
+6294
+6295
+6296
+6297
+6298
+6299
+6300
+6301
+6302
+6303
+6304
+6305
+6306
+6307
+6308
+6309
+6310
+6311
+6312
+6313
+6314
+6315
def get_studies_id_archive(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create ZIP archive
+
+    Synchronously create a ZIP archive containing the DICOM study whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+            "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        ZIP file containing the archive
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/archive",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments(id_, params=None) + +

+ + +
+ +

List attachments

+

Get the list of attachments that are associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (str): If present, retrieve the attachments list and their numerical ids

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the attachments

+
+
+ +
+ Source code in pyorthanc/client.py +
6352
+6353
+6354
+6355
+6356
+6357
+6358
+6359
+6360
+6361
+6362
+6363
+6364
+6365
+6366
+6367
+6368
+6369
+6370
+6371
+6372
+6373
+6374
+6375
+6376
+6377
+6378
def get_studies_id_attachments(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List attachments
+
+    Get the list of attachments that are associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "full" (str): If present, retrieve the attachments list and their numerical ids
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the attachments
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/attachments",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name(id_, name, headers=None) + +

+ + +
+ +

List operations on attachments

+

Get the list of the operations that are available for attachments associated with the given study +Tags: Other

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/client.py +
6410
+6411
+6412
+6413
+6414
+6415
+6416
+6417
+6418
+6419
+6420
+6421
+6422
+6423
+6424
+6425
+6426
+6427
+6428
+6429
+6430
+6431
+6432
+6433
+6434
+6435
+6436
+6437
+6438
+6439
def get_studies_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List operations on attachments
+
+    Get the list of the operations that are available for attachments associated with the given study
+    Tags: Other
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_compressed_data(id_, name, headers=None) + +

+ + +
+ +

Get attachment (no decompression)

+

Get the (binary) content of one attachment associated with the given study. The attachment will not be decompressed if StorageCompression is true. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
6501
+6502
+6503
+6504
+6505
+6506
+6507
+6508
+6509
+6510
+6511
+6512
+6513
+6514
+6515
+6516
+6517
+6518
+6519
+6520
+6521
+6522
+6523
+6524
+6525
+6526
+6527
+6528
+6529
+6530
def get_studies_id_attachments_name_compressed_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get attachment (no decompression)
+
+    Get the (binary) content of one attachment associated with the given study. The attachment will not be decompressed if `StorageCompression` is `true`.
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/compressed-data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_compressed_md5(id_, name, headers=None) + +

+ + +
+ +

Get MD5 of attachment on disk

+

Get the MD5 hash of one attachment associated with the given study, as stored on the disk. This is different from .../md5 iff EnableStorage is true. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/client.py +
6532
+6533
+6534
+6535
+6536
+6537
+6538
+6539
+6540
+6541
+6542
+6543
+6544
+6545
+6546
+6547
+6548
+6549
+6550
+6551
+6552
+6553
+6554
+6555
+6556
+6557
+6558
+6559
+6560
+6561
def get_studies_id_attachments_name_compressed_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get MD5 of attachment on disk
+
+    Get the MD5 hash of one attachment associated with the given study, as stored on the disk. This is different from `.../md5` iff `EnableStorage` is `true`.
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment, as stored on the disk
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/compressed-md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_compressed_size(id_, name, headers=None) + +

+ + +
+ +

Get size of attachment on disk

+

Get the size of one attachment associated with the given study, as stored on the disk. This is different from .../size iff EnableStorage is true. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment, as stored on the disk

+
+
+ +
+ Source code in pyorthanc/client.py +
6563
+6564
+6565
+6566
+6567
+6568
+6569
+6570
+6571
+6572
+6573
+6574
+6575
+6576
+6577
+6578
+6579
+6580
+6581
+6582
+6583
+6584
+6585
+6586
+6587
+6588
+6589
+6590
+6591
+6592
def get_studies_id_attachments_name_compressed_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get size of attachment on disk
+
+    Get the size of one attachment associated with the given study, as stored on the disk. This is different from `.../size` iff `EnableStorage` is `true`.
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment, as stored on the disk
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/compressed-size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_data(id_, name, headers=None) + +

+ + +
+ +

Get attachment

+

Get the (binary) content of one attachment associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
6594
+6595
+6596
+6597
+6598
+6599
+6600
+6601
+6602
+6603
+6604
+6605
+6606
+6607
+6608
+6609
+6610
+6611
+6612
+6613
+6614
+6615
+6616
+6617
+6618
+6619
+6620
+6621
+6622
+6623
def get_studies_id_attachments_name_data(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get attachment
+
+    Get the (binary) content of one attachment associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The attachment
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/data",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_info(id_, name, headers=None) + +

+ + +
+ +

Get info about the attachment

+

Get all the information about the attachment associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the information about the attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
6625
+6626
+6627
+6628
+6629
+6630
+6631
+6632
+6633
+6634
+6635
+6636
+6637
+6638
+6639
+6640
+6641
+6642
+6643
+6644
+6645
+6646
+6647
+6648
+6649
+6650
+6651
+6652
+6653
+6654
def get_studies_id_attachments_name_info(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get info about the attachment
+
+    Get all the information about the attachment associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the information about the attachment
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/info",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_is_compressed(id_, name, headers=None) + +

+ + +
+ +

Is attachment compressed?

+

Test whether the attachment has been stored as a compressed file on the disk. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

0 if the attachment was stored uncompressed, 1 if it was compressed

+
+
+ +
+ Source code in pyorthanc/client.py +
6656
+6657
+6658
+6659
+6660
+6661
+6662
+6663
+6664
+6665
+6666
+6667
+6668
+6669
+6670
+6671
+6672
+6673
+6674
+6675
+6676
+6677
+6678
+6679
+6680
+6681
+6682
+6683
+6684
+6685
def get_studies_id_attachments_name_is_compressed(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Is attachment compressed?
+
+    Test whether the attachment has been stored as a compressed file on the disk.
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `0` if the attachment was stored uncompressed, `1` if it was compressed
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/is-compressed",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_md5(id_, name, headers=None) + +

+ + +
+ +

Get MD5 of attachment

+

Get the MD5 hash of one attachment associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The MD5 of the attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
6687
+6688
+6689
+6690
+6691
+6692
+6693
+6694
+6695
+6696
+6697
+6698
+6699
+6700
+6701
+6702
+6703
+6704
+6705
+6706
+6707
+6708
+6709
+6710
+6711
+6712
+6713
+6714
+6715
+6716
def get_studies_id_attachments_name_md5(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get MD5 of attachment
+
+    Get the MD5 hash of one attachment associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The MD5 of the attachment
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/md5",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_attachments_name_size(id_, name, headers=None) + +

+ + +
+ +

Get size of attachment

+

Get the size of one attachment associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The size of the attachment

+
+
+ +
+ Source code in pyorthanc/client.py +
6718
+6719
+6720
+6721
+6722
+6723
+6724
+6725
+6726
+6727
+6728
+6729
+6730
+6731
+6732
+6733
+6734
+6735
+6736
+6737
+6738
+6739
+6740
+6741
+6742
+6743
+6744
+6745
+6746
+6747
def get_studies_id_attachments_name_size(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get size of attachment
+
+    Get the size of one attachment associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the attachment, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The size of the attachment
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/size",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_instances(id_, params=None) + +

+ + +
+ +

Get child instances

+

Get detailed information about the child instances of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If false or missing, only retrieve the list of child instances + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing information about the child DICOM instances

+
+
+ +
+ Source code in pyorthanc/client.py +
6800
+6801
+6802
+6803
+6804
+6805
+6806
+6807
+6808
+6809
+6810
+6811
+6812
+6813
+6814
+6815
+6816
+6817
+6818
+6819
+6820
+6821
+6822
+6823
+6824
+6825
+6826
+6827
+6828
+6829
def get_studies_id_instances(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get child instances
+
+    Get detailed information about the child instances of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If false or missing, only retrieve the list of child instances
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing information about the child DICOM instances
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/instances",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_instances_tags(id_, params=None) + +

+ + +
+ +

Get tags of instances

+

Get the tags of all the child instances of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags

+
+
+ +
+ Source code in pyorthanc/client.py +
6831
+6832
+6833
+6834
+6835
+6836
+6837
+6838
+6839
+6840
+6841
+6842
+6843
+6844
+6845
+6846
+6847
+6848
+6849
+6850
+6851
+6852
+6853
+6854
+6855
+6856
+6857
+6858
+6859
def get_studies_id_instances_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get tags of instances
+
+    Get the tags of all the child instances of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/instances-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_labels(id_) + +

+ + +
+ +

List labels

+

Get the labels that are associated with the given study (new in Orthanc 1.12.0) +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the labels

+
+
+ +
+ Source code in pyorthanc/client.py +
6861
+6862
+6863
+6864
+6865
+6866
+6867
+6868
+6869
+6870
+6871
+6872
+6873
+6874
+6875
+6876
+6877
+6878
+6879
+6880
+6881
+6882
def get_studies_id_labels(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List labels
+
+    Get the labels that are associated with the given study (new in Orthanc 1.12.0)
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the labels
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/labels",
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_labels_label(id_, label) + +

+ + +
+ +

Test label

+

Test whether the study is associated with the given label +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label of interest

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty string is returned in the case of presence, error 404 in the case of absence

+
+
+ +
+ Source code in pyorthanc/client.py +
6909
+6910
+6911
+6912
+6913
+6914
+6915
+6916
+6917
+6918
+6919
+6920
+6921
+6922
+6923
+6924
+6925
+6926
+6927
+6928
+6929
+6930
+6931
+6932
+6933
def get_studies_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Test label
+
+    Test whether the study is associated with the given label
+    Tags: Studies
+
+    Parameters
+    ----------
+    label
+        The label of interest
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty string is returned in the case of presence, error 404 in the case of absence
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_media(id_, params=None) + +

+ + +
+ +

Create DICOMDIR media

+

Synchronously create a DICOMDIR media containing the DICOM study whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might not be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using POST method. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "extended" (str): If present, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR + "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension) + "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
6960
+6961
+6962
+6963
+6964
+6965
+6966
+6967
+6968
+6969
+6970
+6971
+6972
+6973
+6974
+6975
+6976
+6977
+6978
+6979
+6980
+6981
+6982
+6983
+6984
+6985
+6986
+6987
+6988
def get_studies_id_media(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create DICOMDIR media
+
+    Synchronously create a DICOMDIR media containing the DICOM study whose Orthanc identifier is provided in the URL. This flavor is synchronous, which might *not* be desirable to archive large amount of data, as it might lead to network timeouts. Prefer the asynchronous version using `POST` method.
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "extended" (str): If present, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*
+            "filename" (str): Filename to set in the "Content-Disposition" HTTP header (including file extension)
+            "transcode" (str): If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        ZIP file containing the archive
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/media",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_metadata(id_, params=None) + +

+ + +
+ +

List metadata

+

Get the list of metadata that are associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If present, also retrieve the value of the individual metadata + "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if expand argument is provided)

+
+
+ +
+ Source code in pyorthanc/client.py +
7062
+7063
+7064
+7065
+7066
+7067
+7068
+7069
+7070
+7071
+7072
+7073
+7074
+7075
+7076
+7077
+7078
+7079
+7080
+7081
+7082
+7083
+7084
+7085
+7086
+7087
+7088
+7089
def get_studies_id_metadata(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List metadata
+
+    Get the list of metadata that are associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If present, also retrieve the value of the individual metadata
+            "numeric" (str): If present, use the numeric identifier of the metadata instead of its symbolic name
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the names of the available metadata, or JSON associative array mapping metadata to their values (if `expand` argument is provided)
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/metadata",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_metadata_name(id_, name, headers=None) + +

+ + +
+ +

Get metadata

+

Get the value of a metadata that is associated with the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Value of the metadata

+
+
+ +
+ Source code in pyorthanc/client.py +
7121
+7122
+7123
+7124
+7125
+7126
+7127
+7128
+7129
+7130
+7131
+7132
+7133
+7134
+7135
+7136
+7137
+7138
+7139
+7140
+7141
+7142
+7143
+7144
+7145
+7146
+7147
+7148
+7149
+7150
def get_studies_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get metadata
+
+    Get the value of a metadata that is associated with the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    headers
+        Dictionary of optional headers:
+            "If-None-Match" (str): Optional revision of the metadata, to check if its content has changed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Value of the metadata
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/metadata/{name}",
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_module(id_, params=None) + +

+ + +
+ +

Get study module

+

Get the study module of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM study

+
+
+ +
+ Source code in pyorthanc/client.py +
7228
+7229
+7230
+7231
+7232
+7233
+7234
+7235
+7236
+7237
+7238
+7239
+7240
+7241
+7242
+7243
+7244
+7245
+7246
+7247
+7248
+7249
+7250
+7251
+7252
+7253
+7254
+7255
+7256
def get_studies_id_module(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get study module
+
+    Get the study module of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM study
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/module",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_module_patient(id_, params=None) + +

+ + +
+ +

Get patient module of study

+

Get the patient module of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the DICOM study

+
+
+ +
+ Source code in pyorthanc/client.py +
7258
+7259
+7260
+7261
+7262
+7263
+7264
+7265
+7266
+7267
+7268
+7269
+7270
+7271
+7272
+7273
+7274
+7275
+7276
+7277
+7278
+7279
+7280
+7281
+7282
+7283
+7284
+7285
+7286
def get_studies_id_module_patient(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get patient module of study
+
+    Get the patient module of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "ignore-length" (List): Also include the DICOM tags that are provided in this list, even if their associated value is long
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the DICOM study
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/module-patient",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_patient(id_, params=None) + +

+ + +
+ +

Get parent patient

+

Get detailed information about the parent patient of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the parent DICOM patient

+
+
+ +
+ Source code in pyorthanc/client.py +
7288
+7289
+7290
+7291
+7292
+7293
+7294
+7295
+7296
+7297
+7298
+7299
+7300
+7301
+7302
+7303
+7304
+7305
+7306
+7307
+7308
+7309
+7310
+7311
+7312
+7313
+7314
+7315
+7316
def get_studies_id_patient(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get parent patient
+
+    Get detailed information about the parent patient of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the parent DICOM patient
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/patient",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_series(id_, params=None) + +

+ + +
+ +

Get child series

+

Get detailed information about the child series of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "expand" (str): If false or missing, only retrieve the list of child series + "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "requestedTags" (str): If present, list the DICOM Tags you want to list in the response. This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'. The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return + "short" (bool): If present, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing information about the child DICOM series

+
+
+ +
+ Source code in pyorthanc/client.py +
7348
+7349
+7350
+7351
+7352
+7353
+7354
+7355
+7356
+7357
+7358
+7359
+7360
+7361
+7362
+7363
+7364
+7365
+7366
+7367
+7368
+7369
+7370
+7371
+7372
+7373
+7374
+7375
+7376
+7377
def get_studies_id_series(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get child series
+
+    Get detailed information about the child series of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "expand" (str): If false or missing, only retrieve the list of child series
+            "full" (bool): If present, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+            "requestedTags" (str): If present, list the DICOM Tags you want to list in the response.  This argument is a semi-column separated list of DICOM Tags identifiers; e.g: 'requestedTags=0010,0010;PatientBirthDate'.  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing information about the child DICOM series
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/series",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_shared_tags(id_, params=None) + +

+ + +
+ +

Get shared tags

+

Extract the DICOM tags whose value is constant across all the child instances of the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "short" (bool): If present, report the DICOM tags in hexadecimal format + "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON object containing the values of the DICOM tags

+
+
+ +
+ Source code in pyorthanc/client.py +
7379
+7380
+7381
+7382
+7383
+7384
+7385
+7386
+7387
+7388
+7389
+7390
+7391
+7392
+7393
+7394
+7395
+7396
+7397
+7398
+7399
+7400
+7401
+7402
+7403
+7404
+7405
+7406
def get_studies_id_shared_tags(
+    self,
+    id_: str,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get shared tags
+
+    Extract the DICOM tags whose value is constant across all the child instances of the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    params
+        Dictionary of optional parameters:
+            "short" (bool): If present, report the DICOM tags in hexadecimal format
+            "simplify" (bool): If present, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON object containing the values of the DICOM tags
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/shared-tags",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_studies_id_statistics(id_) + +

+ + +
+ +

Get study statistics

+

Get statistics about the given study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7448
+7449
+7450
+7451
+7452
+7453
+7454
+7455
+7456
+7457
+7458
+7459
+7460
+7461
+7462
+7463
+7464
+7465
+7466
+7467
+7468
+7469
def get_studies_id_statistics(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get study statistics
+
+    Get statistics about the given study
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return self._get(
+        route=f"{self.url}/studies/{id_}/statistics",
+    )
+
+
+
+ +
+ +
+ + +

+ get_system() + +

+ + +
+ +

Get system information

+

Get system information about Orthanc +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7471
+7472
+7473
+7474
+7475
+7476
+7477
+7478
+7479
+7480
+7481
+7482
+7483
+7484
+7485
+7486
def get_system(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get system information
+
+    Get system information about Orthanc
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return self._get(
+        route=f"{self.url}/system",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools() + +

+ + +
+ +

List operations

+

List the available operations under URI /tools/ +Tags: Other

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

List of the available operations

+
+
+ +
+ Source code in pyorthanc/client.py +
7488
+7489
+7490
+7491
+7492
+7493
+7494
+7495
+7496
+7497
+7498
+7499
+7500
+7501
+7502
+7503
def get_tools(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """List operations
+
+    List the available operations under URI `/tools/`
+    Tags: Other
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        List of the available operations
+    """
+    return self._get(
+        route=f"{self.url}/tools",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_accepted_transfer_syntaxes() + +

+ + +
+ +

Get accepted transfer syntaxes

+

Get the list of UIDs of the DICOM transfer syntaxes that are accepted by Orthanc C-STORE SCP. This corresponds to the configuration options AcceptedTransferSyntaxes and XXXTransferSyntaxAccepted. +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the transfer syntax UIDs

+
+
+ +
+ Source code in pyorthanc/client.py +
7505
+7506
+7507
+7508
+7509
+7510
+7511
+7512
+7513
+7514
+7515
+7516
+7517
+7518
+7519
+7520
def get_tools_accepted_transfer_syntaxes(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get accepted transfer syntaxes
+
+    Get the list of UIDs of the DICOM transfer syntaxes that are accepted by Orthanc C-STORE SCP. This corresponds to the configuration options `AcceptedTransferSyntaxes` and `XXXTransferSyntaxAccepted`.
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the transfer syntax UIDs
+    """
+    return self._get(
+        route=f"{self.url}/tools/accepted-transfer-syntaxes",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_create_archive(params=None) + +

+ + +
+ +

Create ZIP archive

+

Create a ZIP archive containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "resources" (str): A comma separated list of Orthanc resource identifiers to include in the ZIP archive. + "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7694
+7695
+7696
+7697
+7698
+7699
+7700
+7701
+7702
+7703
+7704
+7705
+7706
+7707
+7708
+7709
+7710
+7711
+7712
+7713
+7714
+7715
+7716
+7717
def get_tools_create_archive(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create ZIP archive
+
+    Create a ZIP archive containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument
+    Tags: System
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "resources" (str): A comma separated list of Orthanc resource identifiers to include in the ZIP archive.
+            "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._get(
+        route=f"{self.url}/tools/create-archive",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_create_media(params=None) + +

+ + +
+ +

Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "resources" (str): A comma separated list of Orthanc resource identifiers to include in the DICOMDIR media. + "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7785
+7786
+7787
+7788
+7789
+7790
+7791
+7792
+7793
+7794
+7795
+7796
+7797
+7798
+7799
+7800
+7801
+7802
+7803
+7804
+7805
+7806
+7807
+7808
def get_tools_create_media(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument
+    Tags: System
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "resources" (str): A comma separated list of Orthanc resource identifiers to include in the DICOMDIR media.
+            "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._get(
+        route=f"{self.url}/tools/create-media",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_create_media_extended(params=None) + +

+ + +
+ +

Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "resources" (str): A comma separated list of Orthanc resource identifiers to include in the DICOMDIR media. + "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7844
+7845
+7846
+7847
+7848
+7849
+7850
+7851
+7852
+7853
+7854
+7855
+7856
+7857
+7858
+7859
+7860
+7861
+7862
+7863
+7864
+7865
+7866
+7867
def get_tools_create_media_extended(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the 'resources' argument
+    Tags: System
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "resources" (str): A comma separated list of Orthanc resource identifiers to include in the DICOMDIR media.
+            "transcode" (str): If present, the DICOM files will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._get(
+        route=f"{self.url}/tools/create-media-extended",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_default_encoding() + +

+ + +
+ +

Get default encoding

+

Get the default encoding that is used by Orthanc if parsing a DICOM instance without the SpecificCharacterEncoding tag, or during C-FIND. This corresponds to the configuration option DefaultEncoding. +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The name of the encoding

+
+
+ +
+ Source code in pyorthanc/client.py +
7903
+7904
+7905
+7906
+7907
+7908
+7909
+7910
+7911
+7912
+7913
+7914
+7915
+7916
+7917
+7918
def get_tools_default_encoding(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get default encoding
+
+    Get the default encoding that is used by Orthanc if parsing a DICOM instance without the `SpecificCharacterEncoding` tag, or during C-FIND. This corresponds to the configuration option `DefaultEncoding`.
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The name of the encoding
+    """
+    return self._get(
+        route=f"{self.url}/tools/default-encoding",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_dicom_conformance() + +

+ + +
+ +

Get DICOM conformance

+

Get the DICOM conformance statement of Orthanc +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The DICOM conformance statement

+
+
+ +
+ Source code in pyorthanc/client.py +
7943
+7944
+7945
+7946
+7947
+7948
+7949
+7950
+7951
+7952
+7953
+7954
+7955
+7956
+7957
+7958
def get_tools_dicom_conformance(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get DICOM conformance
+
+    Get the DICOM conformance statement of Orthanc
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The DICOM conformance statement
+    """
+    return self._get(
+        route=f"{self.url}/tools/dicom-conformance",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_generate_uid(params=None) + +

+ + +
+ +

Generate an identifier

+

Generate a random DICOM identifier +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
params + QueryParamTypes + +
+

Dictionary of optional parameters: + "level" (str): Type of DICOM resource among: patient, study, series or instance

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The generated identifier

+
+
+ +
+ Source code in pyorthanc/client.py +
8055
+8056
+8057
+8058
+8059
+8060
+8061
+8062
+8063
+8064
+8065
+8066
+8067
+8068
+8069
+8070
+8071
+8072
+8073
+8074
+8075
+8076
+8077
+8078
def get_tools_generate_uid(
+    self,
+    params: QueryParamTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Generate an identifier
+
+    Generate a random DICOM identifier
+    Tags: System
+
+    Parameters
+    ----------
+    params
+        Dictionary of optional parameters:
+            "level" (str): Type of DICOM resource among: `patient`, `study`, `series` or `instance`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The generated identifier
+    """
+    return self._get(
+        route=f"{self.url}/tools/generate-uid_",
+        params=params,
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_labels() + +

+ + +
+ +

Get all the used labels

+

List all the labels that are associated with any resource of the Orthanc database +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the labels

+
+
+ +
+ Source code in pyorthanc/client.py +
8096
+8097
+8098
+8099
+8100
+8101
+8102
+8103
+8104
+8105
+8106
+8107
+8108
+8109
+8110
+8111
def get_tools_labels(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get all the used labels
+
+    List all the labels that are associated with any resource of the Orthanc database
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the labels
+    """
+    return self._get(
+        route=f"{self.url}/tools/labels",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level() + +

+ + +
+ +

Get main log level

+

Get the main log level of Orthanc +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/client.py +
8113
+8114
+8115
+8116
+8117
+8118
+8119
+8120
+8121
+8122
+8123
+8124
+8125
+8126
+8127
+8128
def get_tools_log_level(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get main log level
+
+    Get the main log level of Orthanc
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return self._get(
+        route=f"{self.url}/tools/log-level",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_dicom() + +

+ + +
+ +

Get log level for dicom

+

Get the log level of the log category dicom +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/client.py +
8153
+8154
+8155
+8156
+8157
+8158
+8159
+8160
+8161
+8162
+8163
+8164
+8165
+8166
+8167
+8168
def get_tools_log_level_dicom(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get log level for `dicom`
+
+    Get the log level of the log category `dicom`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return self._get(
+        route=f"{self.url}/tools/log-level-dicom",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_generic() + +

+ + +
+ +

Get log level for generic

+

Get the log level of the log category generic +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/client.py +
8193
+8194
+8195
+8196
+8197
+8198
+8199
+8200
+8201
+8202
+8203
+8204
+8205
+8206
+8207
+8208
def get_tools_log_level_generic(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get log level for `generic`
+
+    Get the log level of the log category `generic`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return self._get(
+        route=f"{self.url}/tools/log-level-generic",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_http() + +

+ + +
+ +

Get log level for http

+

Get the log level of the log category http +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/client.py +
8233
+8234
+8235
+8236
+8237
+8238
+8239
+8240
+8241
+8242
+8243
+8244
+8245
+8246
+8247
+8248
def get_tools_log_level_http(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get log level for `http`
+
+    Get the log level of the log category `http`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return self._get(
+        route=f"{self.url}/tools/log-level-http",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_jobs() + +

+ + +
+ +

Get log level for jobs

+

Get the log level of the log category jobs +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/client.py +
8273
+8274
+8275
+8276
+8277
+8278
+8279
+8280
+8281
+8282
+8283
+8284
+8285
+8286
+8287
+8288
def get_tools_log_level_jobs(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get log level for `jobs`
+
+    Get the log level of the log category `jobs`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return self._get(
+        route=f"{self.url}/tools/log-level-jobs",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_lua() + +

+ + +
+ +

Get log level for lua

+

Get the log level of the log category lua +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/client.py +
8313
+8314
+8315
+8316
+8317
+8318
+8319
+8320
+8321
+8322
+8323
+8324
+8325
+8326
+8327
+8328
def get_tools_log_level_lua(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get log level for `lua`
+
+    Get the log level of the log category `lua`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return self._get(
+        route=f"{self.url}/tools/log-level-lua",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_plugins() + +

+ + +
+ +

Get log level for plugins

+

Get the log level of the log category plugins +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/client.py +
8353
+8354
+8355
+8356
+8357
+8358
+8359
+8360
+8361
+8362
+8363
+8364
+8365
+8366
+8367
+8368
def get_tools_log_level_plugins(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get log level for `plugins`
+
+    Get the log level of the log category `plugins`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return self._get(
+        route=f"{self.url}/tools/log-level-plugins",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_log_level_sqlite() + +

+ + +
+ +

Get log level for sqlite

+

Get the log level of the log category sqlite +Tags: Logs

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Possible values: default, verbose or trace

+
+
+ +
+ Source code in pyorthanc/client.py +
8393
+8394
+8395
+8396
+8397
+8398
+8399
+8400
+8401
+8402
+8403
+8404
+8405
+8406
+8407
+8408
def get_tools_log_level_sqlite(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get log level for `sqlite`
+
+    Get the log level of the log category `sqlite`
+    Tags: Logs
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Possible values: `default`, `verbose` or `trace`
+    """
+    return self._get(
+        route=f"{self.url}/tools/log-level-sqlite",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_metrics() + +

+ + +
+ +

Are metrics collected?

+

Returns a Boolean specifying whether Prometheus metrics are collected and exposed at /tools/metrics-prometheus +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

1 if metrics are collected, 0 if metrics are disabled

+
+
+ +
+ Source code in pyorthanc/client.py +
8457
+8458
+8459
+8460
+8461
+8462
+8463
+8464
+8465
+8466
+8467
+8468
+8469
+8470
+8471
+8472
def get_tools_metrics(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Are metrics collected?
+
+    Returns a Boolean specifying whether Prometheus metrics are collected and exposed at `/tools/metrics-prometheus`
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `1` if metrics are collected, `0` if metrics are disabled
+    """
+    return self._get(
+        route=f"{self.url}/tools/metrics",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_metrics_prometheus() + +

+ + +
+ +

Get usage metrics

+

Get usage metrics of Orthanc in the Prometheus file format (OpenMetrics): https://orthanc.uclouvain.be/book/users/advanced-rest.html#instrumentation-with-prometheus +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

No description

+
+
+ +
+ Source code in pyorthanc/client.py +
8497
+8498
+8499
+8500
+8501
+8502
+8503
+8504
+8505
+8506
+8507
+8508
+8509
+8510
+8511
+8512
def get_tools_metrics_prometheus(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get usage metrics
+
+    Get usage metrics of Orthanc in the Prometheus file format (OpenMetrics): https://orthanc.uclouvain.be/book/users/advanced-rest.html#instrumentation-with-prometheus
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        No description
+    """
+    return self._get(
+        route=f"{self.url}/tools/metrics-prometheus",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_now() + +

+ + +
+ +

Get UTC time

+

Get UTC time +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The UTC time

+
+
+ +
+ Source code in pyorthanc/client.py +
8514
+8515
+8516
+8517
+8518
+8519
+8520
+8521
+8522
+8523
+8524
+8525
+8526
+8527
+8528
+8529
def get_tools_now(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get UTC time
+
+    Get UTC time
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The UTC time
+    """
+    return self._get(
+        route=f"{self.url}/tools/now",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_now_local() + +

+ + +
+ +

Get local time

+

Get local time +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The local time

+
+
+ +
+ Source code in pyorthanc/client.py +
8531
+8532
+8533
+8534
+8535
+8536
+8537
+8538
+8539
+8540
+8541
+8542
+8543
+8544
+8545
+8546
def get_tools_now_local(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Get local time
+
+    Get local time
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The local time
+    """
+    return self._get(
+        route=f"{self.url}/tools/now-local",
+    )
+
+
+
+ +
+ +
+ + +

+ get_tools_unknown_sop_class_accepted() + +

+ + +
+ +

Is unknown SOP class accepted?

+

Shall Orthanc C-STORE SCP accept DICOM instances with an unknown SOP class UID? +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

1 if accepted, 0 if not accepted

+
+
+ +
+ Source code in pyorthanc/client.py +
8607
+8608
+8609
+8610
+8611
+8612
+8613
+8614
+8615
+8616
+8617
+8618
+8619
+8620
+8621
+8622
def get_tools_unknown_sop_class_accepted(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Is unknown SOP class accepted?
+
+    Shall Orthanc C-STORE SCP accept DICOM instances with an unknown SOP class UID?
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        `1` if accepted, `0` if not accepted
+    """
+    return self._get(
+        route=f"{self.url}/tools/unknown-sop-class-accepted",
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances(content=None) + +

+ + +
+ +

Upload DICOM instances

+

Upload DICOM instances +Tags: Instances

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Information about the uploaded instance, or list of information for each uploaded instance in the case of ZIP archive

+
+
+ +
+ Source code in pyorthanc/client.py +
368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
def post_instances(
+    self,
+    content: RequestContent = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Upload DICOM instances
+
+    Upload DICOM instances
+    Tags: Instances
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Information about the uploaded instance, or list of information for each uploaded instance in the case of ZIP archive
+    """
+    return self._post(
+        route=f"{self.url}/instances",
+        content=content,
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_anonymize(id_, json=None) + +

+ + +
+ +

Anonymize instance

+

Download an anonymized version of the DICOM instance whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-a-single-instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option DeidentifyLogsDicomVersion for possible values. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "KeepLabels": Keep the labels of all resources level (defaults to false) + "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to false) + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The anonymized DICOM instance

+
+
+ +
+ Source code in pyorthanc/client.py +
439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
def post_instances_id_anonymize(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Anonymize instance
+
+    Download an anonymized version of the DICOM instance whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-a-single-instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    json
+        Dictionary with the following keys:
+          "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+          "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The anonymized DICOM instance
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/instances/{id_}/anonymize",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_attachments_name_compress(id_, name) + +

+ + +
+ +

Compress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
def post_instances_id_attachments_name_compress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Compress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/compress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_attachments_name_uncompress(id_, name) + +

+ + +
+ +

Uncompress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
def post_instances_id_attachments_name_uncompress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Uncompress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/uncompress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_attachments_name_verify_md5(id_, name) + +

+ + +
+ +

Verify attachment

+

Verify that the attachment is not corrupted, by validating its MD5 hash +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

On success, a valid JSON object is returned

+
+
+ +
+ Source code in pyorthanc/client.py +
901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
def post_instances_id_attachments_name_verify_md5(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Verify attachment
+
+    Verify that the attachment is not corrupted, by validating its MD5 hash
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        On success, a valid JSON object is returned
+    """
+    return self._post(
+        route=f"{self.url}/instances/{id_}/attachments/{name}/verify-md5",
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_export(id_, data=None) + +

+ + +
+ +

Write DICOM onto filesystem

+

Write the DICOM file onto the filesystem where Orthanc is running. This is insecure for Orthanc servers that are remotely accessible since one could overwrite any system file. Since Orthanc 1.12.0, this route is disabled by default, but can be enabled using the RestApiWriteToFileSystemEnabled configuration option. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the DICOM instance of interest

+
+
+ required +
data + RequestData + +
+

Target path on the filesystem

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
def post_instances_id_export(
+    self,
+    id_: str,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Write DICOM onto filesystem
+
+    Write the DICOM file onto the filesystem where Orthanc is running.  This is insecure for Orthanc servers that are remotely accessible since one could overwrite any system file.  Since Orthanc 1.12.0, this route is disabled by default, but can be enabled using the `RestApiWriteToFileSystemEnabled` configuration option.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the DICOM instance of interest
+    data
+        Target path on the filesystem
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/instances/{id_}/export",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_modify(id_, json=None) + +

+ + +
+ +

Modify instance

+

Download a modified version of the DICOM instance whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-a-single-instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world. + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to false) + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The modified DICOM instance

+
+
+ +
+ Source code in pyorthanc/client.py +
1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
def post_instances_id_modify(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Modify instance
+
+    Download a modified version of the DICOM instance whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-a-single-instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    json
+        Dictionary with the following keys:
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The modified DICOM instance
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/instances/{id_}/modify",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_instances_id_reconstruct(id_, json=None) + +

+ + +
+ +

Reconstruct tags & optionally files of instance

+

Reconstruct the main DICOM tags in DB of the instance whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly. +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
def post_instances_id_reconstruct(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Reconstruct tags & optionally files of instance
+
+    Reconstruct the main DICOM tags in DB of the instance whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+    Tags: Instances
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the instance of interest
+    json
+        Dictionary with the following keys:
+          "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/instances/{id_}/reconstruct",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_jobs_id_cancel(id_) + +

+ + +
+ +

Cancel job

+

Cancel the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/client.py +
2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
def post_jobs_id_cancel(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Cancel job
+
+    Cancel the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+    Tags: Jobs
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return self._post(
+        route=f"{self.url}/jobs/{id_}/cancel",
+    )
+
+
+
+ +
+ +
+ + +

+ post_jobs_id_pause(id_) + +

+ + +
+ +

Pause job

+

Pause the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/client.py +
2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
def post_jobs_id_pause(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Pause job
+
+    Pause the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+    Tags: Jobs
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return self._post(
+        route=f"{self.url}/jobs/{id_}/pause",
+    )
+
+
+
+ +
+ +
+ + +

+ post_jobs_id_resubmit(id_) + +

+ + +
+ +

Resubmit job

+

Resubmit the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/client.py +
2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
def post_jobs_id_resubmit(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Resubmit job
+
+    Resubmit the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+    Tags: Jobs
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return self._post(
+        route=f"{self.url}/jobs/{id_}/resubmit",
+    )
+
+
+
+ +
+ +
+ + +

+ post_jobs_id_resume(id_) + +

+ + +
+ +

Resume job

+

Resume the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +Tags: Jobs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the job of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/client.py +
2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
def post_jobs_id_resume(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Resume job
+
+    Resume the job whose identifier is provided in the URL. Check out the Orthanc Book for more information about the state machine applicable to jobs: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+    Tags: Jobs
+
+    Parameters
+    ----------
+    id_
+        Identifier of the job of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return self._post(
+        route=f"{self.url}/jobs/{id_}/resume",
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_echo(id_, json=None) + +

+ + +
+ +

Trigger C-ECHO SCU

+

Trigger C-ECHO SCU command against the DICOM modality whose identifier is provided in URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-c-echo +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "CheckFind": Issue a dummy C-FIND command after the C-GET SCU, in order to check whether the remote modality knows about Orthanc. This field defaults to the value of the DicomEchoChecksFind configuration option. New in Orthanc 1.8.1. + "Timeout": Timeout for the C-ECHO command, in seconds

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
def post_modalities_id_echo(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Trigger C-ECHO SCU
+
+    Trigger C-ECHO SCU command against the DICOM modality whose identifier is provided in URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-c-echo
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "CheckFind": Issue a dummy C-FIND command after the C-GET SCU, in order to check whether the remote modality knows about Orthanc. This field defaults to the value of the `DicomEchoChecksFind` configuration option. New in Orthanc 1.8.1.
+          "Timeout": Timeout for the C-ECHO command, in seconds
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/modalities/{id_}/echo",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_find(id_, json=None) + +

+ + +
+ +

Hierarchical C-FIND SCU

+

Trigger a sequence of C-FIND SCU commands against the DICOM modality whose identifier is provided in URL, in order to discover a hierarchy of matching patients/studies/series. Deprecated in favor of /modalities/{id}/query. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys:

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array describing the DICOM tags of the matching patients, embedding the matching studies, then the matching series.

+
+
+ +
+ Source code in pyorthanc/client.py +
2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
def post_modalities_id_find(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Hierarchical C-FIND SCU
+
+    Trigger a sequence of C-FIND SCU commands against the DICOM modality whose identifier is provided in URL, in order to discover a hierarchy of matching patients/studies/series. Deprecated in favor of `/modalities/{id}/query`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array describing the DICOM tags of the matching patients, embedding the matching studies, then the matching series.
+    """
+    warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/modalities/{id_}/find",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_find_instance(id_, json=None) + +

+ + +
+ +

C-FIND SCU for instances

+

Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find an instance. Deprecated in favor of /modalities/{id}/query. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys:

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array describing the DICOM tags of the matching instances

+
+
+ +
+ Source code in pyorthanc/client.py +
2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
def post_modalities_id_find_instance(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """C-FIND SCU for instances
+
+    Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find an instance. Deprecated in favor of `/modalities/{id}/query`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array describing the DICOM tags of the matching instances
+    """
+    warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/modalities/{id_}/find-instance",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_find_patient(id_, json=None) + +

+ + +
+ +

C-FIND SCU for patients

+

Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a patient. Deprecated in favor of /modalities/{id}/query. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys:

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array describing the DICOM tags of the matching patients

+
+
+ +
+ Source code in pyorthanc/client.py +
2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
def post_modalities_id_find_patient(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """C-FIND SCU for patients
+
+    Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a patient. Deprecated in favor of `/modalities/{id}/query`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array describing the DICOM tags of the matching patients
+    """
+    warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/modalities/{id_}/find-patient",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_find_series(id_, json=None) + +

+ + +
+ +

C-FIND SCU for series

+

Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a series. Deprecated in favor of /modalities/{id}/query. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys:

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array describing the DICOM tags of the matching series

+
+
+ +
+ Source code in pyorthanc/client.py +
2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
def post_modalities_id_find_series(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """C-FIND SCU for series
+
+    Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a series. Deprecated in favor of `/modalities/{id}/query`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array describing the DICOM tags of the matching series
+    """
+    warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/modalities/{id_}/find-series",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_find_study(id_, json=None) + +

+ + +
+ +

C-FIND SCU for studies

+

Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a study. Deprecated in favor of /modalities/{id}/query. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys:

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array describing the DICOM tags of the matching studies

+
+
+ +
+ Source code in pyorthanc/client.py +
2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
def post_modalities_id_find_study(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """C-FIND SCU for studies
+
+    Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL, in order to find a study. Deprecated in favor of `/modalities/{id}/query`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array describing the DICOM tags of the matching studies
+    """
+    warnings.warn("This method is deprecated.", DeprecationWarning, stacklevel=2)
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/modalities/{id_}/find-study",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_find_worklist(id_, json=None) + +

+ + +
+ +

C-FIND SCU for worklist

+

Trigger C-FIND SCU command against the remote worklists of the DICOM modality whose identifier is provided in URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Full": If set to true, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "Query": Associative array containing the filter on the values of the DICOM tags + "Short": If set to true, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array describing the DICOM tags of the matching worklists

+
+
+ +
+ Source code in pyorthanc/client.py +
2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
def post_modalities_id_find_worklist(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """C-FIND SCU for worklist
+
+    Trigger C-FIND SCU command against the remote worklists of the DICOM modality whose identifier is provided in URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+          "Query": Associative array containing the filter on the values of the DICOM tags
+          "Short": If set to `true`, report the DICOM tags in hexadecimal format
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array describing the DICOM tags of the matching worklists
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/modalities/{id_}/find-worklist",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_move(id_, json=None) + +

+ + +
+ +

Trigger C-MOVE SCU

+

Start a C-MOVE SCU command as a job, in order to drive the execution of a sequence of C-STORE commands by some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-c-move +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Level": Level of the query (Patient, Study, Series or Instance) + "LocalAet": Local AET that is used for this commands, defaults to DicomAet configuration option. Ignored if DicomModalities already sets LocalAet for this modality. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": List of queries identifying all the DICOM resources to be sent + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "TargetAet": Target AET that will be used by the remote DICOM modality as a target for its C-STORE SCU commands, defaults to DicomAet configuration option in order to do a simple query/retrieve + "Timeout": Timeout for the C-MOVE command, in seconds

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
def post_modalities_id_move(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Trigger C-MOVE SCU
+
+    Start a C-MOVE SCU command as a job, in order to drive the execution of a sequence of C-STORE commands by some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-c-move
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Level": Level of the query (`Patient`, `Study`, `Series` or `Instance`)
+          "LocalAet": Local AET that is used for this commands, defaults to `DicomAet` configuration option. Ignored if `DicomModalities` already sets `LocalAet` for this modality.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": List of queries identifying all the DICOM resources to be sent
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "TargetAet": Target AET that will be used by the remote DICOM modality as a target for its C-STORE SCU commands, defaults to `DicomAet` configuration option in order to do a simple query/retrieve
+          "Timeout": Timeout for the C-MOVE command, in seconds
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/modalities/{id_}/move",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_query(id_, json=None) + +

+ + +
+ +

Trigger C-FIND SCU

+

Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-query-retrieve-c-find-and-find-with-rest +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Level": Level of the query (Patient, Study, Series or Instance) + "LocalAet": Local AET that is used for this commands, defaults to DicomAet configuration option. Ignored if DicomModalities already sets LocalAet for this modality. + "Normalize": Whether to normalize the query, i.e. whether to wipe out from the query, the DICOM tags that are not applicable for the query-retrieve level of interest + "Query": Associative array containing the filter on the values of the DICOM tags + "Timeout": Timeout for the C-FIND command and subsequent C-MOVE retrievals, in seconds (new in Orthanc 1.9.1)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
def post_modalities_id_query(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Trigger C-FIND SCU
+
+    Trigger C-FIND SCU command against the DICOM modality whose identifier is provided in URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-query-retrieve-c-find-and-find-with-rest
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "Level": Level of the query (`Patient`, `Study`, `Series` or `Instance`)
+          "LocalAet": Local AET that is used for this commands, defaults to `DicomAet` configuration option. Ignored if `DicomModalities` already sets `LocalAet` for this modality.
+          "Normalize": Whether to normalize the query, i.e. whether to wipe out from the query, the DICOM tags that are not applicable for the query-retrieve level of interest
+          "Query": Associative array containing the filter on the values of the DICOM tags
+          "Timeout": Timeout for the C-FIND command and subsequent C-MOVE retrievals, in seconds (new in Orthanc 1.9.1)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/modalities/{id_}/query",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_storage_commitment(id_, json=None) + +

+ + +
+ +

Trigger storage commitment request

+

Trigger a storage commitment request to some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/storage-commitment.html#storage-commitment-scu +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "DicomInstances": List of DICOM resources that are not necessarily stored within Orthanc, but that must be checked by storage commitment. This is a list of JSON objects that must contain the SOPClassUID and SOPInstanceUID fields. + "Resources": List of the Orthanc identifiers of the DICOM resources to be checked by storage commitment + "Timeout": Timeout for the storage commitment command (new in Orthanc 1.9.1)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
def post_modalities_id_storage_commitment(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Trigger storage commitment request
+
+    Trigger a storage commitment request to some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/storage-commitment.html#storage-commitment-scu
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "DicomInstances": List of DICOM resources that are not necessarily stored within Orthanc, but that must be checked by storage commitment. This is a list of JSON objects that must contain the `SOPClassUID` and `SOPInstanceUID` fields.
+          "Resources": List of the Orthanc identifiers of the DICOM resources to be checked by storage commitment
+          "Timeout": Timeout for the storage commitment command (new in Orthanc 1.9.1)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/modalities/{id_}/storage-commitment",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_store(id_, data=None, json=None) + +

+ + +
+ +

Trigger C-STORE SCU

+

Start a C-STORE SCU command as a job, in order to send DICOM resources stored locally to some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#rest-store-scu +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "CalledAet": Called AET that is used for this commands, defaults to AET configuration option. Allows you to overwrite the destination AET for a specific operation. + "Host": Host that is used for this commands, defaults to Host configuration option. Allows you to overwrite the destination host for a specific operation. + "LocalAet": Local AET that is used for this commands, defaults to DicomAet configuration option. Ignored if DicomModalities already sets LocalAet for this modality. + "MoveOriginatorAet": Move originator AET that is used for this commands, in order to fake a C-MOVE SCU + "MoveOriginatorID": Move originator ID that is used for this commands, in order to fake a C-MOVE SCU + "Permissive": If true, ignore errors during the individual steps of the job. + "Port": Port that is used for this command, defaults to Port configuration option. Allows you to overwrite the destination port for a specific operation. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": List of the Orthanc identifiers of all the DICOM resources to be sent + "StorageCommitment": Whether to chain C-STORE with DICOM storage commitment to validate the success of the transmission: https://orthanc.uclouvain.be/book/users/storage-commitment.html#chaining-c-store-with-storage-commitment + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Timeout": Timeout for the C-STORE command, in seconds

+
+
+ None +
data + RequestData + +
+

The Orthanc identifier of one resource to be sent

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
def post_modalities_id_store(
+    self,
+    id_: str,
+    data: RequestData = None,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Trigger C-STORE SCU
+
+    Start a C-STORE SCU command as a job, in order to send DICOM resources stored locally to some remote DICOM modality whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#rest-store-scu
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "CalledAet": Called AET that is used for this commands, defaults to `AET` configuration option. Allows you to overwrite the destination AET for a specific operation.
+          "Host": Host that is used for this commands, defaults to `Host` configuration option. Allows you to overwrite the destination host for a specific operation.
+          "LocalAet": Local AET that is used for this commands, defaults to `DicomAet` configuration option. Ignored if `DicomModalities` already sets `LocalAet` for this modality.
+          "MoveOriginatorAet": Move originator AET that is used for this commands, in order to fake a C-MOVE SCU
+          "MoveOriginatorID": Move originator ID that is used for this commands, in order to fake a C-MOVE SCU
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Port": Port that is used for this command, defaults to `Port` configuration option. Allows you to overwrite the destination port for a specific operation.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": List of the Orthanc identifiers of all the DICOM resources to be sent
+          "StorageCommitment": Whether to chain C-STORE with DICOM storage commitment to validate the success of the transmission: https://orthanc.uclouvain.be/book/users/storage-commitment.html#chaining-c-store-with-storage-commitment
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Timeout": Timeout for the C-STORE command, in seconds
+
+    data
+        The Orthanc identifier of one resource to be sent
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/modalities/{id_}/store",
+        data=data,
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_modalities_id_store_straight(id_, content=None) + +

+ + +
+ +

Straight C-STORE SCU

+

Synchronously send the DICOM instance in the POST body to the remote DICOM modality whose identifier is provided in URL, without having to first store it locally within Orthanc. This is an alternative to command-line tools such as storescu from DCMTK or dcm4che. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
content + RequestContent + +
+
- (Content-Type: "application/dicom") DICOM instance to be sent
+
+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
def post_modalities_id_store_straight(
+    self,
+    id_: str,
+    content: RequestContent = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Straight C-STORE SCU
+
+    Synchronously send the DICOM instance in the POST body to the remote DICOM modality whose identifier is provided in URL, without having to first store it locally within Orthanc. This is an alternative to command-line tools such as `storescu` from DCMTK or dcm4che.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    content
+            - (Content-Type: "application/dicom") DICOM instance to be sent
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return self._post(
+        route=f"{self.url}/modalities/{id_}/store-straight",
+        content=content,
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_anonymize(id_, json=None) + +

+ + +
+ +

Anonymize patient

+

Start a job that will anonymize all the DICOM instances within the patient whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new patient, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option DeidentifyLogsDicomVersion for possible values. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "KeepLabels": Keep the labels of all resources level (defaults to false) + "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to false) + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
def post_patients_id_anonymize(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Anonymize patient
+
+    Start a job that will anonymize all the DICOM instances within the patient whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new patient, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+          "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/patients/{id_}/anonymize",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_archive(id_, json=None) + +

+ + +
+ +

Create ZIP archive

+

Create a ZIP archive containing the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
3057
+3058
+3059
+3060
+3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
def post_patients_id_archive(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create ZIP archive
+
+    Create a ZIP archive containing the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/patients/{id_}/archive",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_attachments_name_compress(id_, name) + +

+ + +
+ +

Compress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
3216
+3217
+3218
+3219
+3220
+3221
+3222
+3223
+3224
+3225
+3226
+3227
+3228
+3229
+3230
+3231
+3232
+3233
+3234
+3235
+3236
+3237
+3238
+3239
def post_patients_id_attachments_name_compress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Compress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/compress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_attachments_name_uncompress(id_, name) + +

+ + +
+ +

Uncompress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
3489
+3490
+3491
+3492
+3493
+3494
+3495
+3496
+3497
+3498
+3499
+3500
+3501
+3502
+3503
+3504
+3505
+3506
+3507
+3508
+3509
+3510
+3511
+3512
def post_patients_id_attachments_name_uncompress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Uncompress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/uncompress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_attachments_name_verify_md5(id_, name) + +

+ + +
+ +

Verify attachment

+

Verify that the attachment is not corrupted, by validating its MD5 hash +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

On success, a valid JSON object is returned

+
+
+ +
+ Source code in pyorthanc/client.py +
3514
+3515
+3516
+3517
+3518
+3519
+3520
+3521
+3522
+3523
+3524
+3525
+3526
+3527
+3528
+3529
+3530
+3531
+3532
+3533
+3534
+3535
+3536
+3537
+3538
def post_patients_id_attachments_name_verify_md5(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Verify attachment
+
+    Verify that the attachment is not corrupted, by validating its MD5 hash
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        On success, a valid JSON object is returned
+    """
+    return self._post(
+        route=f"{self.url}/patients/{id_}/attachments/{name}/verify-md5",
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_media(id_, json=None) + +

+ + +
+ +

Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM patient whose Orthanc identifier is provided in the URL +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Extended": If true, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR. Default value is false. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
3730
+3731
+3732
+3733
+3734
+3735
+3736
+3737
+3738
+3739
+3740
+3741
+3742
+3743
+3744
+3745
+3746
+3747
+3748
+3749
+3750
+3751
+3752
+3753
+3754
+3755
+3756
+3757
+3758
+3759
+3760
+3761
+3762
+3763
+3764
def post_patients_id_media(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM patient whose Orthanc identifier is provided in the URL
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/patients/{id_}/media",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_modify(id_, json=None) + +

+ + +
+ +

Modify patient

+

Start a job that will modify all the DICOM instances within the patient whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new patient, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world. + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to false) + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
3890
+3891
+3892
+3893
+3894
+3895
+3896
+3897
+3898
+3899
+3900
+3901
+3902
+3903
+3904
+3905
+3906
+3907
+3908
+3909
+3910
+3911
+3912
+3913
+3914
+3915
+3916
+3917
+3918
+3919
+3920
+3921
+3922
+3923
+3924
+3925
+3926
+3927
+3928
+3929
+3930
def post_patients_id_modify(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Modify patient
+
+    Start a job that will modify all the DICOM instances within the patient whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new patient, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/patients/{id_}/modify",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_patients_id_reconstruct(id_, json=None) + +

+ + +
+ +

Reconstruct tags & optionally files of patient

+

Reconstruct the main DICOM tags in DB of the patient whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly. +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4007
+4008
+4009
+4010
+4011
+4012
+4013
+4014
+4015
+4016
+4017
+4018
+4019
+4020
+4021
+4022
+4023
+4024
+4025
+4026
+4027
+4028
+4029
+4030
+4031
+4032
+4033
+4034
+4035
def post_patients_id_reconstruct(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Reconstruct tags & optionally files of patient
+
+    Reconstruct the main DICOM tags in DB of the patient whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+    json
+        Dictionary with the following keys:
+          "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/patients/{id_}/reconstruct",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_peers_id_store(id_, data=None, json=None) + +

+ + +
+ +

Send to Orthanc peer

+

Send DICOM resources stored locally to some remote Orthanc peer whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#sending-one-resource +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Compress": Whether to compress the DICOM instances using gzip before the actual sending + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": List of the Orthanc identifiers of all the DICOM resources to be sent + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode to the provided DICOM transfer syntax before the actual sending

+
+
+ None +
data + RequestData + +
+

The Orthanc identifier of one resource to be sent

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4280
+4281
+4282
+4283
+4284
+4285
+4286
+4287
+4288
+4289
+4290
+4291
+4292
+4293
+4294
+4295
+4296
+4297
+4298
+4299
+4300
+4301
+4302
+4303
+4304
+4305
+4306
+4307
+4308
+4309
+4310
+4311
+4312
+4313
+4314
+4315
+4316
+4317
+4318
+4319
def post_peers_id_store(
+    self,
+    id_: str,
+    data: RequestData = None,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Send to Orthanc peer
+
+    Send DICOM resources stored locally to some remote Orthanc peer whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#sending-one-resource
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Compress": Whether to compress the DICOM instances using gzip before the actual sending
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": List of the Orthanc identifiers of all the DICOM resources to be sent
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode to the provided DICOM transfer syntax before the actual sending
+
+    data
+        The Orthanc identifier of one resource to be sent
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/peers/{id_}/store",
+        data=data,
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_peers_id_store_straight(id_, content=None) + +

+ + +
+ +

Straight store to peer

+

Synchronously send the DICOM instance in the POST body to the Orthanc peer whose identifier is provided in URL, without having to first store it locally within Orthanc. This is an alternative to command-line tools such as curl. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the modality of interest

+
+
+ required +
content + RequestContent + +
+
- (Content-Type: "application/dicom") DICOM instance to be sent
+
+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4321
+4322
+4323
+4324
+4325
+4326
+4327
+4328
+4329
+4330
+4331
+4332
+4333
+4334
+4335
+4336
+4337
+4338
+4339
+4340
+4341
+4342
+4343
+4344
+4345
+4346
def post_peers_id_store_straight(
+    self,
+    id_: str,
+    content: RequestContent = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Straight store to peer
+
+    Synchronously send the DICOM instance in the POST body to the Orthanc peer whose identifier is provided in URL, without having to first store it locally within Orthanc. This is an alternative to command-line tools such as `curl`.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the modality of interest
+    content
+            - (Content-Type: "application/dicom") DICOM instance to be sent
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    return self._post(
+        route=f"{self.url}/peers/{id_}/store-straight",
+        content=content,
+    )
+
+
+
+ +
+ +
+ + +

+ post_queries_id_answers_index_query_instances(id_, index, json=None) + +

+ + +
+ +

Query the child instances of an answer

+

Issue a second DICOM C-FIND operation, in order to query the child instances associated with one answer to some query/retrieve operation whose identifiers are provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
index + str + +
+

Index of the answer

+
+
+ required +
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Query": Associative array containing the filter on the values of the DICOM tags + "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4578
+4579
+4580
+4581
+4582
+4583
+4584
+4585
+4586
+4587
+4588
+4589
+4590
+4591
+4592
+4593
+4594
+4595
+4596
+4597
+4598
+4599
+4600
+4601
+4602
+4603
+4604
+4605
+4606
+4607
+4608
+4609
+4610
+4611
def post_queries_id_answers_index_query_instances(
+    self,
+    id_: str,
+    index: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Query the child instances of an answer
+
+    Issue a second DICOM C-FIND operation, in order to query the child instances associated with one answer to some query/retrieve operation whose identifiers are provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    index
+        Index of the answer
+    id_
+        Identifier of the query of interest
+    json
+        Dictionary with the following keys:
+          "Query": Associative array containing the filter on the values of the DICOM tags
+          "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/queries/{id_}/answers/{index}/query-instances",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_queries_id_answers_index_query_series(id_, index, json=None) + +

+ + +
+ +

Query the child series of an answer

+

Issue a second DICOM C-FIND operation, in order to query the child series associated with one answer to some query/retrieve operation whose identifiers are provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
index + str + +
+

Index of the answer

+
+
+ required +
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Query": Associative array containing the filter on the values of the DICOM tags + "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4613
+4614
+4615
+4616
+4617
+4618
+4619
+4620
+4621
+4622
+4623
+4624
+4625
+4626
+4627
+4628
+4629
+4630
+4631
+4632
+4633
+4634
+4635
+4636
+4637
+4638
+4639
+4640
+4641
+4642
+4643
+4644
+4645
+4646
def post_queries_id_answers_index_query_series(
+    self,
+    id_: str,
+    index: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Query the child series of an answer
+
+    Issue a second DICOM C-FIND operation, in order to query the child series associated with one answer to some query/retrieve operation whose identifiers are provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    index
+        Index of the answer
+    id_
+        Identifier of the query of interest
+    json
+        Dictionary with the following keys:
+          "Query": Associative array containing the filter on the values of the DICOM tags
+          "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/queries/{id_}/answers/{index}/query-series",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_queries_id_answers_index_query_studies(id_, index, json=None) + +

+ + +
+ +

Query the child studies of an answer

+

Issue a second DICOM C-FIND operation, in order to query the child studies associated with one answer to some query/retrieve operation whose identifiers are provided in the URL +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
index + str + +
+

Index of the answer

+
+
+ required +
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Query": Associative array containing the filter on the values of the DICOM tags + "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4648
+4649
+4650
+4651
+4652
+4653
+4654
+4655
+4656
+4657
+4658
+4659
+4660
+4661
+4662
+4663
+4664
+4665
+4666
+4667
+4668
+4669
+4670
+4671
+4672
+4673
+4674
+4675
+4676
+4677
+4678
+4679
+4680
+4681
def post_queries_id_answers_index_query_studies(
+    self,
+    id_: str,
+    index: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Query the child studies of an answer
+
+    Issue a second DICOM C-FIND operation, in order to query the child studies associated with one answer to some query/retrieve operation whose identifiers are provided in the URL
+    Tags: Networking
+
+    Parameters
+    ----------
+    index
+        Index of the answer
+    id_
+        Identifier of the query of interest
+    json
+        Dictionary with the following keys:
+          "Query": Associative array containing the filter on the values of the DICOM tags
+          "Timeout": Timeout for the C-FIND command, in seconds (new in Orthanc 1.9.1)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/queries/{id_}/answers/{index}/query-studies",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_queries_id_answers_index_retrieve(id_, index, data=None, json=None) + +

+ + +
+ +

Retrieve one answer

+

Start a C-MOVE SCU command as a job, in order to retrieve one answer associated with the query/retrieve operation whose identifiers are provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-retrieve-c-move +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
index + str + +
+

Index of the answer

+
+
+ required +
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Full": If set to true, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Simplify": If set to true, report the DICOM tags in human-readable format (using the symbolic name of the tags) + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "TargetAet": AET of the target modality. By default, the AET of Orthanc is used, as defined in the DicomAet configuration option. + "Timeout": Timeout for the C-MOVE command, in seconds

+
+
+ None +
data + RequestData + +
+

AET of the target modality

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4683
+4684
+4685
+4686
+4687
+4688
+4689
+4690
+4691
+4692
+4693
+4694
+4695
+4696
+4697
+4698
+4699
+4700
+4701
+4702
+4703
+4704
+4705
+4706
+4707
+4708
+4709
+4710
+4711
+4712
+4713
+4714
+4715
+4716
+4717
+4718
+4719
+4720
+4721
+4722
+4723
+4724
+4725
+4726
def post_queries_id_answers_index_retrieve(
+    self,
+    id_: str,
+    index: str,
+    data: RequestData = None,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Retrieve one answer
+
+    Start a C-MOVE SCU command as a job, in order to retrieve one answer associated with the query/retrieve operation whose identifiers are provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-retrieve-c-move
+    Tags: Networking
+
+    Parameters
+    ----------
+    index
+        Index of the answer
+    id_
+        Identifier of the query of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Simplify": If set to `true`, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "TargetAet": AET of the target modality. By default, the AET of Orthanc is used, as defined in the `DicomAet` configuration option.
+          "Timeout": Timeout for the C-MOVE command, in seconds
+
+    data
+        AET of the target modality
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/queries/{id_}/answers/{index}/retrieve",
+        data=data,
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_queries_id_retrieve(id_, data=None, json=None) + +

+ + +
+ +

Retrieve all answers

+

Start a C-MOVE SCU command as a job, in order to retrieve all the answers associated with the query/retrieve operation whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-retrieve-c-move +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the query of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Full": If set to true, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Simplify": If set to true, report the DICOM tags in human-readable format (using the symbolic name of the tags) + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "TargetAet": AET of the target modality. By default, the AET of Orthanc is used, as defined in the DicomAet configuration option. + "Timeout": Timeout for the C-MOVE command, in seconds

+
+
+ None +
data + RequestData + +
+

AET of the target modality

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4803
+4804
+4805
+4806
+4807
+4808
+4809
+4810
+4811
+4812
+4813
+4814
+4815
+4816
+4817
+4818
+4819
+4820
+4821
+4822
+4823
+4824
+4825
+4826
+4827
+4828
+4829
+4830
+4831
+4832
+4833
+4834
+4835
+4836
+4837
+4838
+4839
+4840
+4841
+4842
+4843
def post_queries_id_retrieve(
+    self,
+    id_: str,
+    data: RequestData = None,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Retrieve all answers
+
+    Start a C-MOVE SCU command as a job, in order to retrieve all the answers associated with the query/retrieve operation whose identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/rest.html#performing-retrieve-c-move
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the query of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Simplify": If set to `true`, report the DICOM tags in human-readable format (using the symbolic name of the tags)
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "TargetAet": AET of the target modality. By default, the AET of Orthanc is used, as defined in the `DicomAet` configuration option.
+          "Timeout": Timeout for the C-MOVE command, in seconds
+
+    data
+        AET of the target modality
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/queries/{id_}/retrieve",
+        data=data,
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_anonymize(id_, json=None) + +

+ + +
+ +

Anonymize series

+

Start a job that will anonymize all the DICOM instances within the series whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new series, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option DeidentifyLogsDicomVersion for possible values. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "KeepLabels": Keep the labels of all resources level (defaults to false) + "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to false) + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4927
+4928
+4929
+4930
+4931
+4932
+4933
+4934
+4935
+4936
+4937
+4938
+4939
+4940
+4941
+4942
+4943
+4944
+4945
+4946
+4947
+4948
+4949
+4950
+4951
+4952
+4953
+4954
+4955
+4956
+4957
+4958
+4959
+4960
+4961
+4962
+4963
+4964
+4965
+4966
+4967
+4968
+4969
def post_series_id_anonymize(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Anonymize series
+
+    Start a job that will anonymize all the DICOM instances within the series whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new series, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+          "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/series/{id_}/anonymize",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_archive(id_, json=None) + +

+ + +
+ +

Create ZIP archive

+

Create a ZIP archive containing the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
5000
+5001
+5002
+5003
+5004
+5005
+5006
+5007
+5008
+5009
+5010
+5011
+5012
+5013
+5014
+5015
+5016
+5017
+5018
+5019
+5020
+5021
+5022
+5023
+5024
+5025
+5026
+5027
+5028
+5029
+5030
+5031
+5032
+5033
def post_series_id_archive(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create ZIP archive
+
+    Create a ZIP archive containing the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/series/{id_}/archive",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_attachments_name_compress(id_, name) + +

+ + +
+ +

Compress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
5159
+5160
+5161
+5162
+5163
+5164
+5165
+5166
+5167
+5168
+5169
+5170
+5171
+5172
+5173
+5174
+5175
+5176
+5177
+5178
+5179
+5180
+5181
+5182
def post_series_id_attachments_name_compress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Compress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/series/{id_}/attachments/{name}/compress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_attachments_name_uncompress(id_, name) + +

+ + +
+ +

Uncompress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
5432
+5433
+5434
+5435
+5436
+5437
+5438
+5439
+5440
+5441
+5442
+5443
+5444
+5445
+5446
+5447
+5448
+5449
+5450
+5451
+5452
+5453
+5454
+5455
def post_series_id_attachments_name_uncompress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Uncompress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/series/{id_}/attachments/{name}/uncompress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_attachments_name_verify_md5(id_, name) + +

+ + +
+ +

Verify attachment

+

Verify that the attachment is not corrupted, by validating its MD5 hash +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

On success, a valid JSON object is returned

+
+
+ +
+ Source code in pyorthanc/client.py +
5457
+5458
+5459
+5460
+5461
+5462
+5463
+5464
+5465
+5466
+5467
+5468
+5469
+5470
+5471
+5472
+5473
+5474
+5475
+5476
+5477
+5478
+5479
+5480
+5481
def post_series_id_attachments_name_verify_md5(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Verify attachment
+
+    Verify that the attachment is not corrupted, by validating its MD5 hash
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        On success, a valid JSON object is returned
+    """
+    return self._post(
+        route=f"{self.url}/series/{id_}/attachments/{name}/verify-md5",
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_media(id_, json=None) + +

+ + +
+ +

Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM series whose Orthanc identifier is provided in the URL +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Extended": If true, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR. Default value is false. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
5673
+5674
+5675
+5676
+5677
+5678
+5679
+5680
+5681
+5682
+5683
+5684
+5685
+5686
+5687
+5688
+5689
+5690
+5691
+5692
+5693
+5694
+5695
+5696
+5697
+5698
+5699
+5700
+5701
+5702
+5703
+5704
+5705
+5706
+5707
def post_series_id_media(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM series whose Orthanc identifier is provided in the URL
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/series/{id_}/media",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_modify(id_, json=None) + +

+ + +
+ +

Modify series

+

Start a job that will modify all the DICOM instances within the series whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new series, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world. + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to false) + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
5833
+5834
+5835
+5836
+5837
+5838
+5839
+5840
+5841
+5842
+5843
+5844
+5845
+5846
+5847
+5848
+5849
+5850
+5851
+5852
+5853
+5854
+5855
+5856
+5857
+5858
+5859
+5860
+5861
+5862
+5863
+5864
+5865
+5866
+5867
+5868
+5869
+5870
+5871
+5872
+5873
def post_series_id_modify(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Modify series
+
+    Start a job that will modify all the DICOM instances within the series whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new series, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/series/{id_}/modify",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_series_id_reconstruct(id_, json=None) + +

+ + +
+ +

Reconstruct tags & optionally files of series

+

Reconstruct the main DICOM tags in DB of the series whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly. +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
5988
+5989
+5990
+5991
+5992
+5993
+5994
+5995
+5996
+5997
+5998
+5999
+6000
+6001
+6002
+6003
+6004
+6005
+6006
+6007
+6008
+6009
+6010
+6011
+6012
+6013
+6014
+6015
+6016
def post_series_id_reconstruct(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Reconstruct tags & optionally files of series
+
+    Reconstruct the main DICOM tags in DB of the series whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+    Tags: Series
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the series of interest
+    json
+        Dictionary with the following keys:
+          "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/series/{id_}/reconstruct",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_storage_commitment_id_remove(id_) + +

+ + +
+ +

Remove after storage commitment

+

Remove out of Orthanc, the DICOM instances that have been reported to have been properly received the storage commitment report whose identifier is provided in the URL. This is only possible if the Status of the storage commitment report is Success. https://orthanc.uclouvain.be/book/users/storage-commitment.html#removing-the-instances +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the storage commitment report

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
6140
+6141
+6142
+6143
+6144
+6145
+6146
+6147
+6148
+6149
+6150
+6151
+6152
+6153
+6154
+6155
+6156
+6157
+6158
+6159
+6160
def post_storage_commitment_id_remove(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Remove after storage commitment
+
+    Remove out of Orthanc, the DICOM instances that have been reported to have been properly received the storage commitment report whose identifier is provided in the URL. This is only possible if the `Status` of the storage commitment report is `Success`. https://orthanc.uclouvain.be/book/users/storage-commitment.html#removing-the-instances
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the storage commitment report
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/storage-commitment/{id_}/remove",
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_anonymize(id_, json=None) + +

+ + +
+ +

Anonymize study

+

Start a job that will anonymize all the DICOM instances within the study whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new study, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option DeidentifyLogsDicomVersion for possible values. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "KeepLabels": Keep the labels of all resources level (defaults to false) + "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to false) + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
6244
+6245
+6246
+6247
+6248
+6249
+6250
+6251
+6252
+6253
+6254
+6255
+6256
+6257
+6258
+6259
+6260
+6261
+6262
+6263
+6264
+6265
+6266
+6267
+6268
+6269
+6270
+6271
+6272
+6273
+6274
+6275
+6276
+6277
+6278
+6279
+6280
+6281
+6282
+6283
+6284
+6285
+6286
def post_studies_id_anonymize(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Anonymize study
+
+    Start a job that will anonymize all the DICOM instances within the study whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new study, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#anonymization-of-patients-studies-or-series
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+          "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/studies/{id_}/anonymize",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_archive(id_, json=None) + +

+ + +
+ +

Create ZIP archive

+

Create a ZIP archive containing the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
6317
+6318
+6319
+6320
+6321
+6322
+6323
+6324
+6325
+6326
+6327
+6328
+6329
+6330
+6331
+6332
+6333
+6334
+6335
+6336
+6337
+6338
+6339
+6340
+6341
+6342
+6343
+6344
+6345
+6346
+6347
+6348
+6349
+6350
def post_studies_id_archive(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create ZIP archive
+
+    Create a ZIP archive containing the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/studies/{id_}/archive",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_attachments_name_compress(id_, name) + +

+ + +
+ +

Compress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
6476
+6477
+6478
+6479
+6480
+6481
+6482
+6483
+6484
+6485
+6486
+6487
+6488
+6489
+6490
+6491
+6492
+6493
+6494
+6495
+6496
+6497
+6498
+6499
def post_studies_id_attachments_name_compress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Compress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/compress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_attachments_name_uncompress(id_, name) + +

+ + +
+ +

Uncompress attachment

+

Change the compression scheme that is used to store an attachment. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
6749
+6750
+6751
+6752
+6753
+6754
+6755
+6756
+6757
+6758
+6759
+6760
+6761
+6762
+6763
+6764
+6765
+6766
+6767
+6768
+6769
+6770
+6771
+6772
def post_studies_id_attachments_name_uncompress(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Uncompress attachment
+
+    Change the compression scheme that is used to store an attachment.
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/uncompress",
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_attachments_name_verify_md5(id_, name) + +

+ + +
+ +

Verify attachment

+

Verify that the attachment is not corrupted, by validating its MD5 hash +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

On success, a valid JSON object is returned

+
+
+ +
+ Source code in pyorthanc/client.py +
6774
+6775
+6776
+6777
+6778
+6779
+6780
+6781
+6782
+6783
+6784
+6785
+6786
+6787
+6788
+6789
+6790
+6791
+6792
+6793
+6794
+6795
+6796
+6797
+6798
def post_studies_id_attachments_name_verify_md5(
+    self,
+    id_: str,
+    name: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Verify attachment
+
+    Verify that the attachment is not corrupted, by validating its MD5 hash
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        On success, a valid JSON object is returned
+    """
+    return self._post(
+        route=f"{self.url}/studies/{id_}/attachments/{name}/verify-md5",
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_media(id_, json=None) + +

+ + +
+ +

Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM study whose Orthanc identifier is provided in the URL +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Extended": If true, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR. Default value is false. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
6990
+6991
+6992
+6993
+6994
+6995
+6996
+6997
+6998
+6999
+7000
+7001
+7002
+7003
+7004
+7005
+7006
+7007
+7008
+7009
+7010
+7011
+7012
+7013
+7014
+7015
+7016
+7017
+7018
+7019
+7020
+7021
+7022
+7023
+7024
def post_studies_id_media(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM study whose Orthanc identifier is provided in the URL
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/studies/{id_}/media",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_merge(id_, json=None) + +

+ + +
+ +

Merge study

+

Start a new job so as to move some DICOM resources into the DICOM study whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#merging +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "KeepSource": If set to true, instructs Orthanc to keep a copy of the original resources in their source study. By default, the original resources are deleted from Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": The list of DICOM resources (studies, series, and/or instances) to be merged into the study of interest (mandatory option) + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7026
+7027
+7028
+7029
+7030
+7031
+7032
+7033
+7034
+7035
+7036
+7037
+7038
+7039
+7040
+7041
+7042
+7043
+7044
+7045
+7046
+7047
+7048
+7049
+7050
+7051
+7052
+7053
+7054
+7055
+7056
+7057
+7058
+7059
+7060
def post_studies_id_merge(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Merge study
+
+    Start a new job so as to move some DICOM resources into the DICOM study whose Orthanc identifier is provided in the URL: https://orthanc.uclouvain.be/book/users/anonymization.html#merging
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "KeepSource": If set to `true`, instructs Orthanc to keep a copy of the original resources in their source study. By default, the original resources are deleted from Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": The list of DICOM resources (studies, series, and/or instances) to be merged into the study of interest (mandatory option)
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/studies/{id_}/merge",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_modify(id_, json=None) + +

+ + +
+ +

Modify study

+

Start a job that will modify all the DICOM instances within the study whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new study, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world. + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to false) + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7186
+7187
+7188
+7189
+7190
+7191
+7192
+7193
+7194
+7195
+7196
+7197
+7198
+7199
+7200
+7201
+7202
+7203
+7204
+7205
+7206
+7207
+7208
+7209
+7210
+7211
+7212
+7213
+7214
+7215
+7216
+7217
+7218
+7219
+7220
+7221
+7222
+7223
+7224
+7225
+7226
def post_studies_id_modify(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Modify study
+
+    Start a job that will modify all the DICOM instances within the study whose identifier is provided in the URL. The modified DICOM instances will be stored into a brand new study, whose Orthanc identifiers will be returned by the job. https://orthanc.uclouvain.be/book/users/anonymization.html#modification-of-studies-or-series
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/studies/{id_}/modify",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_reconstruct(id_, json=None) + +

+ + +
+ +

Reconstruct tags & optionally files of study

+

Reconstruct the main DICOM tags in DB of the study whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly. +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7318
+7319
+7320
+7321
+7322
+7323
+7324
+7325
+7326
+7327
+7328
+7329
+7330
+7331
+7332
+7333
+7334
+7335
+7336
+7337
+7338
+7339
+7340
+7341
+7342
+7343
+7344
+7345
+7346
def post_studies_id_reconstruct(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Reconstruct tags & optionally files of study
+
+    Reconstruct the main DICOM tags in DB of the study whose Orthanc identifier is provided in the URL. This is useful if child studies/series/instances have inconsistent values for higher-level tags, in order to force Orthanc to use the value from the resource of interest. Beware that this is a time-consuming operation, as all the children DICOM instances will be parsed again, and the Orthanc index will be updated accordingly.
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/studies/{id_}/reconstruct",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_studies_id_split(id_, json=None) + +

+ + +
+ +

Split study

+

Start a new job so as to split the DICOM study whose Orthanc identifier is provided in the URL, by taking some of its children series or instances out of it and putting them into a brand new study (this new study is created by setting the StudyInstanceUID tag to a random identifier): https://orthanc.uclouvain.be/book/users/anonymization.html#splitting +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Instances": The list of instances to be separated from the parent study. These instances must all be children of the same source study, that is specified in the URI. + "KeepLabels": Keep the labels of all resources level (defaults to false) + "KeepSource": If set to true, instructs Orthanc to keep a copy of the original series/instances in the source study. By default, the original series/instances are deleted from Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Remove": List of tags that must be removed in the new study (from the same modules as in the Replace option) + "Replace": Associative array to change the value of some DICOM tags in the new study. These tags must be part of the "Patient Module Attributes" or the "General Study Module Attributes", as specified by the DICOM 2011 standard in Tables C.7-1 and C.7-3. + "Series": The list of series to be separated from the parent study. These series must all be children of the same source study, that is specified in the URI. + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7408
+7409
+7410
+7411
+7412
+7413
+7414
+7415
+7416
+7417
+7418
+7419
+7420
+7421
+7422
+7423
+7424
+7425
+7426
+7427
+7428
+7429
+7430
+7431
+7432
+7433
+7434
+7435
+7436
+7437
+7438
+7439
+7440
+7441
+7442
+7443
+7444
+7445
+7446
def post_studies_id_split(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Split study
+
+    Start a new job so as to split the DICOM study whose Orthanc identifier is provided in the URL, by taking some of its children series or instances out of it and putting them into a brand new study (this new study is created by setting the `StudyInstanceUID` tag to a random identifier): https://orthanc.uclouvain.be/book/users/anonymization.html#splitting
+    Tags: Studies
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the study of interest
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Instances": The list of instances to be separated from the parent study. These instances must all be children of the same source study, that is specified in the URI.
+          "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+          "KeepSource": If set to `true`, instructs Orthanc to keep a copy of the original series/instances in the source study. By default, the original series/instances are deleted from Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Remove": List of tags that must be removed in the new study (from the same modules as in the `Replace` option)
+          "Replace": Associative array to change the value of some DICOM tags in the new study. These tags must be part of the "Patient Module Attributes" or the "General Study Module Attributes", as specified by the DICOM 2011 standard in Tables C.7-1 and C.7-3.
+          "Series": The list of series to be separated from the parent study. These series must all be children of the same source study, that is specified in the URI.
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/studies/{id_}/split",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_bulk_anonymize(json=None) + +

+ + +
+ +

Anonymize a set of resources

+

Start a job that will anonymize all the DICOM patients, studies, series or instances whose identifiers are provided in the Resources field. +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option DeidentifyLogsDicomVersion for possible values. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "KeepLabels": Keep the labels of all resources level (defaults to false) + "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to false) + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest. + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The list of all the resources that have been created by this anonymization

+
+
+ +
+ Source code in pyorthanc/client.py +
7553
+7554
+7555
+7556
+7557
+7558
+7559
+7560
+7561
+7562
+7563
+7564
+7565
+7566
+7567
+7568
+7569
+7570
+7571
+7572
+7573
+7574
+7575
+7576
+7577
+7578
+7579
+7580
+7581
+7582
+7583
+7584
+7585
+7586
+7587
+7588
+7589
+7590
+7591
+7592
+7593
def post_tools_bulk_anonymize(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Anonymize a set of resources
+
+    Start a job that will anonymize all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field.
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "DicomVersion": Version of the DICOM standard to be used for anonymization. Check out configuration option `DeidentifyLogsDicomVersion` for possible values.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": List of DICOM tags whose value must not be destroyed by the anonymization. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "KeepLabels": Keep the labels of all resources level (defaults to `false`)
+          "KeepPrivateTags": Keep the private tags from the DICOM instances (defaults to `false`)
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of additional tags to be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The list of all the resources that have been created by this anonymization
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/tools/bulk-anonymize",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_bulk_content(json=None) + +

+ + +
+ +

Describe a set of resources

+

Get the content all the DICOM patients, studies, series or instances whose identifiers are provided in the Resources field, in one single call. +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Full": If set to true, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "Level": This optional argument specifies the level of interest (can be Patient, Study, Series or Instance). Orthanc will loop over the items inside Resources, and explore upward or downward in the DICOM hierarchy in order to find the level of interest. + "Metadata": If set to true (default value), the metadata associated with the resources will also be retrieved. + "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest. + "Short": If set to true, report the DICOM tags in hexadecimal format

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7595
+7596
+7597
+7598
+7599
+7600
+7601
+7602
+7603
+7604
+7605
+7606
+7607
+7608
+7609
+7610
+7611
+7612
+7613
+7614
+7615
+7616
+7617
+7618
+7619
+7620
+7621
+7622
+7623
+7624
def post_tools_bulk_content(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Describe a set of resources
+
+    Get the content all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field, in one single call.
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+          "Level": This optional argument specifies the level of interest (can be `Patient`, `Study`, `Series` or `Instance`). Orthanc will loop over the items inside `Resources`, and explore upward or downward in the DICOM hierarchy in order to find the level of interest.
+          "Metadata": If set to `true` (default value), the metadata associated with the resources will also be retrieved.
+          "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+          "Short": If set to `true`, report the DICOM tags in hexadecimal format
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/tools/bulk-content",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_bulk_delete(json=None) + +

+ + +
+ +

Delete a set of resources

+

Delete all the DICOM patients, studies, series or instances whose identifiers are provided in the Resources field. +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7626
+7627
+7628
+7629
+7630
+7631
+7632
+7633
+7634
+7635
+7636
+7637
+7638
+7639
+7640
+7641
+7642
+7643
+7644
+7645
+7646
+7647
+7648
+7649
+7650
+7651
def post_tools_bulk_delete(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Delete a set of resources
+
+    Delete all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field.
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/tools/bulk-delete",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_bulk_modify(json=None) + +

+ + +
+ +

Modify a set of resources

+

Start a job that will modify all the DICOM patients, studies, series or instances whose identifiers are provided in the Resources field. +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible. + "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world + "Keep": Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world. + "KeepSource": If set to false, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc. + "Level": Level of the modification (Patient, Study, Series or Instance). If absent, the level defaults to Instance, but is set to Patient if PatientID is modified, to Study if StudyInstanceUID is modified, or to Series if SeriesInstancesUID is modified. (new in Orthanc 1.9.7) + "Permissive": If true, ignore errors during the individual steps of the job. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "PrivateCreator": The private creator to be used for private tags in Replace + "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to false) + "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the dcmodify command-line tool (wildcards are supported as well). + "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest. + "Synchronous": If true, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is not desirable for long jobs, as it might lead to network timeouts. + "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

The list of all the resources that have been altered by this modification

+
+
+ +
+ Source code in pyorthanc/client.py +
7653
+7654
+7655
+7656
+7657
+7658
+7659
+7660
+7661
+7662
+7663
+7664
+7665
+7666
+7667
+7668
+7669
+7670
+7671
+7672
+7673
+7674
+7675
+7676
+7677
+7678
+7679
+7680
+7681
+7682
+7683
+7684
+7685
+7686
+7687
+7688
+7689
+7690
+7691
+7692
def post_tools_bulk_modify(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Modify a set of resources
+
+    Start a job that will modify all the DICOM patients, studies, series or instances whose identifiers are provided in the `Resources` field.
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, run the job in asynchronous mode, which means that the REST API call will immediately return, reporting the identifier of a job. Prefer this flavor wherever possible.
+          "Force": Allow the modification of tags related to DICOM identifiers, at the risk of breaking the DICOM model of the real world
+          "Keep": Keep the original value of the specified tags, to be chosen among the `StudyInstanceUID`, `SeriesInstanceUID` and `SOPInstanceUID` tags. Avoid this feature as much as possible, as this breaks the DICOM model of the real world.
+          "KeepSource": If set to `false`, instructs Orthanc to the remove original resources. By default, the original resources are kept in Orthanc.
+          "Level": Level of the modification (`Patient`, `Study`, `Series` or `Instance`). If absent, the level defaults to `Instance`, but is set to `Patient` if `PatientID` is modified, to `Study` if `StudyInstanceUID` is modified, or to `Series` if `SeriesInstancesUID` is modified. (new in Orthanc 1.9.7)
+          "Permissive": If `true`, ignore errors during the individual steps of the job.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "PrivateCreator": The private creator to be used for private tags in `Replace`
+          "Remove": List of tags that must be removed from the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "RemovePrivateTags": Remove the private tags from the DICOM instances (defaults to `false`)
+          "Replace": Associative array to change the value of some DICOM tags in the DICOM instances. Starting with Orthanc 1.9.4, paths to subsequences can be provided using the same syntax as the `dcmodify` command-line tool (wildcards are supported as well).
+          "Resources": List of the Orthanc identifiers of the patients/studies/series/instances of interest.
+          "Synchronous": If `true`, run the job in synchronous mode, which means that the HTTP answer will directly contain the result of the job. This is the default, easy behavior, but it is *not* desirable for long jobs, as it might lead to network timeouts.
+          "Transcode": Transcode the DICOM instances to the provided DICOM transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        The list of all the resources that have been altered by this modification
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/tools/bulk-modify",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_create_archive(json=None) + +

+ + +
+ +

Create ZIP archive

+

Create a ZIP archive containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": The list of Orthanc identifiers of interest. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
7719
+7720
+7721
+7722
+7723
+7724
+7725
+7726
+7727
+7728
+7729
+7730
+7731
+7732
+7733
+7734
+7735
+7736
+7737
+7738
+7739
+7740
+7741
+7742
+7743
+7744
+7745
+7746
+7747
+7748
+7749
+7750
def post_tools_create_archive(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create ZIP archive
+
+    Create a ZIP archive containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": The list of Orthanc identifiers of interest.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/tools/create-archive",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_create_dicom(json=None) + +

+ + +
+ +

Create one DICOM instance

+

Create one DICOM instance, and store it into Orthanc +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Content": This field can be used to embed an image (pixel data encoded as PNG or JPEG), a PDF, or a 3D manufactoring model (MTL/OBJ/STL) inside the created DICOM instance. The file to be encapsulated must be provided using its data URI scheme encoding. This field can possibly contain a JSON array, in which case a DICOM series is created containing one DICOM instance for each item in the Content field. + "Force": Avoid the consistency checks for the DICOM tags that enforce the DICOM model of the real-world. You can notably use this flag if you need to manually set the tags StudyInstanceUID, SeriesInstanceUID, or SOPInstanceUID. Be careful with this feature. + "InterpretBinaryTags": If some value in the Tags associative array is formatted according to some data URI scheme encoding, whether this value is decoded to a binary value or kept as such (true by default) + "Parent": If present, the newly created instance will be attached to the parent DICOM resource whose Orthanc identifier is contained in this field. The DICOM tags of the parent modules in the DICOM hierarchy will be automatically copied to the newly created instance. + "PrivateCreator": The private creator to be used for private tags in Tags + "Tags": Associative array containing the tags of the new instance to be created

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7752
+7753
+7754
+7755
+7756
+7757
+7758
+7759
+7760
+7761
+7762
+7763
+7764
+7765
+7766
+7767
+7768
+7769
+7770
+7771
+7772
+7773
+7774
+7775
+7776
+7777
+7778
+7779
+7780
+7781
+7782
+7783
def post_tools_create_dicom(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create one DICOM instance
+
+    Create one DICOM instance, and store it into Orthanc
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Content": This field can be used to embed an image (pixel data encoded as PNG or JPEG), a PDF, or a 3D manufactoring model (MTL/OBJ/STL) inside the created DICOM instance. The file to be encapsulated must be provided using its [data URI scheme encoding](https://en.wikipedia.org/wiki/Data_URI_scheme). This field can possibly contain a JSON array, in which case a DICOM series is created containing one DICOM instance for each item in the `Content` field.
+          "Force": Avoid the consistency checks for the DICOM tags that enforce the DICOM model of the real-world. You can notably use this flag if you need to manually set the tags `StudyInstanceUID`, `SeriesInstanceUID`, or `SOPInstanceUID`. Be careful with this feature.
+          "InterpretBinaryTags": If some value in the `Tags` associative array is formatted according to some [data URI scheme encoding](https://en.wikipedia.org/wiki/Data_URI_scheme), whether this value is decoded to a binary value or kept as such (`true` by default)
+          "Parent": If present, the newly created instance will be attached to the parent DICOM resource whose Orthanc identifier is contained in this field. The DICOM tags of the parent modules in the DICOM hierarchy will be automatically copied to the newly created instance.
+          "PrivateCreator": The private creator to be used for private tags in `Tags`
+          "Tags": Associative array containing the tags of the new instance to be created
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/tools/create-dicom",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_create_media(json=None) + +

+ + +
+ +

Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Extended": If true, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR. Default value is false. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": The list of Orthanc identifiers of interest. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
7810
+7811
+7812
+7813
+7814
+7815
+7816
+7817
+7818
+7819
+7820
+7821
+7822
+7823
+7824
+7825
+7826
+7827
+7828
+7829
+7830
+7831
+7832
+7833
+7834
+7835
+7836
+7837
+7838
+7839
+7840
+7841
+7842
def post_tools_create_media(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `false`.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": The list of Orthanc identifiers of interest.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/tools/create-media",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_create_media_extended(json=None) + +

+ + +
+ +

Create DICOMDIR media

+

Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "Asynchronous": If true, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background. + "Extended": If true, will include additional tags such as SeriesDescription, leading to a so-called extended DICOMDIR. Default value is true. + "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority. + "Resources": The list of Orthanc identifiers of interest. + "Synchronous": If true, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts. + "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs +In synchronous mode, the ZIP file containing the archive

+
+
+ +
+ Source code in pyorthanc/client.py +
7869
+7870
+7871
+7872
+7873
+7874
+7875
+7876
+7877
+7878
+7879
+7880
+7881
+7882
+7883
+7884
+7885
+7886
+7887
+7888
+7889
+7890
+7891
+7892
+7893
+7894
+7895
+7896
+7897
+7898
+7899
+7900
+7901
def post_tools_create_media_extended(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Create DICOMDIR media
+
+    Create a DICOMDIR media containing the DICOM resources (patients, studies, series, or instances) whose Orthanc identifiers are provided in the body
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "Asynchronous": If `true`, create the archive in asynchronous mode, which means that a job is submitted to create the archive in background.
+          "Extended": If `true`, will include additional tags such as `SeriesDescription`, leading to a so-called *extended DICOMDIR*. Default value is `true`.
+          "Priority": In asynchronous mode, the priority of the job. The lower the value, the higher the priority.
+          "Resources": The list of Orthanc identifiers of interest.
+          "Synchronous": If `true`, create the archive in synchronous mode, which means that the HTTP answer will directly contain the ZIP file. This is the default, easy behavior. However, if global configuration option "SynchronousZipStream" is set to "false", asynchronous transfers should be preferred for large amount of data, as the creation of the temporary file might lead to network timeouts.
+          "Transcode": If present, the DICOM files in the archive will be transcoded to the provided transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        In asynchronous mode, information about the job that has been submitted to generate the archive: https://orthanc.uclouvain.be/book/users/advanced-rest.html#jobs
+        In synchronous mode, the ZIP file containing the archive
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/tools/create-media-extended",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_dicom_echo(json=None) + +

+ + +
+ +

Trigger C-ECHO SCU

+

Trigger C-ECHO SCU command against a DICOM modality described in the POST body, without having to register the modality in some /modalities/{id} (new in Orthanc 1.8.1) +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "AET": AET of the remote DICOM modality + "CheckFind": Issue a dummy C-FIND command after the C-GET SCU, in order to check whether the remote modality knows about Orthanc. This field defaults to the value of the DicomEchoChecksFind configuration option. New in Orthanc 1.8.1. + "Host": Host address of the remote DICOM modality (typically, an IP address) + "Manufacturer": Manufacturer of the remote DICOM modality (check configuration option DicomModalities for possible values + "Port": TCP port of the remote DICOM modality + "Timeout": Timeout for the C-ECHO command, in seconds + "UseDicomTls": Whether to use DICOM TLS in the SCU connection initiated by Orthanc (new in Orthanc 1.9.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7960
+7961
+7962
+7963
+7964
+7965
+7966
+7967
+7968
+7969
+7970
+7971
+7972
+7973
+7974
+7975
+7976
+7977
+7978
+7979
+7980
+7981
+7982
+7983
+7984
+7985
+7986
+7987
+7988
+7989
+7990
+7991
def post_tools_dicom_echo(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Trigger C-ECHO SCU
+
+    Trigger C-ECHO SCU command against a DICOM modality described in the POST body, without having to register the modality in some `/modalities/{id}` (new in Orthanc 1.8.1)
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "AET": AET of the remote DICOM modality
+          "CheckFind": Issue a dummy C-FIND command after the C-GET SCU, in order to check whether the remote modality knows about Orthanc. This field defaults to the value of the `DicomEchoChecksFind` configuration option. New in Orthanc 1.8.1.
+          "Host": Host address of the remote DICOM modality (typically, an IP address)
+          "Manufacturer": Manufacturer of the remote DICOM modality (check configuration option `DicomModalities` for possible values
+          "Port": TCP port of the remote DICOM modality
+          "Timeout": Timeout for the C-ECHO command, in seconds
+          "UseDicomTls": Whether to use DICOM TLS in the SCU connection initiated by Orthanc (new in Orthanc 1.9.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/tools/dicom-echo",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_execute_script(data=None) + +

+ + +
+ +

Execute Lua script

+

Execute the provided Lua script by the Orthanc server. This is very insecure for Orthanc servers that are remotely accessible. Since Orthanc 1.5.8, this route is disabled by default and can be enabled thanks to the ExecuteLuaEnabled configuration. +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

The Lua script to be executed

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Output of the Lua script

+
+
+ +
+ Source code in pyorthanc/client.py +
7993
+7994
+7995
+7996
+7997
+7998
+7999
+8000
+8001
+8002
+8003
+8004
+8005
+8006
+8007
+8008
+8009
+8010
+8011
+8012
+8013
+8014
+8015
def post_tools_execute_script(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Execute Lua script
+
+    Execute the provided Lua script by the Orthanc server. This is very insecure for Orthanc servers that are remotely accessible.  Since Orthanc 1.5.8, this route is disabled by default and can be enabled thanks to the `ExecuteLuaEnabled` configuration.
+    Tags: System
+
+    Parameters
+    ----------
+    data
+        The Lua script to be executed
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Output of the Lua script
+    """
+    return self._post(
+        route=f"{self.url}/tools/execute-script",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_find(json=None) + +

+ + +
+ +

Look for local resources

+

This URI can be used to perform a search on the content of the local Orthanc server, in a way that is similar to querying remote DICOM modalities using C-FIND SCU: https://orthanc.uclouvain.be/book/users/rest.html#performing-finds-within-orthanc +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "CaseSensitive": Enable case-sensitive search for PN value representations (defaults to configuration option CaseSensitivePN) + "Expand": Also retrieve the content of the matching resources, not only their Orthanc identifiers + "Full": If set to true, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value) + "Labels": List of strings specifying which labels to look for in the resources (new in Orthanc 1.12.0) + "LabelsConstraint": Constraint on the labels, can be All, Any, or None (defaults to All, new in Orthanc 1.12.0) + "Level": Level of the query (Patient, Study, Series or Instance) + "Limit": Limit the number of reported resources + "Query": Associative array containing the filter on the values of the DICOM tags + "RequestedTags": A list of DICOM tags to include in the response (applicable only if "Expand" is set to true). The tags requested tags are returned in the 'RequestedTags' field in the response. Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return all Main Dicom Tags to keep backward compatibility with Orthanc prior to 1.11.0. + "Short": If set to true, report the DICOM tags in hexadecimal format + "Since": Show only the resources since the provided index (in conjunction with Limit)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing either the Orthanc identifiers, or detailed information about the reported resources (if Expand argument is true)

+
+
+ +
+ Source code in pyorthanc/client.py +
8017
+8018
+8019
+8020
+8021
+8022
+8023
+8024
+8025
+8026
+8027
+8028
+8029
+8030
+8031
+8032
+8033
+8034
+8035
+8036
+8037
+8038
+8039
+8040
+8041
+8042
+8043
+8044
+8045
+8046
+8047
+8048
+8049
+8050
+8051
+8052
+8053
def post_tools_find(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Look for local resources
+
+    This URI can be used to perform a search on the content of the local Orthanc server, in a way that is similar to querying remote DICOM modalities using C-FIND SCU: https://orthanc.uclouvain.be/book/users/rest.html#performing-finds-within-orthanc
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "CaseSensitive": Enable case-sensitive search for PN value representations (defaults to configuration option `CaseSensitivePN`)
+          "Expand": Also retrieve the content of the matching resources, not only their Orthanc identifiers
+          "Full": If set to `true`, report the DICOM tags in full format (tags indexed by their hexadecimal format, associated with their symbolic name and their value)
+          "Labels": List of strings specifying which labels to look for in the resources (new in Orthanc 1.12.0)
+          "LabelsConstraint": Constraint on the labels, can be `All`, `Any`, or `None` (defaults to `All`, new in Orthanc 1.12.0)
+          "Level": Level of the query (`Patient`, `Study`, `Series` or `Instance`)
+          "Limit": Limit the number of reported resources
+          "Query": Associative array containing the filter on the values of the DICOM tags
+          "RequestedTags": A list of DICOM tags to include in the response (applicable only if "Expand" is set to true).  The tags requested tags are returned in the 'RequestedTags' field in the response.  Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response might be slow since Orthanc will need to access the DICOM files.  If not specified, Orthanc will return all Main Dicom Tags to keep backward compatibility with Orthanc prior to 1.11.0.
+          "Short": If set to `true`, report the DICOM tags in hexadecimal format
+          "Since": Show only the resources since the provided index (in conjunction with `Limit`)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing either the Orthanc identifiers, or detailed information about the reported resources (if `Expand` argument is `true`)
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/tools/find",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_invalid_ate_tags() + +

+ + +
+ +

Invalidate DICOM-as-JSON summaries

+

Remove all the attachments of the type "DICOM-as-JSON" that are associated will all the DICOM instances stored in Orthanc. These summaries will be automatically re-created on the next access. This is notably useful after changes to the Dictionary configuration option. https://orthanc.uclouvain.be/book/faq/orthanc-storage.html#storage-area +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8080
+8081
+8082
+8083
+8084
+8085
+8086
+8087
+8088
+8089
+8090
+8091
+8092
+8093
+8094
def post_tools_invalid_ate_tags(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Invalidate DICOM-as-JSON summaries
+
+    Remove all the attachments of the type "DICOM-as-JSON" that are associated will all the DICOM instances stored in Orthanc. These summaries will be automatically re-created on the next access. This is notably useful after changes to the `Dictionary` configuration option. https://orthanc.uclouvain.be/book/faq/orthanc-storage.html#storage-area
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/tools/invalid_ate-tags",
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_lookup(data=None) + +

+ + +
+ +

Look for DICOM identifiers

+

This URI can be used to convert one DICOM identifier to a list of matching Orthanc resources +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

The DICOM identifier of interest (i.e. the value of PatientID, StudyInstanceUID, SeriesInstanceUID, or SOPInstanceUID)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing a list of matching Orthanc resources, each item in the list corresponding to a JSON object with the fields Type, ID and Path identifying one DICOM resource that is stored by Orthanc

+
+
+ +
+ Source code in pyorthanc/client.py +
8433
+8434
+8435
+8436
+8437
+8438
+8439
+8440
+8441
+8442
+8443
+8444
+8445
+8446
+8447
+8448
+8449
+8450
+8451
+8452
+8453
+8454
+8455
def post_tools_lookup(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Look for DICOM identifiers
+
+    This URI can be used to convert one DICOM identifier to a list of matching Orthanc resources
+    Tags: System
+
+    Parameters
+    ----------
+    data
+        The DICOM identifier of interest (i.e. the value of `PatientID`, `StudyInstanceUID`, `SeriesInstanceUID`, or `SOPInstanceUID`)
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing a list of matching Orthanc resources, each item in the list corresponding to a JSON object with the fields `Type`, `ID` and `Path` identifying one DICOM resource that is stored by Orthanc
+    """
+    return self._post(
+        route=f"{self.url}/tools/lookup",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_reconstruct(json=None) + +

+ + +
+ +

Reconstruct all the index

+

Reconstruct the index of all the tags of all the DICOM instances that are stored in Orthanc. This is notably useful after the deletion of resources whose children resources have inconsistent values with their sibling resources. Beware that this is a highly time-consuming operation, as all the DICOM instances will be parsed again, and as all the Orthanc index will be regenerated. If you have a large database to process, it is advised to use the Housekeeper plugin to perform this action resource by resource +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys: + "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8548
+8549
+8550
+8551
+8552
+8553
+8554
+8555
+8556
+8557
+8558
+8559
+8560
+8561
+8562
+8563
+8564
+8565
+8566
+8567
+8568
+8569
+8570
+8571
+8572
+8573
def post_tools_reconstruct(
+    self,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Reconstruct all the index
+
+    Reconstruct the index of all the tags of all the DICOM instances that are stored in Orthanc. This is notably useful after the deletion of resources whose children resources have inconsistent values with their sibling resources. Beware that this is a highly time-consuming operation, as all the DICOM instances will be parsed again, and as all the Orthanc index will be regenerated. If you have a large database to process, it is advised to use the Housekeeper plugin to perform this action resource by resource
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+          "ReconstructFiles": Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). 'false' by default. (New in Orthanc 1.11.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return self._post(
+        route=f"{self.url}/tools/reconstruct",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_reset() + +

+ + +
+ +

Restart Orthanc

+

Restart Orthanc +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8575
+8576
+8577
+8578
+8579
+8580
+8581
+8582
+8583
+8584
+8585
+8586
+8587
+8588
+8589
def post_tools_reset(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Restart Orthanc
+
+    Restart Orthanc
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/tools/reset",
+    )
+
+
+
+ +
+ +
+ + +

+ post_tools_shutdown() + +

+ + +
+ +

Shutdown Orthanc

+

Shutdown Orthanc +Tags: System

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8591
+8592
+8593
+8594
+8595
+8596
+8597
+8598
+8599
+8600
+8601
+8602
+8603
+8604
+8605
def post_tools_shutdown(
+    self,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Shutdown Orthanc
+
+    Shutdown Orthanc
+    Tags: System
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._post(
+        route=f"{self.url}/tools/shutdown",
+    )
+
+
+
+ +
+ +
+ + +

+ put_instances_id_attachments_name(id_, name, content=None, headers=None) + +

+ + +
+ +

Set attachment

+

Attach a file to the given DICOM instance. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024). +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
content + RequestContent + +
+
- (Content-Type: "application/octet-stream") Binary data containing the attachment
+
+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/client.py +
568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
def put_instances_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    content: RequestContent = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set attachment
+
+    Attach a file to the given DICOM instance. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    content
+            - (Content-Type: "application/octet-stream") Binary data containing the attachment
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return self._put(
+        route=f"{self.url}/instances/{id_}/attachments/{name}",
+        content=content,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_instances_id_labels_label(id_, label) + +

+ + +
+ +

Add label

+

Associate a label with a instance +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be added

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
def put_instances_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Add label
+
+    Associate a label with a instance
+    Tags: Instances
+
+    Parameters
+    ----------
+    label
+        The label to be added
+    id_
+        Orthanc identifier of the instance of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/instances/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ put_instances_id_metadata_name(id_, name, data=None, headers=None) + +

+ + +
+ +

Set metadata

+

Set the value of some metadata in the given DICOM instance. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024). +Tags: Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the instance of interest

+
+
+ required +
data + RequestData + +
+

String value of the metadata

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
def put_instances_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    data: RequestData = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set metadata
+
+    Set the value of some metadata in the given DICOM instance. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+    Tags: Instances
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the instance of interest
+    data
+        String value of the metadata
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/instances/{id_}/metadata/{name}",
+        data=data,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_modalities_id(id_, json=None) + +

+ + +
+ +

Update DICOM modality

+

Define a new DICOM modality, or update an existing one. This change is permanent iff. DicomModalitiesInDatabase is true, otherwise it is lost at the next restart of Orthanc. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the new/updated DICOM modality

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "AET": AET of the remote DICOM modality + "AllowEcho": Whether to accept C-ECHO SCU commands issued by the remote modality + "AllowFind": Whether to accept C-FIND SCU commands issued by the remote modality + "AllowFindWorklist": Whether to accept C-FIND SCU commands for worklists issued by the remote modality + "AllowGet": Whether to accept C-GET SCU commands issued by the remote modality + "AllowMove": Whether to accept C-MOVE SCU commands issued by the remote modality + "AllowStorageCommitment": Whether to accept storage commitment requests issued by the remote modality + "AllowStore": Whether to accept C-STORE SCU commands issued by the remote modality + "AllowTranscoding": Whether to allow transcoding for operations initiated by this modality. This option applies to Orthanc C-GET SCP and to Orthanc C-STORE SCU. It only has an effect if the global option EnableTranscoding is set to true. + "Host": Host address of the remote DICOM modality (typically, an IP address) + "Manufacturer": Manufacturer of the remote DICOM modality (check configuration option DicomModalities for possible values + "Port": TCP port of the remote DICOM modality + "UseDicomTls": Whether to use DICOM TLS in the SCU connection initiated by Orthanc (new in Orthanc 1.9.0)

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
def put_modalities_id(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Update DICOM modality
+
+    Define a new DICOM modality, or update an existing one. This change is permanent iff. `DicomModalitiesInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the new/updated DICOM modality
+    json
+        Dictionary with the following keys:
+          "AET": AET of the remote DICOM modality
+          "AllowEcho": Whether to accept C-ECHO SCU commands issued by the remote modality
+          "AllowFind": Whether to accept C-FIND SCU commands issued by the remote modality
+          "AllowFindWorklist": Whether to accept C-FIND SCU commands for worklists issued by the remote modality
+          "AllowGet": Whether to accept C-GET SCU commands issued by the remote modality
+          "AllowMove": Whether to accept C-MOVE SCU commands issued by the remote modality
+          "AllowStorageCommitment": Whether to accept storage commitment requests issued by the remote modality
+          "AllowStore": Whether to accept C-STORE SCU commands issued by the remote modality
+          "AllowTranscoding": Whether to allow transcoding for operations initiated by this modality. This option applies to Orthanc C-GET SCP and to Orthanc C-STORE SCU. It only has an effect if the global option `EnableTranscoding` is set to `true`.
+          "Host": Host address of the remote DICOM modality (typically, an IP address)
+          "Manufacturer": Manufacturer of the remote DICOM modality (check configuration option `DicomModalities` for possible values
+          "Port": TCP port of the remote DICOM modality
+          "UseDicomTls": Whether to use DICOM TLS in the SCU connection initiated by Orthanc (new in Orthanc 1.9.0)
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return self._put(
+        route=f"{self.url}/modalities/{id_}",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ put_patients_id_attachments_name(id_, name, content=None, headers=None) + +

+ + +
+ +

Set attachment

+

Attach a file to the given DICOM patient. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024). +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
content + RequestContent + +
+
- (Content-Type: "application/octet-stream") Binary data containing the attachment
+
+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/client.py +
3181
+3182
+3183
+3184
+3185
+3186
+3187
+3188
+3189
+3190
+3191
+3192
+3193
+3194
+3195
+3196
+3197
+3198
+3199
+3200
+3201
+3202
+3203
+3204
+3205
+3206
+3207
+3208
+3209
+3210
+3211
+3212
+3213
+3214
def put_patients_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    content: RequestContent = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set attachment
+
+    Attach a file to the given DICOM patient. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    content
+            - (Content-Type: "application/octet-stream") Binary data containing the attachment
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return self._put(
+        route=f"{self.url}/patients/{id_}/attachments/{name}",
+        content=content,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_patients_id_labels_label(id_, label) + +

+ + +
+ +

Add label

+

Associate a label with a patient +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be added

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
3675
+3676
+3677
+3678
+3679
+3680
+3681
+3682
+3683
+3684
+3685
+3686
+3687
+3688
+3689
+3690
+3691
+3692
+3693
+3694
+3695
+3696
+3697
+3698
def put_patients_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Add label
+
+    Associate a label with a patient
+    Tags: Patients
+
+    Parameters
+    ----------
+    label
+        The label to be added
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/patients/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ put_patients_id_metadata_name(id_, name, data=None, headers=None) + +

+ + +
+ +

Set metadata

+

Set the value of some metadata in the given DICOM patient. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024). +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
data + RequestData + +
+

String value of the metadata

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
3856
+3857
+3858
+3859
+3860
+3861
+3862
+3863
+3864
+3865
+3866
+3867
+3868
+3869
+3870
+3871
+3872
+3873
+3874
+3875
+3876
+3877
+3878
+3879
+3880
+3881
+3882
+3883
+3884
+3885
+3886
+3887
+3888
def put_patients_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    data: RequestData = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set metadata
+
+    Set the value of some metadata in the given DICOM patient. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+    Tags: Patients
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the patient of interest
+    data
+        String value of the metadata
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/patients/{id_}/metadata/{name}",
+        data=data,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_patients_id_protected(id_) + +

+ + +
+ +

Protect/Unprotect a patient against recycling

+

Protects a patient by sending 1 or true in the payload request. Unprotects a patient by sending 0 or false in the payload requests. More info: https://orthanc.uclouvain.be/book/faq/features.html#recycling-protection +Tags: Patients

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the patient of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
3985
+3986
+3987
+3988
+3989
+3990
+3991
+3992
+3993
+3994
+3995
+3996
+3997
+3998
+3999
+4000
+4001
+4002
+4003
+4004
+4005
def put_patients_id_protected(
+    self,
+    id_: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Protect/Unprotect a patient against recycling
+
+    Protects a patient by sending `1` or `true` in the payload request. Unprotects a patient by sending `0` or `false` in the payload requests. More info: https://orthanc.uclouvain.be/book/faq/features.html#recycling-protection
+    Tags: Patients
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the patient of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/patients/{id_}/protected",
+    )
+
+
+
+ +
+ +
+ + +

+ put_peers_id(id_, json=None) + +

+ + +
+ +

Update Orthanc peer

+

Define a new Orthanc peer, or update an existing one. This change is permanent iff. OrthancPeersInDatabase is true, otherwise it is lost at the next restart of Orthanc. +Tags: Networking

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Identifier of the new/updated Orthanc peer

+
+
+ required +
json + Any + +
+

Dictionary with the following keys: + "CertificateFile": SSL certificate for the HTTPS connections + "CertificateKeyFile": Key file for the SSL certificate for the HTTPS connections + "CertificateKeyPassword": Key password for the SSL certificate for the HTTPS connections + "HttpHeaders": HTTP headers to be used for the connections to the remote peer + "Password": Password for the credentials + "URL": URL of the root of the REST API of the remote Orthanc peer, for instance http://localhost:8042/ + "Username": Username for the credentials

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
4221
+4222
+4223
+4224
+4225
+4226
+4227
+4228
+4229
+4230
+4231
+4232
+4233
+4234
+4235
+4236
+4237
+4238
+4239
+4240
+4241
+4242
+4243
+4244
+4245
+4246
+4247
+4248
+4249
+4250
+4251
+4252
+4253
+4254
+4255
def put_peers_id(
+    self,
+    id_: str,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Update Orthanc peer
+
+    Define a new Orthanc peer, or update an existing one. This change is permanent iff. `OrthancPeersInDatabase` is `true`, otherwise it is lost at the next restart of Orthanc.
+    Tags: Networking
+
+    Parameters
+    ----------
+    id_
+        Identifier of the new/updated Orthanc peer
+    json
+        Dictionary with the following keys:
+          "CertificateFile": SSL certificate for the HTTPS connections
+          "CertificateKeyFile": Key file for the SSL certificate for the HTTPS connections
+          "CertificateKeyPassword": Key password for the SSL certificate for the HTTPS connections
+          "HttpHeaders": HTTP headers to be used for the connections to the remote peer
+          "Password": Password for the credentials
+          "URL": URL of the root of the REST API of the remote Orthanc peer, for instance `http://localhost:8042/`
+          "Username": Username for the credentials
+
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    if json is None:
+        json = {}
+    return self._put(
+        route=f"{self.url}/peers/{id_}",
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ put_series_id_attachments_name(id_, name, content=None, headers=None) + +

+ + +
+ +

Set attachment

+

Attach a file to the given DICOM series. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024). +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
content + RequestContent + +
+
- (Content-Type: "application/octet-stream") Binary data containing the attachment
+
+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/client.py +
5124
+5125
+5126
+5127
+5128
+5129
+5130
+5131
+5132
+5133
+5134
+5135
+5136
+5137
+5138
+5139
+5140
+5141
+5142
+5143
+5144
+5145
+5146
+5147
+5148
+5149
+5150
+5151
+5152
+5153
+5154
+5155
+5156
+5157
def put_series_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    content: RequestContent = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set attachment
+
+    Attach a file to the given DICOM series. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    content
+            - (Content-Type: "application/octet-stream") Binary data containing the attachment
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return self._put(
+        route=f"{self.url}/series/{id_}/attachments/{name}",
+        content=content,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_series_id_labels_label(id_, label) + +

+ + +
+ +

Add label

+

Associate a label with a series +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be added

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
5618
+5619
+5620
+5621
+5622
+5623
+5624
+5625
+5626
+5627
+5628
+5629
+5630
+5631
+5632
+5633
+5634
+5635
+5636
+5637
+5638
+5639
+5640
+5641
def put_series_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Add label
+
+    Associate a label with a series
+    Tags: Series
+
+    Parameters
+    ----------
+    label
+        The label to be added
+    id_
+        Orthanc identifier of the series of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/series/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ put_series_id_metadata_name(id_, name, data=None, headers=None) + +

+ + +
+ +

Set metadata

+

Set the value of some metadata in the given DICOM series. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024). +Tags: Series

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the series of interest

+
+
+ required +
data + RequestData + +
+

String value of the metadata

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
5799
+5800
+5801
+5802
+5803
+5804
+5805
+5806
+5807
+5808
+5809
+5810
+5811
+5812
+5813
+5814
+5815
+5816
+5817
+5818
+5819
+5820
+5821
+5822
+5823
+5824
+5825
+5826
+5827
+5828
+5829
+5830
+5831
def put_series_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    data: RequestData = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set metadata
+
+    Set the value of some metadata in the given DICOM series. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+    Tags: Series
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the series of interest
+    data
+        String value of the metadata
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/series/{id_}/metadata/{name}",
+        data=data,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_studies_id_attachments_name(id_, name, content=None, headers=None) + +

+ + +
+ +

Set attachment

+

Attach a file to the given DICOM study. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024). +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the attachment, or its index (cf. UserContentType configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
content + RequestContent + +
+
- (Content-Type: "application/octet-stream") Binary data containing the attachment
+
+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

Empty JSON object in the case of a success

+
+
+ +
+ Source code in pyorthanc/client.py +
6441
+6442
+6443
+6444
+6445
+6446
+6447
+6448
+6449
+6450
+6451
+6452
+6453
+6454
+6455
+6456
+6457
+6458
+6459
+6460
+6461
+6462
+6463
+6464
+6465
+6466
+6467
+6468
+6469
+6470
+6471
+6472
+6473
+6474
def put_studies_id_attachments_name(
+    self,
+    id_: str,
+    name: str,
+    content: RequestContent = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set attachment
+
+    Attach a file to the given DICOM study. This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the attachment, or its index (cf. `UserContentType` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    content
+            - (Content-Type: "application/octet-stream") Binary data containing the attachment
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the attachment, if this is not the first time this attachment is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        Empty JSON object in the case of a success
+    """
+    return self._put(
+        route=f"{self.url}/studies/{id_}/attachments/{name}",
+        content=content,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_studies_id_labels_label(id_, label) + +

+ + +
+ +

Add label

+

Associate a label with a study +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
label + str + +
+

The label to be added

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
6935
+6936
+6937
+6938
+6939
+6940
+6941
+6942
+6943
+6944
+6945
+6946
+6947
+6948
+6949
+6950
+6951
+6952
+6953
+6954
+6955
+6956
+6957
+6958
def put_studies_id_labels_label(
+    self,
+    id_: str,
+    label: str,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Add label
+
+    Associate a label with a study
+    Tags: Studies
+
+    Parameters
+    ----------
+    label
+        The label to be added
+    id_
+        Orthanc identifier of the study of interest
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/studies/{id_}/labels/{label}",
+    )
+
+
+
+ +
+ +
+ + +

+ put_studies_id_metadata_name(id_, name, data=None, headers=None) + +

+ + +
+ +

Set metadata

+

Set the value of some metadata in the given DICOM study. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024). +Tags: Studies

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
name + str + +
+

The name of the metadata, or its index (cf. UserMetadata configuration option)

+
+
+ required +
id_ + str + +
+

Orthanc identifier of the study of interest

+
+
+ required +
data + RequestData + +
+

String value of the metadata

+
+
+ None +
headers + HeaderTypes + +
+

Dictionary of optional headers: + "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7152
+7153
+7154
+7155
+7156
+7157
+7158
+7159
+7160
+7161
+7162
+7163
+7164
+7165
+7166
+7167
+7168
+7169
+7170
+7171
+7172
+7173
+7174
+7175
+7176
+7177
+7178
+7179
+7180
+7181
+7182
+7183
+7184
def put_studies_id_metadata_name(
+    self,
+    id_: str,
+    name: str,
+    data: RequestData = None,
+    headers: HeaderTypes = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set metadata
+
+    Set the value of some metadata in the given DICOM study. This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).
+    Tags: Studies
+
+    Parameters
+    ----------
+    name
+        The name of the metadata, or its index (cf. `UserMetadata` configuration option)
+    id_
+        Orthanc identifier of the study of interest
+    data
+        String value of the metadata
+    headers
+        Dictionary of optional headers:
+            "If-Match" (str): Revision of the metadata, if this is not the first time this metadata is set.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/studies/{id_}/metadata/{name}",
+        data=data,
+        headers=headers,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_accepted_transfer_syntaxes(data=None, json=None) + +

+ + +
+ +

Set accepted transfer syntaxes

+

Set the DICOM transfer syntaxes that accepted by Orthanc C-STORE SCP +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
json + Any + +
+

Dictionary with the following keys:

+
+
+ None +
data + RequestData + +
+

UID of the transfer syntax to be accepted. Wildcards ? and * are accepted.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+

JSON array containing the now-accepted transfer syntax UIDs

+
+
+ +
+ Source code in pyorthanc/client.py +
7522
+7523
+7524
+7525
+7526
+7527
+7528
+7529
+7530
+7531
+7532
+7533
+7534
+7535
+7536
+7537
+7538
+7539
+7540
+7541
+7542
+7543
+7544
+7545
+7546
+7547
+7548
+7549
+7550
+7551
def put_tools_accepted_transfer_syntaxes(
+    self,
+    data: RequestData = None,
+    json: Any = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set accepted transfer syntaxes
+
+    Set the DICOM transfer syntaxes that accepted by Orthanc C-STORE SCP
+    Tags: System
+
+    Parameters
+    ----------
+    json
+        Dictionary with the following keys:
+
+    data
+        UID of the transfer syntax to be accepted. Wildcards `?` and `*` are accepted.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+        JSON array containing the now-accepted transfer syntax UIDs
+    """
+    if json is None:
+        json = {}
+    return self._put(
+        route=f"{self.url}/tools/accepted-transfer-syntaxes",
+        data=data,
+        json=json,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_default_encoding(data=None) + +

+ + +
+ +

Set default encoding

+

Change the default encoding that is used by Orthanc if parsing a DICOM instance without the SpecificCharacterEncoding tag, or during C-FIND. This corresponds to the configuration option DefaultEncoding. +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

The name of the encoding. Check out configuration option DefaultEncoding for the allowed values.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
7920
+7921
+7922
+7923
+7924
+7925
+7926
+7927
+7928
+7929
+7930
+7931
+7932
+7933
+7934
+7935
+7936
+7937
+7938
+7939
+7940
+7941
def put_tools_default_encoding(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set default encoding
+
+    Change the default encoding that is used by Orthanc if parsing a DICOM instance without the `SpecificCharacterEncoding` tag, or during C-FIND. This corresponds to the configuration option `DefaultEncoding`.
+    Tags: System
+
+    Parameters
+    ----------
+    data
+        The name of the encoding. Check out configuration option `DefaultEncoding` for the allowed values.
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/tools/default-encoding",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level(data=None) + +

+ + +
+ +

Set main log level

+

Set the main log level of Orthanc +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8130
+8131
+8132
+8133
+8134
+8135
+8136
+8137
+8138
+8139
+8140
+8141
+8142
+8143
+8144
+8145
+8146
+8147
+8148
+8149
+8150
+8151
def put_tools_log_level(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set main log level
+
+    Set the main log level of Orthanc
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/tools/log-level",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_dicom(data=None) + +

+ + +
+ +

Set log level for dicom

+

Set the log level of the log category dicom +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8170
+8171
+8172
+8173
+8174
+8175
+8176
+8177
+8178
+8179
+8180
+8181
+8182
+8183
+8184
+8185
+8186
+8187
+8188
+8189
+8190
+8191
def put_tools_log_level_dicom(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set log level for `dicom`
+
+    Set the log level of the log category `dicom`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/tools/log-level-dicom",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_generic(data=None) + +

+ + +
+ +

Set log level for generic

+

Set the log level of the log category generic +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8210
+8211
+8212
+8213
+8214
+8215
+8216
+8217
+8218
+8219
+8220
+8221
+8222
+8223
+8224
+8225
+8226
+8227
+8228
+8229
+8230
+8231
def put_tools_log_level_generic(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set log level for `generic`
+
+    Set the log level of the log category `generic`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/tools/log-level-generic",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_http(data=None) + +

+ + +
+ +

Set log level for http

+

Set the log level of the log category http +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8250
+8251
+8252
+8253
+8254
+8255
+8256
+8257
+8258
+8259
+8260
+8261
+8262
+8263
+8264
+8265
+8266
+8267
+8268
+8269
+8270
+8271
def put_tools_log_level_http(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set log level for `http`
+
+    Set the log level of the log category `http`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/tools/log-level-http",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_jobs(data=None) + +

+ + +
+ +

Set log level for jobs

+

Set the log level of the log category jobs +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8290
+8291
+8292
+8293
+8294
+8295
+8296
+8297
+8298
+8299
+8300
+8301
+8302
+8303
+8304
+8305
+8306
+8307
+8308
+8309
+8310
+8311
def put_tools_log_level_jobs(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set log level for `jobs`
+
+    Set the log level of the log category `jobs`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/tools/log-level-jobs",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_lua(data=None) + +

+ + +
+ +

Set log level for lua

+

Set the log level of the log category lua +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8330
+8331
+8332
+8333
+8334
+8335
+8336
+8337
+8338
+8339
+8340
+8341
+8342
+8343
+8344
+8345
+8346
+8347
+8348
+8349
+8350
+8351
def put_tools_log_level_lua(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set log level for `lua`
+
+    Set the log level of the log category `lua`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/tools/log-level-lua",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_plugins(data=None) + +

+ + +
+ +

Set log level for plugins

+

Set the log level of the log category plugins +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8370
+8371
+8372
+8373
+8374
+8375
+8376
+8377
+8378
+8379
+8380
+8381
+8382
+8383
+8384
+8385
+8386
+8387
+8388
+8389
+8390
+8391
def put_tools_log_level_plugins(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set log level for `plugins`
+
+    Set the log level of the log category `plugins`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/tools/log-level-plugins",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_log_level_sqlite(data=None) + +

+ + +
+ +

Set log level for sqlite

+

Set the log level of the log category sqlite +Tags: Logs

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

Possible values: default, verbose or trace

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8410
+8411
+8412
+8413
+8414
+8415
+8416
+8417
+8418
+8419
+8420
+8421
+8422
+8423
+8424
+8425
+8426
+8427
+8428
+8429
+8430
+8431
def put_tools_log_level_sqlite(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set log level for `sqlite`
+
+    Set the log level of the log category `sqlite`
+    Tags: Logs
+
+    Parameters
+    ----------
+    data
+        Possible values: `default`, `verbose` or `trace`
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/tools/log-level-sqlite",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_metrics(data=None) + +

+ + +
+ +

Enable collection of metrics

+

Enable or disable the collection and publication of metrics at /tools/metrics-prometheus +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

1 if metrics are collected, 0 if metrics are disabled

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8474
+8475
+8476
+8477
+8478
+8479
+8480
+8481
+8482
+8483
+8484
+8485
+8486
+8487
+8488
+8489
+8490
+8491
+8492
+8493
+8494
+8495
def put_tools_metrics(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Enable collection of metrics
+
+    Enable or disable the collection and publication of metrics at `/tools/metrics-prometheus`
+    Tags: System
+
+    Parameters
+    ----------
+    data
+        `1` if metrics are collected, `0` if metrics are disabled
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/tools/metrics",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ put_tools_unknown_sop_class_accepted(data=None) + +

+ + +
+ +

Set unknown SOP class accepted

+

Set whether Orthanc C-STORE SCP should accept DICOM instances with an unknown SOP class UID +Tags: System

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + RequestData + +
+

1 if accepted, 0 if not accepted

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Union[Dict, List, str, bytes, int, Response] + +
+ +
+
+ +
+ Source code in pyorthanc/client.py +
8624
+8625
+8626
+8627
+8628
+8629
+8630
+8631
+8632
+8633
+8634
+8635
+8636
+8637
+8638
+8639
+8640
+8641
+8642
+8643
+8644
+8645
def put_tools_unknown_sop_class_accepted(
+    self,
+    data: RequestData = None,
+) -> Union[Dict, List, str, bytes, int, httpx.Response]:
+    """Set unknown SOP class accepted
+
+    Set whether Orthanc C-STORE SCP should accept DICOM instances with an unknown SOP class UID
+    Tags: System
+
+    Parameters
+    ----------
+    data
+        `1` if accepted, `0` if not accepted
+
+    Returns
+    -------
+    Union[Dict, List, str, bytes, int, httpx.Response]
+    """
+    return self._put(
+        route=f"{self.url}/tools/unknown-sop-class-accepted",
+        data=data,
+    )
+
+
+
+ +
+ +
+ + +

+ setup_credentials(username, password) + +

+ + +
+ +

Set credentials needed for HTTP requests

+ +
+ Source code in pyorthanc/client.py +
54
+55
+56
def setup_credentials(self, username: str, password: str) -> None:
+    """Set credentials needed for HTTP requests"""
+    self._auth = httpx.BasicAuth(username, password)
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/filtering/index.html b/api/filtering/index.html new file mode 100644 index 0000000..9bf2f02 --- /dev/null +++ b/api/filtering/index.html @@ -0,0 +1,1327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Filtering - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Filtering

+ +
+ + +

+ pyorthanc.find(orthanc, patient_filter=None, study_filter=None, series_filter=None, instance_filter=None) + +

+ + +
+ +

Find desired patients/Study/Series/Instance in an Orthanc server

+

This function builds a series of tree structure. +Each tree correspond to a patient. The layers in the +tree correspond to:

+

Patient -> Studies -> Series -> Instances

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
orthanc + Union[Orthanc, AsyncOrthanc] + +
+

Orthanc object.

+
+
+ required +
patient_filter + Optional[Callable] + +
+

Patient filter (e.g. lambda patient: patient.id_ == '03HDQ99*')

+
+
+ None +
study_filter + Optional[Callable] + +
+

Study filter (e.g. lambda study: study.study_id == 'pros')

+
+
+ None +
series_filter + Optional[Callable] + +
+

Series filter (e.g. lambda series: series.modality == 'SR')

+
+
+ None +
instance_filter + Optional[Callable] + +
+

Instance filter (e.g. lambda instance: instance.SOPInstance == '...')

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ List[Patient] + +
+

List of patients that respect .

+
+
+ +
+ Source code in pyorthanc/_filtering.py +
29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
def find(orthanc: Union[Orthanc, AsyncOrthanc],
+         patient_filter: Optional[Callable] = None,
+         study_filter: Optional[Callable] = None,
+         series_filter: Optional[Callable] = None,
+         instance_filter: Optional[Callable] = None) -> List[Patient]:
+    """Find desired patients/Study/Series/Instance in an Orthanc server
+
+    This function builds a series of tree structure.
+    Each tree correspond to a patient. The layers in the
+    tree correspond to:
+
+    `Patient -> Studies -> Series -> Instances`
+
+    Parameters
+    ----------
+    orthanc
+        Orthanc object.
+    patient_filter
+        Patient filter (e.g. lambda patient: patient.id_ == '03HDQ99*')
+    study_filter
+        Study filter (e.g. lambda study: study.study_id == '*pros*')
+    series_filter
+        Series filter (e.g. lambda series: series.modality == 'SR')
+    instance_filter
+        Instance filter (e.g. lambda instance: instance.SOPInstance == '...')
+
+    Returns
+    -------
+    List[Patient]
+        List of patients that respect .
+    """
+    # In this function, client that return raw responses are not supported.
+    orthanc = util.ensure_non_raw_response(orthanc)
+
+    if isinstance(orthanc, AsyncOrthanc):
+        return asyncio.run(_async_find(
+            async_orthanc=orthanc,
+            patient_filter=patient_filter,
+            study_filter=study_filter,
+            series_filter=series_filter,
+            instance_filter=instance_filter
+        ))
+
+    patients = [Patient(i, orthanc, lock=True) for i in orthanc.get_patients()]
+    if patient_filter is not None:
+        patients = [i for i in patients if patient_filter(i)]
+
+    for patient in patients:
+        if study_filter is not None:
+            patient._child_resources = [i for i in patient.studies if study_filter(i)]
+
+        for study in patient.studies:
+            if series_filter is not None:
+                study._child_resources = [i for i in study.series if series_filter(i)]
+
+            for series in study.series:
+                if instance_filter is not None:
+                    series._child_resources = [i for i in series.instances if instance_filter(i)]
+
+    return trim_patients(patients)
+
+
+
+ +
+ +
+ + +

+ pyorthanc.trim_patients(patients) + +

+ + +
+ +

Trim Patient forest (list of patients)

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
patients + List[Patient] + +
+

Patient forest.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ List[Patient] + +
+

Pruned patient forest.

+
+
+ +
+ Source code in pyorthanc/_filtering.py +
208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
def trim_patients(patients: List[Patient]) -> List[Patient]:
+    """Trim Patient forest (list of patients)
+
+    Parameters
+    ----------
+    patients
+        Patient forest.
+
+    Returns
+    -------
+    List[Patient]
+        Pruned patient forest.
+    """
+    for patient in patients:
+        patient.remove_empty_studies()
+
+    patients = [p for p in patients if p.studies != []]
+
+    return patients
+
+
+
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/find/index.html b/api/find/index.html new file mode 100644 index 0000000..a619571 --- /dev/null +++ b/api/find/index.html @@ -0,0 +1,2305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Find - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Find

+ +
+ + +

+ pyorthanc.find_patients(client, query=None, labels=None, labels_constraint='All') + +

+ + +
+ +

Finds patients in Orthanc according to queries and labels

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
client + Orthanc + +
+

Orthanc client.

+
+
+ required +
query + Dict[str, str] + +
+

Dictionary that specifies the filters on the Patient related DICOM tags.

+
+
+ None +
labels + Union[List[str], str] + +
+

List of strings specifying which labels to look for in the resources.

+
+
+ None +
labels_constraint + str + +
+

Constraint on the labels, can be 'All', 'Any', or 'None'.

+
+
+ 'All' +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ List[Patient] + +
+

List of patients that fit the provided criteria.

+
+
+ + +

Examples:

+
import pyorthanc
+
+client = pyorthanc.Orthanc('http://localhost:8042', 'orthanc', 'orthanc')
+patients = find_patients(
+    client=client,
+    query={'PatientID': 'Something*'},
+    labels=['my_label']
+)
+
+ +
+ Source code in pyorthanc/_find.py +
14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
def find_patients(client: Orthanc,
+                  query: Dict[str, str] = None,
+                  labels: Union[List[str], str] = None,
+                  labels_constraint: str = 'All') -> List[Patient]:
+    """Finds patients in Orthanc according to queries and labels
+
+    Parameters
+    ----------
+    client
+        Orthanc client.
+    query
+        Dictionary that specifies the filters on the Patient related DICOM tags.
+    labels
+        List of strings specifying which labels to look for in the resources.
+    labels_constraint
+        Constraint on the labels, can be 'All', 'Any', or 'None'.
+
+    Returns
+    -------
+    List[Patient]
+        List of patients that fit the provided criteria.
+
+    Examples
+    --------
+    ```python
+    import pyorthanc
+
+    client = pyorthanc.Orthanc('http://localhost:8042', 'orthanc', 'orthanc')
+    patients = find_patients(
+        client=client,
+        query={'PatientID': 'Something*'},
+        labels=['my_label']
+    )
+    ```
+    """
+    return query_orthanc(
+        client=client,
+        level='Patient',
+        query=query,
+        labels=labels,
+        labels_constraint=labels_constraint
+    )
+
+
+
+ +
+ +
+ + +

+ pyorthanc.find_studies(client, query=None, labels=None, labels_constraint='All') + +

+ + +
+ +

Finds studies in Orthanc according to queries and labels

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
client + Orthanc + +
+

Orthanc client.

+
+
+ required +
query + Dict[str, str] + +
+

Dictionary that specifies the filters on the Study related DICOM tags.

+
+
+ None +
labels + Union[List[str], str] + +
+

List of strings specifying which labels to look for in the resources.

+
+
+ None +
labels_constraint + str + +
+

Constraint on the labels, can be 'All', 'Any', or 'None'.

+
+
+ 'All' +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ List[Study] + +
+

List of studies that fit the provided criteria.

+
+
+ + +

Examples:

+
import pyorthanc
+
+client = pyorthanc.Orthanc('http://localhost:8042', 'orthanc', 'orthanc')
+studies = find_studies(
+    client=client,
+    query={'ReferringPhysicianName': 'Something*'},
+    labels=['my_label']
+)
+
+ +
+ Source code in pyorthanc/_find.py +
 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
def find_studies(client: Orthanc,
+                 query: Dict[str, str] = None,
+                 labels: Union[List[str], str] = None,
+                 labels_constraint: str = 'All') -> List[Study]:
+    """Finds studies in Orthanc according to queries and labels
+
+    Parameters
+    ----------
+    client
+        Orthanc client.
+    query
+        Dictionary that specifies the filters on the Study related DICOM tags.
+    labels
+        List of strings specifying which labels to look for in the resources.
+    labels_constraint
+        Constraint on the labels, can be 'All', 'Any', or 'None'.
+
+    Returns
+    -------
+    List[Study]
+        List of studies that fit the provided criteria.
+
+    Examples
+    --------
+    ```python
+    import pyorthanc
+
+    client = pyorthanc.Orthanc('http://localhost:8042', 'orthanc', 'orthanc')
+    studies = find_studies(
+        client=client,
+        query={'ReferringPhysicianName': 'Something*'},
+        labels=['my_label']
+    )
+    ```
+    """
+
+    return query_orthanc(
+        client=client,
+        level='Study',
+        query=query,
+        labels=labels,
+        labels_constraint=labels_constraint
+    )
+
+
+
+ +
+ +
+ + +

+ pyorthanc.find_series(client, query=None, labels=None, labels_constraint='All') + +

+ + +
+ +

Finds series in Orthanc according to queries and labels

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
client + Orthanc + +
+

Orthanc client.

+
+
+ required +
query + Dict[str, str] + +
+

Dictionary that specifies the filters on the Series related DICOM tags.

+
+
+ None +
labels + Union[List[str], str] + +
+

List of strings specifying which labels to look for in the resources.

+
+
+ None +
labels_constraint + str + +
+

Constraint on the labels, can be 'All', 'Any', or 'None'.

+
+
+ 'All' +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ List[Series] + +
+

List of Series that fit the provided criteria.

+
+
+ + +

Examples:

+
import pyorthanc
+
+client = pyorthanc.Orthanc('http://localhost:8042', 'orthanc', 'orthanc')
+series = find_series(
+    client=client,
+    query={'Modality': 'RTDose'},
+    labels=['my_label']
+)
+
+ +
+ Source code in pyorthanc/_find.py +
103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
def find_series(client: Orthanc,
+                query: Dict[str, str] = None,
+                labels: Union[List[str], str] = None,
+                labels_constraint: str = 'All') -> List[Series]:
+    """Finds series in Orthanc according to queries and labels
+
+    Parameters
+    ----------
+    client
+        Orthanc client.
+    query
+        Dictionary that specifies the filters on the Series related DICOM tags.
+    labels
+        List of strings specifying which labels to look for in the resources.
+    labels_constraint
+        Constraint on the labels, can be 'All', 'Any', or 'None'.
+
+    Returns
+    -------
+    List[Series]
+        List of Series that fit the provided criteria.
+
+    Examples
+    --------
+    ```python
+    import pyorthanc
+
+    client = pyorthanc.Orthanc('http://localhost:8042', 'orthanc', 'orthanc')
+    series = find_series(
+        client=client,
+        query={'Modality': 'RTDose'},
+        labels=['my_label']
+    )
+    ```
+    """
+    return query_orthanc(
+        client=client,
+        level='Series',
+        query=query,
+        labels=labels,
+        labels_constraint=labels_constraint
+    )
+
+
+
+ +
+ +
+ + +

+ pyorthanc.find_instances(client, query=None, labels=None, labels_constraint='All') + +

+ + +
+ +

Finds instances in Orthanc according to queries and labels

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
client + Orthanc + +
+

Orthanc client.

+
+
+ required +
query + Dict[str, str] + +
+

Dictionary that specifies the filters on the instances related DICOM tags.

+
+
+ None +
labels + Union[List[str], str] + +
+

List of strings specifying which labels to look for in the resources.

+
+
+ None +
labels_constraint + str + +
+

Constraint on the labels, can be 'All', 'Any', or 'None'.

+
+
+ 'All' +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ List[Instance] + +
+

List of Instances that fit the provided criteria.

+
+
+ + +

Examples:

+
import pyorthanc
+
+client = pyorthanc.Orthanc('http://localhost:8042', 'orthanc', 'orthanc')
+instances = find_instances(
+    client=client,
+    query={'InstanceCreationDate': '20100301'},
+    labels=['my_label']
+)
+
+ +
+ Source code in pyorthanc/_find.py +
147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
def find_instances(client: Orthanc,
+                   query: Dict[str, str] = None,
+                   labels: Union[List[str], str] = None,
+                   labels_constraint: str = 'All') -> List[Instance]:
+    """Finds instances in Orthanc according to queries and labels
+
+    Parameters
+    ----------
+    client
+        Orthanc client.
+    query
+        Dictionary that specifies the filters on the instances related DICOM tags.
+    labels
+        List of strings specifying which labels to look for in the resources.
+    labels_constraint
+        Constraint on the labels, can be 'All', 'Any', or 'None'.
+
+    Returns
+    -------
+    List[Instance]
+        List of Instances that fit the provided criteria.
+
+    Examples
+    --------
+    ```python
+    import pyorthanc
+
+    client = pyorthanc.Orthanc('http://localhost:8042', 'orthanc', 'orthanc')
+    instances = find_instances(
+        client=client,
+        query={'InstanceCreationDate': '20100301'},
+        labels=['my_label']
+    )
+    ```
+    """
+    return query_orthanc(
+        client=client,
+        level='Instance',
+        query=query,
+        labels=labels,
+        labels_constraint=labels_constraint
+    )
+
+
+
+ +
+ +
+ + +

+ pyorthanc.query_orthanc(client, level, query=None, labels=None, labels_constraint='All', limit=DEFAULT_RESOURCES_LIMIT, since=0, retrieve_all_resources=True, lock=False) + +

+ + +
+ +

Query data in the Orthanc server

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
client + Orthanc + +
+

Orthanc client.

+
+
+ required +
level + str + +
+

Level of the query ['Patient', 'Study', 'Series', 'Instance'].

+
+
+ required +
query + Dict[str, str] + +
+

Dictionary that specifies the filters on the level related DICOM tags.

+
+
+ None +
labels + Union[List[str], str] + +
+

List of strings specifying which labels to look for in the resources.

+
+
+ None +
labels_constraint + str + +
+

Constraint on the labels, can be 'All', 'Any', or 'None'.

+
+
+ 'All' +
limit + int + +
+

Limit the number of reported resources.

+
+
+ DEFAULT_RESOURCES_LIMIT +
since + int + +
+

Show only the resources since the provided index (in conjunction with "limit").

+
+
+ 0 +
retrieve_all_resources + bool + +
+

Retrieve all resources since the index specified in the "since" parameter.

+
+
+ True +
lock + bool + +
+

if True, lock the resource state at lookup (useful for minimising the number of HTTP calls).

+
+
+ False +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ List[Resource] + +
+

List of resources that fit the provided criteria.

+
+
+ + +

Examples:

+
import pyorthanc
+
+client = pyorthanc.Orthanc('http://localhost:8042', 'orthanc', 'orthanc')
+instances = query_orthanc(
+    client=client,
+    level='Instance',
+    query={'InstanceCreationDate': '20100301'},
+    labels=['my_label'],
+    since=100,
+    retrieve_all_resource=False
+)
+
+ +
+ Source code in pyorthanc/_find.py +
191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
def query_orthanc(client: Orthanc,
+                  level: str,
+                  query: Dict[str, str] = None,
+                  labels: Union[List[str], str] = None,
+                  labels_constraint: str = 'All',
+                  limit: int = DEFAULT_RESOURCES_LIMIT,
+                  since: int = 0,
+                  retrieve_all_resources: bool = True,
+                  lock: bool = False) -> List[Resource]:
+    """Query data in the Orthanc server
+
+    Parameters
+    ----------
+    client
+        Orthanc client.
+    level
+        Level of the query ['Patient', 'Study', 'Series', 'Instance'].
+    query
+        Dictionary that specifies the filters on the level related DICOM tags.
+    labels
+        List of strings specifying which labels to look for in the resources.
+    labels_constraint
+        Constraint on the labels, can be 'All', 'Any', or 'None'.
+    limit
+        Limit the number of reported resources.
+    since
+        Show only the resources since the provided index (in conjunction with "limit").
+    retrieve_all_resources
+        Retrieve all resources since the index specified in the "since" parameter.
+    lock
+        if `True`, lock the resource state at lookup (useful for minimising the number of HTTP calls).
+
+    Returns
+    -------
+    List[Resource]
+        List of resources that fit the provided criteria.
+
+    Examples
+    --------
+    ```python
+    import pyorthanc
+
+    client = pyorthanc.Orthanc('http://localhost:8042', 'orthanc', 'orthanc')
+    instances = query_orthanc(
+        client=client,
+        level='Instance',
+        query={'InstanceCreationDate': '20100301'},
+        labels=['my_label'],
+        since=100,
+        retrieve_all_resource=False
+    )
+    ```
+    """
+    _validate_level(level)
+    _validate_labels_constraint(labels_constraint)
+
+    # In this function, client that return raw responses are not supported.
+    client = util.ensure_non_raw_response(client)
+
+    data = {
+        'Expand': True,
+        'Level': level,
+        'Limit': limit,
+        'Since': since,
+        'Query': {}
+    }
+
+    if query is not None:
+        data['Query'] = query
+
+    if labels is not None:
+        data['Labels'] = [labels] if isinstance(labels, str) else labels
+        data['LabelsConstraint'] = labels_constraint
+
+    if retrieve_all_resources:
+        results = []
+        while True:
+            result_for_interval = client.post_tools_find(data)
+            if len(result_for_interval) == 0:
+                break
+
+            results += result_for_interval
+            data['Since'] += limit  # Updating the lookup window
+    else:
+        results = client.post_tools_find(data)
+
+    if level == 'Patient':
+        resources = [Patient(i['ID'], client, lock=lock) for i in results]
+    elif level == 'Study':
+        resources = [Study(i['ID'], client, lock=lock) for i in results]
+    elif level == 'Series':
+        resources = [Series(i['ID'], client, lock=lock) for i in results]
+    elif level == 'Instance':
+        resources = [Instance(i['ID'], client, lock=lock) for i in results]
+    else:
+        raise ValueError(f"Unknown level ['Patient', 'Study', 'Series', 'Instance'], got {level}")
+
+    if lock:
+        for resource in resources:
+            # This loads the state in memory. Since lock=True,
+            # subsequent queries on resource will use the local state
+            resource.get_main_information()
+
+    return resources
+
+
+
+ +
+ +
+ + + +

+ pyorthanc._find.DEFAULT_RESOURCES_LIMIT = 1000 + + + module-attribute + + +

+ + +
+
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/jobs/index.html b/api/jobs/index.html new file mode 100644 index 0000000..6befae2 --- /dev/null +++ b/api/jobs/index.html @@ -0,0 +1,2195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Jobs - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+ +
+ + + +
+
+ + + + + + + +

Jobs

+ +
+ + + +

+ pyorthanc.Job + + +

+ + +
+ + +

Job class to follow a Job in Orthanc

+ +
+ Source code in pyorthanc/jobs.py +
 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
class Job:
+    """Job class to follow a Job in Orthanc"""
+
+    def __init__(self, id_: str, client: Orthanc):
+        client = util.ensure_non_raw_response(client)
+
+        self.id_ = id_
+        self.client = client
+
+    @property
+    def state(self) -> State:
+        state = self.get_information()['State']
+
+        return State(state)
+
+    @property
+    def content(self) -> Dict:
+        return self.get_information()['Content']
+
+    @property
+    def type(self) -> str:
+        return self.get_information()['Type']
+
+    @property
+    def creation_time(self) -> datetime:
+        creation_time = self.get_information()['CreationTime'].split('T')
+        date = creation_time[0]
+        time = creation_time[1]
+
+        return util.make_datetime_from_dicom_date(date, time)
+
+    @property
+    def effective_runtime(self) -> float:
+        runtime = self.get_information()['EffectiveRuntime']
+
+        return float(runtime)
+
+    @property
+    def priority(self) -> int:
+        return int(self.get_information()['Priority'])
+
+    @property
+    def progress(self) -> int:
+        return int(self.get_information()['Progress'])
+
+    @property
+    def error(self) -> ErrorCode:
+        info = self.get_information()
+
+        return ErrorCode(info['ErrorCode'])
+
+    @property
+    def error_details(self) -> Optional[str]:
+        info = self.get_information()
+
+        if 'ErrorDetails' in info:
+            return info['ErrorDetails']
+
+        return None
+
+    @property
+    def timestamp(self) -> datetime:
+        timestamp = self.get_information()['Timestamp'].split('T')
+        date = timestamp[0]
+        time = timestamp[1]
+
+        return util.make_datetime_from_dicom_date(date, time)
+
+    @property
+    def completion_time(self) -> Optional[datetime]:
+        info = self.get_information()
+
+        if 'CompletionTime' not in info:
+            return
+
+        completion_time = self.get_information()['CompletionTime'].split('T')
+        date = completion_time[0]
+        time = completion_time[1]
+
+        return util.make_datetime_from_dicom_date(date, time)
+
+    def wait_until_completion(self, time_interval: int = 2) -> None:
+        """Stop execution until job is not Pending/Running
+
+        Parameters
+        ----------
+        time_interval
+            Time interval to check the job status, default 2s.
+        """
+        while self.state in [State.pending, State.running]:
+            time.sleep(time_interval)
+
+    def get_information(self):
+        return self.client.get_jobs_id(self.id_)
+
+
+ + + +
+ + + + + + + +
+ + + +

+ client = client + + + instance-attribute + + +

+ + +
+
+ +
+ +
+ + + +

+ completion_time: Optional[datetime] + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ content: Dict + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ creation_time: datetime + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ effective_runtime: float + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ error: ErrorCode + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ error_details: Optional[str] + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ id_ = id_ + + + instance-attribute + + +

+ + +
+
+ +
+ +
+ + + +

+ priority: int + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ progress: int + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ state: State + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ timestamp: datetime + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ type: str + + + property + + +

+ + +
+
+ +
+ + + +
+ + +

+ __init__(id_, client) + +

+ + +
+ +
+ Source code in pyorthanc/jobs.py +
24
+25
+26
+27
+28
def __init__(self, id_: str, client: Orthanc):
+    client = util.ensure_non_raw_response(client)
+
+    self.id_ = id_
+    self.client = client
+
+
+
+ +
+ +
+ + +

+ get_information() + +

+ + +
+ +
+ Source code in pyorthanc/jobs.py +
113
+114
def get_information(self):
+    return self.client.get_jobs_id(self.id_)
+
+
+
+ +
+ +
+ + +

+ wait_until_completion(time_interval=2) + +

+ + +
+ +

Stop execution until job is not Pending/Running

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
time_interval + int + +
+

Time interval to check the job status, default 2s.

+
+
+ 2 +
+ +
+ Source code in pyorthanc/jobs.py +
102
+103
+104
+105
+106
+107
+108
+109
+110
+111
def wait_until_completion(self, time_interval: int = 2) -> None:
+    """Stop execution until job is not Pending/Running
+
+    Parameters
+    ----------
+    time_interval
+        Time interval to check the job status, default 2s.
+    """
+    while self.state in [State.pending, State.running]:
+        time.sleep(time_interval)
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ pyorthanc.jobs.State + + +

+ + +
+

+ Bases: Enum

+ + +

Job state enum

+ +
+ Source code in pyorthanc/jobs.py +
11
+12
+13
+14
+15
+16
+17
+18
class State(Enum):
+    """Job state enum"""
+    failure = 'Failure'
+    paused = 'Paused'
+    pending = 'Pending'
+    retry = 'Retry'
+    running = 'Running'
+    success = 'Success'
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ pyorthanc.jobs.ErrorCode + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginErrorCode

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
class ErrorCode(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginErrorCode"""
+    ALREADY_EXISTING_TAG = 2042
+    BAD_APPLICATION_ENTITY_TITLE = 2009
+    BAD_FILE_FORMAT = 15
+    BAD_FONT = 30
+    BAD_GEOMETRY = 38
+    BAD_HTTP_STATUS_IN_REST = 2005
+    BAD_JOB_ORDERING = 2028
+    BAD_JSON = 28
+    BAD_PARAMETER_TYPE = 5
+    BAD_RANGE = 41
+    BAD_REQUEST = 8
+    BAD_SEQUENCE_OF_CALLS = 6
+    CANCELED_JOB = 37
+    CANNOT_CREATE_LUA = 2030
+    CANNOT_EXECUTE_LUA = 2031
+    CANNOT_ORDER_SLICES = 2040
+    CANNOT_STORE_INSTANCE = 2018
+    CANNOT_WRITE_FILE = 14
+    CORRUPTED_FILE = 20
+    CREATE_DICOM_BAD_PARENT = 2024
+    CREATE_DICOM_NOT_STRING = 2019
+    CREATE_DICOM_NO_PAYLOAD = 2022
+    CREATE_DICOM_OVERRIDE_TAG = 2020
+    CREATE_DICOM_PARENT_ENCODING = 2026
+    CREATE_DICOM_PARENT_IS_INSTANCE = 2025
+    CREATE_DICOM_USE_CONTENT = 2021
+    CREATE_DICOM_USE_DATA_URI_SCHEME = 2023
+    DATABASE = 11
+    DATABASE_BACKEND_ALREADY_REGISTERED = 2037
+    DATABASE_CANNOT_SERIALIZE = 42
+    DATABASE_NOT_INITIALIZED = 2038
+    DATABASE_PLUGIN = 31
+    DATABASE_UNAVAILABLE = 36
+    DICOM_FIND_UNAVAILABLE = 2016
+    DICOM_MOVE_UNAVAILABLE = 2017
+    DICOM_PORT_IN_USE = 2004
+    DIRECTORY_EXPECTED = 2002
+    DIRECTORY_OVER_FILE = 2000
+    DISCONTINUED_ABI = 40
+    EMPTY_REQUEST = 33
+    FILE_STORAGE_CANNOT_WRITE = 2001
+    FULL_STORAGE = 19
+    HTTP_PORT_IN_USE = 2003
+    INCOMPATIBLE_DATABASE_VERSION = 18
+    INCOMPATIBLE_IMAGE_FORMAT = 23
+    INCOMPATIBLE_IMAGE_SIZE = 24
+    INEXISTENT_FILE = 13
+    INEXISTENT_ITEM = 7
+    INEXISTENT_TAG = 21
+    INTERNAL_ERROR = -1
+    JSON_TO_LUA_TABLE = 2029
+    LUA_ALREADY_EXECUTED = 2032
+    LUA_BAD_OUTPUT = 2033
+    LUA_RETURNS_NO_STRING = 2035
+    MAKE_DIRECTORY = 2008
+    NETWORK_PROTOCOL = 9
+    NOT_ACCEPTABLE = 34
+    NOT_ENOUGH_MEMORY = 4
+    NOT_IMPLEMENTED = 2
+    NOT_LUA_PREDICATE = 2034
+    NO_APPLICATION_ENTITY_FILTER = 2013
+    NO_CFIND_HANDLER = 2010
+    NO_CGET_HANDLER = 2044
+    NO_CMOVE_HANDLER = 2011
+    NO_CSTORE_HANDLER = 2012
+    NO_PRESENTATION_CONTEXT = 2015
+    NO_SOP_CLASS_OR_INSTANCE = 2014
+    NO_STORAGE_COMMITMENT_HANDLER = 2043
+    NO_WORKLIST_HANDLER = 2041
+    NULL_POINTER = 35
+    PARAMETER_OUT_OF_RANGE = 3
+    PATH_TO_EXECUTABLE = 2007
+    PLUGIN = 1
+    READ_ONLY = 22
+    REGULAR_FILE_EXPECTED = 2006
+    REVISION = 43
+    SHARED_LIBRARY = 25
+    SQLITE_ALREADY_OPENED = 1001
+    SQLITE_BIND_OUT_OF_RANGE = 1011
+    SQLITE_CANNOT_OPEN = 1002
+    SQLITE_CANNOT_RUN = 1009
+    SQLITE_CANNOT_STEP = 1010
+    SQLITE_COMMIT_WITHOUT_TRANSACTION = 1006
+    SQLITE_EXECUTE = 1004
+    SQLITE_FLUSH = 1008
+    SQLITE_NOT_OPENED = 1000
+    SQLITE_PREPARE_STATEMENT = 1012
+    SQLITE_REGISTER_FUNCTION = 1007
+    SQLITE_ROLLBACK_WITHOUT_TRANSACTION = 1005
+    SQLITE_STATEMENT_ALREADY_USED = 1003
+    SQLITE_TRANSACTION_ALREADY_STARTED = 1013
+    SQLITE_TRANSACTION_BEGIN = 1015
+    SQLITE_TRANSACTION_COMMIT = 1014
+    SSL_DISABLED = 2039
+    SSL_INITIALIZATION = 39
+    STORAGE_AREA_ALREADY_REGISTERED = 2036
+    STORAGE_AREA_PLUGIN = 32
+    SUCCESS = 0
+    SYSTEM_COMMAND = 10
+    TIMEOUT = 16
+    UNAUTHORIZED = 29
+    UNKNOWN_DICOM_TAG = 27
+    UNKNOWN_MODALITY = 2027
+    UNKNOWN_PLUGIN_SERVICE = 26
+    UNKNOWN_RESOURCE = 17
+    UNSUPPORTED_MEDIA_TYPE = 3000
+    URI_SYNTAX = 12
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/modality/index.html b/api/modality/index.html new file mode 100644 index 0000000..13daa9b --- /dev/null +++ b/api/modality/index.html @@ -0,0 +1,2069 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Modality - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Modality

+ +
+ + + +

+ pyorthanc.Modality + + +

+ + +
+ + +

Wrapper around Orthanc API when dealing with a modality.

+ +
+ Source code in pyorthanc/_modality.py +
  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
class Modality:
+    """Wrapper around Orthanc API when dealing with a modality."""
+
+    def __init__(self, client: Orthanc, modality: str) -> None:
+        """Constructor
+
+        Parameters
+        ----------
+        client
+            Orthanc object.
+        modality
+            Remote modality.
+        """
+        client = util.ensure_non_raw_response(client)
+
+        self.client = client
+        self.modality = modality
+
+    def echo(self) -> bool:
+        """C-Echo to modality
+
+        Returns
+        -------
+        bool
+            True if C-Echo succeeded.
+        """
+        try:
+            self.client.post_modalities_id_echo(self.modality)
+            return True
+
+        except httpx.HTTPError:
+            return False
+
+    def query(self, data: Dict) -> Dict:
+        """C-Find (Querying with data)
+
+        Parameters
+        ----------
+        data
+            Dictionary to send in the body of request.
+
+        Returns
+        -------
+        Dict
+            Dictionary with keys {'ID': '...', 'path': '...'}
+
+        Examples
+        -------
+        >>> data = {'Level': 'Study',
+        ...         'Query': {
+        ...             'PatientID':'03HD*',
+        ...             'StudyDescription':'*Chest*',
+        ...             'PatientName':''
+        ...         }
+        ... }
+
+        >>> modality = Modality(
+        ...     client=Orthanc('http://localhost:8042'),
+        ...     modality='sample'
+        ... )
+
+        >>> modality.query(data)
+        """
+        return dict(self.client.post_modalities_id_query(self.modality, json=data))
+
+    def move(self, query_identifier: str, cmove_data: Dict) -> Dict:
+        """C-Move query results to another modality
+
+        C-Move SCU: Send all the results to another modality whose AET is in the body
+
+        Parameters
+        ----------
+        query_identifier
+            Query identifier.
+        cmove_data
+            Ex. {'TargetAet': 'target_modality_name', "Synchronous": False}
+
+        Returns
+        -------
+        Dict
+            Orthanc Response (probably a Dictionary)
+
+        Examples
+        --------
+        >>> modality = Modality(Orthanc('http://localhost:8042'), 'modality')
+        >>> query_id = modality.query(
+        ...     data={'Level': 'Series',
+        ...           'Query': {'PatientID': '',
+        ...                     'Modality':'SR'}})
+
+        >>> modality.move(
+        ...     query_identifier=query_id['ID'],
+        ...     cmove_data={'TargetAet': 'TARGETAET'}
+        ... )
+
+        """
+        return dict(self.client.post_queries_id_retrieve(query_identifier, json=cmove_data))
+
+    def store(self, instance_or_series_id: str) -> Dict:
+        """Store series or instance to modality.
+
+        Parameters
+        ----------
+        instance_or_series_id
+            Instance or Series Orthanc identifier.
+
+        Returns
+        -------
+        Dict
+            Information related to the C-Store operation.
+        """
+        return dict(self.client.post_modalities_id_store(
+            self.modality,
+            json=instance_or_series_id
+        ))
+
+    def get_query_answers(self) -> Dict:
+        answers = {}
+
+        for query_id in self.client.get_queries():
+            for answer_id in self.client.get_queries_id_answers(query_id):
+                answers[query_id] = self.client.get_queries_id_answers_index_content(query_id, answer_id)
+
+        return answers
+
+
+ + + +
+ + + + + + + +
+ + + +

+ client = client + + + instance-attribute + + +

+ + +
+
+ +
+ +
+ + + +

+ modality = modality + + + instance-attribute + + +

+ + +
+
+ +
+ + + +
+ + +

+ __init__(client, modality) + +

+ + +
+ +

Constructor

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
client + Orthanc + +
+

Orthanc object.

+
+
+ required +
modality + str + +
+

Remote modality.

+
+
+ required +
+ +
+ Source code in pyorthanc/_modality.py +
12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
def __init__(self, client: Orthanc, modality: str) -> None:
+    """Constructor
+
+    Parameters
+    ----------
+    client
+        Orthanc object.
+    modality
+        Remote modality.
+    """
+    client = util.ensure_non_raw_response(client)
+
+    self.client = client
+    self.modality = modality
+
+
+
+ +
+ +
+ + +

+ echo() + +

+ + +
+ +

C-Echo to modality

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ bool + +
+

True if C-Echo succeeded.

+
+
+ +
+ Source code in pyorthanc/_modality.py +
27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
def echo(self) -> bool:
+    """C-Echo to modality
+
+    Returns
+    -------
+    bool
+        True if C-Echo succeeded.
+    """
+    try:
+        self.client.post_modalities_id_echo(self.modality)
+        return True
+
+    except httpx.HTTPError:
+        return False
+
+
+
+ +
+ +
+ + +

+ get_query_answers() + +

+ + +
+ +
+ Source code in pyorthanc/_modality.py +
125
+126
+127
+128
+129
+130
+131
+132
def get_query_answers(self) -> Dict:
+    answers = {}
+
+    for query_id in self.client.get_queries():
+        for answer_id in self.client.get_queries_id_answers(query_id):
+            answers[query_id] = self.client.get_queries_id_answers_index_content(query_id, answer_id)
+
+    return answers
+
+
+
+ +
+ +
+ + +

+ move(query_identifier, cmove_data) + +

+ + +
+ +

C-Move query results to another modality

+

C-Move SCU: Send all the results to another modality whose AET is in the body

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
query_identifier + str + +
+

Query identifier.

+
+
+ required +
cmove_data + Dict + +
+

Ex. {'TargetAet': 'target_modality_name', "Synchronous": False}

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Dict + +
+

Orthanc Response (probably a Dictionary)

+
+
+ + +

Examples:

+
>>> modality = Modality(Orthanc('http://localhost:8042'), 'modality')
+>>> query_id = modality.query(
+...     data={'Level': 'Series',
+...           'Query': {'PatientID': '',
+...                     'Modality':'SR'}})
+
+
>>> modality.move(
+...     query_identifier=query_id['ID'],
+...     cmove_data={'TargetAet': 'TARGETAET'}
+... )
+
+ +
+ Source code in pyorthanc/_modality.py +
 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
def move(self, query_identifier: str, cmove_data: Dict) -> Dict:
+    """C-Move query results to another modality
+
+    C-Move SCU: Send all the results to another modality whose AET is in the body
+
+    Parameters
+    ----------
+    query_identifier
+        Query identifier.
+    cmove_data
+        Ex. {'TargetAet': 'target_modality_name', "Synchronous": False}
+
+    Returns
+    -------
+    Dict
+        Orthanc Response (probably a Dictionary)
+
+    Examples
+    --------
+    >>> modality = Modality(Orthanc('http://localhost:8042'), 'modality')
+    >>> query_id = modality.query(
+    ...     data={'Level': 'Series',
+    ...           'Query': {'PatientID': '',
+    ...                     'Modality':'SR'}})
+
+    >>> modality.move(
+    ...     query_identifier=query_id['ID'],
+    ...     cmove_data={'TargetAet': 'TARGETAET'}
+    ... )
+
+    """
+    return dict(self.client.post_queries_id_retrieve(query_identifier, json=cmove_data))
+
+
+
+ +
+ +
+ + +

+ query(data) + +

+ + +
+ +

C-Find (Querying with data)

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
data + Dict + +
+

Dictionary to send in the body of request.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Dict + +
+

Dictionary with keys {'ID': '...', 'path': '...'}

+
+
+ + +

Examples:

+
>>> data = {'Level': 'Study',
+...         'Query': {
+...             'PatientID':'03HD*',
+...             'StudyDescription':'*Chest*',
+...             'PatientName':''
+...         }
+... }
+
+
>>> modality = Modality(
+...     client=Orthanc('http://localhost:8042'),
+...     modality='sample'
+... )
+
+
>>> modality.query(data)
+
+ +
+ Source code in pyorthanc/_modality.py +
42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
def query(self, data: Dict) -> Dict:
+    """C-Find (Querying with data)
+
+    Parameters
+    ----------
+    data
+        Dictionary to send in the body of request.
+
+    Returns
+    -------
+    Dict
+        Dictionary with keys {'ID': '...', 'path': '...'}
+
+    Examples
+    -------
+    >>> data = {'Level': 'Study',
+    ...         'Query': {
+    ...             'PatientID':'03HD*',
+    ...             'StudyDescription':'*Chest*',
+    ...             'PatientName':''
+    ...         }
+    ... }
+
+    >>> modality = Modality(
+    ...     client=Orthanc('http://localhost:8042'),
+    ...     modality='sample'
+    ... )
+
+    >>> modality.query(data)
+    """
+    return dict(self.client.post_modalities_id_query(self.modality, json=data))
+
+
+
+ +
+ +
+ + +

+ store(instance_or_series_id) + +

+ + +
+ +

Store series or instance to modality.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
instance_or_series_id + str + +
+

Instance or Series Orthanc identifier.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Dict + +
+

Information related to the C-Store operation.

+
+
+ +
+ Source code in pyorthanc/_modality.py +
107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
def store(self, instance_or_series_id: str) -> Dict:
+    """Store series or instance to modality.
+
+    Parameters
+    ----------
+    instance_or_series_id
+        Instance or Series Orthanc identifier.
+
+    Returns
+    -------
+    Dict
+        Information related to the C-Store operation.
+    """
+    return dict(self.client.post_modalities_id_store(
+        self.modality,
+        json=instance_or_series_id
+    ))
+
+
+
+ +
+ + + +
+ +
+ +

RemoteModality

+

RemoteModality is an alias for Modality

+
RemoteModality = Modality
+
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/orthanc_sdk/index.html b/api/orthanc_sdk/index.html new file mode 100644 index 0000000..ece83f6 --- /dev/null +++ b/api/orthanc_sdk/index.html @@ -0,0 +1,11271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Orthanc SDK - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Orthanc SDK

+

The orthanc_sdk is useful when developing with the Orthanc's Python Plugin, +it exposes orthanc module when available (i.e. used as an Orthanc script), +or expose the functions/classes signatures when not for linting and autocomplete.

+

Use it the same way you would use the Python Plugin:

+
from pyorthanc import orthanc_sdk
+
+def on_get(output: orthanc_sdk.RestOutput, *_, **__):
+    output.AnswerBuffer('ok', 'text/plain')
+
+orthanc_sdk.RegisterRestCallback('/test', on_get)
+
+ +

How it works

+

When developing importing the Orthanc Python Plugin with import orthanc will raise a ModuleNotFoundError. +This where the orthanc_sdk submodule is interesting. When orthanc is available, it uses it. +When not, orthanc_sdk expose mock functions/classes of everything available from orthanc, however, these functions/classes does nothing.

+
try:
+    from orthanc import *
+
+except ModuleNotFoundError:
+    """Orthanc SDK methods wrapped in python (plugin version 4.0)"""
+    ...
+
+ +

Reference

+ + +
+ + + +

+ pyorthanc.orthanc_sdk + + +

+ +
+ +

Orthanc SDK methods wrapped in python

+ + + +
+ + + + + + + +
+ + + +

+ VERSION = '4.1' + + + module-attribute + + +

+ + +
+
+ +
+ + +
+ + + +

+ ChangeType + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginChangeType

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
class ChangeType(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginChangeType"""
+    COMPLETED_SERIES = 0
+    DELETED = 1
+    JOB_FAILURE = 18
+    JOB_SUBMITTED = 16
+    JOB_SUCCESS = 17
+    NEW_CHILD_INSTANCE = 2
+    NEW_INSTANCE = 3
+    NEW_PATIENT = 4
+    NEW_SERIES = 5
+    NEW_STUDY = 6
+    ORTHANC_STARTED = 10
+    ORTHANC_STOPPED = 11
+    STABLE_PATIENT = 7
+    STABLE_SERIES = 8
+    STABLE_STUDY = 9
+    UPDATED_ATTACHMENT = 12
+    UPDATED_METADATA = 13
+    UPDATED_MODALITIES = 15
+    UPDATED_PEERS = 14
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ CompressionType + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginCompressionType

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
27
+28
+29
+30
+31
+32
class CompressionType(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginCompressionType"""
+    GZIP = 2
+    GZIP_WITH_SIZE = 3
+    ZLIB = 0
+    ZLIB_WITH_SIZE = 1
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ ConstraintType + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginConstraintType

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
35
+36
+37
+38
+39
+40
+41
class ConstraintType(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginConstraintType"""
+    EQUAL = 1
+    GREATER_OR_EQUAL = 3
+    LIST = 5
+    SMALLER_OR_EQUAL = 2
+    WILDCARD = 4
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ ContentType + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginContentType

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
44
+45
+46
+47
+48
+49
class ContentType(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginContentType"""
+    DICOM = 1
+    DICOM_AS_JSON = 2
+    DICOM_UNTIL_PIXEL_DATA = 3
+    UNKNOWN = 0
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ CreateDicomFlags + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginCreateDicomFlags

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
52
+53
+54
+55
+56
class CreateDicomFlags(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginCreateDicomFlags"""
+    DECODE_DATA_URI_SCHEME = 1
+    GENERATE_IDENTIFIERS = 2
+    NONE = 0
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ DicomInstance + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginDicomInstance

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
class DicomInstance:
+    """Generated from Orthanc C class: OrthancPluginDicomInstance"""
+
+    def GetInstanceAdvancedJson(self, *args, **kwargs) -> str:
+        """This function outputs a JSON string representing the tags of this DICOM file."""
+        pass
+
+    def GetInstanceData(self) -> Any:
+        """This function returns the content of the given DICOM instance."""
+        pass
+
+    def GetInstanceDecodedFrame(self, frameIndex: int) -> Image:
+        """This function decodes one frame of a DICOM image that is managed by the Orthanc core."""
+        pass
+
+    def GetInstanceFramesCount(self) -> int:
+        """This function returns the number of frames that are part of a DICOM image managed by the Orthanc core."""
+        pass
+
+    def GetInstanceJson(self) -> str:
+        """
+        This function returns a string containing a JSON file.
+        This JSON file encodes the tag hierarchy of the given DICOM instance.
+        """
+        pass
+
+    def GetInstanceMetadata(self, metadata: str) -> Any:
+        """
+        This functions returns the value of some metadata that is associated with the DICOM instance of interest.
+        Before calling this function, the existence of the metadata must have been checked with HasInstanceMetadata().
+        """
+        pass
+
+    def GetInstanceOrigin(self) -> InstanceOrigin:
+        """This function returns the origin of a DICOM instance that has been received by Orthanc."""
+        pass
+
+    def GetInstanceRawFrame(self, *args) -> Any:
+        """Generated from C function OrthancPluginGetInstanceRawFrame()"""
+        pass
+
+    def GetInstanceRemoteAet(self) -> str:
+        """
+        This function returns the Application Entity Title (AET) of the DICOM modality
+        from which a DICOM instance originates.
+        """
+        pass
+
+    def GetInstanceSimplifiedJson(self) -> str:
+        """
+        This function returns a string containing a JSON file.
+        This JSON file encodes the tag hierarchy of the given DICOM instance.
+        In contrast with GetInstanceJson(), the returned JSON file is in its simplified version.
+        """
+        pass
+
+    def GetInstanceSize(self) -> int:
+        """This function returns the number of bytes of the given DICOM instance."""
+        pass
+
+    def GetInstanceTransferSyntaxUid(self) -> str:
+        """
+        This function returns a string that contains the transfer syntax UID of the DICOM instance.
+        The empty string might be returned if this information is unknown.
+        """
+        pass
+
+    def HasInstanceMetadata(self, metadata: str) -> bool:
+        """
+        This function checks whether the DICOM instance of interest is associated with some metadata.
+        As of Orthanc 0.8.1, in the callbacks registered by OnStoredInstanceCallback(),
+        the only possibly available metadata are "ReceptionDate", "RemoteAET" and "IndexInSeries".
+        """
+        pass
+
+    def HasInstancePixelData(self) -> bool:
+        """
+        This function returns a Boolean value indicating whether the DICOM instance
+        contains the pixel data (7FE0,0010) tag.
+        """
+        pass
+
+    def SerializeDicomInstance(self, *args) -> Any:
+        """Generated from C function OrthancPluginSerializeDicomInstance()"""
+        pass
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ GetInstanceAdvancedJson(*args, **kwargs) + +

+ + +
+ +

This function outputs a JSON string representing the tags of this DICOM file.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
44
+45
+46
def GetInstanceAdvancedJson(self, *args, **kwargs) -> str:
+    """This function outputs a JSON string representing the tags of this DICOM file."""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetInstanceData() + +

+ + +
+ +

This function returns the content of the given DICOM instance.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
48
+49
+50
def GetInstanceData(self) -> Any:
+    """This function returns the content of the given DICOM instance."""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetInstanceDecodedFrame(frameIndex) + +

+ + +
+ +

This function decodes one frame of a DICOM image that is managed by the Orthanc core.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
52
+53
+54
def GetInstanceDecodedFrame(self, frameIndex: int) -> Image:
+    """This function decodes one frame of a DICOM image that is managed by the Orthanc core."""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetInstanceFramesCount() + +

+ + +
+ +

This function returns the number of frames that are part of a DICOM image managed by the Orthanc core.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
56
+57
+58
def GetInstanceFramesCount(self) -> int:
+    """This function returns the number of frames that are part of a DICOM image managed by the Orthanc core."""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetInstanceJson() + +

+ + +
+ +

This function returns a string containing a JSON file. +This JSON file encodes the tag hierarchy of the given DICOM instance.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
60
+61
+62
+63
+64
+65
def GetInstanceJson(self) -> str:
+    """
+    This function returns a string containing a JSON file.
+    This JSON file encodes the tag hierarchy of the given DICOM instance.
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ GetInstanceMetadata(metadata) + +

+ + +
+ +

This functions returns the value of some metadata that is associated with the DICOM instance of interest. +Before calling this function, the existence of the metadata must have been checked with HasInstanceMetadata().

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
67
+68
+69
+70
+71
+72
def GetInstanceMetadata(self, metadata: str) -> Any:
+    """
+    This functions returns the value of some metadata that is associated with the DICOM instance of interest.
+    Before calling this function, the existence of the metadata must have been checked with HasInstanceMetadata().
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ GetInstanceOrigin() + +

+ + +
+ +

This function returns the origin of a DICOM instance that has been received by Orthanc.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
74
+75
+76
def GetInstanceOrigin(self) -> InstanceOrigin:
+    """This function returns the origin of a DICOM instance that has been received by Orthanc."""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetInstanceRawFrame(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetInstanceRawFrame()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
78
+79
+80
def GetInstanceRawFrame(self, *args) -> Any:
+    """Generated from C function OrthancPluginGetInstanceRawFrame()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetInstanceRemoteAet() + +

+ + +
+ +

This function returns the Application Entity Title (AET) of the DICOM modality +from which a DICOM instance originates.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
82
+83
+84
+85
+86
+87
def GetInstanceRemoteAet(self) -> str:
+    """
+    This function returns the Application Entity Title (AET) of the DICOM modality
+    from which a DICOM instance originates.
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ GetInstanceSimplifiedJson() + +

+ + +
+ +

This function returns a string containing a JSON file. +This JSON file encodes the tag hierarchy of the given DICOM instance. +In contrast with GetInstanceJson(), the returned JSON file is in its simplified version.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
89
+90
+91
+92
+93
+94
+95
def GetInstanceSimplifiedJson(self) -> str:
+    """
+    This function returns a string containing a JSON file.
+    This JSON file encodes the tag hierarchy of the given DICOM instance.
+    In contrast with GetInstanceJson(), the returned JSON file is in its simplified version.
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ GetInstanceSize() + +

+ + +
+ +

This function returns the number of bytes of the given DICOM instance.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
97
+98
+99
def GetInstanceSize(self) -> int:
+    """This function returns the number of bytes of the given DICOM instance."""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetInstanceTransferSyntaxUid() + +

+ + +
+ +

This function returns a string that contains the transfer syntax UID of the DICOM instance. +The empty string might be returned if this information is unknown.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
101
+102
+103
+104
+105
+106
def GetInstanceTransferSyntaxUid(self) -> str:
+    """
+    This function returns a string that contains the transfer syntax UID of the DICOM instance.
+    The empty string might be returned if this information is unknown.
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ HasInstanceMetadata(metadata) + +

+ + +
+ +

This function checks whether the DICOM instance of interest is associated with some metadata. +As of Orthanc 0.8.1, in the callbacks registered by OnStoredInstanceCallback(), +the only possibly available metadata are "ReceptionDate", "RemoteAET" and "IndexInSeries".

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
108
+109
+110
+111
+112
+113
+114
def HasInstanceMetadata(self, metadata: str) -> bool:
+    """
+    This function checks whether the DICOM instance of interest is associated with some metadata.
+    As of Orthanc 0.8.1, in the callbacks registered by OnStoredInstanceCallback(),
+    the only possibly available metadata are "ReceptionDate", "RemoteAET" and "IndexInSeries".
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ HasInstancePixelData() + +

+ + +
+ +

This function returns a Boolean value indicating whether the DICOM instance +contains the pixel data (7FE0,0010) tag.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
116
+117
+118
+119
+120
+121
def HasInstancePixelData(self) -> bool:
+    """
+    This function returns a Boolean value indicating whether the DICOM instance
+    contains the pixel data (7FE0,0010) tag.
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ SerializeDicomInstance(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSerializeDicomInstance()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
123
+124
+125
def SerializeDicomInstance(self, *args) -> Any:
+    """Generated from C function OrthancPluginSerializeDicomInstance()"""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ DicomToJsonFlags + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginDicomToJsonFlags

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
class DicomToJsonFlags(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginDicomToJsonFlags"""
+    CONVERT_BINARY_TO_ASCII = 16
+    CONVERT_BINARY_TO_NULL = 32
+    INCLUDE_BINARY = 1
+    INCLUDE_PIXEL_DATA = 8
+    INCLUDE_PRIVATE_TAGS = 2
+    INCLUDE_UNKNOWN_TAGS = 4
+    NONE = 0
+    SKIP_GROUP_LENGTHS = 128
+    STOP_AFTER_PIXEL_DATA = 64
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ DicomToJsonFormat + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginDicomToJsonFormat

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
72
+73
+74
+75
+76
class DicomToJsonFormat(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginDicomToJsonFormat"""
+    FULL = 1
+    HUMAN = 3
+    SHORT = 2
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ DicomWebBinaryMode + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginDicomWebBinaryMode

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
79
+80
+81
+82
+83
class DicomWebBinaryMode(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginDicomWebBinaryMode"""
+    BULK_DATA_URI = 2
+    IGNORE = 0
+    INLINE_BINARY = 1
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ DicomWebNode + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginDicomWebNode

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
86
+87
class DicomWebNode:
+    """Generated from Orthanc C class: OrthancPluginDicomWebNode"""
+
+
+ +
+ +
+ +
+ + + +

+ ErrorCode + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginErrorCode

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
class ErrorCode(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginErrorCode"""
+    ALREADY_EXISTING_TAG = 2042
+    BAD_APPLICATION_ENTITY_TITLE = 2009
+    BAD_FILE_FORMAT = 15
+    BAD_FONT = 30
+    BAD_GEOMETRY = 38
+    BAD_HTTP_STATUS_IN_REST = 2005
+    BAD_JOB_ORDERING = 2028
+    BAD_JSON = 28
+    BAD_PARAMETER_TYPE = 5
+    BAD_RANGE = 41
+    BAD_REQUEST = 8
+    BAD_SEQUENCE_OF_CALLS = 6
+    CANCELED_JOB = 37
+    CANNOT_CREATE_LUA = 2030
+    CANNOT_EXECUTE_LUA = 2031
+    CANNOT_ORDER_SLICES = 2040
+    CANNOT_STORE_INSTANCE = 2018
+    CANNOT_WRITE_FILE = 14
+    CORRUPTED_FILE = 20
+    CREATE_DICOM_BAD_PARENT = 2024
+    CREATE_DICOM_NOT_STRING = 2019
+    CREATE_DICOM_NO_PAYLOAD = 2022
+    CREATE_DICOM_OVERRIDE_TAG = 2020
+    CREATE_DICOM_PARENT_ENCODING = 2026
+    CREATE_DICOM_PARENT_IS_INSTANCE = 2025
+    CREATE_DICOM_USE_CONTENT = 2021
+    CREATE_DICOM_USE_DATA_URI_SCHEME = 2023
+    DATABASE = 11
+    DATABASE_BACKEND_ALREADY_REGISTERED = 2037
+    DATABASE_CANNOT_SERIALIZE = 42
+    DATABASE_NOT_INITIALIZED = 2038
+    DATABASE_PLUGIN = 31
+    DATABASE_UNAVAILABLE = 36
+    DICOM_FIND_UNAVAILABLE = 2016
+    DICOM_MOVE_UNAVAILABLE = 2017
+    DICOM_PORT_IN_USE = 2004
+    DIRECTORY_EXPECTED = 2002
+    DIRECTORY_OVER_FILE = 2000
+    DISCONTINUED_ABI = 40
+    EMPTY_REQUEST = 33
+    FILE_STORAGE_CANNOT_WRITE = 2001
+    FULL_STORAGE = 19
+    HTTP_PORT_IN_USE = 2003
+    INCOMPATIBLE_DATABASE_VERSION = 18
+    INCOMPATIBLE_IMAGE_FORMAT = 23
+    INCOMPATIBLE_IMAGE_SIZE = 24
+    INEXISTENT_FILE = 13
+    INEXISTENT_ITEM = 7
+    INEXISTENT_TAG = 21
+    INTERNAL_ERROR = -1
+    JSON_TO_LUA_TABLE = 2029
+    LUA_ALREADY_EXECUTED = 2032
+    LUA_BAD_OUTPUT = 2033
+    LUA_RETURNS_NO_STRING = 2035
+    MAKE_DIRECTORY = 2008
+    NETWORK_PROTOCOL = 9
+    NOT_ACCEPTABLE = 34
+    NOT_ENOUGH_MEMORY = 4
+    NOT_IMPLEMENTED = 2
+    NOT_LUA_PREDICATE = 2034
+    NO_APPLICATION_ENTITY_FILTER = 2013
+    NO_CFIND_HANDLER = 2010
+    NO_CGET_HANDLER = 2044
+    NO_CMOVE_HANDLER = 2011
+    NO_CSTORE_HANDLER = 2012
+    NO_PRESENTATION_CONTEXT = 2015
+    NO_SOP_CLASS_OR_INSTANCE = 2014
+    NO_STORAGE_COMMITMENT_HANDLER = 2043
+    NO_WORKLIST_HANDLER = 2041
+    NULL_POINTER = 35
+    PARAMETER_OUT_OF_RANGE = 3
+    PATH_TO_EXECUTABLE = 2007
+    PLUGIN = 1
+    READ_ONLY = 22
+    REGULAR_FILE_EXPECTED = 2006
+    REVISION = 43
+    SHARED_LIBRARY = 25
+    SQLITE_ALREADY_OPENED = 1001
+    SQLITE_BIND_OUT_OF_RANGE = 1011
+    SQLITE_CANNOT_OPEN = 1002
+    SQLITE_CANNOT_RUN = 1009
+    SQLITE_CANNOT_STEP = 1010
+    SQLITE_COMMIT_WITHOUT_TRANSACTION = 1006
+    SQLITE_EXECUTE = 1004
+    SQLITE_FLUSH = 1008
+    SQLITE_NOT_OPENED = 1000
+    SQLITE_PREPARE_STATEMENT = 1012
+    SQLITE_REGISTER_FUNCTION = 1007
+    SQLITE_ROLLBACK_WITHOUT_TRANSACTION = 1005
+    SQLITE_STATEMENT_ALREADY_USED = 1003
+    SQLITE_TRANSACTION_ALREADY_STARTED = 1013
+    SQLITE_TRANSACTION_BEGIN = 1015
+    SQLITE_TRANSACTION_COMMIT = 1014
+    SSL_DISABLED = 2039
+    SSL_INITIALIZATION = 39
+    STORAGE_AREA_ALREADY_REGISTERED = 2036
+    STORAGE_AREA_PLUGIN = 32
+    SUCCESS = 0
+    SYSTEM_COMMAND = 10
+    TIMEOUT = 16
+    UNAUTHORIZED = 29
+    UNKNOWN_DICOM_TAG = 27
+    UNKNOWN_MODALITY = 2027
+    UNKNOWN_PLUGIN_SERVICE = 26
+    UNKNOWN_RESOURCE = 17
+    UNSUPPORTED_MEDIA_TYPE = 3000
+    URI_SYNTAX = 12
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ FindAnswers + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginFindAnswers

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
128
+129
+130
+131
+132
+133
+134
+135
+136
+137
class FindAnswers:
+    """Generated from Orthanc C class: OrthancPluginFindAnswers"""
+
+    def FindAddAnswer(self, *args):
+        """Generated from C function OrthancPluginFindAddAnswer()"""
+        pass
+
+    def FindMarkIncomplete(self, *args):
+        """Generated from C function OrthancPluginFindMarkIncomplete()"""
+        pass
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ FindAddAnswer(*args) + +

+ + +
+ +

Generated from C function OrthancPluginFindAddAnswer()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
131
+132
+133
def FindAddAnswer(self, *args):
+    """Generated from C function OrthancPluginFindAddAnswer()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ FindMarkIncomplete(*args) + +

+ + +
+ +

Generated from C function OrthancPluginFindMarkIncomplete()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
135
+136
+137
def FindMarkIncomplete(self, *args):
+    """Generated from C function OrthancPluginFindMarkIncomplete()"""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ FindMatcher + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginFindMatcher

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
140
+141
+142
+143
+144
+145
class FindMatcher:
+    """Generated from Orthanc C class: OrthancPluginFindMatcher"""
+
+    def FindMatcherIsMatch(self, *args):
+        """Generated from C function OrthancPluginFindMatcherIsMatch()"""
+        pass
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ FindMatcherIsMatch(*args) + +

+ + +
+ +

Generated from C function OrthancPluginFindMatcherIsMatch()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
143
+144
+145
def FindMatcherIsMatch(self, *args):
+    """Generated from C function OrthancPluginFindMatcherIsMatch()"""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ FindQuery + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginFindQuery

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
class FindQuery:
+    """Generated from Orthanc C class: OrthancPluginFindQuery"""
+
+    def GetFindQuerySize(self, *args):
+        """Generated from C function OrthancPluginGetFindQuerySize()"""
+        pass
+
+    def GetFindQueryTagElement(self, *args):
+        """Generated from C function OrthancPluginGetFindQueryTag()"""
+        pass
+
+    def GetFindQueryTagGroup(self, *args):
+        """Generated from C function OrthancPluginGetFindQueryTag()"""
+        pass
+
+    def GetFindQueryTagName(self, *args):
+        """Generated from C function OrthancPluginGetFindQueryTagName()"""
+        pass
+
+    def GetFindQueryValue(self, *args):
+        """Generated from C function OrthancPluginGetFindQueryValue()"""
+        pass
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ GetFindQuerySize(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetFindQuerySize()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
151
+152
+153
def GetFindQuerySize(self, *args):
+    """Generated from C function OrthancPluginGetFindQuerySize()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetFindQueryTagElement(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetFindQueryTag()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
155
+156
+157
def GetFindQueryTagElement(self, *args):
+    """Generated from C function OrthancPluginGetFindQueryTag()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetFindQueryTagGroup(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetFindQueryTag()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
159
+160
+161
def GetFindQueryTagGroup(self, *args):
+    """Generated from C function OrthancPluginGetFindQueryTag()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetFindQueryTagName(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetFindQueryTagName()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
163
+164
+165
def GetFindQueryTagName(self, *args):
+    """Generated from C function OrthancPluginGetFindQueryTagName()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetFindQueryValue(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetFindQueryValue()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
167
+168
+169
def GetFindQueryValue(self, *args):
+    """Generated from C function OrthancPluginGetFindQueryValue()"""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ HttpMethod + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginHttpMethod

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
201
+202
+203
+204
+205
+206
class HttpMethod(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginHttpMethod"""
+    DELETE = 4
+    GET = 1
+    POST = 2
+    PUT = 3
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ IdentifierConstraint + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginIdentifierConstraint

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
209
+210
+211
+212
+213
+214
class IdentifierConstraint(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginIdentifierConstraint"""
+    EQUAL = 1
+    GREATER_OR_EQUAL = 3
+    SMALLER_OR_EQUAL = 2
+    WILDCARD = 4
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ Image + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginImage

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
class Image:
+    """Generated from Orthanc C class: OrthancPluginImage"""
+
+    def ConvertPixelFormat(self, *args):
+        """Generated from C function OrthancPluginConvertPixelFormat()"""
+        pass
+
+    def DrawText(self, *args):
+        """Generated from C function OrthancPluginDrawText()"""
+        pass
+
+    def GetImageBuffer(self, *args):
+        """Generated from C function OrthancPluginGetImageBuffer()"""
+        pass
+
+    def GetImageHeight(self, *args):
+        """Generated from C function OrthancPluginGetImageHeight()"""
+        pass
+
+    def GetImagePitch(self, *args):
+        """Generated from C function OrthancPluginGetImagePitch()"""
+        pass
+
+    def GetImagePixelFormat(self, *args):
+        """Generated from C function OrthancPluginGetImagePixelFormat()"""
+        pass
+
+    def GetImageWidth(self, *args):
+        """Generated from C function OrthancPluginGetImageWidth()"""
+        pass
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ ConvertPixelFormat(*args) + +

+ + +
+ +

Generated from C function OrthancPluginConvertPixelFormat()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
12
+13
+14
def ConvertPixelFormat(self, *args):
+    """Generated from C function OrthancPluginConvertPixelFormat()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ DrawText(*args) + +

+ + +
+ +

Generated from C function OrthancPluginDrawText()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
16
+17
+18
def DrawText(self, *args):
+    """Generated from C function OrthancPluginDrawText()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetImageBuffer(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetImageBuffer()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
20
+21
+22
def GetImageBuffer(self, *args):
+    """Generated from C function OrthancPluginGetImageBuffer()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetImageHeight(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetImageHeight()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
24
+25
+26
def GetImageHeight(self, *args):
+    """Generated from C function OrthancPluginGetImageHeight()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetImagePitch(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetImagePitch()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
28
+29
+30
def GetImagePitch(self, *args):
+    """Generated from C function OrthancPluginGetImagePitch()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetImagePixelFormat(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetImagePixelFormat()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
32
+33
+34
def GetImagePixelFormat(self, *args):
+    """Generated from C function OrthancPluginGetImagePixelFormat()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetImageWidth(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetImageWidth()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
36
+37
+38
def GetImageWidth(self, *args):
+    """Generated from C function OrthancPluginGetImageWidth()"""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ ImageFormat + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginImageFormat

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
217
+218
+219
+220
+221
class ImageFormat(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginImageFormat"""
+    DICOM = 2
+    JPEG = 1
+    PNG = 0
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ InstanceOrigin + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginInstanceOrigin

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
224
+225
+226
+227
+228
+229
+230
+231
class InstanceOrigin(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginInstanceOrigin"""
+    DICOM_PROTOCOL = 2
+    LUA = 5
+    PLUGIN = 4
+    REST_API = 3
+    UNKNOWN = 1
+    WEB_DAV = 6
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ Job + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginJob

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
172
+173
+174
+175
+176
+177
class Job:
+    """Generated from Orthanc C class: OrthancPluginJob"""
+
+    def SubmitJob(self, *args):
+        """Generated from C function OrthancPluginSubmitJob()"""
+        pass
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ SubmitJob(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSubmitJob()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
175
+176
+177
def SubmitJob(self, *args):
+    """Generated from C function OrthancPluginSubmitJob()"""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ JobStepStatus + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginJobStepStatus

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
234
+235
+236
+237
+238
class JobStepStatus(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginJobStepStatus"""
+    CONTINUE = 3
+    FAILURE = 2
+    SUCCESS = 1
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ JobStopReason + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginJobStopReason

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
241
+242
+243
+244
+245
+246
class JobStopReason(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginJobStopReason"""
+    CANCELED = 4
+    FAILURE = 3
+    PAUSED = 2
+    SUCCESS = 1
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ MetricsType + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginMetricsType

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
249
+250
+251
+252
class MetricsType(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginMetricsType"""
+    DEFAULT = 0
+    TIMER = 1
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ OrthancException + + +

+ + +
+ + +

Common base class for all non-exit exceptions.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
180
+181
+182
+183
+184
+185
class OrthancException:
+    """Common base class for all non-exit exceptions."""
+
+    def with_traceback(self, *args):
+        """Exception.with_traceback(tb) -- set self.__traceback__ to tb and return self."""
+        pass
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ with_traceback(*args) + +

+ + +
+ +

Exception.with_traceback(tb) -- set self.traceback to tb and return self.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
183
+184
+185
def with_traceback(self, *args):
+    """Exception.with_traceback(tb) -- set self.__traceback__ to tb and return self."""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ Peers + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginPeers

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
class Peers:
+    """Generated from Orthanc C class: OrthancPluginPeers"""
+
+    def GetPeerName(self, *args):
+        """Generated from C function OrthancPluginGetPeerName()"""
+        pass
+
+    def GetPeerUrl(self, *args):
+        """Generated from C function OrthancPluginGetPeerUrl()"""
+        pass
+
+    def GetPeerUserProperty(self, *args):
+        """Generated from C function OrthancPluginGetPeerUserProperty()"""
+        pass
+
+    def GetPeersCount(self, *args):
+        """Generated from C function OrthancPluginGetPeersCount()"""
+        pass
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ GetPeerName(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetPeerName()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
191
+192
+193
def GetPeerName(self, *args):
+    """Generated from C function OrthancPluginGetPeerName()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetPeerUrl(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetPeerUrl()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
195
+196
+197
def GetPeerUrl(self, *args):
+    """Generated from C function OrthancPluginGetPeerUrl()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetPeerUserProperty(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetPeerUserProperty()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
199
+200
+201
def GetPeerUserProperty(self, *args):
+    """Generated from C function OrthancPluginGetPeerUserProperty()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetPeersCount(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetPeersCount()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
203
+204
+205
def GetPeersCount(self, *args):
+    """Generated from C function OrthancPluginGetPeersCount()"""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ PixelFormat + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginPixelFormat

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
class PixelFormat(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginPixelFormat"""
+    BGRA32 = 10
+    FLOAT32 = 9
+    GRAYSCALE16 = 2
+    GRAYSCALE32 = 8
+    GRAYSCALE64 = 11
+    GRAYSCALE8 = 1
+    RGB24 = 4
+    RGB48 = 7
+    RGBA32 = 5
+    SIGNED_GRAYSCALE16 = 3
+    UNKNOWN = 6
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ ReceivedInstanceAction + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginReceivedInstanceAction

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
270
+271
+272
+273
+274
class ReceivedInstanceAction(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginReceivedInstanceAction"""
+    DISCARD = 3
+    KEEP_AS_IS = 1
+    MODIFY = 2
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ ResourceType + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginResourceType

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
277
+278
+279
+280
+281
+282
+283
class ResourceType(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginResourceType"""
+    INSTANCE = 3
+    NONE = 4
+    PATIENT = 0
+    SERIES = 2
+    STUDY = 1
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ RestOutput + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginRestOutput

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
class RestOutput:
+    """Generated from Orthanc C class: OrthancPluginRestOutput"""
+
+    def AnswerBuffer(self, *args):
+        """Generated from C function OrthancPluginAnswerBuffer()"""
+        pass
+
+    def CompressAndAnswerJpegImage(self, *args):
+        """Generated from C function OrthancPluginCompressAndAnswerJpegImage()"""
+        pass
+
+    def CompressAndAnswerPngImage(self, *args):
+        """Generated from C function OrthancPluginCompressAndAnswerPngImage()"""
+        pass
+
+    def Redirect(self, *args):
+        """Generated from C function OrthancPluginRedirect()"""
+        pass
+
+    def SendHttpStatus(self, *args):
+        """Generated from C function OrthancPluginSendHttpStatus()"""
+        pass
+
+    def SendHttpStatusCode(self, *args):
+        """Generated from C function OrthancPluginSendHttpStatusCode()"""
+        pass
+
+    def SendMethodNotAllowed(self, *args):
+        """Generated from C function OrthancPluginSendMethodNotAllowed()"""
+        pass
+
+    def SendMultipartItem(self, *args):
+        """Generated from C function OrthancPluginSendMultipartItem()"""
+        pass
+
+    def SendUnauthorized(self, *args):
+        """Generated from C function OrthancPluginSendUnauthorized()"""
+        pass
+
+    def SetCookie(self, *args):
+        """Generated from C function OrthancPluginSetCookie()"""
+        pass
+
+    def SetHttpErrorDetails(self, *args):
+        """Generated from C function OrthancPluginSetHttpErrorDetails()"""
+        pass
+
+    def SetHttpHeader(self, *args):
+        """Generated from C function OrthancPluginSetHttpHeader()"""
+        pass
+
+    def StartMultipartAnswer(self, *args):
+        """Generated from C function OrthancPluginStartMultipartAnswer()"""
+        pass
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ AnswerBuffer(*args) + +

+ + +
+ +

Generated from C function OrthancPluginAnswerBuffer()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
211
+212
+213
def AnswerBuffer(self, *args):
+    """Generated from C function OrthancPluginAnswerBuffer()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ CompressAndAnswerJpegImage(*args) + +

+ + +
+ +

Generated from C function OrthancPluginCompressAndAnswerJpegImage()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
215
+216
+217
def CompressAndAnswerJpegImage(self, *args):
+    """Generated from C function OrthancPluginCompressAndAnswerJpegImage()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ CompressAndAnswerPngImage(*args) + +

+ + +
+ +

Generated from C function OrthancPluginCompressAndAnswerPngImage()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
219
+220
+221
def CompressAndAnswerPngImage(self, *args):
+    """Generated from C function OrthancPluginCompressAndAnswerPngImage()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ Redirect(*args) + +

+ + +
+ +

Generated from C function OrthancPluginRedirect()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
223
+224
+225
def Redirect(self, *args):
+    """Generated from C function OrthancPluginRedirect()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ SendHttpStatus(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSendHttpStatus()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
227
+228
+229
def SendHttpStatus(self, *args):
+    """Generated from C function OrthancPluginSendHttpStatus()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ SendHttpStatusCode(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSendHttpStatusCode()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
231
+232
+233
def SendHttpStatusCode(self, *args):
+    """Generated from C function OrthancPluginSendHttpStatusCode()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ SendMethodNotAllowed(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSendMethodNotAllowed()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
235
+236
+237
def SendMethodNotAllowed(self, *args):
+    """Generated from C function OrthancPluginSendMethodNotAllowed()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ SendMultipartItem(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSendMultipartItem()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
239
+240
+241
def SendMultipartItem(self, *args):
+    """Generated from C function OrthancPluginSendMultipartItem()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ SendUnauthorized(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSendUnauthorized()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
243
+244
+245
def SendUnauthorized(self, *args):
+    """Generated from C function OrthancPluginSendUnauthorized()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ SetCookie(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSetCookie()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
247
+248
+249
def SetCookie(self, *args):
+    """Generated from C function OrthancPluginSetCookie()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ SetHttpErrorDetails(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSetHttpErrorDetails()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
251
+252
+253
def SetHttpErrorDetails(self, *args):
+    """Generated from C function OrthancPluginSetHttpErrorDetails()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ SetHttpHeader(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSetHttpHeader()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
255
+256
+257
def SetHttpHeader(self, *args):
+    """Generated from C function OrthancPluginSetHttpHeader()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ StartMultipartAnswer(*args) + +

+ + +
+ +

Generated from C function OrthancPluginStartMultipartAnswer()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
259
+260
+261
def StartMultipartAnswer(self, *args):
+    """Generated from C function OrthancPluginStartMultipartAnswer()"""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ ServerChunkedRequestReader + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginServerChunkedRequestReader

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
264
+265
class ServerChunkedRequestReader:
+    """Generated from Orthanc C class: OrthancPluginServerChunkedRequestReader"""
+
+
+ +
+ +
+ +
+ + + +

+ StorageArea + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginStorageArea

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
class StorageArea:
+    """Generated from Orthanc C class: OrthancPluginStorageArea"""
+
+    def ReconstructMainDicomTags(self, *args):
+        """Generated from C function OrthancPluginReconstructMainDicomTags()"""
+        pass
+
+    def StorageAreaCreate(self, *args):
+        """Generated from C function OrthancPluginStorageAreaCreate()"""
+        pass
+
+    def StorageAreaRead(self, *args):
+        """Generated from C function OrthancPluginStorageAreaRead()"""
+        pass
+
+    def StorageAreaRemove(self, *args):
+        """Generated from C function OrthancPluginStorageAreaRemove()"""
+        pass
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ ReconstructMainDicomTags(*args) + +

+ + +
+ +

Generated from C function OrthancPluginReconstructMainDicomTags()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
271
+272
+273
def ReconstructMainDicomTags(self, *args):
+    """Generated from C function OrthancPluginReconstructMainDicomTags()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ StorageAreaCreate(*args) + +

+ + +
+ +

Generated from C function OrthancPluginStorageAreaCreate()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
275
+276
+277
def StorageAreaCreate(self, *args):
+    """Generated from C function OrthancPluginStorageAreaCreate()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ StorageAreaRead(*args) + +

+ + +
+ +

Generated from C function OrthancPluginStorageAreaRead()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
279
+280
+281
def StorageAreaRead(self, *args):
+    """Generated from C function OrthancPluginStorageAreaRead()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ StorageAreaRemove(*args) + +

+ + +
+ +

Generated from C function OrthancPluginStorageAreaRemove()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
283
+284
+285
def StorageAreaRemove(self, *args):
+    """Generated from C function OrthancPluginStorageAreaRemove()"""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ StorageCommitmentFailureReason + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginStorageCommitmentFailureReason

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
286
+287
+288
+289
+290
+291
+292
+293
+294
class StorageCommitmentFailureReason(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginStorageCommitmentFailureReason"""
+    CLASS_INSTANCE_CONFLICT = 5
+    DUPLICATE_TRANSACTION_UID = 6
+    NO_SUCH_OBJECT_INSTANCE = 2
+    PROCESSING_FAILURE = 1
+    REFERENCED_SOPCLASS_NOT_SUPPORTED = 4
+    RESOURCE_LIMITATION = 3
+    SUCCESS = 0
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ ValueRepresentation + + +

+ + +
+

+ Bases: Enum

+ + +

Generated from C enumeration OrthancPluginOrthancPluginValueRepresentation

+ +
+ Source code in pyorthanc/_orthanc_sdk_enums.py +
297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
class ValueRepresentation(Enum):
+    """Generated from C enumeration OrthancPluginOrthancPluginValueRepresentation"""
+    AE = 1
+    AS = 2
+    AT = 3
+    CS = 4
+    DA = 5
+    DS = 6
+    DT = 7
+    FD = 8
+    FL = 9
+    IS = 10
+    LO = 11
+    LT = 12
+    OB = 13
+    OF = 14
+    OW = 15
+    PN = 16
+    SH = 17
+    SL = 18
+    SQ = 19
+    SS = 20
+    ST = 21
+    TM = 22
+    UI = 23
+    UL = 24
+    UN = 25
+    US = 26
+    UT = 27
+
+
+ + + +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +

+ WorklistAnswers + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginWorklistAnswers

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
288
+289
+290
+291
+292
+293
+294
+295
+296
+297
class WorklistAnswers:
+    """Generated from Orthanc C class: OrthancPluginWorklistAnswers"""
+
+    def WorklistAddAnswer(self, *args):
+        """Generated from C function OrthancPluginWorklistAddAnswer()"""
+        pass
+
+    def WorklistMarkIncomplete(self, *args):
+        """Generated from C function OrthancPluginWorklistMarkIncomplete()"""
+        pass
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ WorklistAddAnswer(*args) + +

+ + +
+ +

Generated from C function OrthancPluginWorklistAddAnswer()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
291
+292
+293
def WorklistAddAnswer(self, *args):
+    """Generated from C function OrthancPluginWorklistAddAnswer()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ WorklistMarkIncomplete(*args) + +

+ + +
+ +

Generated from C function OrthancPluginWorklistMarkIncomplete()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
295
+296
+297
def WorklistMarkIncomplete(self, *args):
+    """Generated from C function OrthancPluginWorklistMarkIncomplete()"""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ WorklistQuery + + +

+ + +
+ + +

Generated from Orthanc C class: OrthancPluginWorklistQuery

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
300
+301
+302
+303
+304
+305
+306
+307
+308
+309
class WorklistQuery:
+    """Generated from Orthanc C class: OrthancPluginWorklistQuery"""
+
+    def WorklistGetDicomQuery(self, *args):
+        """Generated from C function OrthancPluginWorklistGetDicomQuery()"""
+        pass
+
+    def WorklistIsMatch(self, *args):
+        """Generated from C function OrthancPluginWorklistIsMatch()"""
+        pass
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ WorklistGetDicomQuery(*args) + +

+ + +
+ +

Generated from C function OrthancPluginWorklistGetDicomQuery()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
303
+304
+305
def WorklistGetDicomQuery(self, *args):
+    """Generated from C function OrthancPluginWorklistGetDicomQuery()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ WorklistIsMatch(*args) + +

+ + +
+ +

Generated from C function OrthancPluginWorklistIsMatch()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
307
+308
+309
def WorklistIsMatch(self, *args):
+    """Generated from C function OrthancPluginWorklistIsMatch()"""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ __loader__ + + +

+ + +
+ + +

Meta path import for built-in modules.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
878
+879
class __loader__:
+    """Meta path import for built-in modules."""
+
+
+ +
+ +
+ + +
+ + +

+ AutodetectMimeType(*args) + +

+ + +
+ +

Generated from C function OrthancPluginAutodetectMimeType()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
312
+313
+314
def AutodetectMimeType(*args):
+    """Generated from C function OrthancPluginAutodetectMimeType()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ BufferCompression(memory_buffer, source, size, compression, uncompress) + +

+ + +
+ +

Compress or decompress a buffer.

+

This function compresses or decompresses a buffer, using the version of the zlib +library that is used by the Orthanc core.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
memory_buffer + Any + +
+

The target memory buffer. It must be freed with OrthancPluginFreeMemoryBuffer()

+
+
+ required +
source + Any + +
+

The source buffer.

+
+
+ required +
size + int + +
+

The size in bytes of the source buffer.

+
+
+ required +
compression + CompressionType + +
+

The compression algorithm.

+
+
+ required +
uncompress + int + +
+

If set to "0", the buffer must be compressed.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ 0 if success, or the error code if failure. + +
+ +
+
+ +
+ Source code in pyorthanc/orthanc_sdk.py +
317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
def BufferCompression(memory_buffer: Any,
+                      source: Any,
+                      size: int,
+                      compression: CompressionType,
+                      uncompress: int) -> int:
+    """Compress or decompress a buffer.
+
+    This function compresses or decompresses a buffer, using the version of the zlib
+    library that is used by the Orthanc core.
+
+    Parameters
+    ----------
+    memory_buffer
+        The target memory buffer. It must be freed with OrthancPluginFreeMemoryBuffer()
+    source
+        The source buffer.
+    size
+        The size in bytes of the source buffer.
+    compression
+        The compression algorithm.
+    uncompress
+        If set to "0", the buffer must be compressed.
+
+    Returns
+    -------
+        0 if success, or the error code if failure.
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ CheckVersion() + +

+ + +
+ +

Check the compatibility of the plugin wrt. the version of its hosting Orthanc.

+

This function checks whether the version of the Orthanc server +running this plugin, is above the version of the current Orthanc +SDK header. This guarantees that the plugin is compatible with +the hosting Orthanc (i.e. it will not call unavailable services). +The result of this function should always be checked in the +OrthancPluginInitialize() entry point of the plugin.

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ 1 if and only if the versions are compatible. If the result is 0, + +
+

the initialization of the plugin should fail.

+
+
+ +
+ Source code in pyorthanc/orthanc_sdk.py +
347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
def CheckVersion() -> int:
+    """Check the compatibility of the plugin wrt. the version of its hosting Orthanc.
+
+    This function checks whether the version of the Orthanc server
+    running this plugin, is above the version of the current Orthanc
+    SDK header. This guarantees that the plugin is compatible with
+    the hosting Orthanc (i.e. it will not call unavailable services).
+    The result of this function should always be checked in the
+    OrthancPluginInitialize() entry point of the plugin.
+
+    Returns
+    -------
+        1 if and only if the versions are compatible. If the result is 0,
+        the initialization of the plugin should fail.
+
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ CheckVersionAdvanced(*args) + +

+ + +
+ +

Generated from C function OrthancPluginCheckVersionAdvanced()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
366
+367
+368
def CheckVersionAdvanced(*args):
+    """Generated from C function OrthancPluginCheckVersionAdvanced()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ CompressJpegImage(*args) + +

+ + +
+ +

Generated from C function OrthancPluginCompressJpegImage()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
371
+372
+373
def CompressJpegImage(*args):
+    """Generated from C function OrthancPluginCompressJpegImage()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ CompressPngImage(*args) + +

+ + +
+ +

Generated from C function OrthancPluginCompressPngImage()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
376
+377
+378
def CompressPngImage(*args):
+    """Generated from C function OrthancPluginCompressPngImage()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ ComputeMd5(*args) + +

+ + +
+ +

Generated from C function OrthancPluginComputeMd5()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
381
+382
+383
def ComputeMd5(*args):
+    """Generated from C function OrthancPluginComputeMd5()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ ComputeSha1(*args) + +

+ + +
+ +

Generated from C function OrthancPluginComputeSha1()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
386
+387
+388
def ComputeSha1(*args):
+    """Generated from C function OrthancPluginComputeSha1()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ CreateDicom(*args) + +

+ + +
+ +

None

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
391
+392
+393
def CreateDicom(*args):
+    """None"""
+    pass
+
+
+
+ +
+ +
+ + +

+ CreateDicomInstance(*args) + +

+ + +
+ +

Generated from C function OrthancPluginCreateDicomInstance()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
396
+397
+398
def CreateDicomInstance(*args):
+    """Generated from C function OrthancPluginCreateDicomInstance()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ CreateFindMatcher(*args) + +

+ + +
+ +

Generated from C function OrthancPluginCreateFindMatcher()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
401
+402
+403
def CreateFindMatcher(*args):
+    """Generated from C function OrthancPluginCreateFindMatcher()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ CreateImage(*args) + +

+ + +
+ +

Generated from C function OrthancPluginCreateImage()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
406
+407
+408
def CreateImage(*args):
+    """Generated from C function OrthancPluginCreateImage()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ CreateImageFromBuffer(*args) + +

+ + +
+ +

None

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
411
+412
+413
def CreateImageFromBuffer(*args):
+    """None"""
+    pass
+
+
+
+ +
+ +
+ + +

+ CreateMemoryBuffer(*args) + +

+ + +
+ +

Generated from C function OrthancPluginCreateMemoryBuffer()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
416
+417
+418
def CreateMemoryBuffer(*args):
+    """Generated from C function OrthancPluginCreateMemoryBuffer()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ DecodeDicomImage(*args) + +

+ + +
+ +

Generated from C function OrthancPluginDecodeDicomImage()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
421
+422
+423
def DecodeDicomImage(*args):
+    """Generated from C function OrthancPluginDecodeDicomImage()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ DicomBufferToJson(*args) + +

+ + +
+ +

Generated from C function OrthancPluginDicomBufferToJson()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
426
+427
+428
def DicomBufferToJson(*args):
+    """Generated from C function OrthancPluginDicomBufferToJson()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ DicomInstanceToJson(*args) + +

+ + +
+ +

Generated from C function OrthancPluginDicomInstanceToJson()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
431
+432
+433
def DicomInstanceToJson(*args):
+    """Generated from C function OrthancPluginDicomInstanceToJson()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ ExtendOrthancExplorer(*args) + +

+ + +
+ +

Generated from C function OrthancPluginExtendOrthancExplorer()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
436
+437
+438
def ExtendOrthancExplorer(*args):
+    """Generated from C function OrthancPluginExtendOrthancExplorer()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GenerateRestApiAuthorizationToken(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGenerateRestApiAuthorizationToken()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
441
+442
+443
def GenerateRestApiAuthorizationToken(*args):
+    """Generated from C function OrthancPluginGenerateRestApiAuthorizationToken()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GenerateUuid(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGenerateUuid()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
446
+447
+448
def GenerateUuid(*args):
+    """Generated from C function OrthancPluginGenerateUuid()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetCommandLineArgument(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetCommandLineArgument()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
451
+452
+453
def GetCommandLineArgument(*args):
+    """Generated from C function OrthancPluginGetCommandLineArgument()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetCommandLineArgumentsCount(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetCommandLineArgumentsCount()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
456
+457
+458
def GetCommandLineArgumentsCount(*args):
+    """Generated from C function OrthancPluginGetCommandLineArgumentsCount()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetConfiguration(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetConfiguration()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
461
+462
+463
def GetConfiguration(*args):
+    """Generated from C function OrthancPluginGetConfiguration()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetConfigurationPath(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetConfigurationPath()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
466
+467
+468
def GetConfigurationPath(*args):
+    """Generated from C function OrthancPluginGetConfigurationPath()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetDicomForInstance(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetDicomForInstance()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
471
+472
+473
def GetDicomForInstance(*args):
+    """Generated from C function OrthancPluginGetDicomForInstance()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetErrorDescription(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetErrorDescription()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
476
+477
+478
def GetErrorDescription(*args):
+    """Generated from C function OrthancPluginGetErrorDescription()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetExpectedDatabaseVersion(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetExpectedDatabaseVersion()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
481
+482
+483
def GetExpectedDatabaseVersion(*args):
+    """Generated from C function OrthancPluginGetExpectedDatabaseVersion()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetFontName(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetFontName()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
486
+487
+488
def GetFontName(*args):
+    """Generated from C function OrthancPluginGetFontName()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetFontSize(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetFontSize()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
491
+492
+493
def GetFontSize(*args):
+    """Generated from C function OrthancPluginGetFontSize()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetFontsCount(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetFontsCount()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
496
+497
+498
def GetFontsCount(*args):
+    """Generated from C function OrthancPluginGetFontsCount()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetGlobalProperty(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetGlobalProperty()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
501
+502
+503
def GetGlobalProperty(*args):
+    """Generated from C function OrthancPluginGetGlobalProperty()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetOrthancDirectory(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetOrthancDirectory()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
506
+507
+508
def GetOrthancDirectory(*args):
+    """Generated from C function OrthancPluginGetOrthancDirectory()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetOrthancPath(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetOrthancPath()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
511
+512
+513
def GetOrthancPath(*args):
+    """Generated from C function OrthancPluginGetOrthancPath()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetPeers(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetPeers()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
516
+517
+518
def GetPeers(*args):
+    """Generated from C function OrthancPluginGetPeers()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ GetTagName(*args) + +

+ + +
+ +

Generated from C function OrthancPluginGetTagName()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
521
+522
+523
def GetTagName(*args):
+    """Generated from C function OrthancPluginGetTagName()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ HttpDelete(*args) + +

+ + +
+ +

Generated from C function OrthancPluginHttpDelete()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
526
+527
+528
def HttpDelete(*args):
+    """Generated from C function OrthancPluginHttpDelete()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ HttpGet(*args) + +

+ + +
+ +

Generated from C function OrthancPluginHttpGet()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
531
+532
+533
def HttpGet(*args):
+    """Generated from C function OrthancPluginHttpGet()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ HttpPost(*args) + +

+ + +
+ +

Generated from C function OrthancPluginHttpPost()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
536
+537
+538
def HttpPost(*args):
+    """Generated from C function OrthancPluginHttpPost()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ HttpPut(*args) + +

+ + +
+ +

Generated from C function OrthancPluginHttpPut()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
541
+542
+543
def HttpPut(*args):
+    """Generated from C function OrthancPluginHttpPut()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ LogError(*args) + +

+ + +
+ +

Generated from C function OrthancPluginLogError()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
546
+547
+548
def LogError(*args):
+    """Generated from C function OrthancPluginLogError()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ LogInfo(*args) + +

+ + +
+ +

Generated from C function OrthancPluginLogInfo()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
551
+552
+553
def LogInfo(*args):
+    """Generated from C function OrthancPluginLogInfo()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ LogWarning(*args) + +

+ + +
+ +

Generated from C function OrthancPluginLogWarning()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
556
+557
+558
def LogWarning(*args):
+    """Generated from C function OrthancPluginLogWarning()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ LookupDictionary(*args) + +

+ + +
+ +

None

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
561
+562
+563
def LookupDictionary(*args):
+    """None"""
+    pass
+
+
+
+ +
+ +
+ + +

+ LookupInstance(*args) + +

+ + +
+ +

Generated from C function OrthancPluginLookupInstance()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
566
+567
+568
def LookupInstance(*args):
+    """Generated from C function OrthancPluginLookupInstance()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ LookupPatient(*args) + +

+ + +
+ +

Generated from C function OrthancPluginLookupPatient()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
571
+572
+573
def LookupPatient(*args):
+    """Generated from C function OrthancPluginLookupPatient()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ LookupSeries(*args) + +

+ + +
+ +

Generated from C function OrthancPluginLookupSeries()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
576
+577
+578
def LookupSeries(*args):
+    """Generated from C function OrthancPluginLookupSeries()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ LookupStudy(*args) + +

+ + +
+ +

Generated from C function OrthancPluginLookupStudy()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
581
+582
+583
def LookupStudy(*args):
+    """Generated from C function OrthancPluginLookupStudy()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ LookupStudyWithAccessionNumber(*args) + +

+ + +
+ +

Generated from C function OrthancPluginLookupStudyWithAccessionNumber()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
586
+587
+588
def LookupStudyWithAccessionNumber(*args):
+    """Generated from C function OrthancPluginLookupStudyWithAccessionNumber()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ ReadFile(*args) + +

+ + +
+ +

Generated from C function OrthancPluginReadFile()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
591
+592
+593
def ReadFile(*args):
+    """Generated from C function OrthancPluginReadFile()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterDictionaryTag(*args) + +

+ + +
+ +

Generated from C function OrthancPluginRegisterDictionaryTag()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
596
+597
+598
def RegisterDictionaryTag(*args):
+    """Generated from C function OrthancPluginRegisterDictionaryTag()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterErrorCode(*args) + +

+ + +
+ +

Generated from C function OrthancPluginRegisterErrorCode()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
601
+602
+603
def RegisterErrorCode(*args):
+    """Generated from C function OrthancPluginRegisterErrorCode()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterFindCallback(func) + +

+ + +
+ +

Register on C-Find Callback

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
func + Callable[[FindAnswers, FindQuery, str, str], None] + +
+

Function that is call when Orthanc receive an incoming C-Find request

+
+
+ required +
+ + +

Examples:

+

From https://orthanc.uclouvain.be/book/plugins/python.html#handling-dicom-scp-requests-new-in-3-2

+
def on_find(answers, query, issuerAet, calledAet):
+    print('Received incoming C-FIND request from %s:' % issuerAet)
+
+    answer = {}
+    for i in range(query.GetFindQuerySize()):
+        print('  %s (%04x,%04x) = [%s]' % (query.GetFindQueryTagName(i),
+                                           query.GetFindQueryTagGroup(i),
+                                           query.GetFindQueryTagElement(i),
+                                           query.GetFindQueryValue(i)))
+        answer[query.GetFindQueryTagName(i)] = ('HELLO%d-%s' % (i, query.GetFindQueryValue(i)))
+
+    answers.FindAddAnswer(orthanc.CreateDicom(json.dumps(answer), None, orthanc.CreateDicomFlags.NONE))
+
+orthanc.RegisterFindCallback(on_find)
+
+ +
+ Source code in pyorthanc/orthanc_sdk.py +
606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
def RegisterFindCallback(func: Callable[[FindAnswers, FindQuery, str, str], None]) -> None:
+    """Register on C-Find Callback
+
+    Parameters
+    ----------
+    func
+        Function that is call when Orthanc receive an incoming C-Find request
+
+    Examples
+    --------
+    From https://orthanc.uclouvain.be/book/plugins/python.html#handling-dicom-scp-requests-new-in-3-2
+    ```python
+    def on_find(answers, query, issuerAet, calledAet):
+        print('Received incoming C-FIND request from %s:' % issuerAet)
+
+        answer = {}
+        for i in range(query.GetFindQuerySize()):
+            print('  %s (%04x,%04x) = [%s]' % (query.GetFindQueryTagName(i),
+                                               query.GetFindQueryTagGroup(i),
+                                               query.GetFindQueryTagElement(i),
+                                               query.GetFindQueryValue(i)))
+            answer[query.GetFindQueryTagName(i)] = ('HELLO%d-%s' % (i, query.GetFindQueryValue(i)))
+
+        answers.FindAddAnswer(orthanc.CreateDicom(json.dumps(answer), None, orthanc.CreateDicomFlags.NONE))
+
+    orthanc.RegisterFindCallback(on_find)
+    ```
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterIncomingCStoreInstanceFilter(*args) + +

+ + +
+ +

None

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
637
+638
+639
def RegisterIncomingCStoreInstanceFilter(*args):
+    """None"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterIncomingHttpRequestFilter(*args) + +

+ + +
+ +

None

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
642
+643
+644
def RegisterIncomingHttpRequestFilter(*args):
+    """None"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterMoveCallback(func) + +

+ + +
+ +

None

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
647
+648
+649
def RegisterMoveCallback(func: Callable):
+    """None"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterMoveCallback2(create_move_func, get_move_func, apply_move_func, free_move_func) + +

+ + +
+ +

See https://github.com/orthanc-team/dicom-dicomweb-proxy/blob/main/proxy.py for an example from the OrthancTeam.

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
652
+653
+654
def RegisterMoveCallback2(create_move_func: Callable, get_move_func: Callable, apply_move_func: Callable, free_move_func: Callable) -> None:
+    """See https://github.com/orthanc-team/dicom-dicomweb-proxy/blob/main/proxy.py for an example from the OrthancTeam."""
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterOnChangeCallback(func) + +

+ + +
+ +

Register on change callback

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
func + Callable[[ChangeType, ResourceType, str], None] + +
+

Function that is called as callback.

+
+
+ required +
+ + +

Examples:

+

From https://book.orthanc-server.com/plugins/python.html#listening-to-changes.

+
def on_change(change_type: orthanc_sdk.ChangeType, level: orthanc_sdk.ResourceType, resource: str) -> None:
+    if changeType == orthanc_sdk.ChangeType.ORTHANC_STARTED:
+        with open('/tmp/sample.dcm', 'rb') as f:
+            orthanc.RestApiPost('/instances', f.read())
+
+    elif changeType == orthanc_sdk.ChangeType.ORTHANC_STOPPED:
+        print('Stopped')
+
+    elif changeType == orthanc_sdk.ChangeType.NEW_INSTANCE:
+        print('A new instance was uploaded: %s' % resource)
+
+orthanc_sdk.RegisterOnChangeCallback(on_change)
+
+ +
+ Source code in pyorthanc/orthanc_sdk.py +
657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
def RegisterOnChangeCallback(func: Callable[[ChangeType, ResourceType, str], None]):
+    """Register on change callback
+
+    Parameters
+    ----------
+    func
+        Function that is called as callback.
+
+    Examples
+    --------
+    From https://book.orthanc-server.com/plugins/python.html#listening-to-changes.
+    ```python
+    def on_change(change_type: orthanc_sdk.ChangeType, level: orthanc_sdk.ResourceType, resource: str) -> None:
+        if changeType == orthanc_sdk.ChangeType.ORTHANC_STARTED:
+            with open('/tmp/sample.dcm', 'rb') as f:
+                orthanc.RestApiPost('/instances', f.read())
+
+        elif changeType == orthanc_sdk.ChangeType.ORTHANC_STOPPED:
+            print('Stopped')
+
+        elif changeType == orthanc_sdk.ChangeType.NEW_INSTANCE:
+            print('A new instance was uploaded: %s' % resource)
+
+    orthanc_sdk.RegisterOnChangeCallback(on_change)
+    ```
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterOnStoredInstanceCallback(func) + +

+ + +
+ +

Register a callback for when an instance is stored.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
func + Callable[[DicomInstance, str], None] + +
+

Function that is called as callback.

+
+
+ required +
+ + +

Examples:

+

Example from https://book.orthanc-server.com/plugins/python.html#accessing-the-content-of-a-new-instance

+
def on_store_instance(dicom: orthanc_sdk.DicomInstance, instance_id: str):
+    print('Received instance %s of size %d (transfer syntax %s, SOP class UID %s)' % (
+        instance_id, dicom.GetInstanceSize(),
+        dicom.GetInstanceMetadata('TransferSyntax'),
+        dicom.GetInstanceMetadata('SopClassUid')))
+
+    if dicom.GetInstanceOrigin() == orthanc_sdk.InstanceOrigin.DICOM_PROTOCOL:
+        print('This instance was received through the DICOM protocol')
+    elif dicom.GetInstanceOrigin() == orthanc_sdk.InstanceOrigin.REST_API:
+        print('This instance was received through the REST API')
+
+orthanc_sdk.RegisterOnStoredInstanceCallback(on_store_instance)
+
+ +
+ Source code in pyorthanc/orthanc_sdk.py +
686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
def RegisterOnStoredInstanceCallback(func: Callable[[DicomInstance, str], None]):
+    """Register a callback for when an instance is stored.
+
+    Parameters
+    ----------
+    func
+        Function that is called as callback.
+
+    Examples
+    --------
+    Example from https://book.orthanc-server.com/plugins/python.html#accessing-the-content-of-a-new-instance
+    ```python
+    def on_store_instance(dicom: orthanc_sdk.DicomInstance, instance_id: str):
+        print('Received instance %s of size %d (transfer syntax %s, SOP class UID %s)' % (
+            instance_id, dicom.GetInstanceSize(),
+            dicom.GetInstanceMetadata('TransferSyntax'),
+            dicom.GetInstanceMetadata('SopClassUid')))
+
+        if dicom.GetInstanceOrigin() == orthanc_sdk.InstanceOrigin.DICOM_PROTOCOL:
+            print('This instance was received through the DICOM protocol')
+        elif dicom.GetInstanceOrigin() == orthanc_sdk.InstanceOrigin.REST_API:
+            print('This instance was received through the REST API')
+
+    orthanc_sdk.RegisterOnStoredInstanceCallback(on_store_instance)
+    ```
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterPrivateDictionaryTag(*args) + +

+ + +
+ +

Generated from C function OrthancPluginRegisterPrivateDictionaryTag()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
715
+716
+717
def RegisterPrivateDictionaryTag(*args):
+    """Generated from C function OrthancPluginRegisterPrivateDictionaryTag()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterReceivedInstanceCallback(func) + +

+ + +
+ +

Register a callback for when an instance arrives (but hasn't been stored).

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
func + Callable[[DicomInstance, InstanceOrigin], Tuple[ReceivedInstanceAction, Optional[bytes]]] + +
+

Function that is called as callback.

+
+
+ required +
+ + +

Examples:

+
def on_received_instance(dicom: orthanc_sdk.DicomInstance, origin: orthanc_sdk.InstanceOrigin):
+    if origin == origin.REST_API:
+        LogInfo('Not accepting DICOM from REST API.')
+        return ReceivedInstanceAction.DISCARD, None
+
+    return ReceivedInstanceAction.KEEP_AS_IS, None
+
+orthanc.RegisterReceivedInstanceCallback(on_received_instance)
+
+ +
+ Source code in pyorthanc/orthanc_sdk.py +
720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
def RegisterReceivedInstanceCallback(
+        func: Callable[[DicomInstance, InstanceOrigin], Tuple[ReceivedInstanceAction, Optional[bytes]]]):
+    """Register a callback for when an instance arrives (but hasn't been stored).
+
+    Parameters
+    ----------
+    func
+        Function that is called as callback.
+
+    Examples
+    --------
+    ```python
+    def on_received_instance(dicom: orthanc_sdk.DicomInstance, origin: orthanc_sdk.InstanceOrigin):
+        if origin == origin.REST_API:
+            LogInfo('Not accepting DICOM from REST API.')
+            return ReceivedInstanceAction.DISCARD, None
+
+        return ReceivedInstanceAction.KEEP_AS_IS, None
+
+    orthanc.RegisterReceivedInstanceCallback(on_received_instance)
+    ```
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterRestCallback(new_route, func) + +

+ + +
+ +

Register a REST callback.

+

This function registers a REST callback against a regular +expression for a URI. This function must be called during the +initialization of the plugin, i.e. inside the +OrthancPluginInitialize() public function.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
new_route + str + +
+

Regular expression for the URI. May contain groups.

+
+
+ required +
func + Callable[[RestOutput, str, Any], None] + +
+

The callback function to handle the REST call.

+
+
+ required +
+ + +

Examples:

+

Example from https://book.orthanc-server.com/plugins/python.html#extending-the-rest-api

+
def on_rest(output: orthanc_sdk.RestOutput, uri: str, **request):
+    print(request)
+    output.AnswerBuffer('ok', 'text/plain')
+
+orthanc.RegisterRestCallback('/tata', on_rest)
+
+ +
+ Source code in pyorthanc/orthanc_sdk.py +
745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
def RegisterRestCallback(new_route: str, func: Callable[[RestOutput, str, Any], None]) -> None:
+    """Register a REST callback.
+
+    This function registers a REST callback against a regular
+    expression for a URI. This function must be called during the
+    initialization of the plugin, i.e. inside the
+    OrthancPluginInitialize() public function.
+
+    Parameters
+    ----------
+    new_route
+        Regular expression for the URI. May contain groups.
+    func
+        The callback function to handle the REST call.
+
+    Examples
+    --------
+    Example from https://book.orthanc-server.com/plugins/python.html#extending-the-rest-api
+    ```python
+    def on_rest(output: orthanc_sdk.RestOutput, uri: str, **request):
+        print(request)
+        output.AnswerBuffer('ok', 'text/plain')
+
+    orthanc.RegisterRestCallback('/tata', on_rest)
+    ```
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterStorageArea(*args) + +

+ + +
+ +

None

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
774
+775
+776
def RegisterStorageArea(*args):
+    """None"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterStorageCommitmentScpCallback(*args) + +

+ + +
+ +

None

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
779
+780
+781
def RegisterStorageCommitmentScpCallback(*args):
+    """None"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RegisterWorklistCallback(*args) + +

+ + +
+ +

None

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
784
+785
+786
def RegisterWorklistCallback(*args):
+    """None"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RestApiDelete(*args) + +

+ + +
+ +

Generated from C function OrthancPluginRestApiDelete()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
789
+790
+791
def RestApiDelete(*args):
+    """Generated from C function OrthancPluginRestApiDelete()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RestApiDeleteAfterPlugins(*args) + +

+ + +
+ +

Generated from C function OrthancPluginRestApiDeleteAfterPlugins()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
794
+795
+796
def RestApiDeleteAfterPlugins(*args):
+    """Generated from C function OrthancPluginRestApiDeleteAfterPlugins()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RestApiGet(*args) + +

+ + +
+ +

Generated from C function OrthancPluginRestApiGet()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
799
+800
+801
def RestApiGet(*args):
+    """Generated from C function OrthancPluginRestApiGet()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RestApiGetAfterPlugins(*args) + +

+ + +
+ +

Generated from C function OrthancPluginRestApiGetAfterPlugins()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
804
+805
+806
def RestApiGetAfterPlugins(*args):
+    """Generated from C function OrthancPluginRestApiGetAfterPlugins()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RestApiPost(uri, body, *args, **kwargs) + +

+ + +
+ +

Make a POST call to the built-in Orthanc REST API.

+

Make a POST call to the built-in Orthanc REST API. The result to +the query is stored into a newly allocated memory buffer.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
uri + str + +
+

The URI in the built-in Orthanc API.

+
+
+ required +
body + Any + +
+

The body of the POST request.

+
+
+ required +
*args + +
+ +
+
+ () +
**kwargs + +
+ +
+
+ {} +
+ +
+ Source code in pyorthanc/orthanc_sdk.py +
809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
def RestApiPost(uri: str, body: Any, *args, **kwargs):
+    """Make a POST call to the built-in Orthanc REST API.
+
+    Make a POST call to the built-in Orthanc REST API. The result to
+    the query is stored into a newly allocated memory buffer.
+
+    Parameters
+    ----------
+    uri
+        The URI in the built-in Orthanc API.
+    body
+        The body of the POST request.
+    *args
+    **kwargs
+
+    """
+    pass
+
+
+
+ +
+ +
+ + +

+ RestApiPostAfterPlugins(*args) + +

+ + +
+ +

Generated from C function OrthancPluginRestApiPostAfterPlugins()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
828
+829
+830
def RestApiPostAfterPlugins(*args):
+    """Generated from C function OrthancPluginRestApiPostAfterPlugins()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RestApiPut(*args) + +

+ + +
+ +

Generated from C function OrthancPluginRestApiPut()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
833
+834
+835
def RestApiPut(*args):
+    """Generated from C function OrthancPluginRestApiPut()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ RestApiPutAfterPlugins(*args) + +

+ + +
+ +

Generated from C function OrthancPluginRestApiPutAfterPlugins()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
838
+839
+840
def RestApiPutAfterPlugins(*args):
+    """Generated from C function OrthancPluginRestApiPutAfterPlugins()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ SetDescription(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSetDescription()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
843
+844
+845
def SetDescription(*args):
+    """Generated from C function OrthancPluginSetDescription()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ SetGlobalProperty(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSetGlobalProperty()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
848
+849
+850
def SetGlobalProperty(*args):
+    """Generated from C function OrthancPluginSetGlobalProperty()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ SetMetricsValue(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSetMetricsValue()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
853
+854
+855
def SetMetricsValue(*args):
+    """Generated from C function OrthancPluginSetMetricsValue()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ SetRootUri(*args) + +

+ + +
+ +

Generated from C function OrthancPluginSetRootUri()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
858
+859
+860
def SetRootUri(*args):
+    """Generated from C function OrthancPluginSetRootUri()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ TranscodeDicomInstance(*args) + +

+ + +
+ +

Generated from C function OrthancPluginTranscodeDicomInstance()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
863
+864
+865
def TranscodeDicomInstance(*args):
+    """Generated from C function OrthancPluginTranscodeDicomInstance()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ UncompressImage(*args) + +

+ + +
+ +

Generated from C function OrthancPluginUncompressImage()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
868
+869
+870
def UncompressImage(*args):
+    """Generated from C function OrthancPluginUncompressImage()"""
+    pass
+
+
+
+ +
+ +
+ + +

+ WriteFile(*args) + +

+ + +
+ +

Generated from C function OrthancPluginWriteFile()

+ +
+ Source code in pyorthanc/orthanc_sdk.py +
873
+874
+875
def WriteFile(*args):
+    """Generated from C function OrthancPluginWriteFile()"""
+    pass
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/resources/instance/index.html b/api/resources/instance/index.html new file mode 100644 index 0000000..4932ff4 --- /dev/null +++ b/api/resources/instance/index.html @@ -0,0 +1,3584 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Instance - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Instance

+ +
+ + + +

+ pyorthanc.Instance + + +

+ + +
+

+ Bases: Resource

+ + +

Represent an instance that is in an Orthanc server

+

This object has many getters that allow the user to retrieve metadata +or the entire DICOM file of the Instance

+ +
+ Source code in pyorthanc/_resources/instance.py +
 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
class Instance(Resource):
+    """Represent an instance that is in an Orthanc server
+
+    This object has many getters that allow the user to retrieve metadata
+    or the entire DICOM file of the Instance
+    """
+
+    def get_dicom_file_content(self) -> bytes:
+        """Retrieves DICOM file
+
+        This method retrieves bytes corresponding to DICOM file.
+
+        Returns
+        -------
+        bytes
+            Bytes corresponding to DICOM file
+
+        Examples
+        --------
+        ```python
+        from pyorthanc import Instance
+        instance = Instance('instance_identifier', Orthanc('http://localhost:8042'))
+
+        dicom_file_bytes = instance.get_dicom_file_content()
+        with open('your_path', 'wb') as file_handler:
+            file_handler.write(dicom_file_bytes)
+        ```
+        """
+        return self.client.get_instances_id_file(self.id_)
+
+    def download(self, filepath: Union[str, BinaryIO], with_progres: bool = False) -> None:
+        """Download the DICOM file to a target path or buffer
+
+        This method is an alternative to the `.get_dicom_file_content()` method for large files.
+        The `.get_dicom_file_content()` method will pull all the data in a single GET call,
+        while `.download()` stream the data to a file or a buffer.
+        Favor the `.download()` method to avoid timeout and memory issues.
+
+        Examples
+        --------
+        ```python
+        from pyorthanc import Orthanc, Instance
+        instance = Instance('instance_identifier', Orthanc('http://localhost:8042'))
+
+        # Download the dicom file
+        instance.download('instance.dcm')
+
+        # Download the file and show progress
+        instance.download('instance.dcm', with_progres=True)
+
+        # Or download in a buffer in memory
+        buffer = io.BytesIO()
+        instance.download(buffer)
+        # Now do whatever you want to do
+        buffer.seek(0)
+        dicom_bytes = buffer.read()
+        ```
+        """
+        self._download_file(f'{self.client.url}/instances/{self.id_}/file', filepath, with_progres)
+
+    @property
+    def uid(self) -> str:
+        """Get SOPInstanceUID"""
+        return self._get_main_dicom_tag_value('SOPInstanceUID')
+
+    def get_main_information(self) -> Dict:
+        """Get instance information
+
+        Returns
+        -------
+        Dict
+            Dictionary with tags as key and information as value
+        """
+        if self.lock:
+            if self._information is None:
+                # Setup self._information for the first time when study is lock
+                self._information = self.client.get_instances_id(self.id_)
+
+            return self._information
+
+        return self.client.get_instances_id(self.id_)
+
+    @property
+    def file_size(self) -> int:
+        """Get the file size
+
+        The output is in bytes. Divide by 1_000_000 to
+        get it in Mb.
+
+        Returns
+        -------
+        int
+            The file size in bytes.
+        """
+        return self.get_main_information()['FileSize']
+
+    @property
+    def creation_date(self) -> datetime:
+        """Get creation date
+
+        The date have precision to the second.
+
+        Returns
+        -------
+        datetime
+            Creation Date
+        """
+        date_string = self.get_main_information()['MainDicomTags']['InstanceCreationDate']
+        time_string = self.get_main_information()['MainDicomTags']['InstanceCreationTime']
+
+        return util.make_datetime_from_dicom_date(date_string, time_string)
+
+    @property
+    def series_identifier(self) -> str:
+        """Get the parent series identifier"""
+        return self.get_main_information()['ParentSeries']
+
+    @property
+    def parent_series(self) -> Series:
+        from . import Series
+        return Series(self.series_identifier, self.client)
+
+    @property
+    def parent_study(self) -> Study:
+        return self.parent_series.parent_study
+
+    @property
+    def parent_patient(self) -> Patient:
+        return self.parent_study.parent_patient
+
+    @property
+    def acquisition_number(self) -> int:
+        return int(self._get_main_dicom_tag_value('AcquisitionNumber'))
+
+    @property
+    def image_index(self) -> int:
+        return int(self._get_main_dicom_tag_value('ImageIndex'))
+
+    @property
+    def image_orientation_patient(self) -> List[float]:
+        orientation = self._get_main_dicom_tag_value('ImageOrientationPatient')
+
+        return [float(i) for i in orientation.split('\\')]
+
+    @property
+    def image_position_patient(self) -> List[float]:
+        position = self._get_main_dicom_tag_value('ImagePositionPatient')
+
+        return [float(i) for i in position.split('\\')]
+
+    @property
+    def image_comments(self) -> str:
+        return self._get_main_dicom_tag_value('ImageComments')
+
+    @property
+    def instance_number(self) -> int:
+        return int(self._get_main_dicom_tag_value('InstanceNumber'))
+
+    @property
+    def number_of_frames(self) -> int:
+        return int(self._get_main_dicom_tag_value('NumberOfFrames'))
+
+    @property
+    def temporal_position_identifier(self) -> str:
+        return self._get_main_dicom_tag_value('TemporalPositionIdentifier')
+
+    @property
+    def first_level_tags(self) -> Any:
+        """Get first level tags"""
+        return self.client.get_instances_id_content_tags_path(self.id_, '')
+
+    @property
+    def tags(self) -> Dict:
+        """Get tags"""
+        return dict(self.client.get_instances_id_tags(self.id_))
+
+    @property
+    def simplified_tags(self) -> Dict:
+        """Get simplified tags"""
+        return dict(self.client.get_instances_id_tags(self.id_, params={'simplify': True}))
+
+    @property
+    def labels(self) -> List[str]:
+        """Get instance labels"""
+        return self.get_main_information()['Labels']
+
+    def add_label(self, label: str) -> None:
+        """Add label to resource"""
+        self.client.put_instances_id_labels_label(self.id_, label)
+
+    def remove_label(self, label):
+        """Remove label from resource"""
+        self.client.delete_instances_id_labels_label(self.id_, label)
+
+    def get_content_by_tag(self, tag: str) -> Any:
+        """Get content by tag
+
+        Parameters
+        ----------
+        tag
+            Tag like 'ManufacturerModelName' or '0008-1090' or a group element like '' or '0008-1110/0/0008-1150'.
+
+        Returns
+        -------
+        Any
+            Content corresponding to specified tag.
+        """
+        result = self.client.get_instances_id_content_path(id_=self.id_, path=tag)
+
+        try:
+            return result.decode('utf-8').strip().replace('\x00', '')
+        except AttributeError:
+            return result
+
+    def anonymize(self, remove: List = None, replace: Dict = None, keep: List = None,
+                  keep_private_tags: bool = False, keep_source: bool = True,
+                  private_creator: str = None, force: bool = False, dicom_version: str = None) -> bytes:
+        """Anonymize Instance
+
+        If no error has been raise, then it creates a new anonymous instance.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            List of tag to keep unchanged
+        force
+            Some tags can't be changed without forcing it (e.g. SOPInstanceUID) for security reason
+        keep_private_tags
+            If True, keep the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        private_creator
+            The private creator to be used for private tags in replace.
+        dicom_version
+            Version of the DICOM standard to be used for anonymization.
+            Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+        Returns
+        -------
+        bytes
+            Raw bytes of the anonymized instance.
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        data = {
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'KeepPrivateTags': keep_private_tags,
+            'KeepSource': keep_source,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+        if dicom_version is not None:
+            data['DicomVersion'] = dicom_version
+
+        return self.client.post_instances_id_anonymize(self.id_, data)
+
+    def modify(self, remove: List = None, replace: Dict = None, keep: List = None,
+               remove_private_tags: bool = False, keep_source: bool = True,
+               private_creator: str = None, force: bool = False) -> bytes:
+        """Modify Instance
+
+        If no error has been raise, then it creates a new modified instance.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            Keep the original value of the specified tags, to be chosen among the StudyInstanceUID,
+            SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+            as this breaks the DICOM model of the real world.
+        force
+            Some tags can't be changed without forcing it (e.g. SOPInstanceUID) for security reason
+        remove_private_tags
+            If True, remove the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        private_creator
+            The private creator to be used for private tags in replace.
+
+        Returns
+        -------
+        bytes
+            Raw bytes of the modified instance.
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        if 'SOPInstanceUID' in replace and not force:
+            raise errors.ModificationError('If SOPInstanceUID is replaced, `force` must be `True`')
+
+        data = {
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'RemovePrivateTags': remove_private_tags,
+            'KeepSource': keep_source,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+
+        return self.client.post_instances_id_modify(self.id_, data)
+
+    def get_pydicom(self) -> pydicom.FileDataset:
+        """Retrieve a pydicom.FileDataset object corresponding to the instance."""
+        return util.get_pydicom(self.client, self.id_)
+
+
+ + + +
+ + + + + + + +
+ + + +

+ acquisition_number: int + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ creation_date: datetime + + + property + + +

+ + +
+ +

Get creation date

+

The date have precision to the second.

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ datetime + +
+

Creation Date

+
+
+
+ +
+ +
+ + + +

+ file_size: int + + + property + + +

+ + +
+ +

Get the file size

+

The output is in bytes. Divide by 1_000_000 to +get it in Mb.

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ int + +
+

The file size in bytes.

+
+
+
+ +
+ +
+ + + +

+ first_level_tags: Any + + + property + + +

+ + +
+ +

Get first level tags

+
+ +
+ +
+ + + +

+ image_comments: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ image_index: int + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ image_orientation_patient: List[float] + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ image_position_patient: List[float] + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ instance_number: int + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ labels: List[str] + + + property + + +

+ + +
+ +

Get instance labels

+
+ +
+ +
+ + + +

+ number_of_frames: int + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ parent_patient: Patient + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ parent_series: Series + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ parent_study: Study + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ series_identifier: str + + + property + + +

+ + +
+ +

Get the parent series identifier

+
+ +
+ +
+ + + +

+ simplified_tags: Dict + + + property + + +

+ + +
+ +

Get simplified tags

+
+ +
+ +
+ + + +

+ tags: Dict + + + property + + +

+ + +
+ +

Get tags

+
+ +
+ +
+ + + +

+ temporal_position_identifier: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ uid: str + + + property + + +

+ + +
+ +

Get SOPInstanceUID

+
+ +
+ + + +
+ + +

+ add_label(label) + +

+ + +
+ +

Add label to resource

+ +
+ Source code in pyorthanc/_resources/instance.py +
201
+202
+203
def add_label(self, label: str) -> None:
+    """Add label to resource"""
+    self.client.put_instances_id_labels_label(self.id_, label)
+
+
+
+ +
+ +
+ + +

+ anonymize(remove=None, replace=None, keep=None, keep_private_tags=False, keep_source=True, private_creator=None, force=False, dicom_version=None) + +

+ + +
+ +

Anonymize Instance

+

If no error has been raise, then it creates a new anonymous instance. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

List of tag to keep unchanged

+
+
+ None +
force + bool + +
+

Some tags can't be changed without forcing it (e.g. SOPInstanceUID) for security reason

+
+
+ False +
keep_private_tags + bool + +
+

If True, keep the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
private_creator + str + +
+

The private creator to be used for private tags in replace.

+
+
+ None +
dicom_version + str + +
+

Version of the DICOM standard to be used for anonymization. +Check out configuration option DeidentifyLogsDicomVersion for possible values.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ bytes + +
+

Raw bytes of the anonymized instance.

+
+
+ +
+ Source code in pyorthanc/_resources/instance.py +
229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
def anonymize(self, remove: List = None, replace: Dict = None, keep: List = None,
+              keep_private_tags: bool = False, keep_source: bool = True,
+              private_creator: str = None, force: bool = False, dicom_version: str = None) -> bytes:
+    """Anonymize Instance
+
+    If no error has been raise, then it creates a new anonymous instance.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        List of tag to keep unchanged
+    force
+        Some tags can't be changed without forcing it (e.g. SOPInstanceUID) for security reason
+    keep_private_tags
+        If True, keep the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    private_creator
+        The private creator to be used for private tags in replace.
+    dicom_version
+        Version of the DICOM standard to be used for anonymization.
+        Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+    Returns
+    -------
+    bytes
+        Raw bytes of the anonymized instance.
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    data = {
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'KeepPrivateTags': keep_private_tags,
+        'KeepSource': keep_source,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+    if dicom_version is not None:
+        data['DicomVersion'] = dicom_version
+
+    return self.client.post_instances_id_anonymize(self.id_, data)
+
+
+
+ +
+ +
+ + +

+ download(filepath, with_progres=False) + +

+ + +
+ +

Download the DICOM file to a target path or buffer

+

This method is an alternative to the .get_dicom_file_content() method for large files. +The .get_dicom_file_content() method will pull all the data in a single GET call, +while .download() stream the data to a file or a buffer. +Favor the .download() method to avoid timeout and memory issues.

+ + +

Examples:

+
from pyorthanc import Orthanc, Instance
+instance = Instance('instance_identifier', Orthanc('http://localhost:8042'))
+
+# Download the dicom file
+instance.download('instance.dcm')
+
+# Download the file and show progress
+instance.download('instance.dcm', with_progres=True)
+
+# Or download in a buffer in memory
+buffer = io.BytesIO()
+instance.download(buffer)
+# Now do whatever you want to do
+buffer.seek(0)
+dicom_bytes = buffer.read()
+
+ +
+ Source code in pyorthanc/_resources/instance.py +
45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
def download(self, filepath: Union[str, BinaryIO], with_progres: bool = False) -> None:
+    """Download the DICOM file to a target path or buffer
+
+    This method is an alternative to the `.get_dicom_file_content()` method for large files.
+    The `.get_dicom_file_content()` method will pull all the data in a single GET call,
+    while `.download()` stream the data to a file or a buffer.
+    Favor the `.download()` method to avoid timeout and memory issues.
+
+    Examples
+    --------
+    ```python
+    from pyorthanc import Orthanc, Instance
+    instance = Instance('instance_identifier', Orthanc('http://localhost:8042'))
+
+    # Download the dicom file
+    instance.download('instance.dcm')
+
+    # Download the file and show progress
+    instance.download('instance.dcm', with_progres=True)
+
+    # Or download in a buffer in memory
+    buffer = io.BytesIO()
+    instance.download(buffer)
+    # Now do whatever you want to do
+    buffer.seek(0)
+    dicom_bytes = buffer.read()
+    ```
+    """
+    self._download_file(f'{self.client.url}/instances/{self.id_}/file', filepath, with_progres)
+
+
+
+ +
+ +
+ + +

+ get_content_by_tag(tag) + +

+ + +
+ +

Get content by tag

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
tag + str + +
+

Tag like 'ManufacturerModelName' or '0008-1090' or a group element like '' or '0008-1110/0/0008-1150'.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Any + +
+

Content corresponding to specified tag.

+
+
+ +
+ Source code in pyorthanc/_resources/instance.py +
209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
def get_content_by_tag(self, tag: str) -> Any:
+    """Get content by tag
+
+    Parameters
+    ----------
+    tag
+        Tag like 'ManufacturerModelName' or '0008-1090' or a group element like '' or '0008-1110/0/0008-1150'.
+
+    Returns
+    -------
+    Any
+        Content corresponding to specified tag.
+    """
+    result = self.client.get_instances_id_content_path(id_=self.id_, path=tag)
+
+    try:
+        return result.decode('utf-8').strip().replace('\x00', '')
+    except AttributeError:
+        return result
+
+
+
+ +
+ +
+ + +

+ get_dicom_file_content() + +

+ + +
+ +

Retrieves DICOM file

+

This method retrieves bytes corresponding to DICOM file.

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ bytes + +
+

Bytes corresponding to DICOM file

+
+
+ + +

Examples:

+
from pyorthanc import Instance
+instance = Instance('instance_identifier', Orthanc('http://localhost:8042'))
+
+dicom_file_bytes = instance.get_dicom_file_content()
+with open('your_path', 'wb') as file_handler:
+    file_handler.write(dicom_file_bytes)
+
+ +
+ Source code in pyorthanc/_resources/instance.py +
22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
def get_dicom_file_content(self) -> bytes:
+    """Retrieves DICOM file
+
+    This method retrieves bytes corresponding to DICOM file.
+
+    Returns
+    -------
+    bytes
+        Bytes corresponding to DICOM file
+
+    Examples
+    --------
+    ```python
+    from pyorthanc import Instance
+    instance = Instance('instance_identifier', Orthanc('http://localhost:8042'))
+
+    dicom_file_bytes = instance.get_dicom_file_content()
+    with open('your_path', 'wb') as file_handler:
+        file_handler.write(dicom_file_bytes)
+    ```
+    """
+    return self.client.get_instances_id_file(self.id_)
+
+
+
+ +
+ +
+ + +

+ get_main_information() + +

+ + +
+ +

Get instance information

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Dict + +
+

Dictionary with tags as key and information as value

+
+
+ +
+ Source code in pyorthanc/_resources/instance.py +
80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
def get_main_information(self) -> Dict:
+    """Get instance information
+
+    Returns
+    -------
+    Dict
+        Dictionary with tags as key and information as value
+    """
+    if self.lock:
+        if self._information is None:
+            # Setup self._information for the first time when study is lock
+            self._information = self.client.get_instances_id(self.id_)
+
+        return self._information
+
+    return self.client.get_instances_id(self.id_)
+
+
+
+ +
+ +
+ + +

+ get_pydicom() + +

+ + +
+ +

Retrieve a pydicom.FileDataset object corresponding to the instance.

+ +
+ Source code in pyorthanc/_resources/instance.py +
335
+336
+337
def get_pydicom(self) -> pydicom.FileDataset:
+    """Retrieve a pydicom.FileDataset object corresponding to the instance."""
+    return util.get_pydicom(self.client, self.id_)
+
+
+
+ +
+ +
+ + +

+ modify(remove=None, replace=None, keep=None, remove_private_tags=False, keep_source=True, private_creator=None, force=False) + +

+ + +
+ +

Modify Instance

+

If no error has been raise, then it creates a new modified instance. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, +SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, +as this breaks the DICOM model of the real world.

+
+
+ None +
force + bool + +
+

Some tags can't be changed without forcing it (e.g. SOPInstanceUID) for security reason

+
+
+ False +
remove_private_tags + bool + +
+

If True, remove the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
private_creator + str + +
+

The private creator to be used for private tags in replace.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ bytes + +
+

Raw bytes of the modified instance.

+
+
+ +
+ Source code in pyorthanc/_resources/instance.py +
282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
def modify(self, remove: List = None, replace: Dict = None, keep: List = None,
+           remove_private_tags: bool = False, keep_source: bool = True,
+           private_creator: str = None, force: bool = False) -> bytes:
+    """Modify Instance
+
+    If no error has been raise, then it creates a new modified instance.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        Keep the original value of the specified tags, to be chosen among the StudyInstanceUID,
+        SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+        as this breaks the DICOM model of the real world.
+    force
+        Some tags can't be changed without forcing it (e.g. SOPInstanceUID) for security reason
+    remove_private_tags
+        If True, remove the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    private_creator
+        The private creator to be used for private tags in replace.
+
+    Returns
+    -------
+    bytes
+        Raw bytes of the modified instance.
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    if 'SOPInstanceUID' in replace and not force:
+        raise errors.ModificationError('If SOPInstanceUID is replaced, `force` must be `True`')
+
+    data = {
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'RemovePrivateTags': remove_private_tags,
+        'KeepSource': keep_source,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+
+    return self.client.post_instances_id_modify(self.id_, data)
+
+
+
+ +
+ +
+ + +

+ remove_label(label) + +

+ + +
+ +

Remove label from resource

+ +
+ Source code in pyorthanc/_resources/instance.py +
205
+206
+207
def remove_label(self, label):
+    """Remove label from resource"""
+    self.client.delete_instances_id_labels_label(self.id_, label)
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/resources/patient/index.html b/api/resources/patient/index.html new file mode 100644 index 0000000..58af8f5 --- /dev/null +++ b/api/resources/patient/index.html @@ -0,0 +1,5249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Patient - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Patient

+ +
+ + + +

+ pyorthanc.Patient + + +

+ + +
+

+ Bases: Resource

+ + +

Represent a Patient that is in an Orthanc server

+

This object has many getters that allow the user to retrieve metadata +or the entire DICOM file of the Patient

+ +
+ Source code in pyorthanc/_resources/patient.py +
 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
class Patient(Resource):
+    """Represent a Patient that is in an Orthanc server
+
+    This object has many getters that allow the user to retrieve metadata
+    or the entire DICOM file of the Patient
+    """
+
+    def get_main_information(self) -> Dict:
+        """Get Patient information
+
+        Returns
+        -------
+        Dict
+            Dictionary of patient main information.
+        """
+        if self.lock:
+            if self._information is None:
+                # Setup self._information for the first time when patient is lock
+                self._information = self.client.get_patients_id(self.id_)
+
+            return self._information
+
+        return self.client.get_patients_id(self.id_)
+
+    @property
+    def patient_id(self) -> str:
+        """Get patient ID"""
+        return self._get_main_dicom_tag_value('PatientID')
+
+    @property
+    def name(self) -> str:
+        """Get patient name"""
+        return self._get_main_dicom_tag_value('PatientName')
+
+    @property
+    def birth_date(self) -> datetime:
+        """Get patient birthdate"""
+        date = self._get_main_dicom_tag_value('PatientBirthDate')
+
+        return util.make_datetime_from_dicom_date(date)
+
+    @property
+    def sex(self) -> str:
+        """Get patient sex"""
+        return self._get_main_dicom_tag_value('PatientSex')
+
+    @property
+    def other_patient_ids(self) -> str:
+        return self._get_main_dicom_tag_value('OtherPatientIDs').split('\\')
+
+    @property
+    def is_stable(self):
+        return self.get_main_information()['IsStable']
+
+    @property
+    def last_update(self) -> datetime:
+        last_updated_date_and_time = self.get_main_information()['LastUpdate'].split('T')
+        date = last_updated_date_and_time[0]
+        time = last_updated_date_and_time[1]
+
+        return util.make_datetime_from_dicom_date(date, time)
+
+    @property
+    def labels(self) -> List[str]:
+        return self.get_main_information()['Labels']
+
+    def add_label(self, label: str) -> None:
+        self.client.put_patients_id_labels_label(self.id_, label)
+
+    def remove_label(self, label):
+        self.client.delete_patients_id_labels_label(self.id_, label)
+
+    def get_zip(self) -> bytes:
+        """Get the bytes of the zip file
+
+        Get the .zip file.
+
+        Returns
+        -------
+        bytes
+            Bytes of Zip file of the patient.
+
+        Examples
+        --------
+        ```python
+        from pyorthanc import Orthanc, Patient
+        a_patient = Patient(
+            'A_PATIENT_IDENTIFIER',
+            Orthanc('http://localhost:8042')
+        )
+        bytes_content = a_patient.get_zip()
+        with open('patient_zip_file_path.zip', 'wb') as file_handler:
+            file_handler.write(bytes_content)
+        ```
+        """
+        return self.client.get_patients_id_archive(self.id_)
+
+    def download(self, filepath: Union[str, BinaryIO], with_progres: bool = False) -> None:
+        """Download the zip file to a target path or buffer
+
+        This method is an alternative to the `.get_zip()` method for large files.
+        The `.get_zip()` method will pull all the data in a single GET call,
+        while `.download()` stream the data to a file or a buffer.
+        Favor the `.download()` method to avoid timeout and memory issues.
+
+        Examples
+        --------
+        ```python
+        from pyorthanc import Orthanc, Patient
+        a_patient = Patient('A_PATIENT_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+        # Download a zip
+        a_patient.download('patient.zip')
+
+        # Download a zip and show progress
+        a_patient.download('patient.zip', with_progres=True)
+
+        # Or download in a buffer in memory
+        buffer = io.BytesIO()
+        a_patient.download(buffer)
+        # Now do whatever you want to do
+        buffer.seek(0)
+        zip_bytes = buffer.read()
+        ```
+        """
+        self._download_file(f'{self.client.url}/patients/{self.id_}/archive', filepath, with_progres)
+
+    def get_patient_module(self, simplify: bool = False, short: bool = False) -> Dict:
+        """Get patient module in a simplified version
+
+        The method returns the DICOM patient module
+        (PatientName, PatientID, PatientBirthDate, ...)
+
+        Parameters
+        ----------
+        simplify
+            Get the simplified version of the tags
+        short
+            Get the short version of the tags
+
+        Returns
+        -------
+        Dict
+            DICOM Patient module.
+        """
+        params = self._make_response_format_params(simplify, short)
+
+        return dict(self.client.get_patients_id_module(
+            self.id_,
+            params=params
+        ))
+
+    @property
+    def protected(self) -> bool:
+        """Get if patient is protected against recycling
+
+        Protection against recycling: False means unprotected, True protected.
+
+        Returns
+        -------
+        bool
+            False means unprotected, True means protected.
+        """
+        return '1' == self.client.get_patients_id_protected(self.id_)
+
+    @protected.setter
+    def protected(self, value: bool):
+        # As of version 1.11.1, the Orthanc OPEN API file has missing information
+        self.client._put(
+            f'{self.client.url}/patients/{self.id_}/protected',
+            json=1 if value else 0  # 1 means it will be protected, 0 means unprotected
+        )
+
+    def is_protected(self) -> bool:
+        """Get if patient is protected against recycling
+
+        Protection against recycling: False means unprotected, True protected.
+
+        Returns
+        -------
+        bool
+            False means unprotected, True means protected.
+        """
+        DeprecationWarning(
+            '`patient.is_protected()` is deprecated and will be removed in future release. '
+            'Use `patient.protected` instead.'
+        )
+        return self.protected
+
+    def set_to_protected(self):
+        """Set patient to protected state
+
+        Returns
+        -------
+        None
+            Nothing.
+        """
+        # As of version 1.11.1, the Orthanc OPEN API file has missing information
+        warnings.warn(
+            '`patient.set_to_protected()` is deprecated and will be removed in future release. '
+            'Use `patient.protected = True` instead.',
+            DeprecationWarning
+        )
+        self.protected = True
+
+    def set_to_unprotected(self):
+        """Set patient to unprotected state
+
+        Returns
+        -------
+        None
+            Nothing.
+        """
+        # As of version 1.11.1, the Orthanc OPEN API file has missing information
+        warnings.warn(
+            '`patient.set_to_protected()` is deprecated and will be removed in future release. '
+            'Use `patient.protected = True` instead.',
+            DeprecationWarning
+        )
+        self.protected = False
+
+    @property
+    def studies(self) -> List[Study]:
+        """Get patient's studies
+
+        Returns
+        -------
+        List[Study]
+            List of the patient's studies
+        """
+        if self.lock:
+            if self._child_resources is None:
+                studies_ids = self.get_main_information()['Studies']
+                self._child_resources = [Study(i, self.client, self.lock) for i in studies_ids]
+
+            return self._child_resources
+
+        studies_ids = self.get_main_information()['Studies']
+
+        return [Study(i, self.client, self.lock) for i in studies_ids]
+
+    def anonymize(self, remove: List = None, replace: Dict = None, keep: List = None,
+                  force: bool = False, keep_private_tags: bool = False,
+                  keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                  private_creator: str = None, dicom_version: str = None) -> 'Patient':
+        """Anonymize patient
+
+        If no error has been raise, then it creates a new anonymous patient.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Notes
+        -----
+        This method might be long to run, especially on large patient or when multiple
+        patients are anonymized. In those cases, it is recommended to use the `.anonymize_as_job()`
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            List of tag to keep unchanged
+        force
+            Some tags can't be changed without forcing it (e.g. PatientID) for security reason
+        keep_private_tags
+            If True, keep the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        priority
+            Priority of the job. The lower the value, the higher the priority.
+        permissive
+            If True, ignore errors during the individual steps of the job.
+        private_creator
+            The private creator to be used for private tags in Replace.
+        dicom_version
+            Version of the DICOM standard to be used for anonymization.
+            Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+        Returns
+        -------
+        Patient
+            A New anonymous patient.
+
+        Examples
+        --------
+        ```python
+        new_patient = patient.anonymize()
+
+        new_patient_with_specific_patient_id = patient.anonymize(
+            keep=['PatientName'],
+            replace={'PatientID': 'TheNewPatientID'},
+            force=True
+        )
+        ```
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        data = {
+            'Asynchronous': False,
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'KeepPrivateTags': keep_private_tags,
+            'KeepSource': keep_source,
+            'Priority': priority,
+            'Permissive': permissive,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+        if dicom_version is not None:
+            data['DicomVersion'] = dicom_version
+
+        try:
+            anonymous_patient = self.client.post_patients_id_anonymize(self.id_, data)
+        except ReadTimeout:
+            raise ReadTimeout(
+                'Patient anonymization is too long to process. '
+                'Use `.anonymize_as_job` or increase client.timeout.'
+            )
+
+        return Patient(anonymous_patient['ID'], self.client)
+
+    def anonymize_as_job(self, remove: List = None, replace: Dict = None, keep: List = None,
+                         force: bool = False, keep_private_tags: bool = False,
+                         keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                         private_creator: str = None, dicom_version: str = None) -> Job:
+        """Anonymize patient and return a job
+
+        Launch an anonymization job.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Notes
+        -----
+        This method is useful when anonymizing large patient or launching many
+        anonymization jobs. The jobs are sent to Orthanc and processed according
+        to the priority.
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            List of tag to keep unchanged
+        force
+            Some tags can't be changed without forcing it (e.g. PatientID) for security reason
+        keep_private_tags
+            If True, keep the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        priority
+            Priority of the job. The lower the value, the higher the priority.
+        permissive
+            If True, ignore errors during the individual steps of the job.
+        private_creator
+            The private creator to be used for private tags in Replace.
+        dicom_version
+            Version of the DICOM standard to be used for anonymization.
+            Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+        Returns
+        -------
+        Job
+            Return a Job object of the anonymization job.
+
+        Examples
+        --------
+        For large patient (recommended)
+        ```python
+        job = patient.anonymize_as_job()
+        job.state  # You can follow the job state
+
+        job.wait_until_completion() # Or just wait on its completion
+        new_patient = Patient(job.content['ID'], orthanc)
+        ```
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        data = {
+            'Asynchronous': True,
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'KeepPrivateTags': keep_private_tags,
+            'KeepSource': keep_source,
+            'Priority': priority,
+            'Permissive': permissive,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+        if dicom_version is not None:
+            data['DicomVersion'] = dicom_version
+
+        job_info = self.client.post_patients_id_anonymize(self.id_, data)
+
+        return Job(job_info['ID'], self.client)
+
+    def modify(self, remove: List = None, replace: Dict = None, keep: List = None,
+               force: bool = False, remove_private_tags: bool = False,
+               keep_source: bool = True, priority: int = 0, permissive: bool = False,
+               private_creator: str = None) -> 'Patient':
+        """Modify patient
+
+        If no error has been raise, then modify the patient. If the PatientID is replaced
+        (with `force=True`), then return a new patient.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Notes
+        -----
+        This method might be long to run, especially on large patient or when multiple
+        patients are modified. In those cases, it is recommended to use the `.modify_as_job()`
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            Keep the original value of the specified tags, to be chosen among the StudyInstanceUID,
+            SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+            as this breaks the DICOM model of the real world.
+        force
+            Some tags can't be changed without forcing it (e.g. PatientID) for security reason
+        remove_private_tags
+            If True, remove the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        priority
+            Priority of the job. The lower the value, the higher the priority.
+        permissive
+            If True, ignore errors during the individual steps of the job.
+        private_creator
+            The private creator to be used for private tags in Replace.
+
+        Returns
+        -------
+        Patient
+            Returns a new patient if the "PatientID" tag has been replaced,
+            returns itself if not (in this case, the patient itself is modified).
+
+        Examples
+        --------
+        ```python
+        patient.modify(remove=['PatientName'])
+        patient.name  # will raise
+
+        modified_patient = patient.modify(replace={'PatientID': 'TheNewPatientID'}, force=True)
+        assert modified_patient.patient_id == 'TheNewPatientID'
+        ```
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        if 'PatientID' in replace and not force:
+            raise errors.ModificationError('If PatientID is replaced, `force` must be `True`')
+
+        data = {
+            'Asynchronous': False,
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'RemovePrivateTags': remove_private_tags,
+            'KeepSource': keep_source,
+            'Priority': priority,
+            'Permissive': permissive,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+
+        try:
+            modified_patient = self.client.post_patients_id_modify(self.id_, data)
+        except ReadTimeout:
+            raise ReadTimeout(
+                'Patient modification is too long to process. '
+                'Use `.modify_as_job` or increase client.timeout.'
+            )
+
+        # if 'PatientID' is not affected, the modified_patient['ID'] is the same as self.id_
+        return Patient(modified_patient['ID'], self.client)
+
+    def modify_as_job(self, remove: List = None, replace: Dict = None, keep: List = None,
+                      force: bool = False, remove_private_tags: bool = False,
+                      keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                      private_creator: str = None) -> Job:
+        """Modify patient and return a job
+
+        Launch a modification job. If the PatientID is replaced (with `force=True`),
+        then return a new patient. If the PatientID is not replaced, the patient itself is modified.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Notes
+        -----
+        This method is useful when modifying large patient or launching many
+        modification jobs. The jobs are sent to Orthanc and processed according
+        to the priority.
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            Keep the original value of the specified tags, to be chosen among the StudyInstanceUID,
+            SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+            as this breaks the DICOM model of the real world.
+        force
+            Allow the modification of tags related to DICOM identifiers, at the risk of breaking
+            the DICOM model of the real world.
+        remove_private_tags
+            If True, remove the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        priority
+            Priority of the job. The lower the value, the higher the priority.
+        permissive
+            If True, ignore errors during the individual steps of the job.
+        private_creator
+            The private creator to be used for private tags in Replace.
+
+        Returns
+        -------
+        Job
+            Return a Job object of the anonymization job.
+
+        Examples
+        --------
+        For large patient (recommended)
+        ```python
+        job = patient.modify_as_job(replace={'PatientName': 'NewName'})
+        job.state  # You can follow the job state
+
+        job.wait_until_completion() # Or just wait on its completion
+        assert patient.name == 'NewName'
+        ```
+        Or modify the PatientID
+        ```python
+        job = patient.modify_as_job(replace={'PatientID': 'new-id'}, force=True)
+        job.wait_until_completion() # Or just wait on its completion
+
+        modified_patient = Patient(job.content['ID'], client)
+        assert patient.patient_id != 'new_id'
+        assert modified_patient.patient_id == 'new_id'
+        ```
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        if 'PatientID' in replace and not force:
+            raise errors.ModificationError('If PatientID is affected, `force` must be `True`')
+
+        data = {
+            'Asynchronous': True,
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'RemovePrivateTags': remove_private_tags,
+            'KeepSource': keep_source,
+            'Priority': priority,
+            'Permissive': permissive,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+
+        job_info = self.client.post_patients_id_modify(self.id_, data)
+
+        return Job(job_info['ID'], self.client)
+
+    def get_shared_tags(self, simplify: bool = False, short: bool = False) -> Dict:
+        """Retrieve the shared tags of the patient"""
+        params = self._make_response_format_params(simplify, short)
+
+        return dict(self.client.get_patients_id_shared_tags(
+            self.id_,
+            params=params
+        ))
+
+    @property
+    def shared_tags(self) -> Dict:
+        return self.get_shared_tags(simplify=True)
+
+    def remove_empty_studies(self) -> None:
+        """Delete empty studies."""
+        if self._child_resources is None:
+            return
+
+        for study in self._child_resources:
+            study.remove_empty_series()
+
+        self._child_resources = [study for study in self._child_resources if study._child_resources != []]
+
+
+ + + +
+ + + + + + + +
+ + + +

+ birth_date: datetime + + + property + + +

+ + +
+ +

Get patient birthdate

+
+ +
+ +
+ + + +

+ is_stable + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ labels: List[str] + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ last_update: datetime + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ name: str + + + property + + +

+ + +
+ +

Get patient name

+
+ +
+ +
+ + + +

+ other_patient_ids: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ patient_id: str + + + property + + +

+ + +
+ +

Get patient ID

+
+ +
+ +
+ + + +

+ protected: bool + + + property + writable + + +

+ + +
+ +

Get if patient is protected against recycling

+

Protection against recycling: False means unprotected, True protected.

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ bool + +
+

False means unprotected, True means protected.

+
+
+
+ +
+ +
+ + + +

+ sex: str + + + property + + +

+ + +
+ +

Get patient sex

+
+ +
+ +
+ + + +

+ shared_tags: Dict + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ studies: List[Study] + + + property + + +

+ + +
+ +

Get patient's studies

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ List[Study] + +
+

List of the patient's studies

+
+
+
+ +
+ + + +
+ + +

+ add_label(label) + +

+ + +
+ +
+ Source code in pyorthanc/_resources/patient.py +
79
+80
def add_label(self, label: str) -> None:
+    self.client.put_patients_id_labels_label(self.id_, label)
+
+
+
+ +
+ +
+ + +

+ anonymize(remove=None, replace=None, keep=None, force=False, keep_private_tags=False, keep_source=True, priority=0, permissive=False, private_creator=None, dicom_version=None) + +

+ + +
+ +

Anonymize patient

+

If no error has been raise, then it creates a new anonymous patient. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +
+ Notes +

This method might be long to run, especially on large patient or when multiple +patients are anonymized. In those cases, it is recommended to use the .anonymize_as_job()

+
+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

List of tag to keep unchanged

+
+
+ None +
force + bool + +
+

Some tags can't be changed without forcing it (e.g. PatientID) for security reason

+
+
+ False +
keep_private_tags + bool + +
+

If True, keep the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
priority + int + +
+

Priority of the job. The lower the value, the higher the priority.

+
+
+ 0 +
permissive + bool + +
+

If True, ignore errors during the individual steps of the job.

+
+
+ False +
private_creator + str + +
+

The private creator to be used for private tags in Replace.

+
+
+ None +
dicom_version + str + +
+

Version of the DICOM standard to be used for anonymization. +Check out configuration option DeidentifyLogsDicomVersion for possible values.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Patient + +
+

A New anonymous patient.

+
+
+ + +

Examples:

+
new_patient = patient.anonymize()
+
+new_patient_with_specific_patient_id = patient.anonymize(
+    keep=['PatientName'],
+    replace={'PatientID': 'TheNewPatientID'},
+    force=True
+)
+
+ +
+ Source code in pyorthanc/_resources/patient.py +
254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
def anonymize(self, remove: List = None, replace: Dict = None, keep: List = None,
+              force: bool = False, keep_private_tags: bool = False,
+              keep_source: bool = True, priority: int = 0, permissive: bool = False,
+              private_creator: str = None, dicom_version: str = None) -> 'Patient':
+    """Anonymize patient
+
+    If no error has been raise, then it creates a new anonymous patient.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Notes
+    -----
+    This method might be long to run, especially on large patient or when multiple
+    patients are anonymized. In those cases, it is recommended to use the `.anonymize_as_job()`
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        List of tag to keep unchanged
+    force
+        Some tags can't be changed without forcing it (e.g. PatientID) for security reason
+    keep_private_tags
+        If True, keep the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    priority
+        Priority of the job. The lower the value, the higher the priority.
+    permissive
+        If True, ignore errors during the individual steps of the job.
+    private_creator
+        The private creator to be used for private tags in Replace.
+    dicom_version
+        Version of the DICOM standard to be used for anonymization.
+        Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+    Returns
+    -------
+    Patient
+        A New anonymous patient.
+
+    Examples
+    --------
+    ```python
+    new_patient = patient.anonymize()
+
+    new_patient_with_specific_patient_id = patient.anonymize(
+        keep=['PatientName'],
+        replace={'PatientID': 'TheNewPatientID'},
+        force=True
+    )
+    ```
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    data = {
+        'Asynchronous': False,
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'KeepPrivateTags': keep_private_tags,
+        'KeepSource': keep_source,
+        'Priority': priority,
+        'Permissive': permissive,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+    if dicom_version is not None:
+        data['DicomVersion'] = dicom_version
+
+    try:
+        anonymous_patient = self.client.post_patients_id_anonymize(self.id_, data)
+    except ReadTimeout:
+        raise ReadTimeout(
+            'Patient anonymization is too long to process. '
+            'Use `.anonymize_as_job` or increase client.timeout.'
+        )
+
+    return Patient(anonymous_patient['ID'], self.client)
+
+
+
+ +
+ +
+ + +

+ anonymize_as_job(remove=None, replace=None, keep=None, force=False, keep_private_tags=False, keep_source=True, priority=0, permissive=False, private_creator=None, dicom_version=None) + +

+ + +
+ +

Anonymize patient and return a job

+

Launch an anonymization job. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +
+ Notes +

This method is useful when anonymizing large patient or launching many +anonymization jobs. The jobs are sent to Orthanc and processed according +to the priority.

+
+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

List of tag to keep unchanged

+
+
+ None +
force + bool + +
+

Some tags can't be changed without forcing it (e.g. PatientID) for security reason

+
+
+ False +
keep_private_tags + bool + +
+

If True, keep the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
priority + int + +
+

Priority of the job. The lower the value, the higher the priority.

+
+
+ 0 +
permissive + bool + +
+

If True, ignore errors during the individual steps of the job.

+
+
+ False +
private_creator + str + +
+

The private creator to be used for private tags in Replace.

+
+
+ None +
dicom_version + str + +
+

Version of the DICOM standard to be used for anonymization. +Check out configuration option DeidentifyLogsDicomVersion for possible values.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Job + +
+

Return a Job object of the anonymization job.

+
+
+ + +

Examples:

+

For large patient (recommended)

+
job = patient.anonymize_as_job()
+job.state  # You can follow the job state
+
+job.wait_until_completion() # Or just wait on its completion
+new_patient = Patient(job.content['ID'], orthanc)
+
+ +
+ Source code in pyorthanc/_resources/patient.py +
340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
def anonymize_as_job(self, remove: List = None, replace: Dict = None, keep: List = None,
+                     force: bool = False, keep_private_tags: bool = False,
+                     keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                     private_creator: str = None, dicom_version: str = None) -> Job:
+    """Anonymize patient and return a job
+
+    Launch an anonymization job.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Notes
+    -----
+    This method is useful when anonymizing large patient or launching many
+    anonymization jobs. The jobs are sent to Orthanc and processed according
+    to the priority.
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        List of tag to keep unchanged
+    force
+        Some tags can't be changed without forcing it (e.g. PatientID) for security reason
+    keep_private_tags
+        If True, keep the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    priority
+        Priority of the job. The lower the value, the higher the priority.
+    permissive
+        If True, ignore errors during the individual steps of the job.
+    private_creator
+        The private creator to be used for private tags in Replace.
+    dicom_version
+        Version of the DICOM standard to be used for anonymization.
+        Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+    Returns
+    -------
+    Job
+        Return a Job object of the anonymization job.
+
+    Examples
+    --------
+    For large patient (recommended)
+    ```python
+    job = patient.anonymize_as_job()
+    job.state  # You can follow the job state
+
+    job.wait_until_completion() # Or just wait on its completion
+    new_patient = Patient(job.content['ID'], orthanc)
+    ```
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    data = {
+        'Asynchronous': True,
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'KeepPrivateTags': keep_private_tags,
+        'KeepSource': keep_source,
+        'Priority': priority,
+        'Permissive': permissive,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+    if dicom_version is not None:
+        data['DicomVersion'] = dicom_version
+
+    job_info = self.client.post_patients_id_anonymize(self.id_, data)
+
+    return Job(job_info['ID'], self.client)
+
+
+
+ +
+ +
+ + +

+ download(filepath, with_progres=False) + +

+ + +
+ +

Download the zip file to a target path or buffer

+

This method is an alternative to the .get_zip() method for large files. +The .get_zip() method will pull all the data in a single GET call, +while .download() stream the data to a file or a buffer. +Favor the .download() method to avoid timeout and memory issues.

+ + +

Examples:

+
from pyorthanc import Orthanc, Patient
+a_patient = Patient('A_PATIENT_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+# Download a zip
+a_patient.download('patient.zip')
+
+# Download a zip and show progress
+a_patient.download('patient.zip', with_progres=True)
+
+# Or download in a buffer in memory
+buffer = io.BytesIO()
+a_patient.download(buffer)
+# Now do whatever you want to do
+buffer.seek(0)
+zip_bytes = buffer.read()
+
+ +
+ Source code in pyorthanc/_resources/patient.py +
110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
def download(self, filepath: Union[str, BinaryIO], with_progres: bool = False) -> None:
+    """Download the zip file to a target path or buffer
+
+    This method is an alternative to the `.get_zip()` method for large files.
+    The `.get_zip()` method will pull all the data in a single GET call,
+    while `.download()` stream the data to a file or a buffer.
+    Favor the `.download()` method to avoid timeout and memory issues.
+
+    Examples
+    --------
+    ```python
+    from pyorthanc import Orthanc, Patient
+    a_patient = Patient('A_PATIENT_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+    # Download a zip
+    a_patient.download('patient.zip')
+
+    # Download a zip and show progress
+    a_patient.download('patient.zip', with_progres=True)
+
+    # Or download in a buffer in memory
+    buffer = io.BytesIO()
+    a_patient.download(buffer)
+    # Now do whatever you want to do
+    buffer.seek(0)
+    zip_bytes = buffer.read()
+    ```
+    """
+    self._download_file(f'{self.client.url}/patients/{self.id_}/archive', filepath, with_progres)
+
+
+
+ +
+ +
+ + +

+ get_main_information() + +

+ + +
+ +

Get Patient information

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Dict + +
+

Dictionary of patient main information.

+
+
+ +
+ Source code in pyorthanc/_resources/patient.py +
20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
def get_main_information(self) -> Dict:
+    """Get Patient information
+
+    Returns
+    -------
+    Dict
+        Dictionary of patient main information.
+    """
+    if self.lock:
+        if self._information is None:
+            # Setup self._information for the first time when patient is lock
+            self._information = self.client.get_patients_id(self.id_)
+
+        return self._information
+
+    return self.client.get_patients_id(self.id_)
+
+
+
+ +
+ +
+ + +

+ get_patient_module(simplify=False, short=False) + +

+ + +
+ +

Get patient module in a simplified version

+

The method returns the DICOM patient module +(PatientName, PatientID, PatientBirthDate, ...)

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
simplify + bool + +
+

Get the simplified version of the tags

+
+
+ False +
short + bool + +
+

Get the short version of the tags

+
+
+ False +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Dict + +
+

DICOM Patient module.

+
+
+ +
+ Source code in pyorthanc/_resources/patient.py +
140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
def get_patient_module(self, simplify: bool = False, short: bool = False) -> Dict:
+    """Get patient module in a simplified version
+
+    The method returns the DICOM patient module
+    (PatientName, PatientID, PatientBirthDate, ...)
+
+    Parameters
+    ----------
+    simplify
+        Get the simplified version of the tags
+    short
+        Get the short version of the tags
+
+    Returns
+    -------
+    Dict
+        DICOM Patient module.
+    """
+    params = self._make_response_format_params(simplify, short)
+
+    return dict(self.client.get_patients_id_module(
+        self.id_,
+        params=params
+    ))
+
+
+
+ +
+ +
+ + +

+ get_shared_tags(simplify=False, short=False) + +

+ + +
+ +

Retrieve the shared tags of the patient

+ +
+ Source code in pyorthanc/_resources/patient.py +
598
+599
+600
+601
+602
+603
+604
+605
def get_shared_tags(self, simplify: bool = False, short: bool = False) -> Dict:
+    """Retrieve the shared tags of the patient"""
+    params = self._make_response_format_params(simplify, short)
+
+    return dict(self.client.get_patients_id_shared_tags(
+        self.id_,
+        params=params
+    ))
+
+
+
+ +
+ +
+ + +

+ get_zip() + +

+ + +
+ +

Get the bytes of the zip file

+

Get the .zip file.

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ bytes + +
+

Bytes of Zip file of the patient.

+
+
+ + +

Examples:

+
from pyorthanc import Orthanc, Patient
+a_patient = Patient(
+    'A_PATIENT_IDENTIFIER',
+    Orthanc('http://localhost:8042')
+)
+bytes_content = a_patient.get_zip()
+with open('patient_zip_file_path.zip', 'wb') as file_handler:
+    file_handler.write(bytes_content)
+
+ +
+ Source code in pyorthanc/_resources/patient.py +
 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
def get_zip(self) -> bytes:
+    """Get the bytes of the zip file
+
+    Get the .zip file.
+
+    Returns
+    -------
+    bytes
+        Bytes of Zip file of the patient.
+
+    Examples
+    --------
+    ```python
+    from pyorthanc import Orthanc, Patient
+    a_patient = Patient(
+        'A_PATIENT_IDENTIFIER',
+        Orthanc('http://localhost:8042')
+    )
+    bytes_content = a_patient.get_zip()
+    with open('patient_zip_file_path.zip', 'wb') as file_handler:
+        file_handler.write(bytes_content)
+    ```
+    """
+    return self.client.get_patients_id_archive(self.id_)
+
+
+
+ +
+ +
+ + +

+ is_protected() + +

+ + +
+ +

Get if patient is protected against recycling

+

Protection against recycling: False means unprotected, True protected.

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ bool + +
+

False means unprotected, True means protected.

+
+
+ +
+ Source code in pyorthanc/_resources/patient.py +
186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
def is_protected(self) -> bool:
+    """Get if patient is protected against recycling
+
+    Protection against recycling: False means unprotected, True protected.
+
+    Returns
+    -------
+    bool
+        False means unprotected, True means protected.
+    """
+    DeprecationWarning(
+        '`patient.is_protected()` is deprecated and will be removed in future release. '
+        'Use `patient.protected` instead.'
+    )
+    return self.protected
+
+
+
+ +
+ +
+ + +

+ modify(remove=None, replace=None, keep=None, force=False, remove_private_tags=False, keep_source=True, priority=0, permissive=False, private_creator=None) + +

+ + +
+ +

Modify patient

+

If no error has been raise, then modify the patient. If the PatientID is replaced +(with force=True), then return a new patient. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +
+ Notes +

This method might be long to run, especially on large patient or when multiple +patients are modified. In those cases, it is recommended to use the .modify_as_job()

+
+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, +SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, +as this breaks the DICOM model of the real world.

+
+
+ None +
force + bool + +
+

Some tags can't be changed without forcing it (e.g. PatientID) for security reason

+
+
+ False +
remove_private_tags + bool + +
+

If True, remove the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
priority + int + +
+

Priority of the job. The lower the value, the higher the priority.

+
+
+ 0 +
permissive + bool + +
+

If True, ignore errors during the individual steps of the job.

+
+
+ False +
private_creator + str + +
+

The private creator to be used for private tags in Replace.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Patient + +
+

Returns a new patient if the "PatientID" tag has been replaced, +returns itself if not (in this case, the patient itself is modified).

+
+
+ + +

Examples:

+
patient.modify(remove=['PatientName'])
+patient.name  # will raise
+
+modified_patient = patient.modify(replace={'PatientID': 'TheNewPatientID'}, force=True)
+assert modified_patient.patient_id == 'TheNewPatientID'
+
+ +
+ Source code in pyorthanc/_resources/patient.py +
420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
def modify(self, remove: List = None, replace: Dict = None, keep: List = None,
+           force: bool = False, remove_private_tags: bool = False,
+           keep_source: bool = True, priority: int = 0, permissive: bool = False,
+           private_creator: str = None) -> 'Patient':
+    """Modify patient
+
+    If no error has been raise, then modify the patient. If the PatientID is replaced
+    (with `force=True`), then return a new patient.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Notes
+    -----
+    This method might be long to run, especially on large patient or when multiple
+    patients are modified. In those cases, it is recommended to use the `.modify_as_job()`
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        Keep the original value of the specified tags, to be chosen among the StudyInstanceUID,
+        SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+        as this breaks the DICOM model of the real world.
+    force
+        Some tags can't be changed without forcing it (e.g. PatientID) for security reason
+    remove_private_tags
+        If True, remove the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    priority
+        Priority of the job. The lower the value, the higher the priority.
+    permissive
+        If True, ignore errors during the individual steps of the job.
+    private_creator
+        The private creator to be used for private tags in Replace.
+
+    Returns
+    -------
+    Patient
+        Returns a new patient if the "PatientID" tag has been replaced,
+        returns itself if not (in this case, the patient itself is modified).
+
+    Examples
+    --------
+    ```python
+    patient.modify(remove=['PatientName'])
+    patient.name  # will raise
+
+    modified_patient = patient.modify(replace={'PatientID': 'TheNewPatientID'}, force=True)
+    assert modified_patient.patient_id == 'TheNewPatientID'
+    ```
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    if 'PatientID' in replace and not force:
+        raise errors.ModificationError('If PatientID is replaced, `force` must be `True`')
+
+    data = {
+        'Asynchronous': False,
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'RemovePrivateTags': remove_private_tags,
+        'KeepSource': keep_source,
+        'Priority': priority,
+        'Permissive': permissive,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+
+    try:
+        modified_patient = self.client.post_patients_id_modify(self.id_, data)
+    except ReadTimeout:
+        raise ReadTimeout(
+            'Patient modification is too long to process. '
+            'Use `.modify_as_job` or increase client.timeout.'
+        )
+
+    # if 'PatientID' is not affected, the modified_patient['ID'] is the same as self.id_
+    return Patient(modified_patient['ID'], self.client)
+
+
+
+ +
+ +
+ + +

+ modify_as_job(remove=None, replace=None, keep=None, force=False, remove_private_tags=False, keep_source=True, priority=0, permissive=False, private_creator=None) + +

+ + +
+ +

Modify patient and return a job

+

Launch a modification job. If the PatientID is replaced (with force=True), +then return a new patient. If the PatientID is not replaced, the patient itself is modified. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +
+ Notes +

This method is useful when modifying large patient or launching many +modification jobs. The jobs are sent to Orthanc and processed according +to the priority.

+
+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, +SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, +as this breaks the DICOM model of the real world.

+
+
+ None +
force + bool + +
+

Allow the modification of tags related to DICOM identifiers, at the risk of breaking +the DICOM model of the real world.

+
+
+ False +
remove_private_tags + bool + +
+

If True, remove the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
priority + int + +
+

Priority of the job. The lower the value, the higher the priority.

+
+
+ 0 +
permissive + bool + +
+

If True, ignore errors during the individual steps of the job.

+
+
+ False +
private_creator + str + +
+

The private creator to be used for private tags in Replace.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Job + +
+

Return a Job object of the anonymization job.

+
+
+ + +

Examples:

+

For large patient (recommended)

+
job = patient.modify_as_job(replace={'PatientName': 'NewName'})
+job.state  # You can follow the job state
+
+job.wait_until_completion() # Or just wait on its completion
+assert patient.name == 'NewName'
+
+ +

Or modify the PatientID

+
job = patient.modify_as_job(replace={'PatientID': 'new-id'}, force=True)
+job.wait_until_completion() # Or just wait on its completion
+
+modified_patient = Patient(job.content['ID'], client)
+assert patient.patient_id != 'new_id'
+assert modified_patient.patient_id == 'new_id'
+
+ +
+ Source code in pyorthanc/_resources/patient.py +
507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
def modify_as_job(self, remove: List = None, replace: Dict = None, keep: List = None,
+                  force: bool = False, remove_private_tags: bool = False,
+                  keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                  private_creator: str = None) -> Job:
+    """Modify patient and return a job
+
+    Launch a modification job. If the PatientID is replaced (with `force=True`),
+    then return a new patient. If the PatientID is not replaced, the patient itself is modified.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Notes
+    -----
+    This method is useful when modifying large patient or launching many
+    modification jobs. The jobs are sent to Orthanc and processed according
+    to the priority.
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        Keep the original value of the specified tags, to be chosen among the StudyInstanceUID,
+        SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+        as this breaks the DICOM model of the real world.
+    force
+        Allow the modification of tags related to DICOM identifiers, at the risk of breaking
+        the DICOM model of the real world.
+    remove_private_tags
+        If True, remove the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    priority
+        Priority of the job. The lower the value, the higher the priority.
+    permissive
+        If True, ignore errors during the individual steps of the job.
+    private_creator
+        The private creator to be used for private tags in Replace.
+
+    Returns
+    -------
+    Job
+        Return a Job object of the anonymization job.
+
+    Examples
+    --------
+    For large patient (recommended)
+    ```python
+    job = patient.modify_as_job(replace={'PatientName': 'NewName'})
+    job.state  # You can follow the job state
+
+    job.wait_until_completion() # Or just wait on its completion
+    assert patient.name == 'NewName'
+    ```
+    Or modify the PatientID
+    ```python
+    job = patient.modify_as_job(replace={'PatientID': 'new-id'}, force=True)
+    job.wait_until_completion() # Or just wait on its completion
+
+    modified_patient = Patient(job.content['ID'], client)
+    assert patient.patient_id != 'new_id'
+    assert modified_patient.patient_id == 'new_id'
+    ```
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    if 'PatientID' in replace and not force:
+        raise errors.ModificationError('If PatientID is affected, `force` must be `True`')
+
+    data = {
+        'Asynchronous': True,
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'RemovePrivateTags': remove_private_tags,
+        'KeepSource': keep_source,
+        'Priority': priority,
+        'Permissive': permissive,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+
+    job_info = self.client.post_patients_id_modify(self.id_, data)
+
+    return Job(job_info['ID'], self.client)
+
+
+
+ +
+ +
+ + +

+ remove_empty_studies() + +

+ + +
+ +

Delete empty studies.

+ +
+ Source code in pyorthanc/_resources/patient.py +
611
+612
+613
+614
+615
+616
+617
+618
+619
def remove_empty_studies(self) -> None:
+    """Delete empty studies."""
+    if self._child_resources is None:
+        return
+
+    for study in self._child_resources:
+        study.remove_empty_series()
+
+    self._child_resources = [study for study in self._child_resources if study._child_resources != []]
+
+
+
+ +
+ +
+ + +

+ remove_label(label) + +

+ + +
+ +
+ Source code in pyorthanc/_resources/patient.py +
82
+83
def remove_label(self, label):
+    self.client.delete_patients_id_labels_label(self.id_, label)
+
+
+
+ +
+ +
+ + +

+ set_to_protected() + +

+ + +
+ +

Set patient to protected state

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ None + +
+

Nothing.

+
+
+ +
+ Source code in pyorthanc/_resources/patient.py +
202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
def set_to_protected(self):
+    """Set patient to protected state
+
+    Returns
+    -------
+    None
+        Nothing.
+    """
+    # As of version 1.11.1, the Orthanc OPEN API file has missing information
+    warnings.warn(
+        '`patient.set_to_protected()` is deprecated and will be removed in future release. '
+        'Use `patient.protected = True` instead.',
+        DeprecationWarning
+    )
+    self.protected = True
+
+
+
+ +
+ +
+ + +

+ set_to_unprotected() + +

+ + +
+ +

Set patient to unprotected state

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ None + +
+

Nothing.

+
+
+ +
+ Source code in pyorthanc/_resources/patient.py +
218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
def set_to_unprotected(self):
+    """Set patient to unprotected state
+
+    Returns
+    -------
+    None
+        Nothing.
+    """
+    # As of version 1.11.1, the Orthanc OPEN API file has missing information
+    warnings.warn(
+        '`patient.set_to_protected()` is deprecated and will be removed in future release. '
+        'Use `patient.protected = True` instead.',
+        DeprecationWarning
+    )
+    self.protected = False
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/resources/resource/index.html b/api/resources/resource/index.html new file mode 100644 index 0000000..1fde69b --- /dev/null +++ b/api/resources/resource/index.html @@ -0,0 +1,1989 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Resource - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Resource

+ +
+ + + +

+ pyorthanc._resources.Resource + + +

+ + +
+ + +
+ Source code in pyorthanc/_resources/resource.py +
 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
class Resource:
+
+    def __init__(self, id_: str, client: Orthanc, lock: bool = False) -> None:
+        """Constructor
+
+        Parameters
+        ----------
+        id_
+            Orthanc identifier of the resource
+        client
+            Orthanc client
+        lock
+            Specify if the Resource state should be locked. This is useful when the child resources
+            have been filtered out, and you don't want the resource to return an updated version
+            or all of those children. "lock=True" is notably used for the "find" function,
+            so that only the filtered resources are kept.
+        """
+        client = util.ensure_non_raw_response(client)
+
+        self.id_ = id_
+        self.client = client
+
+        self.lock = lock
+        self._information: Optional[Dict] = None
+        self._child_resources: Optional[List['Resource']] = None
+
+    @property
+    def identifier(self) -> str:
+        """Get Orthanc's identifier
+
+        Returns
+        -------
+        str
+            Resource's identifier
+        """
+        return self.id_
+
+    @property
+    def main_dicom_tags(self) -> Dict[str, str]:
+        return self.get_main_information()['MainDicomTags']
+
+    @abc.abstractmethod
+    def get_main_information(self):
+        raise NotImplementedError
+
+    def _get_main_dicom_tag_value(self, tag: str) -> Any:
+        try:
+            return self.get_main_information()['MainDicomTags'][tag]
+        except KeyError:
+            raise errors.TagDoesNotExistError(f'{self} has no {tag} tag.')
+
+    def _make_response_format_params(self, simplify: bool = False, short: bool = False) -> Dict:
+        if simplify and not short:
+            params = {'simplify': True}
+        elif short and not simplify:
+            params = {'short': True}
+        elif simplify and short:
+            raise ValueError('simplify and short can\'t be both True.')
+        else:
+            params = {}
+
+        return params
+
+    def _download_file(
+            self, url: str,
+            filepath: Union[str, BinaryIO],
+            with_progress: bool = False,
+            params: Optional[QueryParamTypes] = None):
+        # Check if filepath is a path or a file object.
+        if isinstance(filepath, str):
+            is_file_object = False
+            filepath = open(filepath, 'wb')
+        elif hasattr(filepath, 'write') and hasattr(filepath, 'seek'):
+            is_file_object = True
+        else:
+            raise TypeError(f'"path" must be a file-like object or a file path, got "{type(filepath).__name__}".')
+
+        try:
+            with self.client.stream('GET', url, params=params) as response:
+                if with_progress:
+                    try:
+                        from tqdm import tqdm
+                    except ModuleNotFoundError:
+                        raise ModuleNotFoundError(
+                            'Optional dependency tqdm have to be installed for the progress indicator. '
+                            'Install with `pip install pyorthanc[progress]` or `pip install pyorthanc[all]'
+                        )
+
+                    last_num_bytes_downloaded = response.num_bytes_downloaded
+
+                    with tqdm(unit='B', unit_scale=True, desc=self.__repr__()) as progress:
+                        for chunk in response.iter_bytes():
+                            filepath.write(chunk)
+                            progress.update(response.num_bytes_downloaded - last_num_bytes_downloaded)
+                            last_num_bytes_downloaded = response.num_bytes_downloaded
+
+                else:
+                    for chunk in response.iter_bytes():
+                        filepath.write(chunk)
+
+        finally:
+            if not is_file_object:
+                filepath.close()
+
+    def __eq__(self, other: 'Resource') -> bool:
+        return self.id_ == other.id_
+
+    def __repr__(self):
+        return f'{self.__class__.__name__}({self.id_})'
+
+
+ + + +
+ + + + + + + +
+ + + +

+ _child_resources: Optional[List[Resource]] = None + + + instance-attribute + + +

+ + +
+
+ +
+ +
+ + + +

+ _information: Optional[Dict] = None + + + instance-attribute + + +

+ + +
+
+ +
+ +
+ + + +

+ client = client + + + instance-attribute + + +

+ + +
+
+ +
+ +
+ + + +

+ id_ = id_ + + + instance-attribute + + +

+ + +
+
+ +
+ +
+ + + +

+ identifier: str + + + property + + +

+ + +
+ +

Get Orthanc's identifier

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ str + +
+

Resource's identifier

+
+
+
+ +
+ +
+ + + +

+ lock = lock + + + instance-attribute + + +

+ + +
+
+ +
+ +
+ + + +

+ main_dicom_tags: Dict[str, str] + + + property + + +

+ + +
+
+ +
+ + + +
+ + +

+ __eq__(other) + +

+ + +
+ +
+ Source code in pyorthanc/_resources/resource.py +
114
+115
def __eq__(self, other: 'Resource') -> bool:
+    return self.id_ == other.id_
+
+
+
+ +
+ +
+ + +

+ __init__(id_, client, lock=False) + +

+ + +
+ +

Constructor

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
id_ + str + +
+

Orthanc identifier of the resource

+
+
+ required +
client + Orthanc + +
+

Orthanc client

+
+
+ required +
lock + bool + +
+

Specify if the Resource state should be locked. This is useful when the child resources +have been filtered out, and you don't want the resource to return an updated version +or all of those children. "lock=True" is notably used for the "find" function, +so that only the filtered resources are kept.

+
+
+ False +
+ +
+ Source code in pyorthanc/_resources/resource.py +
12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
def __init__(self, id_: str, client: Orthanc, lock: bool = False) -> None:
+    """Constructor
+
+    Parameters
+    ----------
+    id_
+        Orthanc identifier of the resource
+    client
+        Orthanc client
+    lock
+        Specify if the Resource state should be locked. This is useful when the child resources
+        have been filtered out, and you don't want the resource to return an updated version
+        or all of those children. "lock=True" is notably used for the "find" function,
+        so that only the filtered resources are kept.
+    """
+    client = util.ensure_non_raw_response(client)
+
+    self.id_ = id_
+    self.client = client
+
+    self.lock = lock
+    self._information: Optional[Dict] = None
+    self._child_resources: Optional[List['Resource']] = None
+
+
+
+ +
+ +
+ + +

+ __repr__() + +

+ + +
+ +
+ Source code in pyorthanc/_resources/resource.py +
117
+118
def __repr__(self):
+    return f'{self.__class__.__name__}({self.id_})'
+
+
+
+ +
+ +
+ + +

+ _download_file(url, filepath, with_progress=False, params=None) + +

+ + +
+ +
+ Source code in pyorthanc/_resources/resource.py +
 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
def _download_file(
+        self, url: str,
+        filepath: Union[str, BinaryIO],
+        with_progress: bool = False,
+        params: Optional[QueryParamTypes] = None):
+    # Check if filepath is a path or a file object.
+    if isinstance(filepath, str):
+        is_file_object = False
+        filepath = open(filepath, 'wb')
+    elif hasattr(filepath, 'write') and hasattr(filepath, 'seek'):
+        is_file_object = True
+    else:
+        raise TypeError(f'"path" must be a file-like object or a file path, got "{type(filepath).__name__}".')
+
+    try:
+        with self.client.stream('GET', url, params=params) as response:
+            if with_progress:
+                try:
+                    from tqdm import tqdm
+                except ModuleNotFoundError:
+                    raise ModuleNotFoundError(
+                        'Optional dependency tqdm have to be installed for the progress indicator. '
+                        'Install with `pip install pyorthanc[progress]` or `pip install pyorthanc[all]'
+                    )
+
+                last_num_bytes_downloaded = response.num_bytes_downloaded
+
+                with tqdm(unit='B', unit_scale=True, desc=self.__repr__()) as progress:
+                    for chunk in response.iter_bytes():
+                        filepath.write(chunk)
+                        progress.update(response.num_bytes_downloaded - last_num_bytes_downloaded)
+                        last_num_bytes_downloaded = response.num_bytes_downloaded
+
+            else:
+                for chunk in response.iter_bytes():
+                    filepath.write(chunk)
+
+    finally:
+        if not is_file_object:
+            filepath.close()
+
+
+
+ +
+ +
+ + +

+ _get_main_dicom_tag_value(tag) + +

+ + +
+ +
+ Source code in pyorthanc/_resources/resource.py +
55
+56
+57
+58
+59
def _get_main_dicom_tag_value(self, tag: str) -> Any:
+    try:
+        return self.get_main_information()['MainDicomTags'][tag]
+    except KeyError:
+        raise errors.TagDoesNotExistError(f'{self} has no {tag} tag.')
+
+
+
+ +
+ +
+ + +

+ _make_response_format_params(simplify=False, short=False) + +

+ + +
+ +
+ Source code in pyorthanc/_resources/resource.py +
61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
def _make_response_format_params(self, simplify: bool = False, short: bool = False) -> Dict:
+    if simplify and not short:
+        params = {'simplify': True}
+    elif short and not simplify:
+        params = {'short': True}
+    elif simplify and short:
+        raise ValueError('simplify and short can\'t be both True.')
+    else:
+        params = {}
+
+    return params
+
+
+
+ +
+ +
+ + +

+ get_main_information() + + + abstractmethod + + +

+ + +
+ +
+ Source code in pyorthanc/_resources/resource.py +
51
+52
+53
@abc.abstractmethod
+def get_main_information(self):
+    raise NotImplementedError
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/resources/series/index.html b/api/resources/series/index.html new file mode 100644 index 0000000..141dad9 --- /dev/null +++ b/api/resources/series/index.html @@ -0,0 +1,5438 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Series - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Series

+ +
+ + + +

+ pyorthanc.Series + + +

+ + +
+

+ Bases: Resource

+ + +

Represent a series that is in an Orthanc server

+

This object has many getters that allow the user to retrieve metadata +or the entire DICOM file of the Series

+ +
+ Source code in pyorthanc/_resources/series.py +
 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
class Series(Resource):
+    """Represent a series that is in an Orthanc server
+
+    This object has many getters that allow the user to retrieve metadata
+    or the entire DICOM file of the Series
+    """
+
+    @property
+    def instances(self) -> List[Instance]:
+        """Get series instance"""
+        if self.lock:
+            if self._child_resources is None:
+                instances_ids = self.get_main_information()['Instances']
+                self._child_resources = [Instance(i, self.client, self.lock) for i in instances_ids]
+
+            return self._child_resources
+
+        instances_ids = self.get_main_information()['Instances']
+
+        return [Instance(i, self.client, self.lock) for i in instances_ids]
+
+    @property
+    def uid(self) -> str:
+        """Get SeriesInstanceUID"""
+        return self._get_main_dicom_tag_value('SeriesInstanceUID')
+
+    def get_main_information(self) -> Dict:
+        """Get series main information"""
+        if self.lock:
+            if self._information is None:
+                # Setup self._information for the first time when series is lock
+                self._information = self.client.get_series_id(self.id_)
+
+            return self._information
+
+        return self.client.get_series_id(self.id_)
+
+    @property
+    def manufacturer(self) -> str:
+        """Get the manufacturer"""
+        return self._get_main_dicom_tag_value('Manufacturer')
+
+    @property
+    def study_identifier(self) -> str:
+        """Get the parent study identifier"""
+        return self.get_main_information()['ParentStudy']
+
+    @property
+    def parent_study(self) -> Study:
+        from . import Study
+        return Study(self.study_identifier, self.client)
+
+    @property
+    def parent_patient(self) -> Patient:
+        return self.parent_study.parent_patient
+
+    @property
+    def date(self) -> datetime:
+        """Get series datetime
+
+        The date have precision to the second (if available).
+
+        Returns
+        -------
+        datetime
+            Series date
+        """
+        date_string = self._get_main_dicom_tag_value('SeriesDate')
+        try:
+            time_string = self._get_main_dicom_tag_value('SeriesTime')
+        except errors.TagDoesNotExistError:
+            time_string = None
+
+        return util.make_datetime_from_dicom_date(date_string, time_string)
+
+    @property
+    def modality(self) -> str:
+        """Get series modality"""
+        return self._get_main_dicom_tag_value('Modality')
+
+    @property
+    def series_number(self) -> int:
+        return int(self._get_main_dicom_tag_value('SeriesNumber'))
+
+    @property
+    def performed_procedure_step_description(self) -> str:
+        return self._get_main_dicom_tag_value('PerformedProcedureStepDescription')
+
+    @property
+    def protocol_name(self) -> str:
+        return self._get_main_dicom_tag_value('ProtocolName')
+
+    @property
+    def station_name(self) -> str:
+        return self._get_main_dicom_tag_value('StationName')
+
+    @property
+    def description(self) -> str:
+        return self._get_main_dicom_tag_value('SeriesDescription')
+
+    @property
+    def body_part_examined(self) -> str:
+        return self._get_main_dicom_tag_value('BodyPartExamined')
+
+    @property
+    def sequence_name(self) -> str:
+        return self._get_main_dicom_tag_value('SequenceName')
+
+    @property
+    def cardiac_number_of_images(self) -> int:
+        return int(self._get_main_dicom_tag_value('CardiacNumberOfImages'))
+
+    @property
+    def images_in_acquisition(self) -> int:
+        return int(self._get_main_dicom_tag_value('ImagesInAcquisition'))
+
+    @property
+    def number_of_temporal_positions(self) -> int:
+        return int(self._get_main_dicom_tag_value('NumberOfTemporalPositions'))
+
+    @property
+    def number_of_slices(self) -> int:
+        return int(self._get_main_dicom_tag_value('NumberOfSlices'))
+
+    @property
+    def number_of_time_slices(self) -> int:
+        return int(self._get_main_dicom_tag_value('NumberOfTimeSlices'))
+
+    @property
+    def image_orientation_patient(self) -> List[float]:
+        orientation = self._get_main_dicom_tag_value('ImageOrientationPatient')
+
+        return [float(i) for i in orientation.split('\\')]
+
+    @property
+    def series_type(self) -> str:
+        return self._get_main_dicom_tag_value('SeriesType')
+
+    @property
+    def operators_name(self) -> str:
+        return self._get_main_dicom_tag_value('OperatorsName')
+
+    @property
+    def acquisition_device_processing_description(self) -> str:
+        return self._get_main_dicom_tag_value('AcquisitionDeviceProcessingDescription')
+
+    @property
+    def contrast_bolus_agent(self) -> str:
+        return self._get_main_dicom_tag_value('ContrastBolusAgent')
+
+    @property
+    def is_stable(self) -> bool:
+        return self.get_main_information()['IsStable']
+
+    @property
+    def last_update(self) -> datetime:
+        last_updated_date_and_time = self.get_main_information()['LastUpdate'].split('T')
+        date = last_updated_date_and_time[0]
+        time = last_updated_date_and_time[1]
+
+        return util.make_datetime_from_dicom_date(date, time)
+
+    @property
+    def labels(self) -> List[str]:
+        return self.get_main_information()['Labels']
+
+    def add_label(self, label: str) -> None:
+        self.client.put_series_id_labels_label(self.id_, label)
+
+    def remove_label(self, label):
+        self.client.delete_series_id_labels_label(self.id_, label)
+
+    def anonymize(self, remove: List = None, replace: Dict = None, keep: List = None,
+                  force: bool = False, keep_private_tags: bool = False,
+                  keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                  private_creator: str = None, dicom_version: str = None) -> 'Series':
+        """Anonymize series
+
+        If no error has been raise, return an anonymous series.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Notes
+        -----
+        This method might be long to run, especially on large series or when multiple
+        series are anonymized. In those cases, it is recommended to use the `.anonymize_as_job()`
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            List of tag to keep unchanged
+        force
+            Some tags can't be changed without forcing it (e.g. SeriesID) for security reason
+        keep_private_tags
+            If True, keep the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        priority
+            Priority of the job. The lower the value, the higher the priority.
+        permissive
+            If True, ignore errors during the individual steps of the job.
+        private_creator
+            The private creator to be used for private tags in replace.
+        dicom_version
+            Version of the DICOM standard to be used for anonymization.
+            Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+        Returns
+        -------
+        Series
+            A New anonymous series.
+
+        Examples
+        --------
+        ```python
+        new_series = series.anonymize()
+
+        new_series_with_specific_series_id = series.anonymize(
+            replace={'SeriesDescription': 'A description'}
+        )
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        data = {
+            'Asynchronous': False,
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'KeepPrivateTags': keep_private_tags,
+            'KeepSource': keep_source,
+            'Priority': priority,
+            'Permissive': permissive,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+        if dicom_version is not None:
+            data['DicomVersion'] = dicom_version
+
+        try:
+            anonymous_series = self.client.post_series_id_anonymize(self.id_, data)
+        except ReadTimeout:
+            raise ReadTimeout(
+                'Series anonymization is too long to process. '
+                'Use `.anonymize_as_job` or increase client.timeout.'
+            )
+
+        return Series(anonymous_series['ID'], self.client)
+
+    def anonymize_as_job(self, remove: List = None, replace: Dict = None, keep: List = None,
+                         force: bool = False, keep_private_tags: bool = False,
+                         keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                         private_creator: str = None, dicom_version: str = None) -> Job:
+        """Anonymize series and return a job
+
+        Launch an anonymization job.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Notes
+        -----
+        This method is useful when anonymizing large series or launching many
+        anonymization jobs. The jobs are sent to Orthanc and processed according
+        to the priority.
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            List of tag to keep unchanged
+        force
+            Some tags can't be changed without forcing it (e.g. SeriesInstanceUID) for security reason
+        keep_private_tags
+            If True, keep the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        priority
+            Priority of the job. The lower the value, the higher the priority.
+        permissive
+            If True, ignore errors during the individual steps of the job.
+        private_creator
+            The private creator to be used for private tags in replace.
+        dicom_version
+            Version of the DICOM standard to be used for anonymization.
+            Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+        Returns
+        -------
+        Job
+            Return a Job object of the anonymization job.
+
+        Examples
+        --------
+        For large series (recommended)
+        ```python
+        job = series.anonymize_as_job()
+        job.state  # You can follow the job state
+
+        job.wait_until_completion() # Or just wait on its completion
+        new_series = Series(job.content['ID'], orthanc)
+        ```
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        data = {
+            'Asynchronous': True,
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'KeepPrivateTags': keep_private_tags,
+            'KeepSource': keep_source,
+            'Priority': priority,
+            'Permissive': permissive,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+        if dicom_version is not None:
+            data['DicomVersion'] = dicom_version
+
+        job_info = self.client.post_series_id_anonymize(self.id_, data)
+
+        return Job(job_info['ID'], self.client)
+
+    def modify(self, remove: List = None, replace: Dict = None, keep: List = None,
+               force: bool = False, remove_private_tags: bool = False,
+               keep_source: bool = True, priority: int = 0, permissive: bool = False,
+               private_creator: str = None) -> 'Series':
+        """Modify series
+
+        If no error has been raise, then create a modified version of the series.
+        If keep=['SeriesInstanceUID'] and force=True are use, then the series itself is changed.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Notes
+        -----
+        This method might be long to run, especially on large series or when multiple
+        series are modified. In those cases, it is recommended to use the `.modify_as_job()`
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            Keep the original value of the specified tags, to be chosen among the SeriesInstanceUID,
+            SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+            as this breaks the DICOM model of the real world.
+        force
+            Some tags can't be changed without forcing it (e.g. SeriesInstanceUID) for security reason
+        remove_private_tags
+            If True, remove the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        priority
+            Priority of the job. The lower the value, the higher the priority.
+        permissive
+            If True, ignore errors during the individual steps of the job.
+        private_creator
+            The private creator to be used for private tags in Replace.
+
+        Returns
+        -------
+        Series
+            Returns a new modified series or returns itself if keep=['SeriesInstanceUID']
+            (in this case, the series itself is modified).
+
+        Examples
+        --------
+        ```python
+        # Create a modified series
+        modified_series = series.modify(replace={'SeriesInstanceUID': '1.2.840.113745.101000.1008000.38048.4626.5933732'}, force=True)
+        assert modified_series.uid == '1.2.840.113745.101000.1008000.38048.4626.5933732'
+
+        # Modify itself
+        series.modify(replace={'ReferringPhysicianName': 'last^first'}, keep=['SeriesInstanceUID'], force=True)
+        assert series.referring_physician_name == 'last^first'
+        ```
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        if 'SeriesInstanceUID' in replace and not force:
+            raise errors.ModificationError('If SeriesInstanceUID is replaced, `force` must be `True`')
+
+        data = {
+            'Asynchronous': False,
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'RemovePrivateTags': remove_private_tags,
+            'KeepSource': keep_source,
+            'Priority': priority,
+            'Permissive': permissive,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+
+        try:
+            modified_series = self.client.post_series_id_modify(self.id_, data)
+        except ReadTimeout:
+            raise ReadTimeout(
+                'Series modification is too long to process. '
+                'Use `.modify_as_job` or increase client.timeout.'
+            )
+
+        # if 'SeriesInstanceUID' is not affected, the modified_series['ID'] is the same as self.id_
+        return Series(modified_series['ID'], self.client)
+
+    def modify_as_job(self, remove: List = None, replace: Dict = None, keep: List = None,
+                      force: bool = False, remove_private_tags: bool = False,
+                      keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                      private_creator: str = None) -> Job:
+        """Modify series and return a job
+
+        Launch a modification job. If keep=['SeriesInstanceUID'] (with `force=True`),
+        then modified this series. If the SeriesInstanceUID is not keeped, this creates
+        a new modified series.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Notes
+        -----
+        This method is useful when modifying large series or launching many
+        modification jobs. The jobs are sent to Orthanc and processed according
+        to the priority.
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            Keep the original value of the specified tags, to be chosen among the SeriesInstanceUID,
+            SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+            as this breaks the DICOM model of the real world.
+        force
+            Allow the modification of tags related to DICOM identifiers, at the risk of breaking
+            the DICOM model of the real world.
+        remove_private_tags
+            If True, remove the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        priority
+            Priority of the job. The lower the value, the higher the priority.
+        permissive
+            If True, ignore errors during the individual steps of the job.
+        private_creator
+            The private creator to be used for private tags in Replace.
+
+        Returns
+        -------
+        Job
+            Return a Job object of the modification job.
+
+        Examples
+        --------
+        For large series (recommended)
+        ```python
+        job = series.modify_as_job(replace={'SeriesDescription': 'a description'})
+        job.state  # You can follow the job state
+
+        job.wait_until_completion() # Or just wait on its completion
+        modified_series = Series(job.content['ID'], client)
+        assert modified_series.description == 'a description'
+        ```
+        Or modify the SeriesInstanceUID
+        ```python
+        job = series.modify_as_job(
+            replace={'SeriesInstanceUID': '1.2.840.113745.101000.1008000.38048.4626.5933732'},
+            force=True
+        )
+        job.wait_until_completion() # Or just wait on its completion
+
+        modified_series = Series(job.content['ID'], client)
+        modified_series.uid == '1.2.840.113745.101000.1008000.38048.4626.5933732'
+        ```
+        Or keep the SeriesInstanceUID
+        ```python
+        job = series.modify_as_job(
+            replace={'SeriesDescription': 'a description'},
+            keep=['SeriesInstanceUID'],
+            force=True
+        )
+        job.wait_until_completion()
+
+        assert series.description == 'a description'
+        ```
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        if 'SeriesInstanceUID' in replace and not force:
+            raise errors.ModificationError('If SeriesInstanceUID is affected, `force` must be `True`')
+
+        data = {
+            'Asynchronous': True,
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'RemovePrivateTags': remove_private_tags,
+            'KeepSource': keep_source,
+            'Priority': priority,
+            'Permissive': permissive,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+
+        job_info = self.client.post_series_id_modify(self.id_, data)
+
+        return Job(job_info['ID'], self.client)
+
+    def get_zip(self) -> bytes:
+        """Get the bytes of the zip file
+
+        Get the .zip file.
+
+        Returns
+        -------
+        bytes
+            Bytes of Zip file of the series.
+
+        Examples
+        --------
+        ```python
+        from pyorthanc import Orthanc, Series
+        a_series = Series('SERIES_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+        bytes_content = a_series.get_zip()
+        with open('series_zip_file_path.zip', 'wb') as file_handler:
+            file_handler.write(bytes_content)
+        ```
+
+        """
+        return self.client.get_series_id_archive(self.id_)
+
+    def download(self, filepath: Union[str, BinaryIO], with_progres: bool = False) -> None:
+        """Download the zip file to a target path or buffer
+
+        This method is an alternative to the `.get_zip()` method for large files.
+        The `.get_zip()` method will pull all the data in a single GET call,
+        while `.download()` stream the data to a file or a buffer.
+        Favor the `.download()` method to avoid timeout and memory issues.
+
+        Examples
+        --------
+        ```python
+        from pyorthanc import Orthanc, Series
+        a_series = Series('SERIES_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+        # Download a zip
+        a_series.download('series.zip')
+
+        # Download a zip and show progress
+        a_series.download('series.zip', with_progres=True)
+
+        # Or download in a buffer in memory
+        buffer = io.BytesIO()
+        a_series.download(buffer)
+        # Now do whatever you want to do
+        buffer.seek(0)
+        zip_bytes = buffer.read()
+        ```
+        """
+        self._download_file(f'{self.client.url}/series/{self.id_}/archive', filepath, with_progres)
+
+    def get_shared_tags(self, simplify: bool = False, short: bool = False) -> Dict:
+        """Retrieve the shared tags of the series"""
+        params = self._make_response_format_params(simplify, short)
+
+        return dict(self.client.get_series_id_shared_tags(
+            self.id_,
+            params=params
+        ))
+
+    @property
+    def shared_tags(self) -> Dict:
+        return self.get_shared_tags(simplify=True)
+
+    def remove_empty_instances(self) -> None:
+        if self._child_resources is not None:
+            self._child_resources = [i for i in self._child_resources if i is not None]
+
+
+ + + +
+ + + + + + + +
+ + + +

+ acquisition_device_processing_description: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ body_part_examined: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ cardiac_number_of_images: int + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ contrast_bolus_agent: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ date: datetime + + + property + + +

+ + +
+ +

Get series datetime

+

The date have precision to the second (if available).

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ datetime + +
+

Series date

+
+
+
+ +
+ +
+ + + +

+ description: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ image_orientation_patient: List[float] + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ images_in_acquisition: int + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ instances: List[Instance] + + + property + + +

+ + +
+ +

Get series instance

+
+ +
+ +
+ + + +

+ is_stable: bool + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ labels: List[str] + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ last_update: datetime + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ manufacturer: str + + + property + + +

+ + +
+ +

Get the manufacturer

+
+ +
+ +
+ + + +

+ modality: str + + + property + + +

+ + +
+ +

Get series modality

+
+ +
+ +
+ + + +

+ number_of_slices: int + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ number_of_temporal_positions: int + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ number_of_time_slices: int + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ operators_name: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ parent_patient: Patient + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ parent_study: Study + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ performed_procedure_step_description: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ protocol_name: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ sequence_name: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ series_number: int + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ series_type: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ shared_tags: Dict + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ station_name: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ study_identifier: str + + + property + + +

+ + +
+ +

Get the parent study identifier

+
+ +
+ +
+ + + +

+ uid: str + + + property + + +

+ + +
+ +

Get SeriesInstanceUID

+
+ +
+ + + +
+ + +

+ add_label(label) + +

+ + +
+ +
+ Source code in pyorthanc/_resources/series.py +
183
+184
def add_label(self, label: str) -> None:
+    self.client.put_series_id_labels_label(self.id_, label)
+
+
+
+ +
+ +
+ + +

+ anonymize(remove=None, replace=None, keep=None, force=False, keep_private_tags=False, keep_source=True, priority=0, permissive=False, private_creator=None, dicom_version=None) + +

+ + +
+ +

Anonymize series

+

If no error has been raise, return an anonymous series. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +
+ Notes +

This method might be long to run, especially on large series or when multiple +series are anonymized. In those cases, it is recommended to use the .anonymize_as_job()

+
+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

List of tag to keep unchanged

+
+
+ None +
force + bool + +
+

Some tags can't be changed without forcing it (e.g. SeriesID) for security reason

+
+
+ False +
keep_private_tags + bool + +
+

If True, keep the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
priority + int + +
+

Priority of the job. The lower the value, the higher the priority.

+
+
+ 0 +
permissive + bool + +
+

If True, ignore errors during the individual steps of the job.

+
+
+ False +
private_creator + str + +
+

The private creator to be used for private tags in replace.

+
+
+ None +
dicom_version + str + +
+

Version of the DICOM standard to be used for anonymization. +Check out configuration option DeidentifyLogsDicomVersion for possible values.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Series + +
+

A New anonymous series.

+
+
+ + +

Examples:

+

```python +new_series = series.anonymize()

+

new_series_with_specific_series_id = series.anonymize( + replace={'SeriesDescription': 'A description'} +)

+ +
+ Source code in pyorthanc/_resources/series.py +
189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
def anonymize(self, remove: List = None, replace: Dict = None, keep: List = None,
+              force: bool = False, keep_private_tags: bool = False,
+              keep_source: bool = True, priority: int = 0, permissive: bool = False,
+              private_creator: str = None, dicom_version: str = None) -> 'Series':
+    """Anonymize series
+
+    If no error has been raise, return an anonymous series.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Notes
+    -----
+    This method might be long to run, especially on large series or when multiple
+    series are anonymized. In those cases, it is recommended to use the `.anonymize_as_job()`
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        List of tag to keep unchanged
+    force
+        Some tags can't be changed without forcing it (e.g. SeriesID) for security reason
+    keep_private_tags
+        If True, keep the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    priority
+        Priority of the job. The lower the value, the higher the priority.
+    permissive
+        If True, ignore errors during the individual steps of the job.
+    private_creator
+        The private creator to be used for private tags in replace.
+    dicom_version
+        Version of the DICOM standard to be used for anonymization.
+        Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+    Returns
+    -------
+    Series
+        A New anonymous series.
+
+    Examples
+    --------
+    ```python
+    new_series = series.anonymize()
+
+    new_series_with_specific_series_id = series.anonymize(
+        replace={'SeriesDescription': 'A description'}
+    )
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    data = {
+        'Asynchronous': False,
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'KeepPrivateTags': keep_private_tags,
+        'KeepSource': keep_source,
+        'Priority': priority,
+        'Permissive': permissive,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+    if dicom_version is not None:
+        data['DicomVersion'] = dicom_version
+
+    try:
+        anonymous_series = self.client.post_series_id_anonymize(self.id_, data)
+    except ReadTimeout:
+        raise ReadTimeout(
+            'Series anonymization is too long to process. '
+            'Use `.anonymize_as_job` or increase client.timeout.'
+        )
+
+    return Series(anonymous_series['ID'], self.client)
+
+
+
+ +
+ +
+ + +

+ anonymize_as_job(remove=None, replace=None, keep=None, force=False, keep_private_tags=False, keep_source=True, priority=0, permissive=False, private_creator=None, dicom_version=None) + +

+ + +
+ +

Anonymize series and return a job

+

Launch an anonymization job. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +
+ Notes +

This method is useful when anonymizing large series or launching many +anonymization jobs. The jobs are sent to Orthanc and processed according +to the priority.

+
+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

List of tag to keep unchanged

+
+
+ None +
force + bool + +
+

Some tags can't be changed without forcing it (e.g. SeriesInstanceUID) for security reason

+
+
+ False +
keep_private_tags + bool + +
+

If True, keep the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
priority + int + +
+

Priority of the job. The lower the value, the higher the priority.

+
+
+ 0 +
permissive + bool + +
+

If True, ignore errors during the individual steps of the job.

+
+
+ False +
private_creator + str + +
+

The private creator to be used for private tags in replace.

+
+
+ None +
dicom_version + str + +
+

Version of the DICOM standard to be used for anonymization. +Check out configuration option DeidentifyLogsDicomVersion for possible values.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Job + +
+

Return a Job object of the anonymization job.

+
+
+ + +

Examples:

+

For large series (recommended)

+
job = series.anonymize_as_job()
+job.state  # You can follow the job state
+
+job.wait_until_completion() # Or just wait on its completion
+new_series = Series(job.content['ID'], orthanc)
+
+ +
+ Source code in pyorthanc/_resources/series.py +
272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
def anonymize_as_job(self, remove: List = None, replace: Dict = None, keep: List = None,
+                     force: bool = False, keep_private_tags: bool = False,
+                     keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                     private_creator: str = None, dicom_version: str = None) -> Job:
+    """Anonymize series and return a job
+
+    Launch an anonymization job.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Notes
+    -----
+    This method is useful when anonymizing large series or launching many
+    anonymization jobs. The jobs are sent to Orthanc and processed according
+    to the priority.
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        List of tag to keep unchanged
+    force
+        Some tags can't be changed without forcing it (e.g. SeriesInstanceUID) for security reason
+    keep_private_tags
+        If True, keep the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    priority
+        Priority of the job. The lower the value, the higher the priority.
+    permissive
+        If True, ignore errors during the individual steps of the job.
+    private_creator
+        The private creator to be used for private tags in replace.
+    dicom_version
+        Version of the DICOM standard to be used for anonymization.
+        Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+    Returns
+    -------
+    Job
+        Return a Job object of the anonymization job.
+
+    Examples
+    --------
+    For large series (recommended)
+    ```python
+    job = series.anonymize_as_job()
+    job.state  # You can follow the job state
+
+    job.wait_until_completion() # Or just wait on its completion
+    new_series = Series(job.content['ID'], orthanc)
+    ```
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    data = {
+        'Asynchronous': True,
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'KeepPrivateTags': keep_private_tags,
+        'KeepSource': keep_source,
+        'Priority': priority,
+        'Permissive': permissive,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+    if dicom_version is not None:
+        data['DicomVersion'] = dicom_version
+
+    job_info = self.client.post_series_id_anonymize(self.id_, data)
+
+    return Job(job_info['ID'], self.client)
+
+
+
+ +
+ +
+ + +

+ download(filepath, with_progres=False) + +

+ + +
+ +

Download the zip file to a target path or buffer

+

This method is an alternative to the .get_zip() method for large files. +The .get_zip() method will pull all the data in a single GET call, +while .download() stream the data to a file or a buffer. +Favor the .download() method to avoid timeout and memory issues.

+ + +

Examples:

+
from pyorthanc import Orthanc, Series
+a_series = Series('SERIES_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+# Download a zip
+a_series.download('series.zip')
+
+# Download a zip and show progress
+a_series.download('series.zip', with_progres=True)
+
+# Or download in a buffer in memory
+buffer = io.BytesIO()
+a_series.download(buffer)
+# Now do whatever you want to do
+buffer.seek(0)
+zip_bytes = buffer.read()
+
+ +
+ Source code in pyorthanc/_resources/series.py +
571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
def download(self, filepath: Union[str, BinaryIO], with_progres: bool = False) -> None:
+    """Download the zip file to a target path or buffer
+
+    This method is an alternative to the `.get_zip()` method for large files.
+    The `.get_zip()` method will pull all the data in a single GET call,
+    while `.download()` stream the data to a file or a buffer.
+    Favor the `.download()` method to avoid timeout and memory issues.
+
+    Examples
+    --------
+    ```python
+    from pyorthanc import Orthanc, Series
+    a_series = Series('SERIES_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+    # Download a zip
+    a_series.download('series.zip')
+
+    # Download a zip and show progress
+    a_series.download('series.zip', with_progres=True)
+
+    # Or download in a buffer in memory
+    buffer = io.BytesIO()
+    a_series.download(buffer)
+    # Now do whatever you want to do
+    buffer.seek(0)
+    zip_bytes = buffer.read()
+    ```
+    """
+    self._download_file(f'{self.client.url}/series/{self.id_}/archive', filepath, with_progres)
+
+
+
+ +
+ +
+ + +

+ get_main_information() + +

+ + +
+ +

Get series main information

+ +
+ Source code in pyorthanc/_resources/series.py +
43
+44
+45
+46
+47
+48
+49
+50
+51
+52
def get_main_information(self) -> Dict:
+    """Get series main information"""
+    if self.lock:
+        if self._information is None:
+            # Setup self._information for the first time when series is lock
+            self._information = self.client.get_series_id(self.id_)
+
+        return self._information
+
+    return self.client.get_series_id(self.id_)
+
+
+
+ +
+ +
+ + +

+ get_shared_tags(simplify=False, short=False) + +

+ + +
+ +

Retrieve the shared tags of the series

+ +
+ Source code in pyorthanc/_resources/series.py +
601
+602
+603
+604
+605
+606
+607
+608
def get_shared_tags(self, simplify: bool = False, short: bool = False) -> Dict:
+    """Retrieve the shared tags of the series"""
+    params = self._make_response_format_params(simplify, short)
+
+    return dict(self.client.get_series_id_shared_tags(
+        self.id_,
+        params=params
+    ))
+
+
+
+ +
+ +
+ + +

+ get_zip() + +

+ + +
+ +

Get the bytes of the zip file

+

Get the .zip file.

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ bytes + +
+

Bytes of Zip file of the series.

+
+
+ + +

Examples:

+
from pyorthanc import Orthanc, Series
+a_series = Series('SERIES_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+bytes_content = a_series.get_zip()
+with open('series_zip_file_path.zip', 'wb') as file_handler:
+    file_handler.write(bytes_content)
+
+ +
+ Source code in pyorthanc/_resources/series.py +
547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
def get_zip(self) -> bytes:
+    """Get the bytes of the zip file
+
+    Get the .zip file.
+
+    Returns
+    -------
+    bytes
+        Bytes of Zip file of the series.
+
+    Examples
+    --------
+    ```python
+    from pyorthanc import Orthanc, Series
+    a_series = Series('SERIES_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+    bytes_content = a_series.get_zip()
+    with open('series_zip_file_path.zip', 'wb') as file_handler:
+        file_handler.write(bytes_content)
+    ```
+
+    """
+    return self.client.get_series_id_archive(self.id_)
+
+
+
+ +
+ +
+ + +

+ modify(remove=None, replace=None, keep=None, force=False, remove_private_tags=False, keep_source=True, priority=0, permissive=False, private_creator=None) + +

+ + +
+ +

Modify series

+

If no error has been raise, then create a modified version of the series. +If keep=['SeriesInstanceUID'] and force=True are use, then the series itself is changed. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +
+ Notes +

This method might be long to run, especially on large series or when multiple +series are modified. In those cases, it is recommended to use the .modify_as_job()

+
+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

Keep the original value of the specified tags, to be chosen among the SeriesInstanceUID, +SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, +as this breaks the DICOM model of the real world.

+
+
+ None +
force + bool + +
+

Some tags can't be changed without forcing it (e.g. SeriesInstanceUID) for security reason

+
+
+ False +
remove_private_tags + bool + +
+

If True, remove the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
priority + int + +
+

Priority of the job. The lower the value, the higher the priority.

+
+
+ 0 +
permissive + bool + +
+

If True, ignore errors during the individual steps of the job.

+
+
+ False +
private_creator + str + +
+

The private creator to be used for private tags in Replace.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Series + +
+

Returns a new modified series or returns itself if keep=['SeriesInstanceUID'] +(in this case, the series itself is modified).

+
+
+ + +

Examples:

+
# Create a modified series
+modified_series = series.modify(replace={'SeriesInstanceUID': '1.2.840.113745.101000.1008000.38048.4626.5933732'}, force=True)
+assert modified_series.uid == '1.2.840.113745.101000.1008000.38048.4626.5933732'
+
+# Modify itself
+series.modify(replace={'ReferringPhysicianName': 'last^first'}, keep=['SeriesInstanceUID'], force=True)
+assert series.referring_physician_name == 'last^first'
+
+ +
+ Source code in pyorthanc/_resources/series.py +
352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
def modify(self, remove: List = None, replace: Dict = None, keep: List = None,
+           force: bool = False, remove_private_tags: bool = False,
+           keep_source: bool = True, priority: int = 0, permissive: bool = False,
+           private_creator: str = None) -> 'Series':
+    """Modify series
+
+    If no error has been raise, then create a modified version of the series.
+    If keep=['SeriesInstanceUID'] and force=True are use, then the series itself is changed.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Notes
+    -----
+    This method might be long to run, especially on large series or when multiple
+    series are modified. In those cases, it is recommended to use the `.modify_as_job()`
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        Keep the original value of the specified tags, to be chosen among the SeriesInstanceUID,
+        SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+        as this breaks the DICOM model of the real world.
+    force
+        Some tags can't be changed without forcing it (e.g. SeriesInstanceUID) for security reason
+    remove_private_tags
+        If True, remove the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    priority
+        Priority of the job. The lower the value, the higher the priority.
+    permissive
+        If True, ignore errors during the individual steps of the job.
+    private_creator
+        The private creator to be used for private tags in Replace.
+
+    Returns
+    -------
+    Series
+        Returns a new modified series or returns itself if keep=['SeriesInstanceUID']
+        (in this case, the series itself is modified).
+
+    Examples
+    --------
+    ```python
+    # Create a modified series
+    modified_series = series.modify(replace={'SeriesInstanceUID': '1.2.840.113745.101000.1008000.38048.4626.5933732'}, force=True)
+    assert modified_series.uid == '1.2.840.113745.101000.1008000.38048.4626.5933732'
+
+    # Modify itself
+    series.modify(replace={'ReferringPhysicianName': 'last^first'}, keep=['SeriesInstanceUID'], force=True)
+    assert series.referring_physician_name == 'last^first'
+    ```
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    if 'SeriesInstanceUID' in replace and not force:
+        raise errors.ModificationError('If SeriesInstanceUID is replaced, `force` must be `True`')
+
+    data = {
+        'Asynchronous': False,
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'RemovePrivateTags': remove_private_tags,
+        'KeepSource': keep_source,
+        'Priority': priority,
+        'Permissive': permissive,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+
+    try:
+        modified_series = self.client.post_series_id_modify(self.id_, data)
+    except ReadTimeout:
+        raise ReadTimeout(
+            'Series modification is too long to process. '
+            'Use `.modify_as_job` or increase client.timeout.'
+        )
+
+    # if 'SeriesInstanceUID' is not affected, the modified_series['ID'] is the same as self.id_
+    return Series(modified_series['ID'], self.client)
+
+
+
+ +
+ +
+ + +

+ modify_as_job(remove=None, replace=None, keep=None, force=False, remove_private_tags=False, keep_source=True, priority=0, permissive=False, private_creator=None) + +

+ + +
+ +

Modify series and return a job

+

Launch a modification job. If keep=['SeriesInstanceUID'] (with force=True), +then modified this series. If the SeriesInstanceUID is not keeped, this creates +a new modified series. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +
+ Notes +

This method is useful when modifying large series or launching many +modification jobs. The jobs are sent to Orthanc and processed according +to the priority.

+
+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

Keep the original value of the specified tags, to be chosen among the SeriesInstanceUID, +SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, +as this breaks the DICOM model of the real world.

+
+
+ None +
force + bool + +
+

Allow the modification of tags related to DICOM identifiers, at the risk of breaking +the DICOM model of the real world.

+
+
+ False +
remove_private_tags + bool + +
+

If True, remove the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
priority + int + +
+

Priority of the job. The lower the value, the higher the priority.

+
+
+ 0 +
permissive + bool + +
+

If True, ignore errors during the individual steps of the job.

+
+
+ False +
private_creator + str + +
+

The private creator to be used for private tags in Replace.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Job + +
+

Return a Job object of the modification job.

+
+
+ + +

Examples:

+

For large series (recommended)

+
job = series.modify_as_job(replace={'SeriesDescription': 'a description'})
+job.state  # You can follow the job state
+
+job.wait_until_completion() # Or just wait on its completion
+modified_series = Series(job.content['ID'], client)
+assert modified_series.description == 'a description'
+
+ +

Or modify the SeriesInstanceUID

+
job = series.modify_as_job(
+    replace={'SeriesInstanceUID': '1.2.840.113745.101000.1008000.38048.4626.5933732'},
+    force=True
+)
+job.wait_until_completion() # Or just wait on its completion
+
+modified_series = Series(job.content['ID'], client)
+modified_series.uid == '1.2.840.113745.101000.1008000.38048.4626.5933732'
+
+ +

Or keep the SeriesInstanceUID

+
job = series.modify_as_job(
+    replace={'SeriesDescription': 'a description'},
+    keep=['SeriesInstanceUID'],
+    force=True
+)
+job.wait_until_completion()
+
+assert series.description == 'a description'
+
+ +
+ Source code in pyorthanc/_resources/series.py +
441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
def modify_as_job(self, remove: List = None, replace: Dict = None, keep: List = None,
+                  force: bool = False, remove_private_tags: bool = False,
+                  keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                  private_creator: str = None) -> Job:
+    """Modify series and return a job
+
+    Launch a modification job. If keep=['SeriesInstanceUID'] (with `force=True`),
+    then modified this series. If the SeriesInstanceUID is not keeped, this creates
+    a new modified series.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Notes
+    -----
+    This method is useful when modifying large series or launching many
+    modification jobs. The jobs are sent to Orthanc and processed according
+    to the priority.
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        Keep the original value of the specified tags, to be chosen among the SeriesInstanceUID,
+        SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+        as this breaks the DICOM model of the real world.
+    force
+        Allow the modification of tags related to DICOM identifiers, at the risk of breaking
+        the DICOM model of the real world.
+    remove_private_tags
+        If True, remove the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    priority
+        Priority of the job. The lower the value, the higher the priority.
+    permissive
+        If True, ignore errors during the individual steps of the job.
+    private_creator
+        The private creator to be used for private tags in Replace.
+
+    Returns
+    -------
+    Job
+        Return a Job object of the modification job.
+
+    Examples
+    --------
+    For large series (recommended)
+    ```python
+    job = series.modify_as_job(replace={'SeriesDescription': 'a description'})
+    job.state  # You can follow the job state
+
+    job.wait_until_completion() # Or just wait on its completion
+    modified_series = Series(job.content['ID'], client)
+    assert modified_series.description == 'a description'
+    ```
+    Or modify the SeriesInstanceUID
+    ```python
+    job = series.modify_as_job(
+        replace={'SeriesInstanceUID': '1.2.840.113745.101000.1008000.38048.4626.5933732'},
+        force=True
+    )
+    job.wait_until_completion() # Or just wait on its completion
+
+    modified_series = Series(job.content['ID'], client)
+    modified_series.uid == '1.2.840.113745.101000.1008000.38048.4626.5933732'
+    ```
+    Or keep the SeriesInstanceUID
+    ```python
+    job = series.modify_as_job(
+        replace={'SeriesDescription': 'a description'},
+        keep=['SeriesInstanceUID'],
+        force=True
+    )
+    job.wait_until_completion()
+
+    assert series.description == 'a description'
+    ```
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    if 'SeriesInstanceUID' in replace and not force:
+        raise errors.ModificationError('If SeriesInstanceUID is affected, `force` must be `True`')
+
+    data = {
+        'Asynchronous': True,
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'RemovePrivateTags': remove_private_tags,
+        'KeepSource': keep_source,
+        'Priority': priority,
+        'Permissive': permissive,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+
+    job_info = self.client.post_series_id_modify(self.id_, data)
+
+    return Job(job_info['ID'], self.client)
+
+
+
+ +
+ +
+ + +

+ remove_empty_instances() + +

+ + +
+ +
+ Source code in pyorthanc/_resources/series.py +
614
+615
+616
def remove_empty_instances(self) -> None:
+    if self._child_resources is not None:
+        self._child_resources = [i for i in self._child_resources if i is not None]
+
+
+
+ +
+ +
+ + +

+ remove_label(label) + +

+ + +
+ +
+ Source code in pyorthanc/_resources/series.py +
186
+187
def remove_label(self, label):
+    self.client.delete_series_id_labels_label(self.id_, label)
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/resources/study/index.html b/api/resources/study/index.html new file mode 100644 index 0000000..26dd58c --- /dev/null +++ b/api/resources/study/index.html @@ -0,0 +1,4971 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Study - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Study

+ +
+ + + +

+ pyorthanc.Study + + +

+ + +
+

+ Bases: Resource

+ + +

Represent a study that is in an Orthanc server

+

This object has many getters that allow the user to retrieve metadata +or the entire DICOM file of the Series

+ +
+ Source code in pyorthanc/_resources/study.py +
 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
class Study(Resource):
+    """Represent a study that is in an Orthanc server
+
+    This object has many getters that allow the user to retrieve metadata
+    or the entire DICOM file of the Series
+    """
+
+    def get_main_information(self) -> Dict:
+        """Get Study information
+
+        Returns
+        -------
+        Dict
+            Dictionary of study information
+        """
+        if self.lock:
+            if self._information is None:
+                # Setup self._information for the first time when study is lock
+                self._information = self.client.get_studies_id(self.id_)
+
+            return self._information
+
+        return self.client.get_studies_id(self.id_)
+
+    @property
+    def referring_physician_name(self) -> str:
+        """Get referring physician name"""
+        return self._get_main_dicom_tag_value('ReferringPhysicianName')
+
+    @property
+    def requesting_physician(self) -> str:
+        """Get referring physician name"""
+        return self._get_main_dicom_tag_value('RequestingPhysician')
+
+    @property
+    def date(self) -> datetime:
+        """Get study date
+
+        The date have precision to the second (if available).
+
+        Returns
+        -------
+        datetime
+            Study date
+        """
+        date_string = self._get_main_dicom_tag_value('StudyDate')
+        try:
+            time_string = self._get_main_dicom_tag_value('StudyTime')
+        except errors.TagDoesNotExistError:
+            time_string = None
+
+        return util.make_datetime_from_dicom_date(date_string, time_string)
+
+    @property
+    def study_id(self) -> str:
+        """Get Study ID"""
+        return self._get_main_dicom_tag_value('StudyID')
+
+    @property
+    def uid(self) -> str:
+        """Get StudyInstanceUID"""
+        return self._get_main_dicom_tag_value('StudyInstanceUID')
+
+    @property
+    def patient_identifier(self) -> str:
+        """Get the Orthanc identifier of the parent patient"""
+        return self.get_main_information()['ParentPatient']
+
+    @property
+    def parent_patient(self) -> Patient:
+        from . import Patient
+        return Patient(self.patient_identifier, self.client)
+
+    @property
+    def patient_information(self) -> Dict:
+        """Get patient information"""
+        return self.get_main_information()['PatientMainDicomTags']
+
+    @property
+    def series(self) -> List[Series]:
+        """Get Study series"""
+        if self.lock:
+            if self._child_resources is None:
+                series_ids = self.get_main_information()['Series']
+                self._child_resources = [Series(i, self.client, self.lock) for i in series_ids]
+
+            return self._child_resources
+
+        series_ids = self.get_main_information()['Series']
+
+        return [Series(i, self.client, self.lock) for i in series_ids]
+
+    @property
+    def accession_number(self) -> str:
+        return self._get_main_dicom_tag_value('AccessionNumber')
+
+    @property
+    def description(self) -> str:
+        return self._get_main_dicom_tag_value('StudyDescription')
+
+    @property
+    def institution_name(self) -> str:
+        return self._get_main_dicom_tag_value('InstitutionName')
+
+    @property
+    def requested_procedure_description(self) -> str:
+        return self._get_main_dicom_tag_value('RequestedProcedureDescription')
+
+    @property
+    def is_stable(self) -> bool:
+        return self.get_main_information()['IsStable']
+
+    @property
+    def last_update(self) -> datetime:
+        last_updated_date_and_time = self.get_main_information()['LastUpdate'].split('T')
+        date = last_updated_date_and_time[0]
+        time = last_updated_date_and_time[1]
+
+        return util.make_datetime_from_dicom_date(date, time)
+
+    @property
+    def labels(self) -> List[str]:
+        return self.get_main_information()['Labels']
+
+    def add_label(self, label: str) -> None:
+        self.client.put_studies_id_labels_label(self.id_, label)
+
+    def remove_label(self, label):
+        self.client.delete_studies_id_labels_label(self.id_, label)
+
+    def anonymize(self, remove: List = None, replace: Dict = None, keep: List = None,
+                  force: bool = False, keep_private_tags: bool = False,
+                  keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                  private_creator: str = None, dicom_version: str = None) -> 'Study':
+        """Anonymize study
+
+        If no error has been raise, return an anonymous study.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Notes
+        -----
+        This method might be long to run, especially on large study or when multiple
+        studies are anonymized. In those cases, it is recommended to use the `.anonymize_as_job()`
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            List of tag to keep unchanged
+        force
+            Some tags can't be changed without forcing it (e.g. StudyID) for security reason
+        keep_private_tags
+            If True, keep the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        priority
+            Priority of the job. The lower the value, the higher the priority.
+        permissive
+            If True, ignore errors during the individual steps of the job.
+        private_creator
+            The private creator to be used for private tags in replace.
+        dicom_version
+            Version of the DICOM standard to be used for anonymization.
+            Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+        Returns
+        -------
+        Study
+            A New anonymous study.
+
+        Examples
+        --------
+        ```python
+        new_study = study.anonymize()
+
+        new_study_with_specific_study_id = study.anonymize(
+            replace={'StudyDescription': 'A description'}
+        )
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        data = {
+            'Asynchronous': False,
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'KeepPrivateTags': keep_private_tags,
+            'KeepSource': keep_source,
+            'Priority': priority,
+            'Permissive': permissive,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+        if dicom_version is not None:
+            data['DicomVersion'] = dicom_version
+
+        try:
+            anonymous_study = self.client.post_studies_id_anonymize(self.id_, data)
+        except ReadTimeout:
+            raise ReadTimeout(
+                'Study anonymization is too long to process. '
+                'Use `.anonymize_as_job` or increase client.timeout.'
+            )
+
+        return Study(anonymous_study['ID'], self.client)
+
+    def anonymize_as_job(self, remove: List = None, replace: Dict = None, keep: List = None,
+                         force: bool = False, keep_private_tags: bool = False,
+                         keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                         private_creator: str = None, dicom_version: str = None) -> Job:
+        """Anonymize study and return a job
+
+        Launch an anonymization job.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Notes
+        -----
+        This method is useful when anonymizing large study or launching many
+        anonymization jobs. The jobs are sent to Orthanc and processed according
+        to the priority.
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            List of tag to keep unchanged
+        force
+            Some tags can't be changed without forcing it (e.g. StudyInstanceUID) for security reason
+        keep_private_tags
+            If True, keep the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        priority
+            Priority of the job. The lower the value, the higher the priority.
+        permissive
+            If True, ignore errors during the individual steps of the job.
+        private_creator
+            The private creator to be used for private tags in replace.
+        dicom_version
+            Version of the DICOM standard to be used for anonymization.
+            Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+        Returns
+        -------
+        Job
+            Return a Job object of the anonymization job.
+
+        Examples
+        --------
+        For large study (recommended)
+        ```python
+        job = study.anonymize_as_job()
+        job.state  # You can follow the job state
+
+        job.wait_until_completion() # Or just wait on its completion
+        new_study = Study(job.content['ID'], orthanc)
+        ```
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        data = {
+            'Asynchronous': True,
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'KeepPrivateTags': keep_private_tags,
+            'KeepSource': keep_source,
+            'Priority': priority,
+            'Permissive': permissive,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+        if dicom_version is not None:
+            data['DicomVersion'] = dicom_version
+
+        job_info = self.client.post_studies_id_anonymize(self.id_, data)
+
+        return Job(job_info['ID'], self.client)
+
+    def modify(self, remove: List = None, replace: Dict = None, keep: List = None,
+               force: bool = False, remove_private_tags: bool = False,
+               keep_source: bool = True, priority: int = 0, permissive: bool = False,
+               private_creator: str = None) -> 'Study':
+        """Modify study
+
+        If no error has been raise, then create a modified version of the study.
+        If keep=['StudyInstanceUID'] and force=True are use, then the study itself is changed.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Notes
+        -----
+        This method might be long to run, especially on large study or when multiple
+        studies are modified. In those cases, it is recommended to use the `.modify_as_job()`
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            Keep the original value of the specified tags, to be chosen among the StudyInstanceUID,
+            SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+            as this breaks the DICOM model of the real world.
+        force
+            Some tags can't be changed without forcing it (e.g. StudyInstanceUID) for security reason
+        remove_private_tags
+            If True, remove the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        priority
+            Priority of the job. The lower the value, the higher the priority.
+        permissive
+            If True, ignore errors during the individual steps of the job.
+        private_creator
+            The private creator to be used for private tags in Replace.
+
+        Returns
+        -------
+        Study
+            Returns a new modified study or returns itself if keep=['StudyInstanceUID']
+            (in this case, the study itself is modified).
+
+        Examples
+        --------
+        ```python
+        # Create a modified study
+        modified_study = study.modify(replace={'StudyInstanceUID': '1.2.840.113745.101000.1008000.38048.4626.5933732'}, force=True)
+        assert modified_study.uid == '1.2.840.113745.101000.1008000.38048.4626.5933732'
+
+        # Modify itself
+        study.modify(replace={'ReferringPhysicianName': 'last^first'}, keep=['StudyInstanceUID'], force=True)
+        assert study.referring_physician_name == 'last^first'
+        ```
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        if 'StudyInstanceUID' in replace and not force:
+            raise errors.ModificationError('If StudyInstanceUID is replaced, `force` must be `True`')
+
+        data = {
+            'Asynchronous': False,
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'RemovePrivateTags': remove_private_tags,
+            'KeepSource': keep_source,
+            'Priority': priority,
+            'Permissive': permissive,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+
+        try:
+            modified_study = self.client.post_studies_id_modify(self.id_, data)
+        except ReadTimeout:
+            raise ReadTimeout(
+                'Study modification is too long to process. '
+                'Use `.modify_as_job` or increase client.timeout.'
+            )
+
+        # if 'StudyInstanceUID' is not affected, the modified_study['ID'] is the same as self.id_
+        return Study(modified_study['ID'], self.client)
+
+    def modify_as_job(self, remove: List = None, replace: Dict = None, keep: List = None,
+                      force: bool = False, remove_private_tags: bool = False,
+                      keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                      private_creator: str = None) -> Job:
+        """Modify study and return a job
+
+        Launch a modification job. If keep=['StudyInstanceUID'] (with `force=True`),
+        then modified this study. If the StudyInstanceUID is not keeped, this creates
+        a new modified study.
+        Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+        Notes
+        -----
+        This method is useful when modifying large study or launching many
+        modification jobs. The jobs are sent to Orthanc and processed according
+        to the priority.
+
+        Parameters
+        ----------
+        remove
+            List of tag to remove
+        replace
+            Dictionary of {tag: new_content}
+        keep
+            Keep the original value of the specified tags, to be chosen among the StudyInstanceUID,
+            SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+            as this breaks the DICOM model of the real world.
+        force
+            Allow the modification of tags related to DICOM identifiers, at the risk of breaking
+            the DICOM model of the real world.
+        remove_private_tags
+            If True, remove the private tags from the DICOM instances.
+        keep_source
+            If False, instructs Orthanc to the remove original resources.
+            By default, the original resources are kept in Orthanc.
+        priority
+            Priority of the job. The lower the value, the higher the priority.
+        permissive
+            If True, ignore errors during the individual steps of the job.
+        private_creator
+            The private creator to be used for private tags in Replace.
+
+        Returns
+        -------
+        Job
+            Return a Job object of the modification job.
+
+        Examples
+        --------
+        For large study (recommended)
+        ```python
+        job = study.modify_as_job(replace={'StudyDescription': 'a description'})
+        job.state  # You can follow the job state
+
+        job.wait_until_completion() # Or just wait on its completion
+        modified_study = Study(job.content['ID'], client)
+        assert modified_study.description == 'a description'
+        ```
+        Or modify the StudyInstanceUID
+        ```python
+        job = study.modify_as_job(
+            replace={'StudyInstanceUID': '1.2.840.113745.101000.1008000.38048.4626.5933732'},
+            force=True
+        )
+        job.wait_until_completion() # Or just wait on its completion
+
+        modified_study = Study(job.content['ID'], client)
+        modified_study.uid == '1.2.840.113745.101000.1008000.38048.4626.5933732'
+        ```
+        Or keep the StudyInstanceUID
+        ```python
+        job = study.modify_as_job(
+            replace={'StudyDescription': 'a description'},
+            keep=['StudyInstanceUID'],
+            force=True
+        )
+        job.wait_until_completion()
+
+        assert study.description == 'a description'
+        ```
+        """
+        remove = [] if remove is None else remove
+        replace = {} if replace is None else replace
+        keep = [] if keep is None else keep
+
+        if 'StudyInstanceUID' in replace and not force:
+            raise errors.ModificationError('If StudyInstanceUID is affected, `force` must be `True`')
+
+        data = {
+            'Asynchronous': True,
+            'Remove': remove,
+            'Replace': replace,
+            'Keep': keep,
+            'Force': force,
+            'RemovePrivateTags': remove_private_tags,
+            'KeepSource': keep_source,
+            'Priority': priority,
+            'Permissive': permissive,
+        }
+        if private_creator is not None:
+            data['PrivateCreator'] = private_creator
+
+        job_info = self.client.post_studies_id_modify(self.id_, data)
+
+        return Job(job_info['ID'], self.client)
+
+    def get_zip(self) -> bytes:
+        """Get the bytes of the zip file
+
+        Get the .zip file.
+
+        Returns
+        -------
+        bytes
+            Bytes of Zip file of the study.
+
+        Examples
+        --------
+        ```python
+        from pyorthanc import Orthanc, Study
+        a_study = Study('STUDY_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+        bytes_content = a_study.get_zip()
+        with open('study_zip_file_path.zip', 'wb') as file_handler:
+            file_handler.write(bytes_content)
+        ```
+        """
+        return self.client.get_studies_id_archive(self.id_)
+
+    def download(self, filepath: Union[str, BinaryIO], with_progres: bool = False) -> None:
+        """Download the zip file to a target path or buffer
+
+        This method is an alternative to the `.get_zip()` method for large files.
+        The `.get_zip()` method will pull all the data in a single GET call,
+        while `.download()` stream the data to a file or a buffer.
+        Favor the `.download()` method to avoid timeout and memory issues.
+
+        Examples
+        --------
+        ```python
+        from pyorthanc import Orthanc, Study
+        a_study = Study('STUDY_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+        # Download a zip
+        a_study.download('study.zip')
+
+        # Download a zip and show progress
+        a_study.download('study.zip', with_progres=True)
+
+        # Or download in a buffer in memory
+        buffer = io.BytesIO()
+        a_study.download(buffer)
+        # Now do whatever you want to do
+        buffer.seek(0)
+        zip_bytes = buffer.read()
+        ```
+        """
+        self._download_file(f'{self.client.url}/studies/{self.id_}/archive', filepath, with_progres)
+
+    def get_shared_tags(self, simplify: bool = False, short: bool = False) -> Dict:
+        """Retrieve the shared tags of the study"""
+        params = self._make_response_format_params(simplify, short)
+
+        return dict(self.client.get_studies_id_shared_tags(
+            self.id_,
+            params=params
+        ))
+
+    @property
+    def shared_tags(self) -> Dict:
+        return self.get_shared_tags(simplify=True)
+
+    def remove_empty_series(self) -> None:
+        """Delete empty series."""
+        if self._child_resources is None:
+            return
+
+        for series in self._child_resources:
+            series.remove_empty_instances()
+
+        self._child_resources = [series for series in self._child_resources if series._child_resources != []]
+
+
+ + + +
+ + + + + + + +
+ + + +

+ accession_number: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ date: datetime + + + property + + +

+ + +
+ +

Get study date

+

The date have precision to the second (if available).

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ datetime + +
+

Study date

+
+
+
+ +
+ +
+ + + +

+ description: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ institution_name: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ is_stable: bool + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ labels: List[str] + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ last_update: datetime + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ parent_patient: Patient + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ patient_identifier: str + + + property + + +

+ + +
+ +

Get the Orthanc identifier of the parent patient

+
+ +
+ +
+ + + +

+ patient_information: Dict + + + property + + +

+ + +
+ +

Get patient information

+
+ +
+ +
+ + + +

+ referring_physician_name: str + + + property + + +

+ + +
+ +

Get referring physician name

+
+ +
+ +
+ + + +

+ requested_procedure_description: str + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ requesting_physician: str + + + property + + +

+ + +
+ +

Get referring physician name

+
+ +
+ +
+ + + +

+ series: List[Series] + + + property + + +

+ + +
+ +

Get Study series

+
+ +
+ +
+ + + +

+ shared_tags: Dict + + + property + + +

+ + +
+
+ +
+ +
+ + + +

+ study_id: str + + + property + + +

+ + +
+ +

Get Study ID

+
+ +
+ +
+ + + +

+ uid: str + + + property + + +

+ + +
+ +

Get StudyInstanceUID

+
+ +
+ + + +
+ + +

+ add_label(label) + +

+ + +
+ +
+ Source code in pyorthanc/_resources/study.py +
141
+142
def add_label(self, label: str) -> None:
+    self.client.put_studies_id_labels_label(self.id_, label)
+
+
+
+ +
+ +
+ + +

+ anonymize(remove=None, replace=None, keep=None, force=False, keep_private_tags=False, keep_source=True, priority=0, permissive=False, private_creator=None, dicom_version=None) + +

+ + +
+ +

Anonymize study

+

If no error has been raise, return an anonymous study. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +
+ Notes +

This method might be long to run, especially on large study or when multiple +studies are anonymized. In those cases, it is recommended to use the .anonymize_as_job()

+
+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

List of tag to keep unchanged

+
+
+ None +
force + bool + +
+

Some tags can't be changed without forcing it (e.g. StudyID) for security reason

+
+
+ False +
keep_private_tags + bool + +
+

If True, keep the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
priority + int + +
+

Priority of the job. The lower the value, the higher the priority.

+
+
+ 0 +
permissive + bool + +
+

If True, ignore errors during the individual steps of the job.

+
+
+ False +
private_creator + str + +
+

The private creator to be used for private tags in replace.

+
+
+ None +
dicom_version + str + +
+

Version of the DICOM standard to be used for anonymization. +Check out configuration option DeidentifyLogsDicomVersion for possible values.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Study + +
+

A New anonymous study.

+
+
+ + +

Examples:

+

```python +new_study = study.anonymize()

+

new_study_with_specific_study_id = study.anonymize( + replace={'StudyDescription': 'A description'} +)

+ +
+ Source code in pyorthanc/_resources/study.py +
147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
def anonymize(self, remove: List = None, replace: Dict = None, keep: List = None,
+              force: bool = False, keep_private_tags: bool = False,
+              keep_source: bool = True, priority: int = 0, permissive: bool = False,
+              private_creator: str = None, dicom_version: str = None) -> 'Study':
+    """Anonymize study
+
+    If no error has been raise, return an anonymous study.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Notes
+    -----
+    This method might be long to run, especially on large study or when multiple
+    studies are anonymized. In those cases, it is recommended to use the `.anonymize_as_job()`
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        List of tag to keep unchanged
+    force
+        Some tags can't be changed without forcing it (e.g. StudyID) for security reason
+    keep_private_tags
+        If True, keep the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    priority
+        Priority of the job. The lower the value, the higher the priority.
+    permissive
+        If True, ignore errors during the individual steps of the job.
+    private_creator
+        The private creator to be used for private tags in replace.
+    dicom_version
+        Version of the DICOM standard to be used for anonymization.
+        Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+    Returns
+    -------
+    Study
+        A New anonymous study.
+
+    Examples
+    --------
+    ```python
+    new_study = study.anonymize()
+
+    new_study_with_specific_study_id = study.anonymize(
+        replace={'StudyDescription': 'A description'}
+    )
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    data = {
+        'Asynchronous': False,
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'KeepPrivateTags': keep_private_tags,
+        'KeepSource': keep_source,
+        'Priority': priority,
+        'Permissive': permissive,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+    if dicom_version is not None:
+        data['DicomVersion'] = dicom_version
+
+    try:
+        anonymous_study = self.client.post_studies_id_anonymize(self.id_, data)
+    except ReadTimeout:
+        raise ReadTimeout(
+            'Study anonymization is too long to process. '
+            'Use `.anonymize_as_job` or increase client.timeout.'
+        )
+
+    return Study(anonymous_study['ID'], self.client)
+
+
+
+ +
+ +
+ + +

+ anonymize_as_job(remove=None, replace=None, keep=None, force=False, keep_private_tags=False, keep_source=True, priority=0, permissive=False, private_creator=None, dicom_version=None) + +

+ + +
+ +

Anonymize study and return a job

+

Launch an anonymization job. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +
+ Notes +

This method is useful when anonymizing large study or launching many +anonymization jobs. The jobs are sent to Orthanc and processed according +to the priority.

+
+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

List of tag to keep unchanged

+
+
+ None +
force + bool + +
+

Some tags can't be changed without forcing it (e.g. StudyInstanceUID) for security reason

+
+
+ False +
keep_private_tags + bool + +
+

If True, keep the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
priority + int + +
+

Priority of the job. The lower the value, the higher the priority.

+
+
+ 0 +
permissive + bool + +
+

If True, ignore errors during the individual steps of the job.

+
+
+ False +
private_creator + str + +
+

The private creator to be used for private tags in replace.

+
+
+ None +
dicom_version + str + +
+

Version of the DICOM standard to be used for anonymization. +Check out configuration option DeidentifyLogsDicomVersion for possible values.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Job + +
+

Return a Job object of the anonymization job.

+
+
+ + +

Examples:

+

For large study (recommended)

+
job = study.anonymize_as_job()
+job.state  # You can follow the job state
+
+job.wait_until_completion() # Or just wait on its completion
+new_study = Study(job.content['ID'], orthanc)
+
+ +
+ Source code in pyorthanc/_resources/study.py +
230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
def anonymize_as_job(self, remove: List = None, replace: Dict = None, keep: List = None,
+                     force: bool = False, keep_private_tags: bool = False,
+                     keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                     private_creator: str = None, dicom_version: str = None) -> Job:
+    """Anonymize study and return a job
+
+    Launch an anonymization job.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Notes
+    -----
+    This method is useful when anonymizing large study or launching many
+    anonymization jobs. The jobs are sent to Orthanc and processed according
+    to the priority.
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        List of tag to keep unchanged
+    force
+        Some tags can't be changed without forcing it (e.g. StudyInstanceUID) for security reason
+    keep_private_tags
+        If True, keep the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    priority
+        Priority of the job. The lower the value, the higher the priority.
+    permissive
+        If True, ignore errors during the individual steps of the job.
+    private_creator
+        The private creator to be used for private tags in replace.
+    dicom_version
+        Version of the DICOM standard to be used for anonymization.
+        Check out configuration option DeidentifyLogsDicomVersion for possible values.
+
+    Returns
+    -------
+    Job
+        Return a Job object of the anonymization job.
+
+    Examples
+    --------
+    For large study (recommended)
+    ```python
+    job = study.anonymize_as_job()
+    job.state  # You can follow the job state
+
+    job.wait_until_completion() # Or just wait on its completion
+    new_study = Study(job.content['ID'], orthanc)
+    ```
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    data = {
+        'Asynchronous': True,
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'KeepPrivateTags': keep_private_tags,
+        'KeepSource': keep_source,
+        'Priority': priority,
+        'Permissive': permissive,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+    if dicom_version is not None:
+        data['DicomVersion'] = dicom_version
+
+    job_info = self.client.post_studies_id_anonymize(self.id_, data)
+
+    return Job(job_info['ID'], self.client)
+
+
+
+ +
+ +
+ + +

+ download(filepath, with_progres=False) + +

+ + +
+ +

Download the zip file to a target path or buffer

+

This method is an alternative to the .get_zip() method for large files. +The .get_zip() method will pull all the data in a single GET call, +while .download() stream the data to a file or a buffer. +Favor the .download() method to avoid timeout and memory issues.

+ + +

Examples:

+
from pyorthanc import Orthanc, Study
+a_study = Study('STUDY_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+# Download a zip
+a_study.download('study.zip')
+
+# Download a zip and show progress
+a_study.download('study.zip', with_progres=True)
+
+# Or download in a buffer in memory
+buffer = io.BytesIO()
+a_study.download(buffer)
+# Now do whatever you want to do
+buffer.seek(0)
+zip_bytes = buffer.read()
+
+ +
+ Source code in pyorthanc/_resources/study.py +
528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
def download(self, filepath: Union[str, BinaryIO], with_progres: bool = False) -> None:
+    """Download the zip file to a target path or buffer
+
+    This method is an alternative to the `.get_zip()` method for large files.
+    The `.get_zip()` method will pull all the data in a single GET call,
+    while `.download()` stream the data to a file or a buffer.
+    Favor the `.download()` method to avoid timeout and memory issues.
+
+    Examples
+    --------
+    ```python
+    from pyorthanc import Orthanc, Study
+    a_study = Study('STUDY_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+    # Download a zip
+    a_study.download('study.zip')
+
+    # Download a zip and show progress
+    a_study.download('study.zip', with_progres=True)
+
+    # Or download in a buffer in memory
+    buffer = io.BytesIO()
+    a_study.download(buffer)
+    # Now do whatever you want to do
+    buffer.seek(0)
+    zip_bytes = buffer.read()
+    ```
+    """
+    self._download_file(f'{self.client.url}/studies/{self.id_}/archive', filepath, with_progres)
+
+
+
+ +
+ +
+ + +

+ get_main_information() + +

+ + +
+ +

Get Study information

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Dict + +
+

Dictionary of study information

+
+
+ +
+ Source code in pyorthanc/_resources/study.py +
24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
def get_main_information(self) -> Dict:
+    """Get Study information
+
+    Returns
+    -------
+    Dict
+        Dictionary of study information
+    """
+    if self.lock:
+        if self._information is None:
+            # Setup self._information for the first time when study is lock
+            self._information = self.client.get_studies_id(self.id_)
+
+        return self._information
+
+    return self.client.get_studies_id(self.id_)
+
+
+
+ +
+ +
+ + +

+ get_shared_tags(simplify=False, short=False) + +

+ + +
+ +

Retrieve the shared tags of the study

+ +
+ Source code in pyorthanc/_resources/study.py +
558
+559
+560
+561
+562
+563
+564
+565
def get_shared_tags(self, simplify: bool = False, short: bool = False) -> Dict:
+    """Retrieve the shared tags of the study"""
+    params = self._make_response_format_params(simplify, short)
+
+    return dict(self.client.get_studies_id_shared_tags(
+        self.id_,
+        params=params
+    ))
+
+
+
+ +
+ +
+ + +

+ get_zip() + +

+ + +
+ +

Get the bytes of the zip file

+

Get the .zip file.

+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ bytes + +
+

Bytes of Zip file of the study.

+
+
+ + +

Examples:

+
from pyorthanc import Orthanc, Study
+a_study = Study('STUDY_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+bytes_content = a_study.get_zip()
+with open('study_zip_file_path.zip', 'wb') as file_handler:
+    file_handler.write(bytes_content)
+
+ +
+ Source code in pyorthanc/_resources/study.py +
505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
def get_zip(self) -> bytes:
+    """Get the bytes of the zip file
+
+    Get the .zip file.
+
+    Returns
+    -------
+    bytes
+        Bytes of Zip file of the study.
+
+    Examples
+    --------
+    ```python
+    from pyorthanc import Orthanc, Study
+    a_study = Study('STUDY_IDENTIFIER', Orthanc('http://localhost:8042'))
+
+    bytes_content = a_study.get_zip()
+    with open('study_zip_file_path.zip', 'wb') as file_handler:
+        file_handler.write(bytes_content)
+    ```
+    """
+    return self.client.get_studies_id_archive(self.id_)
+
+
+
+ +
+ +
+ + +

+ modify(remove=None, replace=None, keep=None, force=False, remove_private_tags=False, keep_source=True, priority=0, permissive=False, private_creator=None) + +

+ + +
+ +

Modify study

+

If no error has been raise, then create a modified version of the study. +If keep=['StudyInstanceUID'] and force=True are use, then the study itself is changed. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +
+ Notes +

This method might be long to run, especially on large study or when multiple +studies are modified. In those cases, it is recommended to use the .modify_as_job()

+
+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, +SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, +as this breaks the DICOM model of the real world.

+
+
+ None +
force + bool + +
+

Some tags can't be changed without forcing it (e.g. StudyInstanceUID) for security reason

+
+
+ False +
remove_private_tags + bool + +
+

If True, remove the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
priority + int + +
+

Priority of the job. The lower the value, the higher the priority.

+
+
+ 0 +
permissive + bool + +
+

If True, ignore errors during the individual steps of the job.

+
+
+ False +
private_creator + str + +
+

The private creator to be used for private tags in Replace.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Study + +
+

Returns a new modified study or returns itself if keep=['StudyInstanceUID'] +(in this case, the study itself is modified).

+
+
+ + +

Examples:

+
# Create a modified study
+modified_study = study.modify(replace={'StudyInstanceUID': '1.2.840.113745.101000.1008000.38048.4626.5933732'}, force=True)
+assert modified_study.uid == '1.2.840.113745.101000.1008000.38048.4626.5933732'
+
+# Modify itself
+study.modify(replace={'ReferringPhysicianName': 'last^first'}, keep=['StudyInstanceUID'], force=True)
+assert study.referring_physician_name == 'last^first'
+
+ +
+ Source code in pyorthanc/_resources/study.py +
310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
def modify(self, remove: List = None, replace: Dict = None, keep: List = None,
+           force: bool = False, remove_private_tags: bool = False,
+           keep_source: bool = True, priority: int = 0, permissive: bool = False,
+           private_creator: str = None) -> 'Study':
+    """Modify study
+
+    If no error has been raise, then create a modified version of the study.
+    If keep=['StudyInstanceUID'] and force=True are use, then the study itself is changed.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Notes
+    -----
+    This method might be long to run, especially on large study or when multiple
+    studies are modified. In those cases, it is recommended to use the `.modify_as_job()`
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        Keep the original value of the specified tags, to be chosen among the StudyInstanceUID,
+        SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+        as this breaks the DICOM model of the real world.
+    force
+        Some tags can't be changed without forcing it (e.g. StudyInstanceUID) for security reason
+    remove_private_tags
+        If True, remove the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    priority
+        Priority of the job. The lower the value, the higher the priority.
+    permissive
+        If True, ignore errors during the individual steps of the job.
+    private_creator
+        The private creator to be used for private tags in Replace.
+
+    Returns
+    -------
+    Study
+        Returns a new modified study or returns itself if keep=['StudyInstanceUID']
+        (in this case, the study itself is modified).
+
+    Examples
+    --------
+    ```python
+    # Create a modified study
+    modified_study = study.modify(replace={'StudyInstanceUID': '1.2.840.113745.101000.1008000.38048.4626.5933732'}, force=True)
+    assert modified_study.uid == '1.2.840.113745.101000.1008000.38048.4626.5933732'
+
+    # Modify itself
+    study.modify(replace={'ReferringPhysicianName': 'last^first'}, keep=['StudyInstanceUID'], force=True)
+    assert study.referring_physician_name == 'last^first'
+    ```
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    if 'StudyInstanceUID' in replace and not force:
+        raise errors.ModificationError('If StudyInstanceUID is replaced, `force` must be `True`')
+
+    data = {
+        'Asynchronous': False,
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'RemovePrivateTags': remove_private_tags,
+        'KeepSource': keep_source,
+        'Priority': priority,
+        'Permissive': permissive,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+
+    try:
+        modified_study = self.client.post_studies_id_modify(self.id_, data)
+    except ReadTimeout:
+        raise ReadTimeout(
+            'Study modification is too long to process. '
+            'Use `.modify_as_job` or increase client.timeout.'
+        )
+
+    # if 'StudyInstanceUID' is not affected, the modified_study['ID'] is the same as self.id_
+    return Study(modified_study['ID'], self.client)
+
+
+
+ +
+ +
+ + +

+ modify_as_job(remove=None, replace=None, keep=None, force=False, remove_private_tags=False, keep_source=True, priority=0, permissive=False, private_creator=None) + +

+ + +
+ +

Modify study and return a job

+

Launch a modification job. If keep=['StudyInstanceUID'] (with force=True), +then modified this study. If the StudyInstanceUID is not keeped, this creates +a new modified study. +Documentation: https://book.orthanc-server.com/users/anonymization.html

+ + +
+ Notes +

This method is useful when modifying large study or launching many +modification jobs. The jobs are sent to Orthanc and processed according +to the priority.

+
+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
remove + List + +
+

List of tag to remove

+
+
+ None +
replace + Dict + +
+

Dictionary of {tag: new_content}

+
+
+ None +
keep + List + +
+

Keep the original value of the specified tags, to be chosen among the StudyInstanceUID, +SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible, +as this breaks the DICOM model of the real world.

+
+
+ None +
force + bool + +
+

Allow the modification of tags related to DICOM identifiers, at the risk of breaking +the DICOM model of the real world.

+
+
+ False +
remove_private_tags + bool + +
+

If True, remove the private tags from the DICOM instances.

+
+
+ False +
keep_source + bool + +
+

If False, instructs Orthanc to the remove original resources. +By default, the original resources are kept in Orthanc.

+
+
+ True +
priority + int + +
+

Priority of the job. The lower the value, the higher the priority.

+
+
+ 0 +
permissive + bool + +
+

If True, ignore errors during the individual steps of the job.

+
+
+ False +
private_creator + str + +
+

The private creator to be used for private tags in Replace.

+
+
+ None +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Job + +
+

Return a Job object of the modification job.

+
+
+ + +

Examples:

+

For large study (recommended)

+
job = study.modify_as_job(replace={'StudyDescription': 'a description'})
+job.state  # You can follow the job state
+
+job.wait_until_completion() # Or just wait on its completion
+modified_study = Study(job.content['ID'], client)
+assert modified_study.description == 'a description'
+
+ +

Or modify the StudyInstanceUID

+
job = study.modify_as_job(
+    replace={'StudyInstanceUID': '1.2.840.113745.101000.1008000.38048.4626.5933732'},
+    force=True
+)
+job.wait_until_completion() # Or just wait on its completion
+
+modified_study = Study(job.content['ID'], client)
+modified_study.uid == '1.2.840.113745.101000.1008000.38048.4626.5933732'
+
+ +

Or keep the StudyInstanceUID

+
job = study.modify_as_job(
+    replace={'StudyDescription': 'a description'},
+    keep=['StudyInstanceUID'],
+    force=True
+)
+job.wait_until_completion()
+
+assert study.description == 'a description'
+
+ +
+ Source code in pyorthanc/_resources/study.py +
399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
def modify_as_job(self, remove: List = None, replace: Dict = None, keep: List = None,
+                  force: bool = False, remove_private_tags: bool = False,
+                  keep_source: bool = True, priority: int = 0, permissive: bool = False,
+                  private_creator: str = None) -> Job:
+    """Modify study and return a job
+
+    Launch a modification job. If keep=['StudyInstanceUID'] (with `force=True`),
+    then modified this study. If the StudyInstanceUID is not keeped, this creates
+    a new modified study.
+    Documentation: https://book.orthanc-server.com/users/anonymization.html
+
+    Notes
+    -----
+    This method is useful when modifying large study or launching many
+    modification jobs. The jobs are sent to Orthanc and processed according
+    to the priority.
+
+    Parameters
+    ----------
+    remove
+        List of tag to remove
+    replace
+        Dictionary of {tag: new_content}
+    keep
+        Keep the original value of the specified tags, to be chosen among the StudyInstanceUID,
+        SeriesInstanceUID and SOPInstanceUID tags. Avoid this feature as much as possible,
+        as this breaks the DICOM model of the real world.
+    force
+        Allow the modification of tags related to DICOM identifiers, at the risk of breaking
+        the DICOM model of the real world.
+    remove_private_tags
+        If True, remove the private tags from the DICOM instances.
+    keep_source
+        If False, instructs Orthanc to the remove original resources.
+        By default, the original resources are kept in Orthanc.
+    priority
+        Priority of the job. The lower the value, the higher the priority.
+    permissive
+        If True, ignore errors during the individual steps of the job.
+    private_creator
+        The private creator to be used for private tags in Replace.
+
+    Returns
+    -------
+    Job
+        Return a Job object of the modification job.
+
+    Examples
+    --------
+    For large study (recommended)
+    ```python
+    job = study.modify_as_job(replace={'StudyDescription': 'a description'})
+    job.state  # You can follow the job state
+
+    job.wait_until_completion() # Or just wait on its completion
+    modified_study = Study(job.content['ID'], client)
+    assert modified_study.description == 'a description'
+    ```
+    Or modify the StudyInstanceUID
+    ```python
+    job = study.modify_as_job(
+        replace={'StudyInstanceUID': '1.2.840.113745.101000.1008000.38048.4626.5933732'},
+        force=True
+    )
+    job.wait_until_completion() # Or just wait on its completion
+
+    modified_study = Study(job.content['ID'], client)
+    modified_study.uid == '1.2.840.113745.101000.1008000.38048.4626.5933732'
+    ```
+    Or keep the StudyInstanceUID
+    ```python
+    job = study.modify_as_job(
+        replace={'StudyDescription': 'a description'},
+        keep=['StudyInstanceUID'],
+        force=True
+    )
+    job.wait_until_completion()
+
+    assert study.description == 'a description'
+    ```
+    """
+    remove = [] if remove is None else remove
+    replace = {} if replace is None else replace
+    keep = [] if keep is None else keep
+
+    if 'StudyInstanceUID' in replace and not force:
+        raise errors.ModificationError('If StudyInstanceUID is affected, `force` must be `True`')
+
+    data = {
+        'Asynchronous': True,
+        'Remove': remove,
+        'Replace': replace,
+        'Keep': keep,
+        'Force': force,
+        'RemovePrivateTags': remove_private_tags,
+        'KeepSource': keep_source,
+        'Priority': priority,
+        'Permissive': permissive,
+    }
+    if private_creator is not None:
+        data['PrivateCreator'] = private_creator
+
+    job_info = self.client.post_studies_id_modify(self.id_, data)
+
+    return Job(job_info['ID'], self.client)
+
+
+
+ +
+ +
+ + +

+ remove_empty_series() + +

+ + +
+ +

Delete empty series.

+ +
+ Source code in pyorthanc/_resources/study.py +
571
+572
+573
+574
+575
+576
+577
+578
+579
def remove_empty_series(self) -> None:
+    """Delete empty series."""
+    if self._child_resources is None:
+        return
+
+    for series in self._child_resources:
+        series.remove_empty_instances()
+
+    self._child_resources = [series for series in self._child_resources if series._child_resources != []]
+
+
+
+ +
+ +
+ + +

+ remove_label(label) + +

+ + +
+ +
+ Source code in pyorthanc/_resources/study.py +
144
+145
def remove_label(self, label):
+    self.client.delete_studies_id_labels_label(self.id_, label)
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/retrieve/index.html b/api/retrieve/index.html new file mode 100644 index 0000000..7e52f2f --- /dev/null +++ b/api/retrieve/index.html @@ -0,0 +1,1096 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Retrieve - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Retrieve

+ +
+ + + +

+ pyorthanc.retrieve + + +

+ +
+ + + +
+ + + + + + + + + +
+ + +

+ retrieve_and_write_patients(patients, path) + +

+ + +
+ +

Retrieve and write patients to given path

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
patients + List[Patient] + +
+

List of patients.

+
+
+ required +
path + str + +
+

Path where you want to write the files.

+
+
+ required +
+ +
+ Source code in pyorthanc/retrieve.py +
10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
def retrieve_and_write_patients(patients: List[Patient], path: str) -> None:
+    """Retrieve and write patients to given path
+
+    Parameters
+    ----------
+    patients
+        List of patients.
+    path
+        Path where you want to write the files.
+    """
+    for patient in patients:
+        retrieve_and_write_patient(patient, path)
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/api/util/index.html b/api/util/index.html new file mode 100644 index 0000000..4ef34de --- /dev/null +++ b/api/util/index.html @@ -0,0 +1,1117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Util - PyOrthanc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Util

+ +
+ + + +

+ pyorthanc.util + + +

+ +
+ + + +
+ + + + + + + + + +
+ + +

+ get_pydicom(orthanc, instance_identifier) + +

+ + +
+ +

Get a pydicom.FileDataset from the instance's Orthanc identifier

+ +
+ Source code in pyorthanc/util.py +
51
+52
+53
+54
+55
def get_pydicom(orthanc: Orthanc, instance_identifier: str) -> pydicom.FileDataset:
+    """Get a pydicom.FileDataset from the instance's Orthanc identifier"""
+    dicom_bytes = orthanc.get_instances_id_file(instance_identifier)
+
+    return pydicom.dcmread(BytesIO(dicom_bytes))
+
+
+
+ +
+ +
+ + +

+ make_datetime_from_dicom_date(date, time=None) + +

+ + +
+ +

Attempt to decode date

+ +
+ Source code in pyorthanc/util.py +
15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
def make_datetime_from_dicom_date(date: str, time: str = None) -> Optional[datetime]:
+    """Attempt to decode date"""
+    try:
+        return datetime(
+            year=int(date[:4]),
+            month=int(date[4:6]),
+            day=int(date[6:8]),
+            hour=int(time[:2]),
+            minute=int(time[2:4]),
+            second=int(time[4:6])
+        )
+    except (ValueError, TypeError):
+        try:
+            return datetime(
+                year=int(date[:4]),
+                month=int(date[4:6]),
+                day=int(date[6:8]),
+            )
+        except (ValueError, TypeError):
+            return None
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/architecture.drawio b/architecture.drawio new file mode 100644 index 0000000..e879ea1 --- /dev/null +++ b/architecture.drawio @@ -0,0 +1 @@ +7Vxdc6O4Ev01rso8xMWnsR+TzGR2t2pmUpu6u9mnLQUUW3cBOUIk8fz6bQmBQZLHsWOMc+fmwQEhBJw+aqlPC0b+VfbymaHl4gtNcDrynORl5H8ceZ47DUL4J0pWVcksnFUFc0YSVWldcEu+Y1XoqNKSJLjoVOSUppwsu4UxzXMc804ZYow+d6s90LR71SWaY6PgNkapWfonSfiiKp160br8F0zmi/rK7kQ9X4bqyupJigVK6HOryP808q8Ypbzayl6ucCrAq3GpzrvecLS5MYZz/poTPj/e383d//z3+138eM2/XP31cPFwHvhVM08oLdUTq7vlqxoCRss8waIVd+RfPi8Ix7dLFIujz2B0KFvwLFWHH2jOlRVdeMTLBBWL5lx1Lcw4ftn4FG6DDZAK0wxztoIq6oTziYJT8SlSu89r4wQzVbZoGSaoCYUUIeZN02vMYEPBtgOErmtA+C2P6TO+h8KRfwG/Uwcu7jjyl+QFR3kMnNZxBlB4F0yUknkO2zGAgxkUCOgIkPNCHchIkojTLxkuyHd0L5uCi14uKcm5fNLwchR+FG2VnBbKMLBbcEb/wVc0pdDux5zmopUHkqZa0QFM5ntdk4UWm7mRxWZebybzDJNdoyfKSDG68kcX0IOdFMEPq3bjclltMMQJzYU3K+Hnt9tvX+HfWYYAa5wjQANgoUVBwA4ffhrzutut67tHta7p074xvoBON/ImqbDBPYOtudg6u0oJlob7dvPp68XNr6bddnJ/B8Bzonk437F0F88C6KQ3QAMD0BvoCRK3gcEKNd/ihSZY1uGgN6wmBla3vExWgyM10ZFyh0YqMpHCjFgGxmNDFfmnBtXUgOpXNY0YHKxmKnwyPXC2yVud0WoY+HtZ7f9NEtPdwxUgtsBHwc51ukSbWTz91ILdtC/sah+he68GuULsDY6b1j8bjIbDzYwBThE3zzs54MyZeDUInBhy59os1xseOXOWe5LINaicDnLmdLYeTU8Mu/Owi50/PHbm9PZEsdN93QlgZ87i6oBUqGYdqCaPJa0PnFdxvRCS3OnyRcJTH6/j2PF4XLcF91Y1Vx0xjPC/qkP4kWZwy6zdt9i7Nx3CMyei/7f3AXUnzd7B0PauL2axd7FE+avs7W2wt9AfpzPZMhuJbEeWVbJVyUlKCllYSZa05BAUwq1cx+CN5yKcds5atWIcE/H0TzgWp+eicozihfiPxU2mFJjwocWu6ubfE7vaSYjpG9lWy5qW2CwILfTye6OXGWNcVXYzRE26VDq1NGhWidcZJcxSmQopuygFNRJSPJYW5frokoIW3/m+Zei2de3eNAXfDFPMyU2eXIiEo6B+ioqCxF1g1ig6ljwZQMNWd7B37owdz61L/hLVx/6sqfLxRTVQ7a3aezcw/4fnFZ1OFla3iBMjw6kZwnM4YnPMt5LPtFjLIrbOUJcxnCJOnrr3YbOSusKN8ARrQkTTDYSomyhoyWKszlrb2mhIZ5Yx2auAMBqSpGke+w08ekW69f3yaCh6TFxvHHpdw0aTcTDdjyQbEzDHIokZn/ZFEqBEFHY54rjRwL6myt8NRibN+tDu2Gn/+fuxKnKihpENSf2Gt1u4BcZGq1Y1NVXqg33hEdk3mUQa+3z3p2ZfFBns23Okc0PNibkwHpwa10w1qS+udUfCbRx7IfyutV1xM1R765PEzmpnClYm/BEFp++CqxNd2Y325GrkaVz1TpGrZrr6mqTggkg+N6Oqc6j5QPIE/t3Zj0oFZ+BAK9T05cCy1MSWu+1tpYlvk0h7GnzaDmHboHPAzl3z6NQ7d2jMqQNn/zl1pGW6Az2C63tObWqxn4oCjEfgZKy0NKnBTVAmOlp+Xyyl4Z0HfWWgUMo4Q9A51XlSMRN0SEsuql0GovSxFBUrZUWeU2D2hMWuRuiTl9C8w0hozQqktkBrcy+9KbS1PtRiwe84oxx/oQlgzk9glZYualswc22rKXuTvgJTduzNJY/DgZxyjd6JO+VoEhlOOXiDU466867gyEJH4BnU+oxYUiUzZOJCZjPEBop5KTy12Ma8OQ53wFmV7qgzJgleMhwjDnRrZVF+VpcbWFyuc1SXa4pZfwDWCRioZIUld6EyXYRLGjD8WMqR90JmtVTWKhHbGSqfECkkD0j+QFkmV+fb2sQvMNd2lJNvBnKZ+eBoLs7PmnX7p5f+sM3KPdvKhd6m5UH/mpCKuN1WxF1v2+Nt+0R+W2R/wDGjfs1g65hRdYHhFCVzzAjfII7ruTl94tH3mGFKRn9QIlxFIdLay1VCYpqN5AuB6hUFleROSSF9SCI9BvT7QtxA2yeI8toPvJPXsw45ZqgTZtpSx8CycMq3Eba/McSUXn7kfhQ0+6XMHC0dEnjhFpdiFaQ7rz0W0Ce46Rxl8TVJ67uER1B7B5a0qz4zlAOa6iKTPky91vXMdA1Bf6VzZ43wlTc8nWkUrlo8rF/bTfnam+NaRngbud/O44G19FfLbcGgkV0wc8d6NOaF43C/nmLoumHQS08JtAxAreptui+9vqceud+eZVuG2UPPcsZe5Hd71yzYZ+w4oOev3oUaitTupvd0duWz/g6Be2T1ONxNA3sDhaZgsS6F1gW7cKjxumPoZB3P6/j+j+Mq2NmfkVv98TuhbqOnvpW6Xjgbu/5s/ddtdhKOvfbiEs3h981rU4A7u6G8nRb5AIf/RCyXWU6IjsqWONfSZsT+Y0lUFYZU5KUOsyplQpcj8ZkXlMsQbINKY3xzQepAvBYC00bvKZpYrvmkxjv56EIPQdt01uVrWC//aC9Xtn00oLflyuFuSx139ZnHC7BOJW4KdXX+1UuBtNEzrF9M6Tluqq/T6+yuntm29SDMimr5+0WxEh/9cM6+kli6ICpMhZ7ey9dZ+sgIDP7xndAmJteZmsuSpAkcbL4v4lxTgJe3cznOGcBXPslxoZQvOGCATmbWnZxmP6Ft69dFtVceLab2DmRq2F1/uazqy+vvv/mf/gU= \ No newline at end of file diff --git a/assets/_mkdocstrings.css b/assets/_mkdocstrings.css new file mode 100644 index 0000000..85449ec --- /dev/null +++ b/assets/_mkdocstrings.css @@ -0,0 +1,119 @@ + +/* Avoid breaking parameter names, etc. in table cells. */ +.doc-contents td code { + word-break: normal !important; +} + +/* No line break before first paragraph of descriptions. */ +.doc-md-description, +.doc-md-description>p:first-child { + display: inline; +} + +/* Max width for docstring sections tables. */ +.doc .md-typeset__table, +.doc .md-typeset__table table { + display: table !important; + width: 100%; +} + +.doc .md-typeset__table tr { + display: table-row; +} + +/* Defaults in Spacy table style. */ +.doc-param-default { + float: right; +} + +/* Backward-compatibility: docstring section titles in bold. */ +.doc-section-title { + font-weight: bold; +} + +/* Symbols in Navigation and ToC. */ +:root, +[data-md-color-scheme="default"] { + --doc-symbol-attribute-fg-color: #953800; + --doc-symbol-function-fg-color: #8250df; + --doc-symbol-method-fg-color: #8250df; + --doc-symbol-class-fg-color: #0550ae; + --doc-symbol-module-fg-color: #5cad0f; + + --doc-symbol-attribute-bg-color: #9538001a; + --doc-symbol-function-bg-color: #8250df1a; + --doc-symbol-method-bg-color: #8250df1a; + --doc-symbol-class-bg-color: #0550ae1a; + --doc-symbol-module-bg-color: #5cad0f1a; +} + +[data-md-color-scheme="slate"] { + --doc-symbol-attribute-fg-color: #ffa657; + --doc-symbol-function-fg-color: #d2a8ff; + --doc-symbol-method-fg-color: #d2a8ff; + --doc-symbol-class-fg-color: #79c0ff; + --doc-symbol-module-fg-color: #baff79; + + --doc-symbol-attribute-bg-color: #ffa6571a; + --doc-symbol-function-bg-color: #d2a8ff1a; + --doc-symbol-method-bg-color: #d2a8ff1a; + --doc-symbol-class-bg-color: #79c0ff1a; + --doc-symbol-module-bg-color: #baff791a; +} + +code.doc-symbol { + border-radius: .1rem; + font-size: .85em; + padding: 0 .3em; + font-weight: bold; +} + +code.doc-symbol-attribute { + color: var(--doc-symbol-attribute-fg-color); + background-color: var(--doc-symbol-attribute-bg-color); +} + +code.doc-symbol-attribute::after { + content: "attr"; +} + +code.doc-symbol-function { + color: var(--doc-symbol-function-fg-color); + background-color: var(--doc-symbol-function-bg-color); +} + +code.doc-symbol-function::after { + content: "func"; +} + +code.doc-symbol-method { + color: var(--doc-symbol-method-fg-color); + background-color: var(--doc-symbol-method-bg-color); +} + +code.doc-symbol-method::after { + content: "meth"; +} + +code.doc-symbol-class { + color: var(--doc-symbol-class-fg-color); + background-color: var(--doc-symbol-class-bg-color); +} + +code.doc-symbol-class::after { + content: "class"; +} + +code.doc-symbol-module { + color: var(--doc-symbol-module-fg-color); + background-color: var(--doc-symbol-module-bg-color); +} + +code.doc-symbol-module::after { + content: "mod"; +} + +.doc-signature .autorefs { + color: inherit; + border-bottom: 1px dotted currentcolor; +} diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000..1cf13b9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.081f42fc.min.js b/assets/javascripts/bundle.081f42fc.min.js new file mode 100644 index 0000000..32734cd --- /dev/null +++ b/assets/javascripts/bundle.081f42fc.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Fi=Object.create;var gr=Object.defineProperty;var ji=Object.getOwnPropertyDescriptor;var Wi=Object.getOwnPropertyNames,Dt=Object.getOwnPropertySymbols,Ui=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty,no=Object.prototype.propertyIsEnumerable;var oo=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))xr.call(t,r)&&oo(e,r,t[r]);if(Dt)for(var r of Dt(t))no.call(t,r)&&oo(e,r,t[r]);return e};var io=(e,t)=>{var r={};for(var o in e)xr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Dt)for(var o of Dt(e))t.indexOf(o)<0&&no.call(e,o)&&(r[o]=e[o]);return r};var yr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Di=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Wi(t))!xr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=ji(t,n))||o.enumerable});return e};var Vt=(e,t,r)=>(r=e!=null?Fi(Ui(e)):{},Di(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var ao=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var co=yr((Er,so)=>{(function(e,t){typeof Er=="object"&&typeof so!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(H){return!!(H&&H!==document&&H.nodeName!=="HTML"&&H.nodeName!=="BODY"&&"classList"in H&&"contains"in H.classList)}function p(H){var mt=H.type,ze=H.tagName;return!!(ze==="INPUT"&&a[mt]&&!H.readOnly||ze==="TEXTAREA"&&!H.readOnly||H.isContentEditable)}function c(H){H.classList.contains("focus-visible")||(H.classList.add("focus-visible"),H.setAttribute("data-focus-visible-added",""))}function l(H){H.hasAttribute("data-focus-visible-added")&&(H.classList.remove("focus-visible"),H.removeAttribute("data-focus-visible-added"))}function f(H){H.metaKey||H.altKey||H.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(H){o=!1}function h(H){s(H.target)&&(o||p(H.target))&&c(H.target)}function w(H){s(H.target)&&(H.target.classList.contains("focus-visible")||H.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(H.target))}function A(H){document.visibilityState==="hidden"&&(n&&(o=!0),te())}function te(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function ie(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(H){H.target.nodeName&&H.target.nodeName.toLowerCase()==="html"||(o=!1,ie())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",A,!0),te(),r.addEventListener("focus",h,!0),r.addEventListener("blur",w,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var Yr=yr((Rt,Kr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Rt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Rt=="object"?Rt.ClipboardJS=r():t.ClipboardJS=r()})(Rt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ii}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(_){return!1}}var h=function(_){var O=f()(_);return u("cut"),O},w=h;function A(V){var _=document.documentElement.getAttribute("dir")==="rtl",O=document.createElement("textarea");O.style.fontSize="12pt",O.style.border="0",O.style.padding="0",O.style.margin="0",O.style.position="absolute",O.style[_?"right":"left"]="-9999px";var j=window.pageYOffset||document.documentElement.scrollTop;return O.style.top="".concat(j,"px"),O.setAttribute("readonly",""),O.value=V,O}var te=function(_,O){var j=A(_);O.container.appendChild(j);var D=f()(j);return u("copy"),j.remove(),D},ie=function(_){var O=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},j="";return typeof _=="string"?j=te(_,O):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?j=te(_.value,O):(j=f()(_),u("copy")),j},J=ie;function H(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(O){return typeof O}:H=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},H(V)}var mt=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},O=_.action,j=O===void 0?"copy":O,D=_.container,Y=_.target,ke=_.text;if(j!=="copy"&&j!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&H(Y)==="object"&&Y.nodeType===1){if(j==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(j==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(ke)return J(ke,{container:D});if(Y)return j==="cut"?w(Y):J(Y,{container:D})},ze=mt;function Ie(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(O){return typeof O}:Ie=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},Ie(V)}function _i(V,_){if(!(V instanceof _))throw new TypeError("Cannot call a class as a function")}function ro(V,_){for(var O=0;O<_.length;O++){var j=_[O];j.enumerable=j.enumerable||!1,j.configurable=!0,"value"in j&&(j.writable=!0),Object.defineProperty(V,j.key,j)}}function Ai(V,_,O){return _&&ro(V.prototype,_),O&&ro(V,O),V}function Ci(V,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");V.prototype=Object.create(_&&_.prototype,{constructor:{value:V,writable:!0,configurable:!0}}),_&&br(V,_)}function br(V,_){return br=Object.setPrototypeOf||function(j,D){return j.__proto__=D,j},br(V,_)}function Hi(V){var _=Pi();return function(){var j=Wt(V),D;if(_){var Y=Wt(this).constructor;D=Reflect.construct(j,arguments,Y)}else D=j.apply(this,arguments);return ki(this,D)}}function ki(V,_){return _&&(Ie(_)==="object"||typeof _=="function")?_:$i(V)}function $i(V){if(V===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return V}function Pi(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(V){return!1}}function Wt(V){return Wt=Object.setPrototypeOf?Object.getPrototypeOf:function(O){return O.__proto__||Object.getPrototypeOf(O)},Wt(V)}function vr(V,_){var O="data-clipboard-".concat(V);if(_.hasAttribute(O))return _.getAttribute(O)}var Ri=function(V){Ci(O,V);var _=Hi(O);function O(j,D){var Y;return _i(this,O),Y=_.call(this),Y.resolveOptions(D),Y.listenClick(j),Y}return Ai(O,[{key:"resolveOptions",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=Ie(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function(ke){return Y.onClick(ke)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,ke=this.action(Y)||"copy",Ut=ze({action:ke,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Ut?"success":"error",{action:ke,text:Ut,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return w(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,ke=!!document.queryCommandSupported;return Y.forEach(function(Ut){ke=ke&&!!document.queryCommandSupported(Ut)}),ke}}]),O}(s()),Ii=Ri},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,h,w){var A=c.apply(this,arguments);return l.addEventListener(u,A,w),{destroy:function(){l.removeEventListener(u,A,w)}}}function p(l,f,u,h,w){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(A){return s(A,f,u,h,w)}))}function c(l,f,u,h){return function(w){w.delegateTarget=a(w.target,f),w.delegateTarget&&h.call(l,w)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,h,w){if(!u&&!h&&!w)throw new Error("Missing required arguments");if(!a.string(h))throw new TypeError("Second argument must be a String");if(!a.fn(w))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,h,w);if(a.nodeList(u))return l(u,h,w);if(a.string(u))return f(u,h,w);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,h,w){return u.addEventListener(h,w),{destroy:function(){u.removeEventListener(h,w)}}}function l(u,h,w){return Array.prototype.forEach.call(u,function(A){A.addEventListener(h,w)}),{destroy:function(){Array.prototype.forEach.call(u,function(A){A.removeEventListener(h,w)})}}}function f(u,h,w){return s(document.body,u,h,w)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var ts=/["'&<>]/;ei.exports=rs;function rs(e){var t=""+e,r=ts.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||s(u,h)})})}function s(u,h){try{p(o[u](h))}catch(w){f(i[0][3],w)}}function p(u){u.value instanceof nt?Promise.resolve(u.value.v).then(c,l):f(i[0][2],u)}function c(u){s("next",u)}function l(u){s("throw",u)}function f(u,h){u(h),i.shift(),i.length&&s(i[0][0],i[0][1])}}function mo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof de=="function"?de(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function k(e){return typeof e=="function"}function ft(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ft(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Fe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=de(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(A){t={error:A}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(A){i=A instanceof zt?A.errors:[A]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=de(f),h=u.next();!h.done;h=u.next()){var w=h.value;try{fo(w)}catch(A){i=i!=null?i:[],A instanceof zt?i=q(q([],N(i)),N(A.errors)):i.push(A)}}}catch(A){o={error:A}}finally{try{h&&!h.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)fo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=Fe.EMPTY;function qt(e){return e instanceof Fe||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function fo(e){k(e)?e():e.unsubscribe()}var $e={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var ut={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Fe(function(){o.currentObservers=null,qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new Eo(r,o)},t}(F);var Eo=function(e){re(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){re(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var Lt={now:function(){return(Lt.delegate||Date).now()},delegate:void 0};var _t=function(e){re(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Lt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(vt);var So=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(gt);var Hr=new So(To);var Oo=function(e){re(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=bt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(bt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(vt);var Mo=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(gt);var me=new Mo(Oo);var M=new F(function(e){return e.complete()});function Yt(e){return e&&k(e.schedule)}function kr(e){return e[e.length-1]}function Xe(e){return k(kr(e))?e.pop():void 0}function He(e){return Yt(kr(e))?e.pop():void 0}function Bt(e,t){return typeof kr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return k(e==null?void 0:e.then)}function Jt(e){return k(e[ht])}function Xt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Gi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Gi();function tr(e){return k(e==null?void 0:e[er])}function rr(e){return lo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return k(e==null?void 0:e.getReader)}function W(e){if(e instanceof F)return e;if(e!=null){if(Jt(e))return Ji(e);if(xt(e))return Xi(e);if(Gt(e))return Zi(e);if(Xt(e))return Lo(e);if(tr(e))return ea(e);if(or(e))return ta(e)}throw Zt(e)}function Ji(e){return new F(function(t){var r=e[ht]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Xi(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?v(function(n,i){return e(n,i,o)}):le,Te(1),r?Be(t):zo(function(){return new ir}))}}function Fr(e){return e<=0?function(){return M}:y(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,h=0,w=!1,A=!1,te=function(){f==null||f.unsubscribe(),f=void 0},ie=function(){te(),l=u=void 0,w=A=!1},J=function(){var H=l;ie(),H==null||H.unsubscribe()};return y(function(H,mt){h++,!A&&!w&&te();var ze=u=u!=null?u:r();mt.add(function(){h--,h===0&&!A&&!w&&(f=Wr(J,p))}),ze.subscribe(mt),!l&&h>0&&(l=new at({next:function(Ie){return ze.next(Ie)},error:function(Ie){A=!0,te(),f=Wr(ie,n,Ie),ze.error(Ie)},complete:function(){w=!0,te(),f=Wr(ie,a),ze.complete()}}),W(H).subscribe(l))})(c)}}function Wr(e,t){for(var r=[],o=2;oe.next(document)),e}function $(e,t=document){return Array.from(t.querySelectorAll(e))}function P(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Re(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var xa=S(d(document.body,"focusin"),d(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Re()||document.body),B(1));function et(e){return xa.pipe(m(t=>e.contains(t)),K())}function kt(e,t){return C(()=>S(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Me(+!r*t)):le,Q(e.matches(":hover"))))}function Bo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Bo(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Bo(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function wt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),S(d(t,"load"),d(t,"error").pipe(b(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),L(()=>document.head.removeChild(t)),Te(1))))}var Go=new g,ya=C(()=>typeof ResizeObserver=="undefined"?wt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Go.next(t)))),b(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),B(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return ya.pipe(E(r=>r.observe(t)),b(r=>Go.pipe(v(o=>o.target===t),L(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function Tt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Jo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ue(e){return{x:e.offsetLeft,y:e.offsetTop}}function Xo(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function Zo(e){return S(d(window,"load"),d(window,"resize")).pipe(Le(0,me),m(()=>Ue(e)),Q(Ue(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function De(e){return S(d(e,"scroll"),d(window,"scroll"),d(window,"resize")).pipe(Le(0,me),m(()=>pr(e)),Q(pr(e)))}var en=new g,Ea=C(()=>I(new IntersectionObserver(e=>{for(let t of e)en.next(t)},{threshold:0}))).pipe(b(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),B(1));function tt(e){return Ea.pipe(E(t=>t.observe(e)),b(t=>en.pipe(v(({target:r})=>r===e),L(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function tn(e,t=16){return De(e).pipe(m(({y:r})=>{let o=ce(e),n=Tt(e);return r>=n.height-o.height-t}),K())}var lr={drawer:P("[data-md-toggle=drawer]"),search:P("[data-md-toggle=search]")};function rn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function Ve(e){let t=lr[e];return d(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function wa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ta(){return S(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function on(){let e=d(window,"keydown").pipe(v(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:rn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),v(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!wa(o,r)}return!0}),pe());return Ta().pipe(b(t=>t?M:e))}function xe(){return new URL(location.href)}function pt(e,t=!1){if(G("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function nn(){return new g}function an(){return location.hash.slice(1)}function sn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Sa(e){return S(d(window,"hashchange"),e).pipe(m(an),Q(an()),v(t=>t.length>0),B(1))}function cn(e){return Sa(e).pipe(m(t=>fe(`[id="${t}"]`)),v(t=>typeof t!="undefined"))}function $t(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function pn(){let e=matchMedia("print");return S(d(window,"beforeprint").pipe(m(()=>!0)),d(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(b(r=>r?t():M))}function zr(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function Ne(e,t){return zr(e,t).pipe(b(r=>r.text()),m(r=>JSON.parse(r)),B(1))}function ln(e,t){let r=new DOMParser;return zr(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),B(1))}function mn(e,t){let r=new DOMParser;return zr(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),B(1))}function fn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function un(){return S(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(fn),Q(fn()))}function dn(){return{width:innerWidth,height:innerHeight}}function hn(){return d(window,"resize",{passive:!0}).pipe(m(dn),Q(dn()))}function bn(){return z([un(),hn()]).pipe(m(([e,t])=>({offset:e,size:t})),B(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(Z("size")),n=z([o,r]).pipe(m(()=>Ue(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function Oa(e){return d(e,"message",t=>t.data)}function Ma(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function vn(e,t=new Worker(e)){let r=Oa(t),o=Ma(t),n=new g;n.subscribe(o);let i=o.pipe(X(),ne(!0));return n.pipe(X(),Pe(r.pipe(U(i))),pe())}var La=P("#__config"),St=JSON.parse(La.textContent);St.base=`${new URL(St.base,xe())}`;function ye(){return St}function G(e){return St.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?St.translations[e].replace("#",t.toString()):St.translations[e]}function Se(e,t=document){return P(`[data-md-component=${e}]`,t)}function ae(e,t=document){return $(`[data-md-component=${e}]`,t)}function _a(e){let t=P(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>P(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function gn(e){if(!G("announce.dismiss")||!e.childElementCount)return M;if(!e.hidden){let t=P(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),_a(e).pipe(E(r=>t.next(r)),L(()=>t.complete()),m(r=>R({ref:e},r)))})}function Aa(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function xn(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Aa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))}function Pt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function yn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function En(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function wn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,c)," "],[]).slice(0,-1),i=ye(),a=new URL(e.location,i.base);G("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=ye();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)}),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Tn(e){let t=e[0].score,r=[...e],o=ye(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreqr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function Sn(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Qr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function On(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Ca(e){var o;let t=ye(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Mn(e,t){var o;let r=ye();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Ca)))}var Ha=0;function ka(e){let t=z([et(e),kt(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Jo(e)).pipe(oe(De),ct(1),m(()=>Xo(e)));return t.pipe(Ae(o=>o),b(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function $a(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ha++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(X(),ne(!1)).subscribe(a);let s=a.pipe(Ht(c=>Me(+!c*250,Hr)),K(),b(c=>c?r:M),E(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(b(c=>kt(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(v(c=>c),ee(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),h=u.width/2;if(l.role==="tooltip")return{x:h,y:8+u.height};if(u.y>=f.height/2){let{height:w}=ce(l);return{x:h,y:-16-w}}else return{x:h,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(v(c=>c),ee(s,(c,l)=>l),v(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(P(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),be(me),ee(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(v(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(v(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),ka(e).pipe(E(c=>i.next(c)),L(()=>i.complete()),m(c=>R({ref:e},c)))})}function lt(e,{viewport$:t},r=document.body){return $a(e,{content$:new F(o=>{let n=e.title,i=yn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Pa(e,t){let r=C(()=>z([Zo(e),De(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(b(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function Ln(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(U(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),S(i.pipe(v(({active:s})=>s)),i.pipe(_e(250),v(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Le(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(ct(125,me),v(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),d(n,"click").pipe(U(a),v(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),d(n,"mousedown").pipe(U(a),ee(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Re())==null||c.blur()}}),r.pipe(U(a),v(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Pa(e,t).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function Ra(e){return e.tagName==="CODE"?$(".c, .c1, .cm",e):[e]}function Ia(e){let t=[];for(let r of Ra(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function _n(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Ia(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,En(p,i)),s.replaceWith(a.get(p)))}return a.size===0?M:C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=[];for(let[l,f]of a)c.push([P(".md-typeset",f),P(`:scope > li:nth-child(${l})`,e)]);return o.pipe(U(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?_n(f,u):_n(u,f)}),S(...[...a].map(([,l])=>Ln(l,t,{target$:r}))).pipe(L(()=>s.complete()),pe())})}function An(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return An(t)}}function Cn(e,t){return C(()=>{let r=An(e);return typeof r!="undefined"?fr(r,e,t):M})}var Hn=Vt(Yr());var Fa=0;function kn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return kn(t)}}function ja(e){return ge(e).pipe(m(({width:t})=>({scrollable:Tt(e).width>t})),Z("scrollable"))}function $n(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(Fr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Hn.default.isSupported()&&(e.closest(".copy")||G("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Fa++}`;let l=wn(c.id);c.insertBefore(l,e),G("content.tooltips")&&a.push(lt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=kn(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||G("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(U(i),m(({width:f,height:u})=>f&&u),K(),b(f=>f?l:M)))}}return $(":scope > span[id]",e).length&&e.classList.add("md-code__content"),ja(e).pipe(E(c=>n.next(c)),L(()=>n.complete()),m(c=>R({ref:e},c)),Pe(...a))});return G("content.lazy")?tt(e).pipe(v(n=>n),Te(1),b(()=>o)):o}function Wa(e,{target$:t,print$:r}){let o=!0;return S(t.pipe(m(n=>n.closest("details:not([open])")),v(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(v(n=>n||!o),E(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Pn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Wa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}var Rn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Br,Da=0;function Va(){return typeof mermaid=="undefined"||mermaid instanceof Element?wt("https://unpkg.com/mermaid@10/dist/mermaid.min.js"):I(void 0)}function In(e){return e.classList.remove("mermaid"),Br||(Br=Va().pipe(E(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Rn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),B(1))),Br.subscribe(()=>ao(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Da++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Br.pipe(m(()=>({ref:e})))}var Fn=x("table");function jn(e){return e.replaceWith(Fn),Fn.replaceWith(On(e)),I({ref:e})}function Na(e){let t=e.find(r=>r.checked)||e[0];return S(...e.map(r=>d(r,"change").pipe(m(()=>P(`label[for="${r.id}"]`))))).pipe(Q(P(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Wn(e,{viewport$:t,target$:r}){let o=P(".tabbed-labels",e),n=$(":scope > input",e),i=Qr("prev");e.append(i);let a=Qr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(X(),ne(!0));z([s,ge(e)]).pipe(U(p),Le(1,me)).subscribe({next([{active:c},l]){let f=Ue(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let h=pr(o);(f.xh.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([De(o),ge(o)]).pipe(U(p)).subscribe(([c,l])=>{let f=Tt(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),S(d(i,"click").pipe(m(()=>-1)),d(a,"click").pipe(m(()=>1))).pipe(U(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(U(p),v(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=P(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),d(l.firstElementChild,"click").pipe(U(p),v(f=>!(f.metaKey||f.ctrlKey)),E(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return G("content.tabs.link")&&s.pipe(Ce(1),ee(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let w of $("[data-tabs]"))for(let A of $(":scope > input",w)){let te=P(`label[for="${A.id}"]`);if(te!==c&&te.innerText.trim()===f){te.setAttribute("data-md-switching",""),A.click();break}}window.scrollTo({top:e.offsetTop-u});let h=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...h])])}}),s.pipe(U(p)).subscribe(()=>{for(let c of $("audio, video",e))c.pause()}),tt(e).pipe(b(()=>Na(n)),E(c=>s.next(c)),L(()=>s.complete()),m(c=>R({ref:e},c)))}).pipe(Qe(se))}function Un(e,{viewport$:t,target$:r,print$:o}){return S(...$(".annotate:not(.highlight)",e).map(n=>Cn(n,{target$:r,print$:o})),...$("pre:not(.mermaid) > code",e).map(n=>$n(n,{target$:r,print$:o})),...$("pre.mermaid",e).map(n=>In(n)),...$("table:not([class])",e).map(n=>jn(n)),...$("details",e).map(n=>Pn(n,{target$:r,print$:o})),...$("[data-tabs]",e).map(n=>Wn(n,{viewport$:t,target$:r})),...$("[title]",e).filter(()=>G("content.tooltips")).map(n=>lt(n,{viewport$:t})))}function za(e,{alert$:t}){return t.pipe(b(r=>S(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function Dn(e,t){let r=P(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),za(e,t).pipe(E(n=>o.next(n)),L(()=>o.complete()),m(n=>R({ref:e},n)))})}var qa=0;function Qa(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?De(o):I({x:0,y:0}),i=S(et(t),kt(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ue(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function Vn(e){let t=e.title;if(!t.length)return M;let r=`__tooltip_${qa++}`,o=Pt(r,"inline"),n=P(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),S(i.pipe(v(({active:a})=>a)),i.pipe(_e(250),v(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Le(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(ct(125,me),v(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Qa(o,e).pipe(E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))}).pipe(Qe(se))}function Ka({viewport$:e}){if(!G("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Ye(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=Ve("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),b(n=>n?r:I(!1)),Q(!1))}function Nn(e,t){return C(()=>z([ge(e),Ka(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),B(1))}function zn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(X(),ne(!0));o.pipe(Z("active"),We(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue($("[title]",e)).pipe(v(()=>G("content.tooltips")),oe(a=>Vn(a)));return r.subscribe(o),t.pipe(U(n),m(a=>R({ref:e},a)),Pe(i.pipe(U(n))))})}function Ya(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),Z("active"))}function qn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?M:Ya(o,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))})}function Qn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(b(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),Z("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Ba(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(oe(o=>d(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),B(1))}function Kn(e){let t=$("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=$t("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),ee(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(be(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Ba(t).pipe(U(n.pipe(Ce(1))),st(),E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))})}function Yn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(E(o=>r.next({value:o})),L(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Gr=Vt(Yr());function Ga(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Bn({alert$:e}){Gr.default.isSupported()&&new F(t=>{new Gr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ga(P(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(E(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function Gn(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function Ja(e,t){let r=new Map;for(let o of $("url",e)){let n=P("loc",o),i=[Gn(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of $("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(Gn(new URL(s),t))}}return r}function ur(e){return mn(new URL("sitemap.xml",e)).pipe(m(t=>Ja(t,new URL(e))),ve(()=>I(new Map)))}function Xa(e,t){if(!(e.target instanceof Element))return M;let r=e.target.closest("a");if(r===null)return M;if(r.target||e.metaKey||e.ctrlKey)return M;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):M}function Jn(e){let t=new Map;for(let r of $(":scope > *",e.head))t.set(r.outerHTML,r);return t}function Xn(e){for(let t of $("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function Za(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...G("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=Jn(document);for(let[o,n]of Jn(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return je($("script",r)).pipe(b(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),M}),X(),ne(document))}function Zn({location$:e,viewport$:t,progress$:r}){let o=ye();if(location.protocol==="file:")return M;let n=ur(o.base);I(document).subscribe(Xn);let i=d(document.body,"click").pipe(We(n),b(([p,c])=>Xa(p,c)),pe()),a=d(window,"popstate").pipe(m(xe),pe());i.pipe(ee(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),S(i,a).subscribe(e);let s=e.pipe(Z("pathname"),b(p=>ln(p,{progress$:r}).pipe(ve(()=>(pt(p,!0),M)))),b(Xn),b(Za),pe());return S(s.pipe(ee(e,(p,c)=>c)),s.pipe(b(()=>e),Z("pathname"),b(()=>e),Z("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),b(()=>i),E(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",sn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),d(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(Z("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var ri=Vt(ti());function oi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ri.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function It(e){return e.type===1}function dr(e){return e.type===3}function ni(e,t){let r=vn(e);return S(I(location.protocol!=="file:"),Ve("search")).pipe(Ae(o=>o),b(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:G("search.suggest")}}})),r}function ii({document$:e}){let t=ye(),r=Ne(new URL("../versions.json",t.base)).pipe(ve(()=>M)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),b(n=>d(document.body,"click").pipe(v(i=>!i.metaKey&&!i.ctrlKey),ee(o),b(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?M:(i.preventDefault(),I(p))}}return M}),b(i=>ur(new URL(i)).pipe(m(a=>{let p=xe().href.replace(t.base,i);return a.has(p.split("#")[0])?new URL(p):new URL(i)})))))).subscribe(n=>pt(n,!0)),z([r,o]).subscribe(([n,i])=>{P(".md-header__topic").appendChild(Mn(n,i))}),e.pipe(b(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function ns(e,{worker$:t}){let{searchParams:r}=xe();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),Ve("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=xe();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=S(t.pipe(Ae(It)),d(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),B(1))}function ai(e,{worker$:t}){let r=new g,o=r.pipe(X(),ne(!0));z([t.pipe(Ae(It)),r],(i,a)=>a).pipe(Z("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(Z("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),d(e.form,"reset").pipe(U(o)).subscribe(()=>e.focus());let n=P("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),ns(e,{worker$:t}).pipe(E(i=>r.next(i)),L(()=>r.complete()),m(i=>R({ref:e},i)),B(1))}function si(e,{worker$:t,query$:r}){let o=new g,n=tn(e.parentElement).pipe(v(Boolean)),i=e.parentElement,a=P(":scope > :first-child",e),s=P(":scope > :last-child",e);Ve("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ee(r),Ur(t.pipe(Ae(It)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(E(()=>s.innerHTML=""),b(({items:l})=>S(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Ye(4),Vr(n),b(([f])=>f)))),m(Tn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(oe(l=>{let f=fe("details",l);return typeof f=="undefined"?M:d(f,"toggle").pipe(U(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(v(dr),m(({data:l})=>l)).pipe(E(l=>o.next(l)),L(()=>o.complete()),m(l=>R({ref:e},l)))}function is(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=xe();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function ci(e,t){let r=new g,o=r.pipe(X(),ne(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),d(e,"click").pipe(U(o)).subscribe(n=>n.preventDefault()),is(e,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))}function pi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=S(d(n,"keydown"),d(n,"focus")).pipe(be(se),m(()=>n.value),K());return o.pipe(We(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(v(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(v(dr),m(({data:s})=>s)).pipe(E(s=>o.next(s)),L(()=>o.complete()),m(()=>({ref:e})))}function li(e,{index$:t,keyboard$:r}){let o=ye();try{let n=ni(o.search,t),i=Se("search-query",e),a=Se("search-result",e);d(e,"click").pipe(v(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(v(({mode:p})=>p==="search")).subscribe(p=>{let c=Re();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of $(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,h])=>h-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...$(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Re()&&i.focus()}}),r.pipe(v(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=ai(i,{worker$:n});return S(s,si(a,{worker$:n,query$:s})).pipe(Pe(...ae("search-share",e).map(p=>ci(p,{query$:s})),...ae("search-suggest",e).map(p=>pi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ke}}function mi(e,{index$:t,location$:r}){return z([t,r.pipe(Q(xe()),v(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>oi(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function as(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Jr(e,o){var n=o,{header$:t}=n,r=io(n,["header$"]);let i=P(".md-sidebar__scrollwrap",e),{y:a}=Ue(i);return C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=s.pipe(Le(0,me));return c.pipe(ee(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of $(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2})}}}),ue($("label[tabindex]",e)).pipe(oe(l=>d(l,"click").pipe(be(se),m(()=>l),U(p)))).subscribe(l=>{let f=P(`[id="${l.htmlFor}"]`);P(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),as(e,r).pipe(E(l=>s.next(l)),L(()=>s.complete()),m(l=>R({ref:e},l)))})}function fi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Ct(Ne(`${r}/releases/latest`).pipe(ve(()=>M),m(o=>({version:o.tag_name})),Be({})),Ne(r).pipe(ve(()=>M),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Be({}))).pipe(m(([o,n])=>R(R({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ne(r).pipe(m(o=>({repositories:o.public_repos})),Be({}))}}function ui(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ne(r).pipe(ve(()=>M),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Be({}))}function di(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return fi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ui(r,o)}return M}var ss;function cs(e){return ss||(ss=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return M}return di(e.href).pipe(E(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>M),v(t=>Object.keys(t).length>0),m(t=>({facts:t})),B(1)))}function hi(e){let t=P(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(Sn(o)),t.classList.add("md-source__repository--active")}),cs(e).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ps(e,{viewport$:t,header$:r}){return ge(document.body).pipe(b(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),Z("hidden"))}function bi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(G("navigation.tabs.sticky")?I({hidden:!1}):ps(e,t)).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ls(e,{viewport$:t,header$:r}){let o=new Map,n=$(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(Z("height"),m(({height:s})=>{let p=Se("main"),c=P(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(Z("height"),b(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let h=f.offsetParent;for(;h;h=h.offsetParent)u+=h.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),We(i),b(([p,c])=>t.pipe(jr(([l,f],{offset:{y:u},size:h})=>{let w=u+h.height>=Math.floor(s.height);for(;f.length;){let[,A]=f[0];if(A-c=u&&!w)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Ye(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(X(),ne(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),G("toc.follow")){let s=S(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(v(({prev:p})=>p.length>0),We(o.pipe(be(se))),ee(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2,behavior:c})}}})}return G("navigation.tracking")&&t.pipe(U(a),Z("offset"),_e(250),Ce(1),U(n.pipe(Ce(1))),st({delay:250}),ee(i)).subscribe(([,{prev:s}])=>{let p=xe(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),ls(e,{viewport$:t,header$:r}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function ms(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Ye(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),U(o.pipe(Ce(1))),ne(!0),st({delay:250}),m(a=>({hidden:a})))}function gi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(U(a),Z("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),d(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),ms(e,{viewport$:t,main$:o,target$:n}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))}function xi({document$:e,viewport$:t}){e.pipe(b(()=>$(".md-ellipsis")),oe(r=>tt(r).pipe(U(e.pipe(Ce(1))),v(o=>o),m(()=>r),Te(1))),v(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,lt(n,{viewport$:t}).pipe(U(e.pipe(Ce(1))),L(()=>n.removeAttribute("title")))})).subscribe(),e.pipe(b(()=>$(".md-status")),oe(r=>lt(r,{viewport$:t}))).subscribe()}function yi({document$:e,tablet$:t}){e.pipe(b(()=>$(".md-toggle--indeterminate")),E(r=>{r.indeterminate=!0,r.checked=!1}),oe(r=>d(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ee(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function fs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ei({document$:e}){e.pipe(b(()=>$("[data-md-scrollfix]")),E(t=>t.removeAttribute("data-md-scrollfix")),v(fs),oe(t=>d(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function wi({viewport$:e,tablet$:t}){z([Ve("search"),t]).pipe(m(([r,o])=>r&&!o),b(r=>I(r).pipe(Ge(r?400:100))),ee(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function us(){return location.protocol==="file:"?wt(`${new URL("search/search_index.js",Xr.base)}`).pipe(m(()=>__index),B(1)):Ne(new URL("search/search_index.json",Xr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Yo(),jt=nn(),Ot=cn(jt),Zr=on(),Oe=bn(),hr=$t("(min-width: 960px)"),Si=$t("(min-width: 1220px)"),Oi=pn(),Xr=ye(),Mi=document.forms.namedItem("search")?us():Ke,eo=new g;Bn({alert$:eo});var to=new g;G("navigation.instant")&&Zn({location$:jt,viewport$:Oe,progress$:to}).subscribe(ot);var Ti;((Ti=Xr.version)==null?void 0:Ti.provider)==="mike"&&ii({document$:ot});S(jt,Ot).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});Zr.pipe(v(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&&pt(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&&pt(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});xi({viewport$:Oe,document$:ot});yi({document$:ot,tablet$:hr});Ei({document$:ot});wi({viewport$:Oe,tablet$:hr});var rt=Nn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),b(e=>Qn(e,{viewport$:Oe,header$:rt})),B(1)),ds=S(...ae("consent").map(e=>xn(e,{target$:Ot})),...ae("dialog").map(e=>Dn(e,{alert$:eo})),...ae("header").map(e=>zn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("palette").map(e=>Kn(e)),...ae("progress").map(e=>Yn(e,{progress$:to})),...ae("search").map(e=>li(e,{index$:Mi,keyboard$:Zr})),...ae("source").map(e=>hi(e))),hs=C(()=>S(...ae("announce").map(e=>gn(e)),...ae("content").map(e=>Un(e,{viewport$:Oe,target$:Ot,print$:Oi})),...ae("content").map(e=>G("search.highlight")?mi(e,{index$:Mi,location$:jt}):M),...ae("header-title").map(e=>qn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Si,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>bi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>vi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})),...ae("top").map(e=>gi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})))),Li=ot.pipe(b(()=>hs),Pe(ds),B(1));Li.subscribe();window.document$=ot;window.location$=jt;window.target$=Ot;window.keyboard$=Zr;window.viewport$=Oe;window.tablet$=hr;window.screen$=Si;window.print$=Oi;window.alert$=eo;window.progress$=to;window.component$=Li;})(); +//# sourceMappingURL=bundle.081f42fc.min.js.map + diff --git a/assets/javascripts/bundle.081f42fc.min.js.map b/assets/javascripts/bundle.081f42fc.min.js.map new file mode 100644 index 0000000..e055db5 --- /dev/null +++ b/assets/javascripts/bundle.081f42fc.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an