rsna-anonymizer 19.1.0.dev4__tar.gz → 19.1.0.dev5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (482) hide show
  1. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/CHANGELOG.md +6 -0
  2. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/PKG-INFO +5 -5
  3. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/pyproject.toml +1 -1
  4. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/readme.de.md +4 -4
  5. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/readme.es.md +4 -4
  6. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/readme.fr.md +4 -4
  7. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/readme.md +4 -4
  8. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/batch_process.py +23 -1
  9. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/metadata/detect.py +53 -28
  10. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/entity.py +3 -2
  11. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/pixel/ocr_pipeline.py +82 -25
  12. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/pixel/remove_pixel_phi.py +26 -5
  13. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/pixel/whitelist_io.py +4 -1
  14. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/term_similarity.py +10 -4
  15. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/phi/phi_io.py +22 -2
  16. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/series/create_projections.py +9 -5
  17. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/series/series_io.py +3 -2
  18. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/model/anonymizer.py +110 -0
  19. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/dicom.py +19 -3
  20. rsna_anonymizer-19.1.0.dev5/src/anonymizer/utils/windowing.py +209 -0
  21. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/ai_batch_process_options_dialog.py +152 -30
  22. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/app_window.py +23 -1
  23. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/tk_mouse.py +4 -0
  24. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/reports/report_text_review.py +8 -2
  25. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/series/histogram.py +40 -8
  26. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/series/image.py +46 -20
  27. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/series/metadata_assessment_dialog.py +41 -0
  28. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/series/series.py +5 -7
  29. rsna_anonymizer-19.1.0.dev4/src/anonymizer/utils/windowing.py +0 -90
  30. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/.gitignore +0 -0
  31. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/LICENSE +0 -0
  32. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/__init__.py +0 -0
  33. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/anonymizer.py +0 -0
  34. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/analytics/organ_volume_ranges_ml.json +0 -0
  35. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/dicom_standard/2025e/json/dict_info.json +0 -0
  36. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/dicom_standard/2025e/json/iod_info.json +0 -0
  37. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/dicom_standard/2025e/json/module_info.json +0 -0
  38. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/dicom_standard/2025e/json/uid_info.json +0 -0
  39. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/dicom_standard/2025e/json/version +0 -0
  40. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/dicom_standard/SOURCE.md +0 -0
  41. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/fonts/DINAlternate-Bold.ttf +0 -0
  42. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/create_icns.sh +0 -0
  43. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/kaleidoscope.png +0 -0
  44. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/kaleidoscope_flat.svg +0 -0
  45. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/kaleidoscope_stack_angle.svg +0 -0
  46. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/kaleidoscope_stack_vert.svg +0 -0
  47. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/pause.png +0 -0
  48. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/play.png +0 -0
  49. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/rsna_icon.icns +0 -0
  50. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/rsna_icon.ico +0 -0
  51. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/rsna_icon.png +0 -0
  52. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/rsna_logo_alpha.png +0 -0
  53. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/rsna_logo_head_profile.png +0 -0
  54. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/rsna_logo_head_profile_1024x1024.png +0 -0
  55. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/rsna_logo_head_profile_titled.png +0 -0
  56. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/rsna_titled_logo.svg +0 -0
  57. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/rsna_titled_logo_alpha.png +0 -0
  58. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/icons/signpath_logo.svg +0 -0
  59. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/LC_MESSAGES/messages.mo +0 -0
  60. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/LC_MESSAGES/messages.po +0 -0
  61. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/1_/303/274bersicht.html" +0 -0
  62. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/2_deidentifikationsprotokoll.html +0 -0
  63. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/3_anonymisierungsprojekte_verwalten.html +0 -0
  64. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/4_projekteinstellungen.html +0 -0
  65. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/5_bedienung.html +0 -0
  66. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/6_lizenz.html +0 -0
  67. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/AWSCognitoCredentials.png +0 -0
  68. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/AbfrageAbrufenImportieren.png +0 -0
  69. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Auswahlabfrage.png +0 -0
  70. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/BildarchivQRServer.png +0 -0
  71. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Dashboard.png +0 -0
  72. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Dateiauswahloptionen.png +0 -0
  73. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/DateienImportieren.png +0 -0
  74. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/ExportServer.png +0 -0
  75. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/ExportStudienAWS.png +0 -0
  76. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/ExportStudienStatus.png +0 -0
  77. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/ImportlokalenDateisystem.png +0 -0
  78. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/KlonenProjekts.png +0 -0
  79. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/LokalerServer.png +0 -0
  80. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Modalit/303/244ten.png" +0 -0
  81. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Netzwerk-Zeit/303/274berschreitungen.png" +0 -0
  82. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/NeueProjekteinstellungen.png +0 -0
  83. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/NeuesProjekt.png +0 -0
  84. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Patienten-Such-CSV-Datei.png +0 -0
  85. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/PatientenPHI.png +0 -0
  86. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Projektschlie/303/237en.png" +0 -0
  87. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Protokollierungsstufen.png +0 -0
  88. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Speicherklassen.png +0 -0
  89. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Speicherverzeichnis.png +0 -0
  90. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/TransferSyntaxen.png +0 -0
  91. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/VerzeichnisAusw/303/244hlen.png" +0 -0
  92. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Welcome_de_osx_light.png +0 -0
  93. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Welcome_de_win_light.png +0 -0
  94. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/html/images/Wiederer/303/266ffnenProjekts.png" +0 -0
  95. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/whitelists/ct.txt +0 -0
  96. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/whitelists/dx.txt +0 -0
  97. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/whitelists/mg.txt +0 -0
  98. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/whitelists/mr.txt +0 -0
  99. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/de/whitelists/us.txt +0 -0
  100. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/LC_MESSAGES/messages.mo +0 -0
  101. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/LC_MESSAGES/messages.po +0 -0
  102. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/LOINC_StudyDescription.csv +0 -0
  103. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/1_overview.html +0 -0
  104. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/2_ai features.html +0 -0
  105. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/3_deidentification protocol.html +0 -0
  106. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/4_managing anonymization projects.html +0 -0
  107. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/5_project settings.html +0 -0
  108. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/6_operation.html +0 -0
  109. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/7_license.html +0 -0
  110. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/ai_features/ai batch process.html +0 -0
  111. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/ai_features/embedded_phi.html +0 -0
  112. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/ai_features/face de-identify.html +0 -0
  113. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/ai_features/harmonize.html +0 -0
  114. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/ai_features/remove burnt-in annotation.html +0 -0
  115. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/AWSCognitoCredentials.png +0 -0
  116. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/CloneProject.png +0 -0
  117. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/CloseProject.png +0 -0
  118. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/Dashboard.png +0 -0
  119. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/ExportServer.png +0 -0
  120. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/ExportStudiesAWS.png +0 -0
  121. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/ExportStudiesStatus.png +0 -0
  122. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/ImportFilesDialog.png +0 -0
  123. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/ImportFilesMenu.png +0 -0
  124. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/ImportStudiesDialog.png +0 -0
  125. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/ImportStudiesResult.png +0 -0
  126. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/LocalServer.png +0 -0
  127. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/LoggingLevels.png +0 -0
  128. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/Modalities.png +0 -0
  129. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/NetworkTimeouts.png +0 -0
  130. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/NewProject.png +0 -0
  131. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/NewProjectSettings.png +0 -0
  132. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/OpenLogViewer.png +0 -0
  133. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/OpenRecent.png +0 -0
  134. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/PatientLookupData.png +0 -0
  135. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/PatientLookupSave.png +0 -0
  136. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/QueryRetrieveImport.png +0 -0
  137. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/QueryServer.png +0 -0
  138. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/SelectDirectory.png +0 -0
  139. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/SelectFiles.png +0 -0
  140. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/SelectQuery.png +0 -0
  141. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/StorageClasses.png +0 -0
  142. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/StorageDirectory.png +0 -0
  143. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/TransferSyntaxes.png +0 -0
  144. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/Welcome_en_osx_light.png +0 -0
  145. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/html/images/Welcome_en_win_light.png +0 -0
  146. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/whitelists/ct.txt +0 -0
  147. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/whitelists/dx.txt +0 -0
  148. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/whitelists/mg.txt +0 -0
  149. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/whitelists/mr.txt +0 -0
  150. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/en_US/whitelists/us.txt +0 -0
  151. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/LC_MESSAGES/messages.mo +0 -0
  152. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/LC_MESSAGES/messages.po +0 -0
  153. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/1_visi/303/263n general.html" +0 -0
  154. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/2_protocolo de desidentificaci/303/263n.html" +0 -0
  155. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/3_gesti/303/263n de proyectos.html" +0 -0
  156. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/4_configuraci/303/263n del proyecto.html" +0 -0
  157. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/5_operaci/303/263n.html" +0 -0
  158. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/6_licencia.html +0 -0
  159. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/AWSCognitoCredenciales.png +0 -0
  160. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/AbrirReciente.png +0 -0
  161. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/CerrarProyecto.png +0 -0
  162. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/ClasesDeAlmacenamiento.png +0 -0
  163. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/Clonaci/303/263nDeProyecto.png" +0 -0
  164. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/Configuraci/303/263nDelProyecto.png" +0 -0
  165. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/ConsultarRecuperarImportar.png +0 -0
  166. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/DatosDeB/303/272squedaDePaciente.png" +0 -0
  167. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/DirectorioDeAlmacenamiento.png +0 -0
  168. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/ExportarEstudiosAWS.png +0 -0
  169. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/ExportarEstudiosEstado.png +0 -0
  170. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/GuardarB/303/272squedaDePaciente.png" +0 -0
  171. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/ImportarArchivos.png +0 -0
  172. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/ImportarArchivosDi/303/241logo.png" +0 -0
  173. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/ImportarEstudiosDi/303/241logo.png" +0 -0
  174. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/ImportarEstudiosResultado.png +0 -0
  175. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/Modalidades.png +0 -0
  176. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/NivelesDeRegistro.png +0 -0
  177. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/NuevoProyecto.png +0 -0
  178. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/PanelDeControl.png +0 -0
  179. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/SeleccionarArchivos.png +0 -0
  180. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/SeleccionarDirectorio.png +0 -0
  181. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/SeleccionarImportar.png +0 -0
  182. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/ServidorDeConsulta.png +0 -0
  183. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/ServidorDeExportaci/303/263n.png" +0 -0
  184. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/ServidorLocal.png +0 -0
  185. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/SintaxisDeTransferencia.png +0 -0
  186. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/TimeoutsDeRed.png +0 -0
  187. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/Welcome_es_osx_light.png +0 -0
  188. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html/images/Welcome_es_win_light.png +0 -0
  189. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html_bak/1_visi/303/263n general.html" +0 -0
  190. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html_bak/2_protocolo de desidentificaci/303/263n.html" +0 -0
  191. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html_bak/3_gesti/303/263n de proyectos.html" +0 -0
  192. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html_bak/4_configuraci/303/263n del proyecto.html" +0 -0
  193. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html_bak/5_operaci/303/263n.html" +0 -0
  194. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/html_bak/6_licencia.html +0 -0
  195. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/whitelists/ct.txt +0 -0
  196. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/whitelists/dx.txt +0 -0
  197. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/whitelists/mg.txt +0 -0
  198. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/whitelists/mr.txt +0 -0
  199. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/es/whitelists/us.txt +0 -0
  200. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/extract_translations.sh +0 -0
  201. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/LC_MESSAGES/messages.mo +0 -0
  202. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/LC_MESSAGES/messages.po +0 -0
  203. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/html/1_aper/303/247u.html" +0 -0
  204. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/html/2_protocole de d/303/251sidentification.html" +0 -0
  205. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/html/3_gestion de projet.html +0 -0
  206. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/html/4_param/303/250tres du projet.html" +0 -0
  207. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/html/5_op/303/251ration.html" +0 -0
  208. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/html/6_licence.html +0 -0
  209. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/html/images/Welcome_fr_osx_light.png +0 -0
  210. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/html/images/Welcome_fr_win_light.png +0 -0
  211. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/whitelists/ct.txt +0 -0
  212. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/whitelists/dx.txt +0 -0
  213. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/whitelists/mg.txt +0 -0
  214. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/whitelists/mr.txt +0 -0
  215. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/fr/whitelists/us.txt +0 -0
  216. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/messages.pot +0 -0
  217. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/locales/update_translations.sh +0 -0
  218. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/scripts/README.md +0 -0
  219. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/scripts/default-anonymizer.script +0 -0
  220. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/tcia_kb/TCIAPrivateTagKB-02-01-2024-formatted.csv +0 -0
  221. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/themes/dark-blue.json +0 -0
  222. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/assets/themes/rsna_theme.json +0 -0
  223. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/__init__.py +0 -0
  224. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/__init__.py +0 -0
  225. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/batch_config.py +0 -0
  226. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/blur_face/__init__.py +0 -0
  227. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/blur_face/pipeline.py +0 -0
  228. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/blur_face/status.py +0 -0
  229. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/README.md +0 -0
  230. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/__init__.py +0 -0
  231. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/classify_series.py +0 -0
  232. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/entity_labels.py +0 -0
  233. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/metadata/__init__.py +0 -0
  234. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/metadata/extract.py +0 -0
  235. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/metadata/iod_allowlist.py +0 -0
  236. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/metadata/iod_qc.py +0 -0
  237. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/metadata/ner_compile.py +0 -0
  238. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/metadata/scrub.py +0 -0
  239. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/metadata/series_assessment.py +0 -0
  240. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/metadata/series_index.py +0 -0
  241. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/metadata/viewer_tree.py +0 -0
  242. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/__init__.py +0 -0
  243. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/cache.py +0 -0
  244. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/engine.py +0 -0
  245. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/pools/en_US/SOURCE.md +0 -0
  246. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/pools/en_US/cities.txt +0 -0
  247. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/pools/en_US/first_names.txt +0 -0
  248. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/pools/en_US/first_names_female.txt +0 -0
  249. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/pools/en_US/first_names_male.txt +0 -0
  250. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/pools/en_US/last_names.txt +0 -0
  251. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/pools/en_US/streets.txt +0 -0
  252. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/radiology_filters.py +0 -0
  253. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/ner/synthetic_phi.py +0 -0
  254. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/pixel/__init__.py +0 -0
  255. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/pixel/cache.py +0 -0
  256. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/pixel/detect_text.py +0 -0
  257. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/pixel/exclude_zones.py +0 -0
  258. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/pixel/ocr_transcript_sr.py +0 -0
  259. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/pixel/remove_scope.py +0 -0
  260. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/report/__init__.py +0 -0
  261. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/embedded_phi/report/process_report_text.py +0 -0
  262. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/feature_availability.py +0 -0
  263. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/feature_ids.py +0 -0
  264. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/__init__.py +0 -0
  265. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/_playbook_gettext.py +0 -0
  266. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/description_components.py +0 -0
  267. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/description_mapping_store.py +0 -0
  268. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/docs/XR_US_MG.md +0 -0
  269. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/loinc_study.py +0 -0
  270. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/model_slot.py +0 -0
  271. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/pipeline.py +0 -0
  272. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/playbook.py +0 -0
  273. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/playbook_planar.py +0 -0
  274. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/profile_2d.py +0 -0
  275. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/timings.py +0 -0
  276. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xp_bodypart/__init__.py +0 -0
  277. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xp_bodypart/cache.py +0 -0
  278. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xp_bodypart/fuse.py +0 -0
  279. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xp_bodypart/labels.py +0 -0
  280. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xp_bodypart/model.py +0 -0
  281. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xp_bodypart/predict.py +0 -0
  282. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xp_bodypart/preprocess.py +0 -0
  283. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xr_chest_view/__init__.py +0 -0
  284. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xr_chest_view/cache.py +0 -0
  285. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xr_chest_view/fuse.py +0 -0
  286. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xr_chest_view/labels.py +0 -0
  287. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xr_chest_view/model.py +0 -0
  288. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xr_chest_view/predict.py +0 -0
  289. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/harmonize/xr_chest_view/preprocess.py +0 -0
  290. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/model_download.py +0 -0
  291. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/__init__.py +0 -0
  292. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/cache.py +0 -0
  293. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/config.py +0 -0
  294. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/contrast.py +0 -0
  295. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/dicom_geometry.py +0 -0
  296. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/docs/README.md +0 -0
  297. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/face_gate.py +0 -0
  298. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/geometry_types.py +0 -0
  299. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/head_signals.py +0 -0
  300. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/ml_env.py +0 -0
  301. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/modality_profile.py +0 -0
  302. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/model_cache.py +0 -0
  303. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/readiness.py +0 -0
  304. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/regions.py +0 -0
  305. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/seg_retention.py +0 -0
  306. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/segment.py +0 -0
  307. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/series_classification.py +0 -0
  308. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ai/tseg/ts_probe.py +0 -0
  309. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/analytics/__init__.py +0 -0
  310. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/analytics/dataset.py +0 -0
  311. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/analytics/ledger.py +0 -0
  312. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/analytics/prefs.py +0 -0
  313. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/annotations/__init__.py +0 -0
  314. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/annotations/brush.py +0 -0
  315. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/annotations/export_dicom_seg.py +0 -0
  316. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/annotations/export_nii.py +0 -0
  317. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/annotations/import_nii.py +0 -0
  318. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/annotations/planar_geometry.py +0 -0
  319. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/annotations/store.py +0 -0
  320. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/annotations/volumes.py +0 -0
  321. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/anonymizer.py +0 -0
  322. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/ctp_lookup.py +0 -0
  323. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dates.py +0 -0
  324. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/__init__.py +0 -0
  325. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/association.py +0 -0
  326. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/dicomweb/__init__.py +0 -0
  327. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/dicomweb/qido.py +0 -0
  328. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/dicomweb/session.py +0 -0
  329. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/dicomweb/stow.py +0 -0
  330. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/dicomweb/wado.py +0 -0
  331. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/echo_scu.py +0 -0
  332. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/find_scu.py +0 -0
  333. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/hierarchies.py +0 -0
  334. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/requests.py +0 -0
  335. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/retrieve_scu.py +0 -0
  336. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/scp.py +0 -0
  337. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/dicom/store_scu.py +0 -0
  338. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/headless.py +0 -0
  339. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/headless_io.py +0 -0
  340. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/jobs/__init__.py +0 -0
  341. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/jobs/runner.py +0 -0
  342. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/jobs/work_state.py +0 -0
  343. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/phi/__init__.py +0 -0
  344. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/private_tags/__init__.py +0 -0
  345. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/private_tags/convert_tcia_private_kb.py +0 -0
  346. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/private_tags/dateinc.txt +0 -0
  347. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/private_tags/private_tags.py +0 -0
  348. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/private_tags/tcia_kb_data.py +0 -0
  349. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/project.py +0 -0
  350. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/script/__init__.py +0 -0
  351. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/script/compile.py +0 -0
  352. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/script/date_rules.py +0 -0
  353. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/script/document.py +0 -0
  354. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/script/e1_1_basic_profile.json +0 -0
  355. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/script/e1_1_retain_tags.json +0 -0
  356. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/script/operands.py +0 -0
  357. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/script/option_explanations.py +0 -0
  358. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/script/options.py +0 -0
  359. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/script/paths.py +0 -0
  360. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/script/retain_option_tags.py +0 -0
  361. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/script/tcia_research_operands.json +0 -0
  362. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/series/__init__.py +0 -0
  363. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/series/series_overlay.py +0 -0
  364. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/controller/series/workspace.py +0 -0
  365. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/__init__.py +0 -0
  366. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/api/__init__.py +0 -0
  367. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/api/catalog.py +0 -0
  368. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/api/handlers.py +0 -0
  369. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/api/schema_json.py +0 -0
  370. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/api/schemas.py +0 -0
  371. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/api/wire.py +0 -0
  372. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/assets/__init__.py +0 -0
  373. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/assets/instructions.md +0 -0
  374. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/assets/setup_help.json +0 -0
  375. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/instructions.py +0 -0
  376. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/middleware/__init__.py +0 -0
  377. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/middleware/call_logging.py +0 -0
  378. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/modality_tokens.py +0 -0
  379. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/ops.py +0 -0
  380. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/server.py +0 -0
  381. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/session.py +0 -0
  382. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/mcp/snapshots.py +0 -0
  383. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/model/__init__.py +0 -0
  384. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/model/project.py +0 -0
  385. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/model/settings_validate.py +0 -0
  386. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/model/sqlite_schema.py +0 -0
  387. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/__init__.py +0 -0
  388. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/app_state.py +0 -0
  389. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/dicom_dictionary.py +0 -0
  390. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/logging.py +0 -0
  391. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/memory.py +0 -0
  392. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/modalities.py +0 -0
  393. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/network.py +0 -0
  394. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/storage/__init__.py +0 -0
  395. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/storage/dicom_tree.py +0 -0
  396. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/storage/java_index.py +0 -0
  397. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/translate.py +0 -0
  398. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/utils/version.py +0 -0
  399. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/__init__.py +0 -0
  400. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/__init__.py +0 -0
  401. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/ai_batch_process_dialog.py +0 -0
  402. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/ai_features_dialog.py +0 -0
  403. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/blur_face_results.py +0 -0
  404. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/face_blur_review_dialog.py +0 -0
  405. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/features/__init__.py +0 -0
  406. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/features/availability.py +0 -0
  407. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/features/catalog.py +0 -0
  408. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/features/look.py +0 -0
  409. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/features/panel.py +0 -0
  410. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/harmonize_description.py +0 -0
  411. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/harmonize_results.py +0 -0
  412. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/harmonize_run_options_dialog.py +0 -0
  413. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/modality_whitelist_preview_dialog.py +0 -0
  414. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ai/set_description_dialog.py +0 -0
  415. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/__init__.py +0 -0
  416. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/ctk_safe.py +0 -0
  417. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/filesystem_drop.py +0 -0
  418. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/fonts.py +0 -0
  419. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/help_docs.py +0 -0
  420. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/html_view.py +0 -0
  421. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/job_poller.py +0 -0
  422. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/navigation.py +0 -0
  423. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/phi_action_labels.py +0 -0
  424. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/tooltip.py +0 -0
  425. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/treeview_chrome.py +0 -0
  426. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/common/ux_fields.py +0 -0
  427. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/ocr_ui.py +0 -0
  428. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/project/__init__.py +0 -0
  429. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/project/dataset.py +0 -0
  430. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/project/delete_studies_dialog.py +0 -0
  431. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/project/description_mappings.py +0 -0
  432. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/project/export.py +0 -0
  433. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/project/import_files_dialog.py +0 -0
  434. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/project/import_studies_dialog.py +0 -0
  435. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/project/query_retrieve_import.py +0 -0
  436. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/reports/__init__.py +0 -0
  437. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/reports/entity_colors.py +0 -0
  438. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/reports/entity_legend.py +0 -0
  439. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/reports/open_workspace.py +0 -0
  440. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/reports/pdf_page_view.py +0 -0
  441. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/reports/report_canvas.py +0 -0
  442. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/series/__init__.py +0 -0
  443. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/series/anatomy_overlay.py +0 -0
  444. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/series/new_segment_dialog.py +0 -0
  445. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/series/projection.py +0 -0
  446. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/series/series_overlay.py +0 -0
  447. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/settings/anonymizer_script_dialog.py +0 -0
  448. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/settings/aws_cognito_dialog.py +0 -0
  449. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/settings/deidentification_options_dialog.py +0 -0
  450. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/settings/dicom_node_dialog.py +0 -0
  451. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/settings/logging_levels_dialog.py +0 -0
  452. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/settings/lookup_table_dialog.py +0 -0
  453. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/settings/modalites_dialog.py +0 -0
  454. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/settings/network_timeouts_dialog.py +0 -0
  455. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/settings/script_editor.py +0 -0
  456. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/settings/settings_dialog.py +0 -0
  457. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/settings/sop_classes_dialog.py +0 -0
  458. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/settings/transfer_syntaxes_dialog.py +0 -0
  459. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/shell/__init__.py +0 -0
  460. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/shell/analytics_charts.py +0 -0
  461. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/shell/dashboard.py +0 -0
  462. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/anonymizer/view/shell/welcome.py +0 -0
  463. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/__init__.py +0 -0
  464. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/README.md +0 -0
  465. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/__init__.py +0 -0
  466. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/__main__.py +0 -0
  467. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/answer_filter.py +0 -0
  468. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/assets/AiBatchConfig.json +0 -0
  469. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/assets/ProjectModel.json +0 -0
  470. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/assets/smoke20_random_patients.json +0 -0
  471. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/cli.py +0 -0
  472. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/inventory.py +0 -0
  473. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/ner_presentation_probe.py +0 -0
  474. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/paths.py +0 -0
  475. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/project_prep.py +0 -0
  476. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/report.py +0 -0
  477. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/score_official.py +0 -0
  478. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/scorecards/README.md +0 -0
  479. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/scorecards/source_answer_errors.md +0 -0
  480. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/scorecards/test_20261101_full.md +0 -0
  481. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/scorecards/validation_20261101_full.md +0 -0
  482. {rsna_anonymizer-19.1.0.dev4 → rsna_anonymizer-19.1.0.dev5}/src/eval/midi_b/vendor/README.md +0 -0
