module-qc-tools 2.8.0__tar.gz → 2.9.0__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 (173) hide show
  1. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.zenodo.json +3 -3
  2. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/CITATION.cff +2 -2
  3. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/PKG-INFO +5 -5
  4. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/README.md +1 -1
  5. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/history.md +17 -1
  6. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/install.md +2 -2
  7. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/measurements.md +61 -25
  8. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/pyproject.toml +3 -3
  9. module_qc_tools-2.9.0/src/module_qc_tools/_version.py +24 -0
  10. module_qc_tools-2.9.0/src/module_qc_tools/cli/HVGROUP_IV_MEASURE.py +303 -0
  11. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/globals.py +13 -1
  12. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/main.py +2 -0
  13. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/hw_config_example_lls_qc_itkpixv2.json +6 -0
  14. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/meas_config.json +6 -0
  15. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/schema/meas_config.json +23 -0
  16. module_qc_tools-2.9.0/src/module_qc_tools/measurements/hvgroup_iv_measure.py +340 -0
  17. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/yarr.py +2 -2
  18. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tbump.toml +2 -2
  19. module_qc_tools-2.9.0/tests/test_emulator/lls_connectivity_OB_preprod_longeron_M6.json +400 -0
  20. module_qc_tools-2.9.0/tests/test_emulator/module_configs/20UPGM22601146/20UPGM22601146_info.json +9 -0
  21. module_qc_tools-2.9.0/tests/test_emulator/module_configs/20UPGM22601158/20UPGM22601158_info.json +9 -0
  22. module_qc_tools-2.9.0/tests/test_emulator/module_configs/20UPGM22601160/20UPGM22601160_info.json +9 -0
  23. module_qc_tools-2.9.0/tests/test_emulator/module_configs/20UPGM22601171/20UPGM22601171_info.json +9 -0
  24. module_qc_tools-2.9.0/tests/test_emulator/module_configs/20UPGM22601181/20UPGM22601181_info.json +9 -0
  25. module_qc_tools-2.9.0/tests/test_emulator/module_configs/20UPGM22601182/20UPGM22601182_info.json +9 -0
  26. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/test_emulator.py +31 -0
  27. module_qc_tools-2.8.0/src/module_qc_tools/_version.py +0 -34
  28. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.gitattributes +0 -0
  29. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.gitignore +0 -0
  30. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.gitlab-ci.yml +0 -0
  31. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.gitmodules +0 -0
  32. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.linkcheckerrc +0 -0
  33. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.pre-commit-config.yaml +0 -0
  34. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/LICENSE +0 -0
  35. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/.gitkeep +0 -0
  36. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/.overrides/main.html +0 -0
  37. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/.snippets/abbrs.txt +0 -0
  38. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/.snippets/links.txt +0 -0
  39. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/assets/css/custom.css +0 -0
  40. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/config.md +0 -0
  41. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/development.md +0 -0
  42. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/emulator.md +0 -0
  43. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/index.md +0 -0
  44. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/meta/authors.md +0 -0
  45. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/reference/cli.md +0 -0
  46. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/reference/gen_ref_nav.py +0 -0
  47. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2 +0 -0
  48. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2 +0 -0
  49. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2 +0 -0
  50. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2 +0 -0
  51. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2 +0 -0
  52. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2 +0 -0
  53. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2 +0 -0
  54. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic-CsTKlA.woff2 +0 -0
  55. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2 +0 -0
  56. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2 +0 -0
  57. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic2CsTKlA.woff2 +0 -0
  58. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic3CsTKlA.woff2 +0 -0
  59. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2 +0 -0
  60. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2 +0 -0
  61. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2 +0 -0
  62. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2 +0 -0
  63. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2 +0 -0
  64. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2 +0 -0
  65. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xIIzI.woff2 +0 -0
  66. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2 +0 -0
  67. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2 +0 -0
  68. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 +0 -0
  69. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 +0 -0
  70. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 +0 -0
  71. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 +0 -0
  72. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 +0 -0
  73. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 +0 -0
  74. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 +0 -0
  75. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 +0 -0
  76. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfBBc4.woff2 +0 -0
  77. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 +0 -0
  78. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 +0 -0
  79. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 +0 -0
  80. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 +0 -0
  81. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 +0 -0
  82. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 +0 -0
  83. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu4mxK.woff2 +0 -0
  84. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 +0 -0
  85. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu72xKOzY.woff2 +0 -0
  86. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 +0 -0
  87. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 +0 -0
  88. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 +0 -0
  89. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0mf0h.woff2 +0 -0
  90. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0mf0h.woff2 +0 -0
  91. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0mf0h.woff2 +0 -0
  92. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2 +0 -0
  93. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0mf0h.woff2 +0 -0
  94. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0mf0h.woff2 +0 -0
  95. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlYIw.woff2 +0 -0
  96. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlYIw.woff2 +0 -0
  97. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlYIw.woff2 +0 -0
  98. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ul.woff2 +0 -0
  99. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlYIw.woff2 +0 -0
  100. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-UlYIw.woff2 +0 -0
  101. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts.css +0 -0
  102. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/readme.txt +0 -0
  103. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/mkdocs.yml +0 -0
  104. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/__init__.py +0 -0
  105. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/ADC_CALIBRATION.py +0 -0
  106. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/ANALOG_READBACK.py +0 -0
  107. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/DATA_TRANSMISSION.py +0 -0
  108. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/INJECTION_CAPACITANCE.py +0 -0
  109. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/IV_MEASURE.py +0 -0
  110. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/LONG_TERM_STABILITY_DCS.py +0 -0
  111. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/LP_MODE.py +0 -0
  112. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/OVERVOLTAGE_PROTECTION.py +0 -0
  113. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/SLDO.py +0 -0
  114. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/THERMAL_PERFORMANCE.py +0 -0
  115. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/UNDERSHUNT_PROTECTION.py +0 -0
  116. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/VCAL_CALIBRATION.py +0 -0
  117. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/__init__.py +0 -0
  118. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/__main__.py +0 -0
  119. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/get_nominal_current.py +0 -0
  120. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/hardware_emulator.py +0 -0
  121. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/split_old_config.py +0 -0
  122. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/upload_localdb.py +0 -0
  123. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/yarr.py +0 -0
  124. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/console.py +0 -0
  125. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/hw_config_emulator_merged_vmux.json +0 -0
  126. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/hw_config_example_felix_merged_vmux_itkpixv2.json +0 -0
  127. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/hw_config_example_felix_merged_vmux_v1.json +0 -0
  128. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/hw_config_example_felix_separate_vmux_itkpixv2.json +0 -0
  129. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/hw_config_example_felix_separate_vmux_v1.json +0 -0
  130. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/hw_config_example_merged_vmux_itkpixv2.json +0 -0
  131. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/hw_config_example_merged_vmux_v1.json +0 -0
  132. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/hw_config_example_separate_vmux_itkpixv2.json +0 -0
  133. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/hw_config_example_separate_vmux_v1.json +0 -0
  134. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/emulator/configs/connectivity/20UPGXM1234567_Lx_dummy.json +0 -0
  135. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/emulator/configs/connectivity/20UPGXM1234567_Lx_dummy_disabledchip.json +0 -0
  136. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/emulator/configs/connectivity/20UPGXM1234567_info.json +0 -0
  137. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/emulator/configs/connectivity/chip/dummy_chip1.json +0 -0
  138. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/emulator/configs/connectivity/chip/dummy_chip2.json +0 -0
  139. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/emulator/configs/connectivity/chip/dummy_chip3.json +0 -0
  140. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/emulator/configs/connectivity/chip/dummy_chip4.json +0 -0
  141. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/emulator/configs/controller/specCfg-rd53b.json +0 -0
  142. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/emulator/module_state_template.json +0 -0
  143. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/__init__.py +0 -0
  144. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/adc_calibration.py +0 -0
  145. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/analog_readback.py +0 -0
  146. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/data_transmission.py +0 -0
  147. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/injection_capacitance.py +0 -0
  148. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/iv_measure.py +0 -0
  149. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/long_term_stability_dcs.py +0 -0
  150. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/lp_mode.py +0 -0
  151. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/overvoltage_protection.py +0 -0
  152. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/sldo.py +0 -0
  153. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/thermal_performance.py +0 -0
  154. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/undershunt_protection.py +0 -0
  155. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/vcal_calibration.py +0 -0
  156. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/typing_compat.py +0 -0
  157. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/__init__.py +0 -0
  158. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/cellqc_box.py +0 -0
  159. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/hardware_control_base.py +0 -0
  160. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/hrc.py +0 -0
  161. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/lls_interlock.py +0 -0
  162. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/misc.py +0 -0
  163. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/mops.py +0 -0
  164. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/multimeter.py +0 -0
  165. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/ntc.py +0 -0
  166. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/power_supply.py +0 -0
  167. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/subprocess_emulator.py +0 -0
  168. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/conftest.py +0 -0
  169. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/test_measurements.py +0 -0
  170. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/test_package.py +0 -0
  171. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/test_schema/cutter_pcb_tab.json +0 -0
  172. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/test_schema/cutter_pcb_tab_BAD.json +0 -0
  173. {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/test_schema.py +0 -0
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "description": " general python tool for running ITkPixV1.1 and ITkPixV2 module QC tests for the ATLAS ITk project",
3
3
  "license": "MIT",
4
- "title": "atlas-itk-pixel-modules/mqt: v2.8.0",
5
- "version": "v2.8.0",
4
+ "title": "atlas-itk-pixel-modules/mqt: v2.9.0",
5
+ "version": "v2.9.0",
6
6
  "upload_type": "software",
7
7
  "creators": [
8
8
  {
@@ -120,7 +120,7 @@
120
120
  "related_identifiers": [
121
121
  {
122
122
  "scheme": "url",
123
- "identifier": "https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/tree/v2.8.0",
123
+ "identifier": "https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/tree/v2.9.0",
124
124
  "relation": "isSupplementTo"
125
125
  }
126
126
  ]
@@ -77,6 +77,6 @@ keywords:
77
77
  license:
78
78
  - mit
79
79
  message: If you use this software, please cite it using the metadata from this file.
80
- title: 'atlas-itk-pixel-modules/mqt: v2.8.0'
80
+ title: 'atlas-itk-pixel-modules/mqt: v2.9.0'
81
81
  type: software
82
- version: v2.8.0
82
+ version: v2.9.0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: module_qc_tools
3
- Version: 2.8.0
3
+ Version: 2.9.0
4
4
  Summary: Module qc tools
5
5
  Project-URL: Homepage, https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools
6
6
  Project-URL: Bug Tracker, https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/issues
7
7
  Project-URL: Source, https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools
8
- Project-URL: Documentation, https://atlas-itk-pixel-mqt.docs.cern.ch/2.8/
8
+ Project-URL: Documentation, https://atlas-itk-pixel-mqt.docs.cern.ch/2.9/
9
9
  Author-email: Jay Chan <jay.chan@cern.ch>
10
10
  Maintainer-email: Giordon Stark <gstark@cern.ch>
11
11
  License: Copyright (c) 2018 ATLAS ITk Pixel Modules
@@ -33,8 +33,8 @@ Classifier: Operating System :: OS Independent
33
33
  Classifier: Programming Language :: Python :: 3
34
34
  Requires-Python: >=3.9
35
35
  Requires-Dist: check-jsonschema
36
- Requires-Dist: module-qc-data-tools>=1.5.0
37
- Requires-Dist: module-qc-database-tools>=2.10.0
36
+ Requires-Dist: module-qc-data-tools>=1.7.0
37
+ Requires-Dist: module-qc-database-tools>=2.11.2
38
38
  Requires-Dist: numpy
39
39
  Requires-Dist: packaging
40
40
  Requires-Dist: pre-commit
@@ -45,7 +45,7 @@ Requires-Dist: typer>=0.18.0
45
45
  Requires-Dist: urllib3<2,>=1.26.20; 'el7.x86_64' in platform_release
46
46
  Description-Content-Type: text/markdown
47
47
 
48
- # module-qc-tools v2.8.0
48
+ # module-qc-tools v2.9.0
49
49
 
50
50
  A general python tool for running ITkPixV1.1 and ITkPixV2 module QC tests
51
51
 
@@ -1,4 +1,4 @@
1
- # module-qc-tools v2.8.0
1
+ # module-qc-tools v2.9.0
2
2
 
3
3
  A general python tool for running ITkPixV1.1 and ITkPixV2 module QC tests
4
4
 
@@ -16,6 +16,22 @@ and this project adheres to
16
16
 
17
17
  **_Fixed:_**
18
18
 
19
+ ## [2.9.0](https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/tags/v2.9.0) - 2006-07-13 ## {: #mqt-v2.9.0 }
20
+
21
+ **_Changed:_**
22
+
23
+ - Update measurement times with current versions (!285)
24
+
25
+ **_Added:_**
26
+
27
+ - Add evaporatorPosition information to connectivity file and rename some fields
28
+ (!286)
29
+ - HV group IV measure (!284)
30
+
31
+ **_Fixed:_**
32
+
33
+ - Remove writable-check for measuremnt config (!289)
34
+
19
35
  ## [2.8.0](https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/tags/v2.8.0) - 2006-03-06 ## {: #mqt-v2.8.0 }
20
36
 
21
37
  **_Added:_**
@@ -33,7 +49,7 @@ and this project adheres to
33
49
 
34
50
  !!! important
35
51
 
36
- Requires module-qc-data-tools >= v1.5.0rc0,
52
+ Requires module-qc-data-tools >= v1.5.0rc1,
37
53
 
38
54
  **_Fixed:_**
39
55
 
@@ -94,7 +94,7 @@ package.
94
94
  $ python -m venv venv
95
95
  $ source venv/bin/activate
96
96
  $ python -m pip install -U pip
97
- $ python -m pip install -U pip module-qc-tools==2.8.0
97
+ $ python -m pip install -U pip module-qc-tools==2.9.0
98
98
  ```
99
99
 
100
100
  ### via uv
@@ -103,7 +103,7 @@ $ python -m pip install -U pip module-qc-tools==2.8.0
103
103
  $ python -m venv venv
104
104
  $ source venv/bin/activate
105
105
  $ python -m pip install uv
106
- $ uv pip install module-qc-tools==2.8.0
106
+ $ uv pip install module-qc-tools==2.9.0
107
107
  ```
108
108
 
109
109
  # Usage
@@ -19,42 +19,44 @@ modules to be tested are already powered on.
19
19
  ### Time Estimates
20
20
 
21
21
  The following were measured using an old Keithley multimeter with
22
- [v2.4.2](https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/tags/v2.4.2)
23
- running `run-full-qc`. The analysis includes uploading to localDB and
24
- downloading the results.
22
+ [mqt v2.8.0](https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/tags/v2.8.0)
23
+ running `run-full-qc` with YARR v1.5.6. The analysis includes uploading to
24
+ localDB v2.8.2 and downloading the results from a standalone database machine on
25
+ the same network.
25
26
 
26
27
  | Measurement | Duration (hh:mm:ss) |
27
28
  | -------------------------- | ------------------- |
28
29
  | update k-shunt | 00:00:01 |
29
30
  | eye diagram | 00:00:05 |
30
- | core column scan | 00:00:27 |
31
- | **ADC calib** | **00:02:32** |
32
- | analysis | 00:00:09 |
31
+ | core column scan | 00:00:29 |
32
+ | **ADC calib** | **00:01:32** |
33
+ | analysis | 00:00:16 |
33
34
  | update chip config | 00:00:04 |
34
- | **Analog Readback** | **00:30:47** |
35
- | analysis | 00:00:14 |
35
+ | **Analog Readback** | **00:30:56** |
36
+ | analysis | 00:00:22 |
36
37
  | update chip config | 00:00:04 |
37
- | **SLDO VI** | **00:19:30** |
38
- | analysis | 00:00:12 |
38
+ | eye diagram | 00:00:05 |
39
+ | **SLDO VI** | **00:10:45** |
40
+ | analysis | 00:00:16 |
39
41
  | update chip config | 00:00:02 |
40
- | **Vcal calib** | **00:05:47** |
41
- | analysis | 00:00:10 |
42
- | update chip config | 00:00:04 |
43
- | **Injection Cap.** | **00:02:29** |
44
- | analysis | 00:00:09 |
45
- | update chip config | 00:00:04 |
46
- | **LP Mode** | **00:06:51** |
47
- | analysis | 00:00:09 |
48
- | update chip config | 00:00:01 |
49
- | **DATA_TRANSMISSION** | **00:00:35** |
50
- | analysis | 00:00:09 |
42
+ | **Vcal calib** | **00:02:55** |
43
+ | analysis | 00:00:13 |
44
+ | update chip config | 00:00:03 |
45
+ | **Injection Cap.** | **00:01:30** |
46
+ | analysis | 00:00:16 |
51
47
  | update chip config | 00:00:02 |
52
- | **Minimum Health Test** | **00:06:40** |
48
+ | **LP Mode** | **00:01:37** |
49
+ | analysis | 00:00:08 |
50
+ | update chip config | 00:00:03 |
51
+ | **DATA_TRANSMISSION** | **00:00:31** |
52
+ | analysis | 00:00:14 |
53
+ | update chip config | 00:00:02 |
54
+ | **Minimum Health Test** | **00:07:09** |
53
55
  | clear chip config | 00:00:00 |
54
- | **Tuning** | **00:13:09** |
55
- | **Pixel Failure Analysis** | **00:09:02** |
56
+ | **Tuning** | **00:14:26** |
57
+ | **Pixel Failure Analysis** | **00:09:39** |
56
58
  | -------------------------- | ------------------- |
57
- | _total_ | _01:39:29_ |
59
+ | _total_ | _01:24:01_ |
58
60
 
59
61
  ### Local Filesystem
60
62
 
@@ -520,3 +522,37 @@ This adds the ability to run the thermal performance measurement
520
522
  ```
521
523
  measurement-THERMAL-PERFORMANCE -c $(module-qc-tools --prefix)/configs/hw_config_emulator_merged_vmux.json -o emulator/outputs/
522
524
  ```
525
+
526
+ ## HV group IV measurement
527
+
528
+ - [`mqt measurement hvgroup-iv-measure`](reference/cli.md#mqt-measurement-hvgroup-iv-measure)
529
+ - [`module-qc-tools measurement hvgroup-iv-measure`](reference/cli.md#mqt-measurement-hvgroup-iv-measure)
530
+ - [`measurement-HVGROUP-IV-MEASURE`](reference/cli.md#mqt-measurement-hvgroup-iv-measure)
531
+
532
+ This adds the ability to run an IV measure of a group of modules biased in
533
+ parallel within one high voltage (HV) group (`task = HVGROUP_IV_MEASURE`). The
534
+ measurement configuration is specified in the input configuration json file
535
+ (i.e. '$(module-qc-tools --prefix)/configs/meas_config.json'). Before the start
536
+ of the measurement, it is assumed, that both LV and HV are turned ON for the
537
+ modules.
538
+
539
+ **Configuration settings**
540
+
541
+ | Name | Description |
542
+ | --------------- | --------------------------------------------------------------------------------------------------------------------- |
543
+ | `v_min` | the starting voltage of this measurement |
544
+ | `v_max` | the end voltage of this measurement (**IMPORTANT:** This might need adjustment for every HV group) |
545
+ | `n_points` | how many points should be measured depending on the required voltage steps (i.e. 1V for 3D and 5V for planar modules) |
546
+ | `settling_time` | delay in seconds between setting a bias voltage and reading the current |
547
+
548
+ ??? example
549
+
550
+ ```
551
+ mqt measurement hvgroup-iv-measure --config-meas "$(module-qc-tools --prefix)/configs/meas_config.json" --config "$(module-qc-tools --prefix)/configs/hw_config_example_lls_qc_itkpixv2.json" --serial-number 20UPBVGxxxxxx --lls-connectivity path/to/connectivity.json --module-connectivity path/to/module/configs/directory --site SITE -o output/path
552
+ ```
553
+
554
+ ??? example "emulator"
555
+
556
+ ```
557
+ mqt measurement hvgroup-iv-measure --config "$(module-qc-tools --prefix)/configs/hw_config_emulator_merged_vmux.json" --serial-number 20UPBVG1234567 --lls-connectivity "$(dirname "$(dirname "$(dirname "$(module-qc-tools --prefix)" )")")/tests/test_emulator/lls_connectivity_OB_preprod_longeron_M6.json" --module-connectivity "$(dirname "$(dirname "$(dirname "$(module-qc-tools --prefix)" )")")/tests/test_emulator/module_configs" --site TEST -o emulator/outputs
558
+ ```
@@ -20,8 +20,8 @@ dependencies = [
20
20
  "tabulate",
21
21
  "pre-commit",
22
22
  "check-jsonschema",
23
- "module-qc-data-tools >= 1.5.0",
24
- "module-qc-database-tools >= 2.10.0",
23
+ "module-qc-data-tools >= 1.7.0",
24
+ "module-qc-database-tools >= 2.11.2",
25
25
  "requests",
26
26
  'urllib3>=1.26.20,<2; "el7.x86_64" in platform_release',
27
27
  "typer>=0.18.0",
@@ -38,7 +38,7 @@ classifiers = [
38
38
  "Homepage" = "https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools"
39
39
  "Bug Tracker" = "https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/issues"
40
40
  "Source" = "https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools"
41
- "Documentation" = "https://atlas-itk-pixel-mqt.docs.cern.ch/2.8/"
41
+ "Documentation" = "https://atlas-itk-pixel-mqt.docs.cern.ch/2.9/"
42
42
 
43
43
  [project.scripts]
44
44
  module-qc-tools = "module_qc_tools.cli:app"
@@ -0,0 +1,24 @@
1
+ # file generated by vcs-versioning
2
+ # don't change, don't track in version control
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "__version__",
7
+ "__version_tuple__",
8
+ "version",
9
+ "version_tuple",
10
+ "__commit_id__",
11
+ "commit_id",
12
+ ]
13
+
14
+ version: str
15
+ __version__: str
16
+ __version_tuple__: tuple[int | str, ...]
17
+ version_tuple: tuple[int | str, ...]
18
+ commit_id: str | None
19
+ __commit_id__: str | None
20
+
21
+ __version__ = version = '2.9.0'
22
+ __version_tuple__ = version_tuple = (2, 9, 0)
23
+
24
+ __commit_id__ = commit_id = None
@@ -0,0 +1,303 @@
1
+ import json
2
+ import logging
3
+ from datetime import date, datetime
4
+ from pathlib import Path
5
+ from tempfile import TemporaryDirectory
6
+
7
+ import numpy as np
8
+ import typer
9
+ from module_qc_data_tools.qcDataFrame import (
10
+ outputDataFrame,
11
+ )
12
+ from module_qc_data_tools.utils import (
13
+ find_parent_of_type,
14
+ get_associated_mops,
15
+ get_child_nodes_of_type,
16
+ get_chip_type_from_serial_number,
17
+ get_layer_from_sn,
18
+ get_n_chips,
19
+ get_nominal_current,
20
+ get_type_from_sn,
21
+ load_hw_config,
22
+ load_lls_dcs_connectivity,
23
+ save_dict_list,
24
+ )
25
+ from module_qc_database_tools.utils import (
26
+ get_BOMCode_from_file,
27
+ get_cutFile_suffix,
28
+ )
29
+
30
+ from module_qc_tools.cli.globals import (
31
+ CONTEXT_SETTINGS,
32
+ LogLevel,
33
+ OPTION_config_hw,
34
+ OPTION_config_meas,
35
+ OPTION_lls_connectivity_path,
36
+ OPTION_module_connectivity,
37
+ OPTION_nchips,
38
+ OPTION_output_dir,
39
+ OPTION_save_local,
40
+ OPTION_serial_number,
41
+ OPTION_site,
42
+ OPTION_verbosity,
43
+ )
44
+ from module_qc_tools.measurements.hvgroup_iv_measure import run
45
+ from module_qc_tools.utils import datapath as mqt_data
46
+ from module_qc_tools.utils.misc import (
47
+ add_identifiers_metadata,
48
+ copytree,
49
+ load_meas_config,
50
+ )
51
+ from module_qc_tools.utils.mops import mops
52
+ from module_qc_tools.utils.power_supply import power_supply
53
+
54
+ logger = logging.getLogger("measurement")
55
+
56
+ app = typer.Typer(context_settings=CONTEXT_SETTINGS)
57
+
58
+ # Taking the test-type from the script name which is the test-code in ProdDB.
59
+ TEST_TYPE = Path(__file__).stem
60
+
61
+
62
+ @app.command()
63
+ def main(
64
+ hw_config_path: OPTION_config_hw = ...,
65
+ meas_config_path: OPTION_config_meas = mqt_data / "configs" / "meas_config.json",
66
+ hvgroup_serialnumber: OPTION_serial_number = ...,
67
+ lls_connectivity_file_path: OPTION_lls_connectivity_path = ...,
68
+ base_output_dir: OPTION_output_dir = Path("outputs"),
69
+ module_configs_path: OPTION_module_connectivity = ...,
70
+ _verbosity: OPTION_verbosity = LogLevel.info,
71
+ institution: OPTION_site = "",
72
+ save_local: OPTION_save_local = True,
73
+ nchips: OPTION_nchips = None,
74
+ ):
75
+ """Records the sensor leakage current vs reverse bias voltage for a group of modules. The group of modules is biased by one HV channel that is identified by passing the HV_GROUP serial number with the `--serial-number` flag. The module connectivity passed with `--module-connectivity` should point to a folder containing all module configurations in one subfolder per module."""
76
+
77
+ timestart = datetime.now().strftime("%Y-%m-%d_%H%M%S")
78
+
79
+ # check serial number to be of a HV group
80
+ try:
81
+ if get_type_from_sn(hvgroup_serialnumber) != "HIGH_VOLTAGE_GROUP":
82
+ logger.error(
83
+ f"The specified serialnumber {hvgroup_serialnumber} is not an HV group serialnumber."
84
+ )
85
+ raise typer.Exit(1)
86
+ except Exception as err:
87
+ logger.exception(err)
88
+ raise typer.Exit(1) from err
89
+
90
+ # if -o option used, overwrite the default output directory
91
+ output_dir = base_output_dir
92
+
93
+ output_dir = output_dir.joinpath("Measurements", TEST_TYPE, timestart)
94
+ # Make output directory and start log file
95
+ output_dir.mkdir(parents=True, exist_ok=True)
96
+
97
+ logger.info(f"Start {TEST_TYPE.replace('_', ' ')}!")
98
+ logger.info(f"TimeStart: {timestart}")
99
+
100
+ logger.addHandler(logging.FileHandler(output_dir.joinpath("output.log")))
101
+
102
+ config_hw = load_hw_config(hw_config_path)
103
+
104
+ dcs_connectivity = load_lls_dcs_connectivity(lls_connectivity_file_path)
105
+ hvgroups = get_child_nodes_of_type(dcs_connectivity, "HV_GROUP")
106
+
107
+ hvgroup = {}
108
+ for hvgroup_tmp in hvgroups:
109
+ if hvgroup_tmp["data"]["serial"] == hvgroup_serialnumber:
110
+ hvgroup = hvgroup_tmp
111
+
112
+ if not hvgroup:
113
+ logger.error(
114
+ f"LLS connectivity does not contain HV group with specified serialnumber {hvgroup_serialnumber} on which the IV measure should be performed."
115
+ )
116
+ raise typer.Exit(1)
117
+
118
+ logger.info(f"Running on HV group with serial number {hvgroup_serialnumber}")
119
+
120
+ # Taking the module serial numbers in the HV group from the DCS connectivity file
121
+ modules = get_child_nodes_of_type(
122
+ dcs_connectivity, node_type="MODULE", parent_sn=hvgroup_serialnumber
123
+ )
124
+ module_serials = []
125
+ module_positions = []
126
+ module_layers = []
127
+ module_chip_types = []
128
+ module_bom_suffix = []
129
+ module_nominal_currents = []
130
+ for module in modules:
131
+ module_serial = module["data"]["serial"]
132
+ module_serials.append(module_serial)
133
+ module_positions.append(module["data"]["geometricPosition"])
134
+ try:
135
+ # get the layer by checking the module serial number
136
+ layer = get_layer_from_sn(module_serial)
137
+ module_layers.append(layer)
138
+ chip_type = get_chip_type_from_serial_number(module_serial)
139
+ module_chip_types.append(chip_type)
140
+ except Exception as err:
141
+ logger.exception(err)
142
+ raise typer.Exit(1) from err
143
+
144
+ # try to retrieve the BOM information from the config files
145
+ BOM_file = (
146
+ module_configs_path / f"{module_serial}" / f"{module_serial}_info.json"
147
+ )
148
+ bom = get_BOMCode_from_file(BOM_file, layer)
149
+ bom_suffix = get_cutFile_suffix(bom)
150
+ module_bom_suffix.append(bom_suffix)
151
+
152
+ if meas_config_path:
153
+ with meas_config_path.open() as f:
154
+ config = json.load(f)
155
+
156
+ # if nchips was not entered as a command line argument, use the default number of chips for the given layer
157
+ nchips_tmp = nchips
158
+ if nchips is None:
159
+ nchips_tmp = get_n_chips(layer)
160
+ general_i_config = get_nominal_current(
161
+ config, layer, chip_type, bom_suffix, nchips_tmp
162
+ )
163
+ module_nominal_currents.append(general_i_config)
164
+
165
+ max_index = int(np.argmax(module_nominal_currents))
166
+ # Load the measurement config using the chip with the largest nominal current and combine it with the hardware config
167
+ config = load_meas_config(
168
+ meas_config_path,
169
+ test_type=TEST_TYPE,
170
+ chip_type=module_chip_types[max_index],
171
+ bom_type=module_bom_suffix[max_index],
172
+ layer=module_layers[max_index],
173
+ nchips=nchips,
174
+ )
175
+ config.update(config_hw)
176
+
177
+ # initialize hardware
178
+ spchain = find_parent_of_type(
179
+ dcs_connectivity, hvgroup_serialnumber, node_type="SP_CHAIN"
180
+ )
181
+ if spchain is None:
182
+ # should never happen when loaded with schema check
183
+ logger.error(
184
+ f"LLS connectivity does not contain associated SP chain for HV group with serialnumber {hvgroup_serialnumber}."
185
+ )
186
+ raise typer.Exit(1)
187
+ spchain_serialnumber = spchain["data"]["serial"]
188
+ ps = power_supply(config["power_supply"], ch_id=spchain["data"]["DCSidentifier"])
189
+ hv = power_supply(
190
+ config["high_voltage"],
191
+ ch_id=hvgroup["data"]["DCSidentifier"],
192
+ name="high_voltage",
193
+ is_hv=True,
194
+ )
195
+
196
+ if hv.getPolarity() < 0:
197
+ logger.info(
198
+ f"HV polarity is {hv.getPolarity()} which is opposite to default (1)."
199
+ )
200
+ config["tasks"][TEST_TYPE]["v_max"] = {
201
+ x: abs(y) for x, y in config["v_max"].items()
202
+ }
203
+
204
+ try:
205
+ data = run(
206
+ config,
207
+ ps,
208
+ hv,
209
+ module_layers[max_index],
210
+ hvgroupsn=hvgroup_serialnumber,
211
+ lls_connectivity=dcs_connectivity,
212
+ )
213
+ except KeyboardInterrupt:
214
+ logger.info("KeyboardInterrupt")
215
+ except Exception as err:
216
+ logger.exception(err)
217
+ raise typer.Exit(1) from err
218
+
219
+ add_identifiers_metadata(data, module_serials, institution)
220
+ data.add_meta_data("moduleGeometricPositions", module_positions)
221
+ # Get module ground voltages in SP chain
222
+ module_ground_voltages_array = []
223
+ spchain_modules = get_child_nodes_of_type(
224
+ dcs_connectivity, node_type="MODULE", parent_sn=spchain_serialnumber
225
+ )
226
+ associated_mops = get_associated_mops(dcs_connectivity, hvgroup_serialnumber)
227
+ if associated_mops is None:
228
+ logger.error(
229
+ f"LLS connectivity does not contain associated MOPS for HV group with serialnumber {hvgroup_serialnumber}."
230
+ )
231
+ raise typer.Exit(1)
232
+ associated_mops_measurement = mops(
233
+ config["mops_monitoring"], mops_id=associated_mops["data"]["DCSidentifier"]
234
+ )
235
+ modules_in_spchain = 1
236
+ lvpositions = []
237
+ for module in modules:
238
+ lvpositions.append(int(module["data"]["LVposition"]))
239
+ modules_in_spchain = max(lvpositions)
240
+ for module in modules:
241
+ module_lvposition = int(module["data"]["LVposition"])
242
+ # find next module in SP chain
243
+ found = False
244
+ for next_module in spchain_modules:
245
+ if next_module["data"]["LVposition"] == module_lvposition + 1:
246
+ found = True
247
+ mops_adc_channel_voltage_measure = int(
248
+ next_module["data"]["voltageMeasurement"]["MOPSadc"]
249
+ )
250
+ voltage = associated_mops_measurement.get_converted_adc_measurement(
251
+ mops_adc_channel_voltage_measure,
252
+ "V",
253
+ modules_in_spchain - module_lvposition + 1,
254
+ )
255
+ module_ground_voltages_array.append(voltage[0])
256
+ break
257
+ if found is False:
258
+ # module is last in SP chain
259
+ module_ground_voltages_array.append(0.0)
260
+
261
+ data.add_meta_data("moduleGroundVoltage", module_ground_voltages_array)
262
+ data.add_meta_data("moduleGroundVoltageUnit", "V")
263
+ data.add_meta_data("MeasurementDate", date.today().isoformat())
264
+
265
+ alloutput = []
266
+
267
+ # console.print(data) # we don't print result to terminal
268
+ outputDF = outputDataFrame()
269
+ outputDF._serialNumber = hvgroup_serialnumber
270
+ outputDF.set_test_type(TEST_TYPE)
271
+ outputDF.set_results(data)
272
+ alloutput += [outputDF.to_dict()]
273
+
274
+ with TemporaryDirectory() as tmpdirname:
275
+ save_dict_list(
276
+ Path(tmpdirname).joinpath(f"{hvgroup_serialnumber}.json"),
277
+ alloutput,
278
+ )
279
+
280
+ # for now, set to false until localDB upload functionality implemented
281
+ upload_failed = True
282
+ upload_implemented = False
283
+
284
+ if not save_local:
285
+ # add in logic here to upload to localDB
286
+ msg = "Not implemented yet"
287
+ raise RuntimeError(msg)
288
+
289
+ if upload_failed or save_local:
290
+ copytree(tmpdirname, output_dir)
291
+ if upload_failed and upload_implemented:
292
+ logger.warning(
293
+ "The upload to localDB failed. Please fix and retry uploading the measurement output again."
294
+ )
295
+
296
+ logger.info(f"Writing output measurements in {output_dir}")
297
+
298
+ logger.info("Done!")
299
+ logger.info(f"TimeEnd: {datetime.now().strftime('%Y-%m-%d_%H%M%S')}")
300
+
301
+
302
+ if __name__ == "__main__":
303
+ typer.run(main)
@@ -46,7 +46,6 @@ OPTION_config_meas = Annotated[
46
46
  exists=True,
47
47
  file_okay=True,
48
48
  readable=True,
49
- writable=True,
50
49
  resolve_path=True,
51
50
  ),
52
51
  ]
@@ -309,6 +308,19 @@ OPTION_serial_number = Annotated[
309
308
  ),
310
309
  ]
311
310
 
311
+
312
+ OPTION_lls_connectivity_path = Annotated[
313
+ Path,
314
+ typer.Option(
315
+ "--lls-connectivity",
316
+ help="Path to lls connectivity file",
317
+ exists=True,
318
+ file_okay=True,
319
+ readable=True,
320
+ resolve_path=True,
321
+ ),
322
+ ]
323
+
312
324
  OPTION_scans = Annotated[
313
325
  list[str],
314
326
  typer.Option(
@@ -15,6 +15,7 @@ from module_qc_tools.cli.globals import (
15
15
  from module_qc_tools.cli.hardware_emulator import (
16
16
  app as app_emulator,
17
17
  )
18
+ from module_qc_tools.cli.HVGROUP_IV_MEASURE import main as hvgroup_iv_measure
18
19
  from module_qc_tools.cli.INJECTION_CAPACITANCE import main as injection_capacitance
19
20
  from module_qc_tools.cli.IV_MEASURE import main as iv_measure
20
21
  from module_qc_tools.cli.LONG_TERM_STABILITY_DCS import main as long_term_stability_dcs
@@ -69,6 +70,7 @@ app_measurement.command("lp-mode")(lp_mode)
69
70
  app_measurement.command("overvoltage-protection")(overvoltage_protection)
70
71
  app_measurement.command("undershunt-protection")(undershunt_protection)
71
72
  app_measurement.command("iv-measure")(iv_measure)
73
+ app_measurement.command("hvgroup-iv-measure")(hvgroup_iv_measure)
72
74
  app_measurement.command("long-term-stability-dcs")(long_term_stability_dcs)
73
75
  app_measurement.command("thermal-performance")(thermal_performance)
74
76
 
@@ -70,5 +70,11 @@
70
70
  "get_interlock_temperature_cmd": "./venv/bin/python ./winccoaRemote.py -d INTERLOCK -c GET-TEMPERATURE {ch-id}",
71
71
  "n_try": 0,
72
72
  "success_code": 0
73
+ },
74
+ "hrc": {
75
+ "run_dir": "/home/itkpixdcs/module-qc-winccoa-dcs",
76
+ "cmd": "./venv/bin/python ./winccoaRemote.py -d ENV -c GET-ENVIRONMENT-HUMIDITY",
77
+ "n_try": 0,
78
+ "success_code": 0
73
79
  }
74
80
  }
@@ -15,6 +15,12 @@
15
15
  "n_points": {"L0": 101, "L1": 41, "L2": 41},
16
16
  "settling_time": {"L0": 2, "L1": 2, "L2": 2}
17
17
  },
18
+ "HVGROUP_IV_MEASURE": {
19
+ "v_min": {"L0": 0, "L1": 0, "L2": 0},
20
+ "v_max": {"L0": -100, "L1": -200, "L2": -200},
21
+ "n_points": {"L0": 101, "L1": 41, "L2": 41},
22
+ "settling_time": {"L0": 2, "L1": 2, "L2": 2}
23
+ },
18
24
  "DATA_TRANSMISSION": {
19
25
  "MonitorV": [32],
20
26
  "DataMerging": ["4-to-1", "2-to-1"]