@@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [19.1.0.dev5]
10
+ - PyPI development pre-release of 19.1 on branch `dev` (install with `uv pip install --pre rsna-anonymizer`)
11
+ - After metadata PHI removal (Series View Metadata Save and AI Batch), Dataset Original Description and Embedded PHI columns refresh from cleaned Study/Series Description and removed spans; lookup CSV adds CleanedStudyDescription and CleanedSeriesDescription after the sticky Study/Series Description columns
12
+ - AI Batch Embedded PHI: Pixel PHI / Metadata / Reports path checkboxes; Match strictness and Whitelist stay visible when Pixel PHI is off
13
+ - Series View windowing keeps PET window widths below one, with shared auto-window helpers and projection/default-window alignment
14
+
9
15
  ## [19.1.0.dev4]
10
16
  - PyPI development pre-release of 19.1 on branch `dev` (install with `uv pip install --pre rsna-anonymizer`)
11
17
  - PyPI source archive and wheel ship the installable packages. Pixel PHI experiment output is no longer stored in the repository. Help-site screenshots and the curated DICOM fixtures stay in git.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: rsna-anonymizer
3
- Version: 19.1.0.dev4
3
+ Version: 19.1.0.dev5
4
4
  Summary: RSNA DICOM Anonymizer
5
5
  Project-URL: Homepage, https://github.com/RSNA/anonymizer
6
6
  Author-email: Algorhythm Software <michael@dx.life>
@@ -62,7 +62,7 @@ Other languages: [Deutsch](readme.de.md), [Español](readme.es.md), [Français](
62
62
  [![PyPI](https://img.shields.io/pypi/v/rsna-anonymizer.svg)](https://pypi.org/project/rsna-anonymizer/)
63
63
  [![Python](https://img.shields.io/badge/python-3.11%20%7C%203.12%20%7C%203.13%20%7C%203.14-blue.svg)](https://www.python.org/downloads/)
64
64
 
65
- **Version 19.1.0.dev4** is the current 19.1 development pre-release on the `dev` branch (`uv pip install --pre rsna-anonymizer`). Stable **19.0.10** remains on `master`. Requires **Python 3.11–3.14** with **tkinter** built in. Prefer **3.12** for the widest Tk/AI wheel coverage; avoid **3.14.1** (torchvision excludes that patch).
65
+ **Version 19.1.0.dev5** is the current 19.1 development pre-release on the `dev` branch (`uv pip install --pre rsna-anonymizer`). Stable **19.0.10** remains on `master`. Requires **Python 3.11–3.14** with **tkinter** built in. Prefer **3.12** for the widest Tk/AI wheel coverage; avoid **3.14.1** (torchvision excludes that patch).
66
66
 
67
67
  ## Install
68
68
 
@@ -88,7 +88,7 @@ uv --version
88
88
 
89
89
  ### 2. Install Python with tkinter, then the app
90
90
 
91
- The desktop UI needs **tkinter**. Install a Python that ships with it, then create the venv and install **19.1.0.dev4** (`--pre`):
91
+ The desktop UI needs **tkinter**. Install a Python that ships with it, then create the venv and install **19.1.0.dev5** (`--pre`):
92
92
 
93
93
  | Platform | Ensure tkinter is available |
94
94
  | --- | --- |
@@ -101,7 +101,7 @@ uv python install 3.12 # or: 3.11 / 3.13 / 3.14
101
101
  uv venv rsna-anonymizer --python 3.12 # or: --python 3.11 / 3.13 / 3.14
102
102
  source rsna-anonymizer/bin/activate # Windows: rsna-anonymizer\Scripts\activate
103
103
 
104
- uv pip install --pre rsna-anonymizer # version 19.1.0.dev4
104
+ uv pip install --pre rsna-anonymizer # version 19.1.0.dev5
105
105
  ```
106
106
 
107
107
  ### 3. Verify the install
@@ -109,7 +109,7 @@ uv pip install --pre rsna-anonymizer # version 19.1.0.dev4
109
109
  ```bash
110
110
  python --version # 3.11.x–3.14.x
111
111
  python -m tkinter # a small Tk window must open — required for the UI
112
- rsna-anonymizer --version # should report 19.1.0.dev4
112
+ rsna-anonymizer --version # should report 19.1.0.dev5
113
113
  ```
114
114
 
115
115
  If `python -m tkinter` fails, the venv’s Python was built without Tk: fix the platform step above, recreate the venv, and reinstall.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "rsna-anonymizer"
7
- version = "19.1.0.dev4"
7
+ version = "19.1.0.dev5"
8
8
  description = "RSNA DICOM Anonymizer"
9
9
  readme = "readme.md"
10
10
  license = { text = "Apache-2.0" }
@@ -7,7 +7,7 @@
7
7
  [![PyPI](https://img.shields.io/pypi/v/rsna-anonymizer.svg)](https://pypi.org/project/rsna-anonymizer/)
8
8
  [![Python](https://img.shields.io/badge/python-3.11%20%7C%203.12%20%7C%203.13%20%7C%203.14-blue.svg)](https://www.python.org/downloads/)
9
9
 
10
- **Version 19.1.0.dev4** ist die aktuelle 19.1-Entwicklungs-Vorabversion auf dem Branch `dev` (`uv pip install --pre rsna-anonymizer`). Stabil bleibt **19.0.10** auf `master`. Benötigt **Python 3.11–3.14** mit eingebautem **tkinter**. Empfohlen ist **3.12**; **3.14.1** vermeiden (torchvision schließt diesen Patch aus).
10
+ **Version 19.1.0.dev5** ist die aktuelle 19.1-Entwicklungs-Vorabversion auf dem Branch `dev` (`uv pip install --pre rsna-anonymizer`). Stabil bleibt **19.0.10** auf `master`. Benötigt **Python 3.11–3.14** mit eingebautem **tkinter**. Empfohlen ist **3.12**; **3.14.1** vermeiden (torchvision schließt diesen Patch aus).
11
11
 
12
12
  ## Installation
13
13
 
@@ -33,7 +33,7 @@ uv --version
33
33
 
34
34
  ### 2. Python mit tkinter und die App installieren
35
35
 
36
- Die Desktop-Oberfläche braucht **tkinter**. Installieren Sie ein Python mit tkinter, erstellen Sie die venv und installieren Sie **19.1.0.dev4** (`--pre`):
36
+ Die Desktop-Oberfläche braucht **tkinter**. Installieren Sie ein Python mit tkinter, erstellen Sie die venv und installieren Sie **19.1.0.dev5** (`--pre`):
37
37
 
38
38
  | Plattform | tkinter verfügbar machen |
39
39
  | --- | --- |
@@ -46,7 +46,7 @@ uv python install 3.12 # or: 3.11 / 3.13 / 3.14
46
46
  uv venv rsna-anonymizer --python 3.12 # or: --python 3.11 / 3.13 / 3.14
47
47
  source rsna-anonymizer/bin/activate # Windows: rsna-anonymizer\Scripts\activate
48
48
 
49
- uv pip install --pre rsna-anonymizer # version 19.1.0.dev4
49
+ uv pip install --pre rsna-anonymizer # version 19.1.0.dev5
50
50
  ```
51
51
 
52
52
  ### 3. Installation prüfen
@@ -54,7 +54,7 @@ uv pip install --pre rsna-anonymizer # version 19.1.0.dev4
54
54
  ```bash
55
55
  python --version # 3.11.x–3.14.x
56
56
  python -m tkinter # a small Tk window must open — required for the UI
57
- rsna-anonymizer --version # should report 19.1.0.dev4
57
+ rsna-anonymizer --version # should report 19.1.0.dev5
58
58
  ```
59
59
 
60
60
  Wenn `python -m tkinter` fehlschlägt, wurde das Python der venv ohne Tk gebaut: Plattformschritt oben korrigieren, venv neu anlegen und neu installieren.
@@ -7,7 +7,7 @@
7
7
  [![PyPI](https://img.shields.io/pypi/v/rsna-anonymizer.svg)](https://pypi.org/project/rsna-anonymizer/)
8
8
  [![Python](https://img.shields.io/badge/python-3.11%20%7C%203.12%20%7C%203.13%20%7C%203.14-blue.svg)](https://www.python.org/downloads/)
9
9
 
10
- **La versión 19.1.0.dev4** es la prelanzamiento de desarrollo 19.1 actual en la rama `dev` (`uv pip install --pre rsna-anonymizer`). La estable **19.0.10** permanece en `master`. Requiere **Python 3.11–3.14** con **tkinter** incluido. Se recomienda **3.12**; evite **3.14.1** (torchvision excluye ese parche).
10
+ **La versión 19.1.0.dev5** es la prelanzamiento de desarrollo 19.1 actual en la rama `dev` (`uv pip install --pre rsna-anonymizer`). La estable **19.0.10** permanece en `master`. Requiere **Python 3.11–3.14** con **tkinter** incluido. Se recomienda **3.12**; evite **3.14.1** (torchvision excluye ese parche).
11
11
 
12
12
  ## Instalación
13
13
 
@@ -33,7 +33,7 @@ uv --version
33
33
 
34
34
  ### 2. Instalar Python con tkinter y la aplicación
35
35
 
36
- La interfaz de escritorio necesita **tkinter**. Instale un Python que lo incluya, cree el venv e instale **19.1.0.dev4** (`--pre`):
36
+ La interfaz de escritorio necesita **tkinter**. Instale un Python que lo incluya, cree el venv e instale **19.1.0.dev5** (`--pre`):
37
37
 
38
38
  | Plataforma | Asegurar tkinter |
39
39
  | --- | --- |
@@ -46,7 +46,7 @@ uv python install 3.12 # or: 3.11 / 3.13 / 3.14
46
46
  uv venv rsna-anonymizer --python 3.12 # or: --python 3.11 / 3.13 / 3.14
47
47
  source rsna-anonymizer/bin/activate # Windows: rsna-anonymizer\Scripts\activate
48
48
 
49
- uv pip install --pre rsna-anonymizer # version 19.1.0.dev4
49
+ uv pip install --pre rsna-anonymizer # version 19.1.0.dev5
50
50
  ```
51
51
 
52
52
  ### 3. Verificar la instalación
@@ -54,7 +54,7 @@ uv pip install --pre rsna-anonymizer # version 19.1.0.dev4
54
54
  ```bash
55
55
  python --version # 3.11.x–3.14.x
56
56
  python -m tkinter # a small Tk window must open — required for the UI
57
- rsna-anonymizer --version # should report 19.1.0.dev4
57
+ rsna-anonymizer --version # should report 19.1.0.dev5
58
58
  ```
59
59
 
60
60
  Si `python -m tkinter` falla, el Python del venv se compiló sin Tk: corrija el paso de la plataforma, recree el venv y reinstale.
@@ -7,7 +7,7 @@
7
7
  [![PyPI](https://img.shields.io/pypi/v/rsna-anonymizer.svg)](https://pypi.org/project/rsna-anonymizer/)
8
8
  [![Python](https://img.shields.io/badge/python-3.11%20%7C%203.12%20%7C%203.13%20%7C%203.14-blue.svg)](https://www.python.org/downloads/)
9
9
 
10
- **La version 19.1.0.dev4** est la préversion de développement 19.1 actuelle sur la branche `dev` (`uv pip install --pre rsna-anonymizer`). La stable **19.0.10** reste sur `master`. Nécessite **Python 3.11–3.14** avec **tkinter** intégré. Préférez **3.12** ; évitez **3.14.1** (torchvision exclut ce correctif).
10
+ **La version 19.1.0.dev5** est la préversion de développement 19.1 actuelle sur la branche `dev` (`uv pip install --pre rsna-anonymizer`). La stable **19.0.10** reste sur `master`. Nécessite **Python 3.11–3.14** avec **tkinter** intégré. Préférez **3.12** ; évitez **3.14.1** (torchvision exclut ce correctif).
11
11
 
12
12
  ## Installation
13
13
 
@@ -33,7 +33,7 @@ uv --version
33
33
 
34
34
  ### 2. Installer Python avec tkinter, puis l’application
35
35
 
36
- L’interface de bureau a besoin de **tkinter**. Installez un Python qui l’inclut, créez le venv et installez **19.1.0.dev4** (`--pre`) :
36
+ L’interface de bureau a besoin de **tkinter**. Installez un Python qui l’inclut, créez le venv et installez **19.1.0.dev5** (`--pre`) :
37
37
 
38
38
  | Plateforme | Assurer la disponibilité de tkinter |
39
39
  | --- | --- |
@@ -46,7 +46,7 @@ uv python install 3.12 # or: 3.11 / 3.13 / 3.14
46
46
  uv venv rsna-anonymizer --python 3.12 # or: --python 3.11 / 3.13 / 3.14
47
47
  source rsna-anonymizer/bin/activate # Windows: rsna-anonymizer\Scripts\activate
48
48
 
49
- uv pip install --pre rsna-anonymizer # version 19.1.0.dev4
49
+ uv pip install --pre rsna-anonymizer # version 19.1.0.dev5
50
50
  ```
51
51
 
52
52
  ### 3. Vérifier l’installation
@@ -54,7 +54,7 @@ uv pip install --pre rsna-anonymizer # version 19.1.0.dev4
54
54
  ```bash
55
55
  python --version # 3.11.x–3.14.x
56
56
  python -m tkinter # a small Tk window must open — required for the UI
57
- rsna-anonymizer --version # should report 19.1.0.dev4
57
+ rsna-anonymizer --version # should report 19.1.0.dev5
58
58
  ```
59
59
 
60
60
  Si `python -m tkinter` échoue, le Python du venv a été compilé sans Tk : corrigez l’étape plateforme ci-dessus, recréez le venv et réinstallez.
@@ -9,7 +9,7 @@ Other languages: [Deutsch](readme.de.md), [Español](readme.es.md), [Français](
9
9
  [![PyPI](https://img.shields.io/pypi/v/rsna-anonymizer.svg)](https://pypi.org/project/rsna-anonymizer/)
10
10
  [![Python](https://img.shields.io/badge/python-3.11%20%7C%203.12%20%7C%203.13%20%7C%203.14-blue.svg)](https://www.python.org/downloads/)
11
11
 
12
- **Version 19.1.0.dev4** is the current 19.1 development pre-release on the `dev` branch (`uv pip install --pre rsna-anonymizer`). Stable **19.0.10** remains on `master`. Requires **Python 3.11–3.14** with **tkinter** built in. Prefer **3.12** for the widest Tk/AI wheel coverage; avoid **3.14.1** (torchvision excludes that patch).
12
+ **Version 19.1.0.dev5** is the current 19.1 development pre-release on the `dev` branch (`uv pip install --pre rsna-anonymizer`). Stable **19.0.10** remains on `master`. Requires **Python 3.11–3.14** with **tkinter** built in. Prefer **3.12** for the widest Tk/AI wheel coverage; avoid **3.14.1** (torchvision excludes that patch).
13
13
 
14
14
  ## Install
15
15
 
@@ -35,7 +35,7 @@ uv --version
35
35
 
36
36
  ### 2. Install Python with tkinter, then the app
37
37
 
38
- The desktop UI needs **tkinter**. Install a Python that ships with it, then create the venv and install **19.1.0.dev4** (`--pre`):
38
+ The desktop UI needs **tkinter**. Install a Python that ships with it, then create the venv and install **19.1.0.dev5** (`--pre`):
39
39
 
40
40
  | Platform | Ensure tkinter is available |
41
41
  | --- | --- |
@@ -48,7 +48,7 @@ uv python install 3.12 # or: 3.11 / 3.13 / 3.14
48
48
  uv venv rsna-anonymizer --python 3.12 # or: --python 3.11 / 3.13 / 3.14
49
49
  source rsna-anonymizer/bin/activate # Windows: rsna-anonymizer\Scripts\activate
50
50
 
51
- uv pip install --pre rsna-anonymizer # version 19.1.0.dev4
51
+ uv pip install --pre rsna-anonymizer # version 19.1.0.dev5
52
52
  ```
53
53
 
54
54
  ### 3. Verify the install
@@ -56,7 +56,7 @@ uv pip install --pre rsna-anonymizer # version 19.1.0.dev4
56
56
  ```bash
57
57
  python --version # 3.11.x–3.14.x
58
58
  python -m tkinter # a small Tk window must open — required for the UI
59
- rsna-anonymizer --version # should report 19.1.0.dev4
59
+ rsna-anonymizer --version # should report 19.1.0.dev5
60
60
  ```
61
61
 
62
62
  If `python -m tkinter` fails, the venv’s Python was built without Tk: fix the platform step above, recreate the venv, and reinstall.
@@ -1298,9 +1298,15 @@ def _scrub_series_descriptors(
1298
1298
  dcm_paths: Sequence[Path],
1299
1299
  replace_mode: str = "blank",
1300
1300
  project_dir: Path | None = None,
1301
+ anon_model: AnonymizerModel | None = None,
1301
1302
  on_log_detail: Callable[[str], None] | None = None,
1302
1303
  ) -> tuple[int, list[str]]:
1303
- """Run Clean Descriptors on each instance; return (modified_count, removed texts)."""
1304
+ """Run Clean Descriptors on each instance; return (modified_count, removed texts).
1305
+
1306
+ When anon_model is set, removed spans are merged into Instance.embedded_phi so
1307
+ the Dataset series row Embedded PHI column updates after the batch refresh.
1308
+ """
1309
+ del series_path # retained for call-site clarity / future series-level hooks
1304
1310
  mode = "synth" if str(replace_mode).strip().lower() == "synth" else "blank"
1305
1311
  modified_count = 0
1306
1312
  all_removed: list[str] = []
@@ -1317,6 +1323,20 @@ def _scrub_series_descriptors(
1317
1323
  if changed:
1318
1324
  modified_count += 1
1319
1325
  all_removed.extend(removed)
1326
+ if anon_model is not None:
1327
+ if removed:
1328
+ apply_instance_embedded_phi_for_dcm(
1329
+ anon_model, dcm_path, removed, merge=True
1330
+ )
1331
+ # Keep Dataset Original Description in sync with cleaned tags.
1332
+ try:
1333
+ ds = dcmread(str(dcm_path), stop_before_pixels=True, force=True)
1334
+ anon_model.sync_descriptions_from_dataset(ds)
1335
+ except Exception:
1336
+ logger.exception(
1337
+ "Failed to sync Dataset descriptions after Clean Descriptors for %s",
1338
+ dcm_path,
1339
+ )
1320
1340
  if on_log_detail is not None and removed:
1321
1341
  on_log_detail(f"{dcm_path.name}: " + ", ".join(removed[:8]))
1322
1342
  return modified_count, all_removed
@@ -1386,6 +1406,7 @@ def _apply_remove_pixel_phi_series(
1386
1406
  dcm_paths=sorted(get_dcm_files(series_path)),
1387
1407
  replace_mode=metadata_replace_mode,
1388
1408
  project_dir=project_dir,
1409
+ anon_model=anon_model,
1389
1410
  on_log_detail=on_log_detail,
1390
1411
  )
1391
1412
  except Exception as exc: # noqa: BLE001
@@ -1540,6 +1561,7 @@ def _apply_remove_pixel_phi_series(
1540
1561
  dcm_paths=dcm_paths,
1541
1562
  replace_mode=metadata_replace_mode,
1542
1563
  project_dir=project_dir,
1564
+ anon_model=anon_model,
1543
1565
  on_log_detail=on_log_detail,
1544
1566
  )
1545
1567
  all_removed_texts.extend(meta_removed)
@@ -6,8 +6,9 @@ Explicit workflow (steps 1–5; apply continues 6–7)
6
6
  2. Compile NER input (Tag Name: value + separators) — see ner_compile.py.
7
7
  3. OpenMed on that string (chunk with optional overlap when over char cap).
8
8
  4. Remap spans via the compile offset map onto original Content.
9
- 5. Post-NER: whitelist drop (always includes DICOM VR codes), anon drop,
10
- drop whole-cell pure-numeric false IDs, for/caret/Dr. expand, date +
9
+ 5. Post-NER: pixel decide on each span (NER score floor + whitelist-vs-NER
10
+ contest; DICOM VR codes and clinical keep terms in the keep list), anon
11
+ drop, drop whole-cell pure-numeric false IDs, for/caret/Dr. expand, date +
11
12
  descriptor PHI pattern fill (IDs, SSN-like, at/by sites, phone, Dr.).
12
13
 
13
14
  Public API
@@ -60,7 +61,11 @@ from anonymizer.controller.ai.embedded_phi.ner.radiology_filters import (
60
61
  drop_measurement_digit_id_entities,
61
62
  is_anon_identity_tag,
62
63
  )
63
- from anonymizer.controller.ai.embedded_phi.pixel.ocr_pipeline import PhiMatchMode, thresholds_for
64
+ from anonymizer.controller.ai.embedded_phi.pixel.ocr_pipeline import (
65
+ PhiMatchMode,
66
+ phi_accepted_scores,
67
+ thresholds_for,
68
+ )
64
69
  from anonymizer.controller.ai.embedded_phi.pixel.whitelist_io import load_modality_phi_match_mode
65
70
  from anonymizer.controller.ai.embedded_phi.report.process_report_text import resolve_dataset_whitelist
66
71
  from anonymizer.controller.ai.embedded_phi.term_similarity import similarity_term_match
@@ -121,9 +126,9 @@ def detect_metadata_phi(
121
126
  locale: NER locale pack.
122
127
  whitelist: Terms masked after NER. None loads resolve_dataset_whitelist.
123
128
  An explicit list (including empty) is used as given.
124
- match_mode: PhiMatchMode for whitelist similarity on an imaging file.
125
- None keeps the floor from resolve_dataset_whitelist. A report
126
- keeps the floor from that resolver.
129
+ match_mode: PhiMatchMode for whitelist similarity and NER score floors
130
+ on an imaging file. None loads the modality preset (STANDARD when
131
+ unset).
127
132
  project_dir: Project storage dir holding per-modality whitelists
128
133
  and the compiled *-anonymizer.script (@safe skip).
129
134
  modality: Imaging modality code passed to resolve_dataset_whitelist.
@@ -144,7 +149,6 @@ def detect_metadata_phi(
144
149
  if whitelist is not None:
145
150
  base_terms = list(whitelist)
146
151
  effective_match = match_mode or load_modality_phi_match_mode(project_dir, modality)
147
- similarity = thresholds_for(effective_match).whitelist_similarity
148
152
  else:
149
153
  resolved = resolve_dataset_whitelist(
150
154
  project_dir,
@@ -154,17 +158,20 @@ def detect_metadata_phi(
154
158
  modality=modality,
155
159
  )
156
160
  base_terms = list(resolved.terms)
157
- similarity = resolved.similarity
158
- if resolved.source == "modality" and match_mode is not None:
159
- similarity = thresholds_for(match_mode).whitelist_similarity
161
+ if match_mode is not None:
162
+ effective_match = match_mode
163
+ else:
164
+ code = modality or (resolved.modalities[0] if resolved.modalities else None)
165
+ effective_match = load_modality_phi_match_mode(project_dir, code)
160
166
  logger.info(
161
- "Clean Descriptors whitelist source=%s modalities=%s terms=%d similarity=%.2f",
167
+ "Clean Descriptors whitelist source=%s modalities=%s terms=%d mode=%s",
162
168
  resolved.source,
163
169
  ",".join(resolved.modalities) if resolved.modalities else "—",
164
170
  len(resolved.terms),
165
- similarity,
171
+ effective_match.value,
166
172
  )
167
173
  effective_whitelist = _with_dicom_vr_allow_terms(base_terms)
174
+ similarity = thresholds_for(effective_match).whitelist_similarity
168
175
  min_length_ratio = 0.70
169
176
 
170
177
  ops = (
@@ -263,7 +270,7 @@ def detect_metadata_phi(
263
270
  ents,
264
271
  whitelist=effective_whitelist,
265
272
  anon_values=anon,
266
- similarity=similarity,
273
+ match_mode=effective_match,
267
274
  min_length_ratio=min_length_ratio,
268
275
  )
269
276
  whitelist_dropped += w_drop
@@ -306,9 +313,9 @@ def detect_metadata_phi(
306
313
  out[text] = tuple(pattern)
307
314
 
308
315
  logger.info(
309
- "Clean Descriptors step 5/7 post-NER whitelist_drop=%d anon_drop=%d "
316
+ "Clean Descriptors step 5/7 post-NER decide_drop=%d anon_drop=%d "
310
317
  "pure_numeric_whole_cell_drop=%d expand=%d pattern_fills=%d "
311
- "with_phi=%d whitelist_terms=%d similarity=%.2f",
318
+ "with_phi=%d whitelist_terms=%d mode=%s wl>=%.2f ner>=%.2f",
312
319
  whitelist_dropped,
313
320
  anon_dropped,
314
321
  numeric_dropped,
@@ -316,7 +323,9 @@ def detect_metadata_phi(
316
323
  pattern_added,
317
324
  len(out),
318
325
  len(effective_whitelist),
326
+ effective_match.value,
319
327
  similarity,
328
+ thresholds_for(effective_match).ner_score,
320
329
  )
321
330
  return out
322
331
 
@@ -504,14 +513,15 @@ def _drop_whitelist_and_anon(
504
513
  *,
505
514
  whitelist: Sequence[str],
506
515
  anon_values: Sequence[str] | set[str] | frozenset[str],
507
- similarity: float,
516
+ match_mode: PhiMatchMode,
508
517
  min_length_ratio: float,
509
518
  ) -> tuple[list[Entity], int, int]:
510
- """Drop post-NER spans that match whitelist terms or anon header surfaces."""
519
+ """Drop post-NER spans via pixel decide (NER floor + whitelist contest) or anon."""
511
520
  anon = frozenset(str(v).strip() for v in anon_values if str(v).strip())
512
521
  terms = [str(t).strip() for t in whitelist if str(t).strip()]
522
+ thr = thresholds_for(match_mode)
513
523
  kept: list[Entity] = []
514
- w_drop = 0
524
+ decide_drop = 0
515
525
  a_drop = 0
516
526
  for ent in ents:
517
527
  span = text[ent.start : ent.end].strip()
@@ -524,23 +534,38 @@ def _drop_whitelist_and_anon(
524
534
  span[:60],
525
535
  )
526
536
  continue
537
+ wl_score: float | None = None
538
+ wl_term: str | None = None
527
539
  if terms:
528
540
  hit = similarity_term_match(
529
541
  span,
530
542
  terms,
531
- threshold=similarity,
543
+ threshold=thr.whitelist_similarity,
532
544
  min_length_ratio=min_length_ratio,
533
545
  )
534
- if hit.matched:
535
- w_drop += 1
536
- logger.info(
537
- "Clean Descriptors step 5/7 drop whitelist span=%r term=%r",
538
- span[:60],
539
- hit.term,
540
- )
541
- continue
546
+ if hit.term is not None:
547
+ wl_score = float(hit.similarity)
548
+ wl_term = hit.term
549
+ if not phi_accepted_scores(
550
+ float(ent.score),
551
+ has_label=bool(str(ent.label or "").strip()),
552
+ whitelist_score=wl_score,
553
+ mode=match_mode,
554
+ ):
555
+ decide_drop += 1
556
+ logger.info(
557
+ "Clean Descriptors step 5/7 drop decide span=%r label=%s "
558
+ "ner=%.3f wl=%s term=%r mode=%s",
559
+ span[:60],
560
+ ent.label,
561
+ float(ent.score),
562
+ f"{wl_score:.3f}" if wl_score is not None else "—",
563
+ wl_term,
564
+ match_mode.value,
565
+ )
566
+ continue
542
567
  kept.append(ent)
543
- return kept, w_drop, a_drop
568
+ return kept, decide_drop, a_drop
544
569
 
545
570
 
546
571
  def _post_ner_pattern_entities(text: str) -> list[Entity]:
@@ -15,8 +15,9 @@ class Entity:
15
15
  """One PHI span: product label plus character offsets into the source string.
16
16
 
17
17
  score is the model's softmax confidence for raw_label (fine-grained HF
18
- class), not for the mapped product label. No score threshold is applied —
19
- see module README. UI hover shows label only.
18
+ class), not for the mapped product label. The NER engine keeps every mapped
19
+ span; pixel Embedded PHI and Clean Descriptors decide apply PhiMatchMode
20
+ floors and the whitelist-vs-NER contest. UI hover shows label only.
20
21
 
21
22
  replacement: when set (metadata PHI tagged with a DICOM keyword as
22
23
  label), replace_entities always writes this string — the anonymized
@@ -13,9 +13,24 @@ PhiMatchMode
13
13
  PhiMatchThresholds
14
14
  whitelist_similarity and ner_score for one mode.
15
15
 
16
+ WHITELIST_CONFIDENT_SCORE
17
+ Whitelist similarity above this always wins over NER (0.8).
18
+
19
+ WHITELIST_OVER_NER_MARGIN
20
+ Weaker whitelist wins when ner.score < whitelist.score - this margin (0.1).
21
+
16
22
  thresholds_for(mode: PhiMatchMode) -> PhiMatchThresholds
17
23
  Preset floors for a match mode.
18
24
 
25
+ whitelist_score_meets_floor(whitelist_score: float | None, mode: PhiMatchMode) -> bool
26
+ True when whitelist_score meets the mode similarity floor.
27
+
28
+ whitelist_overrides_ner_scores(ner_score: float | None, whitelist_score: float | None, mode: PhiMatchMode) -> bool
29
+ Pixel/metadata decide: confident whitelist wins, or weaker hit with margin.
30
+
31
+ phi_accepted_scores(ner_score: float | None, *, has_label: bool, whitelist_score: float | None, mode: PhiMatchMode) -> bool
32
+ True when NER meets the mode floor and whitelist does not override.
33
+
19
34
  is_whitelisted(t: OCRText, mode: PhiMatchMode) -> bool
20
35
  True when whitelist.score is set and meets the mode similarity floor.
21
36
 
@@ -108,9 +123,9 @@ _NER_JOIN_MAX_SKIP_CHARS = 2
108
123
  _NER_TRAILING_SEPARATORS = frozenset(":-/\\|;,.")
109
124
  _PIXEL_NAME_LABELS = frozenset({"FIRST_NAME", "LAST_NAME"})
110
125
  # A whitelist score above this always wins over NER.
111
- _WHITELIST_CONFIDENT_SCORE = 0.8
126
+ WHITELIST_CONFIDENT_SCORE = 0.8
112
127
  # Weaker hits override NER only when ner.score < whitelist.score - this margin.
113
- _WHITELIST_OVER_NER_MARGIN = 0.1
128
+ WHITELIST_OVER_NER_MARGIN = 0.1
114
129
  # XR (CR/DX) and US burn-in clocks: any separators → HH:MM:SS for NER.
115
130
  _CLOCK_NORMALIZE_MODALITIES = frozenset({*XR_MODALITIES, Modality.US})
116
131
  # Separators: non-digits and/or digit 8 (EasyOCR often reads ':' as '8'), mixed ok.
@@ -152,37 +167,81 @@ def thresholds_for(mode: PhiMatchMode) -> PhiMatchThresholds:
152
167
  return _MATCH_PRESETS[mode]
153
168
 
154
169
 
155
- def is_whitelisted(t: OCRText, mode: PhiMatchMode) -> bool:
156
- """True when whitelist.score is set and score >= mode.whitelist_similarity."""
157
- thr = thresholds_for(mode)
158
- return t.whitelist.score is not None and t.whitelist.score >= thr.whitelist_similarity
170
+ def whitelist_score_meets_floor(
171
+ whitelist_score: float | None, mode: PhiMatchMode
172
+ ) -> bool:
173
+ """True when whitelist_score meets the mode similarity floor."""
174
+ if whitelist_score is None:
175
+ return False
176
+ return float(whitelist_score) >= thresholds_for(mode).whitelist_similarity
159
177
 
160
178
 
161
- def _whitelist_overrides_ner(t: OCRText, mode: PhiMatchMode) -> bool:
179
+ def whitelist_overrides_ner_scores(
180
+ ner_score: float | None,
181
+ whitelist_score: float | None,
182
+ mode: PhiMatchMode,
183
+ ) -> bool:
162
184
  """
163
- True when the box meets the whitelist floor and whitelist wins.
185
+ True when whitelist meets the mode floor and wins over NER.
164
186
 
165
187
  A whitelist score above 0.8 always wins. A weaker hit wins when NER is
166
188
  absent or ner.score < whitelist.score - 0.1. Close scores on a fuzzy
167
189
  resemblance stay PHI.
168
190
 
169
191
  Args:
170
- t: Annotated OCR box.
192
+ ner_score: Model confidence for the PHI span, or None when unlabeled.
193
+ whitelist_score: Best keep-term similarity for the span, or None.
171
194
  mode: Current PhiMatchMode floors.
172
195
 
173
196
  Returns:
174
- True when callers should treat the box as whitelist chrome, not PHI.
197
+ True when callers should treat the span as keep-list chrome, not PHI.
175
198
  """
176
- if not is_whitelisted(t, mode):
177
- return False
178
- wl_score = t.whitelist.score
179
- if wl_score is None:
199
+ if not whitelist_score_meets_floor(whitelist_score, mode):
180
200
  return False
181
- if float(wl_score) > _WHITELIST_CONFIDENT_SCORE:
201
+ assert whitelist_score is not None
202
+ if float(whitelist_score) > WHITELIST_CONFIDENT_SCORE:
182
203
  return True
183
- if t.ner.label is None or t.ner.score is None:
204
+ if ner_score is None:
184
205
  return True
185
- return float(t.ner.score) < float(wl_score) - _WHITELIST_OVER_NER_MARGIN
206
+ return float(ner_score) < float(whitelist_score) - WHITELIST_OVER_NER_MARGIN
207
+
208
+
209
+ def phi_accepted_scores(
210
+ ner_score: float | None,
211
+ *,
212
+ has_label: bool,
213
+ whitelist_score: float | None,
214
+ mode: PhiMatchMode,
215
+ ) -> bool:
216
+ """
217
+ True when NER meets the mode floor and whitelist does not override.
218
+
219
+ Shared by pixel boxes and Clean Descriptors metadata spans.
220
+
221
+ Args:
222
+ ner_score: Model confidence for the PHI span, or None.
223
+ has_label: True when a product PHI label is set.
224
+ whitelist_score: Best keep-term similarity for the span, or None.
225
+ mode: Current PhiMatchMode floors.
226
+
227
+ Returns:
228
+ True when callers should treat the span as Embedded PHI.
229
+ """
230
+ thr = thresholds_for(mode)
231
+ if not has_label or ner_score is None or float(ner_score) < thr.ner_score:
232
+ return False
233
+ return not whitelist_overrides_ner_scores(ner_score, whitelist_score, mode)
234
+
235
+
236
+ def is_whitelisted(t: OCRText, mode: PhiMatchMode) -> bool:
237
+ """True when whitelist.score is set and score >= mode.whitelist_similarity."""
238
+ return whitelist_score_meets_floor(t.whitelist.score, mode)
239
+
240
+
241
+ def _whitelist_overrides_ner(t: OCRText, mode: PhiMatchMode) -> bool:
242
+ """OCRText wrapper for whitelist_overrides_ner_scores."""
243
+ ner_score = None if t.ner.label is None else t.ner.score
244
+ return whitelist_overrides_ner_scores(ner_score, t.whitelist.score, mode)
186
245
 
187
246
 
188
247
  def phi_accepted(t: OCRText, mode: PhiMatchMode) -> bool:
@@ -198,14 +257,12 @@ def phi_accepted(t: OCRText, mode: PhiMatchMode) -> bool:
198
257
  Returns:
199
258
  True when callers should treat the box as Embedded PHI.
200
259
  """
201
- thr = thresholds_for(mode)
202
- if (
203
- t.ner.label is None
204
- or t.ner.score is None
205
- or t.ner.score < thr.ner_score
206
- ):
207
- return False
208
- return not _whitelist_overrides_ner(t, mode)
260
+ return phi_accepted_scores(
261
+ t.ner.score,
262
+ has_label=t.ner.label is not None,
263
+ whitelist_score=t.whitelist.score,
264
+ mode=mode,
265
+ )
209
266
 
210
267
 
211
268
  def accepted_phi_entities(t: OCRText, mode: PhiMatchMode) -> tuple[tuple[str, str], ...]: