module-qc-tools 2.7.1__tar.gz → 2.8.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 (163) hide show
  1. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/.pre-commit-config.yaml +4 -3
  2. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/.zenodo.json +3 -3
  3. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/CITATION.cff +2 -2
  4. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/PKG-INFO +5 -5
  5. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/README.md +1 -1
  6. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/config.md +44 -13
  7. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/history.md +32 -0
  8. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/install.md +2 -2
  9. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/measurements.md +33 -0
  10. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/pyproject.toml +10 -3
  11. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/_version.py +2 -2
  12. module_qc_tools-2.8.0/src/module_qc_tools/cli/THERMAL_PERFORMANCE.py +226 -0
  13. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/globals.py +4 -3
  14. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/hardware_emulator.py +54 -0
  15. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/main.py +2 -0
  16. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/configs/hw_config_emulator_merged_vmux.json +28 -0
  17. module_qc_tools-2.8.0/src/module_qc_tools/data/configs/hw_config_example_lls_qc_itkpixv2.json +74 -0
  18. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/configs/hw_config_example_merged_vmux_itkpixv2.json +14 -0
  19. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/configs/hw_config_example_merged_vmux_v1.json +14 -0
  20. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/configs/meas_config.json +8 -0
  21. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/schema/meas_config.json +32 -1
  22. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/measurements/iv_measure.py +36 -24
  23. module_qc_tools-2.8.0/src/module_qc_tools/measurements/thermal_performance.py +218 -0
  24. module_qc_tools-2.8.0/src/module_qc_tools/utils/cellqc_box.py +70 -0
  25. module_qc_tools-2.8.0/src/module_qc_tools/utils/lls_interlock.py +30 -0
  26. module_qc_tools-2.8.0/src/module_qc_tools/utils/mops.py +51 -0
  27. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/utils/power_supply.py +38 -15
  28. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/utils/yarr.py +2 -2
  29. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/tbump.toml +2 -2
  30. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/tests/test_emulator.py +3 -0
  31. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/.gitattributes +0 -0
  32. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/.gitignore +0 -0
  33. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/.gitlab-ci.yml +0 -0
  34. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/.gitmodules +0 -0
  35. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/.linkcheckerrc +0 -0
  36. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/LICENSE +0 -0
  37. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/.gitkeep +0 -0
  38. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/.overrides/main.html +0 -0
  39. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/.snippets/abbrs.txt +0 -0
  40. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/.snippets/links.txt +0 -0
  41. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/assets/css/custom.css +0 -0
  42. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/development.md +0 -0
  43. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/emulator.md +0 -0
  44. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/index.md +0 -0
  45. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/meta/authors.md +0 -0
  46. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/reference/cli.md +0 -0
  47. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/reference/gen_ref_nav.py +0 -0
  48. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2 +0 -0
  49. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2 +0 -0
  50. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2 +0 -0
  51. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2 +0 -0
  52. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2 +0 -0
  53. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2 +0 -0
  54. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2 +0 -0
  55. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic-CsTKlA.woff2 +0 -0
  56. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2 +0 -0
  57. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2 +0 -0
  58. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic2CsTKlA.woff2 +0 -0
  59. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic3CsTKlA.woff2 +0 -0
  60. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2 +0 -0
  61. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2 +0 -0
  62. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2 +0 -0
  63. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2 +0 -0
  64. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2 +0 -0
  65. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2 +0 -0
  66. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xIIzI.woff2 +0 -0
  67. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2 +0 -0
  68. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2 +0 -0
  69. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 +0 -0
  70. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 +0 -0
  71. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 +0 -0
  72. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 +0 -0
  73. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 +0 -0
  74. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 +0 -0
  75. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 +0 -0
  76. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 +0 -0
  77. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfBBc4.woff2 +0 -0
  78. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 +0 -0
  79. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 +0 -0
  80. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 +0 -0
  81. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 +0 -0
  82. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 +0 -0
  83. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 +0 -0
  84. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu4mxK.woff2 +0 -0
  85. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 +0 -0
  86. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu72xKOzY.woff2 +0 -0
  87. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 +0 -0
  88. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 +0 -0
  89. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 +0 -0
  90. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0mf0h.woff2 +0 -0
  91. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0mf0h.woff2 +0 -0
  92. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0mf0h.woff2 +0 -0
  93. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2 +0 -0
  94. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0mf0h.woff2 +0 -0
  95. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0mf0h.woff2 +0 -0
  96. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlYIw.woff2 +0 -0
  97. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlYIw.woff2 +0 -0
  98. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlYIw.woff2 +0 -0
  99. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ul.woff2 +0 -0
  100. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlYIw.woff2 +0 -0
  101. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-UlYIw.woff2 +0 -0
  102. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/fonts.css +0 -0
  103. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/docs/stylesheets/readme.txt +0 -0
  104. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/mkdocs.yml +0 -0
  105. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/__init__.py +0 -0
  106. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/ADC_CALIBRATION.py +0 -0
  107. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/ANALOG_READBACK.py +0 -0
  108. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/DATA_TRANSMISSION.py +0 -0
  109. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/INJECTION_CAPACITANCE.py +0 -0
  110. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/IV_MEASURE.py +0 -0
  111. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/LONG_TERM_STABILITY_DCS.py +0 -0
  112. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/LP_MODE.py +0 -0
  113. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/OVERVOLTAGE_PROTECTION.py +0 -0
  114. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/SLDO.py +0 -0
  115. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/UNDERSHUNT_PROTECTION.py +0 -0
  116. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/VCAL_CALIBRATION.py +0 -0
  117. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/__init__.py +0 -0
  118. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/__main__.py +0 -0
  119. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/get_nominal_current.py +0 -0
  120. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/split_old_config.py +0 -0
  121. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/upload_localdb.py +0 -0
  122. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/cli/yarr.py +0 -0
  123. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/console.py +0 -0
  124. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/configs/hw_config_example_felix_merged_vmux_itkpixv2.json +0 -0
  125. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/configs/hw_config_example_felix_merged_vmux_v1.json +0 -0
  126. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/configs/hw_config_example_felix_separate_vmux_itkpixv2.json +0 -0
  127. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/configs/hw_config_example_felix_separate_vmux_v1.json +0 -0
  128. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/configs/hw_config_example_separate_vmux_itkpixv2.json +0 -0
  129. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/configs/hw_config_example_separate_vmux_v1.json +0 -0
  130. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/emulator/configs/connectivity/20UPGXM1234567_Lx_dummy.json +0 -0
  131. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/emulator/configs/connectivity/20UPGXM1234567_Lx_dummy_disabledchip.json +0 -0
  132. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/emulator/configs/connectivity/20UPGXM1234567_info.json +0 -0
  133. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/emulator/configs/connectivity/chip/dummy_chip1.json +0 -0
  134. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/emulator/configs/connectivity/chip/dummy_chip2.json +0 -0
  135. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/emulator/configs/connectivity/chip/dummy_chip3.json +0 -0
  136. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/emulator/configs/connectivity/chip/dummy_chip4.json +0 -0
  137. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/emulator/configs/controller/specCfg-rd53b.json +0 -0
  138. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/data/emulator/module_state_template.json +0 -0
  139. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/measurements/__init__.py +0 -0
  140. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/measurements/adc_calibration.py +0 -0
  141. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/measurements/analog_readback.py +0 -0
  142. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/measurements/data_transmission.py +0 -0
  143. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/measurements/injection_capacitance.py +0 -0
  144. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/measurements/long_term_stability_dcs.py +0 -0
  145. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/measurements/lp_mode.py +0 -0
  146. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/measurements/overvoltage_protection.py +0 -0
  147. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/measurements/sldo.py +0 -0
  148. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/measurements/undershunt_protection.py +0 -0
  149. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/measurements/vcal_calibration.py +0 -0
  150. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/typing_compat.py +0 -0
  151. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/utils/__init__.py +0 -0
  152. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/utils/hardware_control_base.py +0 -0
  153. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/utils/hrc.py +0 -0
  154. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/utils/misc.py +0 -0
  155. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/utils/multimeter.py +0 -0
  156. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/utils/ntc.py +0 -0
  157. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/src/module_qc_tools/utils/subprocess_emulator.py +0 -0
  158. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/tests/conftest.py +0 -0
  159. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/tests/test_measurements.py +0 -0
  160. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/tests/test_package.py +0 -0
  161. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/tests/test_schema/cutter_pcb_tab.json +0 -0
  162. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/tests/test_schema/cutter_pcb_tab_BAD.json +0 -0
  163. {module_qc_tools-2.7.1 → module_qc_tools-2.8.0}/tests/test_schema.py +0 -0
@@ -1,6 +1,7 @@
1
1
  ci:
2
2
  autoupdate_commit_msg: "chore: update pre-commit hooks"
3
3
  autofix_commit_msg: "style: pre-commit fixes"
4
+ autoupdate_schedule: "monthly"
4
5
 
5
6
  repos:
6
7
  - repo: https://github.com/pre-commit/pre-commit-hooks
@@ -43,7 +44,7 @@ repos:
43
44
  additional_dependencies: [black==22.3.0]
44
45
 
45
46
  - repo: https://github.com/astral-sh/ruff-pre-commit
46
- rev: v0.14.1
47
+ rev: v0.14.13
47
48
  hooks:
48
49
  - id: ruff-check
49
50
  args: ["--fix", "--show-fixes"]
@@ -57,7 +58,7 @@ repos:
57
58
  - id: rst-inline-touching-normal
58
59
 
59
60
  - repo: https://github.com/rbubley/mirrors-prettier
60
- rev: "v3.6.2"
61
+ rev: "v3.8.0"
61
62
  hooks:
62
63
  - id: prettier
63
64
  types_or: [yaml, markdown, html, css, scss, javascript] #, json]
@@ -96,7 +97,7 @@ repos:
96
97
  # additional_dependencies: ["repo-review[cli]"]
97
98
 
98
99
  - repo: https://github.com/asottile/pyupgrade
99
- rev: v3.21.0
100
+ rev: v3.21.2
100
101
  hooks:
101
102
  - id: pyupgrade
102
103
  args: ["--py38-plus"]
@@ -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.7.1",
5
- "version": "v2.7.1",
4
+ "title": "atlas-itk-pixel-modules/mqt: v2.8.0",
5
+ "version": "v2.8.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.7.1",
123
+ "identifier": "https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/tree/v2.8.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.7.1'
80
+ title: 'atlas-itk-pixel-modules/mqt: v2.8.0'
81
81
  type: software
82
- version: v2.7.1
82
+ version: v2.8.0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: module_qc_tools
3
- Version: 2.7.1
3
+ Version: 2.8.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.7/
8
+ Project-URL: Documentation, https://atlas-itk-pixel-mqt.docs.cern.ch/2.8/
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.4.0
37
- Requires-Dist: module-qc-database-tools>=2.9.0
36
+ Requires-Dist: module-qc-data-tools>=1.5.0
37
+ Requires-Dist: module-qc-database-tools>=2.10.0
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.7.1
48
+ # module-qc-tools v2.8.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.7.1
1
+ # module-qc-tools v2.8.0
2
2
 
3
3
  A general python tool for running ITkPixV1.1 and ITkPixV2 module QC tests
4
4
 
@@ -74,19 +74,20 @@ low voltage power supply
74
74
 
75
75
  **Configuration settings**
76
76
 
77
- | Name | Description |
78
- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
79
- | `run_dir` | path (relative or absolute) to the directory where `power_supply` commands should be run |
80
- | `on_cmd` | command to turn on the power supply with specified voltage and current. Use the syntax `{v}` and `{i}` to represent the voltage and current that are to be given as input arguments |
81
- | `off_cmd` | command to turn off the power supply |
82
- | `set_cmd` | command to set voltage and current for power supply. Use the syntax `{v}` and `{i}` to represent the voltage and current that are to be given as input arguments |
83
- | `getI_cmd` | command to inquire the set current of the power supply. This command shall return a std output which represents the value of the current (float in the unit of [A]). For example, when I = 5.2A, `getI_cmd` returns std output = `5.2`. |
84
- | `getV_cmd` | command to inquire the set voltage of the power supply. This command shall return a std output which represents the value of the voltage (float in the unit of [V]). For example, when V = 1.8V, `getV_cmd` returns std output = `1.8`. |
85
- | `measI_cmd` | command to measure the output current of the power supply. This command shall return a std output which represents the value of the current (float in the unit of [A]). For example, when I = 5.2A, `measI_cmd` returns std output = `5.2`. |
86
- | `measV_cmd` | command to measure the output voltage of the power supply. This command shall return a std output which represents the value of the voltage (float in the unit of [V]). For example, when V = 1.8V, `measV_cmd` returns std output = `1.8`. |
87
- | `n_try` | number of re-tries in case the script fails to read from the power supply |
88
- | `checkTarget_timeout` | after each `set_cmd` call, `measI_cmd` is called to check if the target is reached, if not after `checkTarget_timeout` (in sec.), an exception is raised |
89
- | `success_code` | exit status that indicates success. The default is 0. |
77
+ | Name | Description |
78
+ | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
79
+ | `run_dir` | path (relative or absolute) to the directory where `power_supply` commands should be run |
80
+ | `on_cmd` | command to turn on the power supply with specified voltage and current. Use the syntax `{v}` and `{i}` to represent the voltage and current that are to be given as input arguments |
81
+ | `off_cmd` | command to turn off the power supply |
82
+ | `set_cmd` | command to set voltage and current for power supply. Use the syntax `{v}` and `{i}` to represent the voltage and current that are to be given as input arguments |
83
+ | `getI_cmd` | command to inquire the set current of the power supply. This command shall return a std output which represents the value of the current (float in the unit of [A]). For example, when I = 5.2A, `getI_cmd` returns std output = `5.2`. |
84
+ | `getV_cmd` | command to inquire the set voltage of the power supply. This command shall return a std output which represents the value of the voltage (float in the unit of [V]). For example, when V = 1.8V, `getV_cmd` returns std output = `1.8`. |
85
+ | `getState_cmd` | command to inquire the state of the output channel. This command shall return a std output which represents the state of the channel. When the output is turned on, `getState_cmd` shall return `ON`. When the output is off, `getState_cmd` shall return `OFF`. |
86
+ | `measI_cmd` | command to measure the output current of the power supply. This command shall return a std output which represents the value of the current (float in the unit of [A]). For example, when I = 5.2A, `measI_cmd` returns std output = `5.2`. |
87
+ | `measV_cmd` | command to measure the output voltage of the power supply. This command shall return a std output which represents the value of the voltage (float in the unit of [V]). For example, when V = 1.8V, `measV_cmd` returns std output = `1.8`. |
88
+ | `n_try` | number of re-tries in case the script fails to read from the power supply |
89
+ | `checkTarget_timeout` | after each `set_cmd` call, `measI_cmd` is called to check if the target is reached, if not after `checkTarget_timeout` (in sec.), an exception is raised |
90
+ | `success_code` | exit status that indicates success. The default is 0. |
90
91
 
91
92
  ### high_voltage
92
93
 
@@ -179,6 +180,36 @@ the following:
179
180
  sys.exit(1)
180
181
  ```
181
182
 
183
+ ### LLS interlock
184
+
185
+ The `lls_interlock` block specifies the path and the commands for reading
186
+ information from the interlock system in a LLS setup. Always one module in a
187
+ serial powering chain is connected directly to the interlock system to read the
188
+ module NTC.
189
+
190
+ **Configuration settings**
191
+
192
+ | Name | Description |
193
+ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
194
+ | `run_dir` | path (relative or absolute) to the directory where `lls_interlock` commands should be run |
195
+ | `get_interlock_temperature_cmd` | command to read a temperature that is used as an input into the interlock system. This can be e.g. a module NTC from the interlock module of a serial powering chain. The command returns a std output which represents the value of measured temperature (float in the unit of [C]). For example: when T = 36.2C, `get_interlock_temperature_cmd` returns std output = `36.2`. |
196
+ | `n_try` | number of re-tries in case the script fails to read from the interlock system |
197
+ | `success_code` | exit status that indicates success. The default is 0. |
198
+
199
+ ### MOPS
200
+
201
+ The `mops_monitoring` block specifies the path and the commands for reading
202
+ monitoring information from a MOPS chip
203
+
204
+ **Configuration settings**
205
+
206
+ | Name | Description |
207
+ | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
208
+ | `run_dir` | path (relative or absolute) to the directory where `mops_monitoring` commands should be run |
209
+ | `get_converted_adc_measurement_cmd` | command to measure temperature or voltage from the MOPS. Since several MOPS chips can be available in the setup, `{mops-id}` can be passed to the command, identifying the MOPS chip. The `{ch-id}` parameter is used to specify the ADC channel that is read. The command returns a std output which represents the ADC value for the specified channel converted into the measured temperature (float in the unit of [C]) or voltage (float in the unit of [V]). For example: when T = 36.2C, `get_converted_adc_measurement_cmd` returns std output = `36.2`. Note: When using an emulator, one can provide a `-C` flag for the temperature measurement or a `-V` flag for the voltage measurement (passed as the `{unit}` parameter). |
210
+ | `n_try` | number of re-tries in case the script fails to read from the MOPS |
211
+ | `success_code` | exit status that indicates success. The default is 0. |
212
+
182
213
  ## Measurement Configuration
183
214
 
184
215
  ### tasks
@@ -16,6 +16,36 @@ and this project adheres to
16
16
 
17
17
  **_Fixed:_**
18
18
 
19
+ ## [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
+
21
+ **_Added:_**
22
+
23
+ - add checks into `IV_MEASURE` (!282)
24
+ - warning if measured points less than expected
25
+ - progress lock to protect from mixing progress output and measured values
26
+ - read current when HV not reached to trigger Keithley autorange - closes #177
27
+ - Power supply emulator update (!283)
28
+ - Add MOPS hardware class (!280)
29
+ - Add LLS interlock hardware class (!281)
30
+ - Allow sending channel identifier to power supply for fine-grained channel
31
+ selection (!275)
32
+ - OB Cell Thermal performance measurement (!227)
33
+
34
+ !!! important
35
+
36
+ Requires module-qc-data-tools >= v1.5.0rc0,
37
+
38
+ **_Fixed:_**
39
+
40
+ - Upgrade versions of pre-commit hooks (!279)
41
+ - fix CI (PC903 and PP304) (!273)
42
+
43
+ ## [2.7.1](https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/tags/v2.7.1) - 2025-10-30 ## {: #mqt-v2.7.1 }
44
+
45
+ **_Changed:_**
46
+
47
+ - reverted file lock related changes in !265 and !270 (!271)
48
+
19
49
  ## [2.7.0](https://gitlab.cern.ch/atlas-itk/pixel/module/module-qc-tools/-/tags/v2.7.0) - 2025-10-29 ## {: #mqt-v2.7.0 }
20
50
 
21
51
  **_Changed:_**
@@ -36,6 +66,8 @@ and this project adheres to
36
66
  `mqt measurement sldo -c <hw config> -o <output dir> --npoints <int>`
37
67
  - a pipeline test `test_measurement_one_point_SLDO` was also added in
38
68
  `test_emulator.py` to check the implementation
69
+ - add fcntl capability to lock before calling yarr commands simultaneously
70
+ (!265)
39
71
 
40
72
  **_Fixed:_**
41
73
 
@@ -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.7.1
97
+ $ python -m pip install -U pip module-qc-tools==2.8.0
98
98
  ```
99
99
 
100
100
  ### via uv
@@ -103,7 +103,7 @@ $ python -m pip install -U pip module-qc-tools==2.7.1
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.7.1
106
+ $ uv pip install module-qc-tools==2.8.0
107
107
  ```
108
108
 
109
109
  # Usage
@@ -487,3 +487,36 @@ file (i.e. '$(module-qc-tools --prefix)/configs/meas_config.json').
487
487
  ```
488
488
  measurement-LONG-TERM-STABILITY-DCS -c $(module-qc-tools --prefix)/configs/hw_config_emulator_merged_vmux.json -o emulator/outputs/
489
489
  ```
490
+
491
+ ## Thermal Performance
492
+
493
+ - [`mqt measurement thermal-performance`](reference/cli.md#mqt-measurement-thermal-performance)
494
+ - [`module-qc-tools measurement thermal-performance`](reference/cli.md#mqt-measurement-thermal-performance)
495
+ - [`measurement-THERMAL-PERFORMANCE`](reference/cli.md#mqt-measurement-thermal-performance)
496
+
497
+ This adds the ability to run the thermal performance measurement
498
+ (`task = THERMAL_PERFORMANCE`) as specified in the input configuration json file
499
+ (i.e. '$(module-qc-tools --prefix)/configs/meas_config.json').
500
+
501
+ **Configuration settings**
502
+
503
+ | Name | Description |
504
+ | ----------- | -------------------------------------------------------- |
505
+ | `v_mux_ntc` | list of Vmux channels to be measured for ntc temperature |
506
+ | `i_mux_ntc` | list of Imux channels to be measured for ntc temperature |
507
+ | `v_mux_gnd` | list of Vmux channels to be measured for GND temperature |
508
+ | `i_mux_gnd` | list of Imux channels to be measured for GND temperature |
509
+ | `v_mux` | list of Vmux channels to be measured |
510
+ | `i_mux` | list of Imux channels to be measured |
511
+
512
+ ??? example
513
+
514
+ ```
515
+ measurement-THERMAL-PERFORMANCE -c $(module-qc-tools --prefix)/configs/hw_config_example_merged_vmux_itkpixv2.json -m 20UPGM23xxxxxx_L2_warm.json
516
+ ```
517
+
518
+ ??? example "emulator"
519
+
520
+ ```
521
+ measurement-THERMAL-PERFORMANCE -c $(module-qc-tools --prefix)/configs/hw_config_emulator_merged_vmux.json -o emulator/outputs/
522
+ ```
@@ -20,8 +20,8 @@ dependencies = [
20
20
  "tabulate",
21
21
  "pre-commit",
22
22
  "check-jsonschema",
23
- "module-qc-data-tools >= 1.4.0",
24
- "module-qc-database-tools >= 2.9.0",
23
+ "module-qc-data-tools >= 1.5.0",
24
+ "module-qc-database-tools >= 2.10.0",
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.7/"
41
+ "Documentation" = "https://atlas-itk-pixel-mqt.docs.cern.ch/2.8/"
42
42
 
43
43
  [project.scripts]
44
44
  module-qc-tools = "module_qc_tools.cli:app"
@@ -55,6 +55,11 @@ measurement-IV-MEASURE = "module_qc_tools.cli.IV_MEASURE:app"
55
55
  module-qc-tools-upload = "module_qc_tools.cli.upload_localdb:app"
56
56
  measurement-UNDERSHUNT-PROTECTION = "module_qc_tools.cli.UNDERSHUNT_PROTECTION:app"
57
57
  measurement-LONG-TERM-STABILITY-DCS = "module_qc_tools.cli.LONG_TERM_STABILITY_DCS:app"
58
+ measurement-THERMAL-PERFORMANCE = "module_qc_tools.cli.THERMAL_PERFORMANCE:app"
59
+
60
+ [dependency-groups]
61
+ dev = [ { include-group = "test" } ]
62
+ test = [ "pytest" ]
58
63
 
59
64
  [tool.hatch.version]
60
65
  source = "vcs"
@@ -207,6 +212,7 @@ messages_control.disable = [
207
212
  "design",
208
213
  "fixme",
209
214
  "line-too-long",
215
+ "too-many-lines",
210
216
  "wrong-import-position",
211
217
  # below are additional warnings to fix later
212
218
  "duplicate-code",
@@ -221,6 +227,7 @@ messages_control.disable = [
221
227
  ]
222
228
 
223
229
  [tool.pytest.ini_options]
230
+ log_level = "INFO"
224
231
  minversion = "6.0"
225
232
  addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"]
226
233
  xfail_strict = true
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '2.7.1'
32
- __version_tuple__ = version_tuple = (2, 7, 1)
31
+ __version__ = version = '2.8.0'
32
+ __version_tuple__ = version_tuple = (2, 8, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -0,0 +1,226 @@
1
+ import logging
2
+ from datetime import datetime
3
+ from pathlib import Path
4
+ from tempfile import TemporaryDirectory
5
+
6
+ import typer
7
+ from module_qc_data_tools.qcDataFrame import (
8
+ outputDataFrame,
9
+ )
10
+ from module_qc_data_tools.utils import (
11
+ get_chip_type_from_serial_number,
12
+ get_layer_from_sn,
13
+ get_sn_from_connectivity,
14
+ load_hw_config,
15
+ save_dict_list,
16
+ )
17
+ from module_qc_database_tools.utils import (
18
+ get_BOMCode_from_file,
19
+ get_cutFile_suffix,
20
+ )
21
+
22
+ from module_qc_tools.cli.globals import (
23
+ CONTEXT_SETTINGS,
24
+ LogLevel,
25
+ OPTION_config_hw,
26
+ OPTION_config_meas,
27
+ OPTION_module_connectivity,
28
+ OPTION_nchips,
29
+ OPTION_output_dir,
30
+ OPTION_save_local,
31
+ OPTION_site,
32
+ OPTION_use_calib_ADC,
33
+ OPTION_use_pixel_config,
34
+ OPTION_verbosity,
35
+ check_module_connectivity,
36
+ )
37
+ from module_qc_tools.measurements.thermal_performance import (
38
+ run_emeas,
39
+ run_tpmeas,
40
+ )
41
+ from module_qc_tools.utils import datapath as mqt_data
42
+ from module_qc_tools.utils.misc import (
43
+ add_identifiers_metadata,
44
+ copytree,
45
+ load_meas_config,
46
+ )
47
+ from module_qc_tools.utils.power_supply import power_supply
48
+ from module_qc_tools.utils.yarr import yarr
49
+
50
+ logger = logging.getLogger("measurement")
51
+
52
+ app = typer.Typer(context_settings=CONTEXT_SETTINGS)
53
+
54
+ # Taking the test-type from the script name which is the test-code in ProdDB.
55
+ TEST_TYPE = Path(__file__).stem
56
+
57
+
58
+ @app.command()
59
+ def main(
60
+ hw_config_path: OPTION_config_hw = ...,
61
+ meas_config_path: OPTION_config_meas = mqt_data / "configs" / "meas_config.json",
62
+ base_output_dir: OPTION_output_dir = Path("outputs"),
63
+ module_connectivity: OPTION_module_connectivity = None,
64
+ _verbosity: OPTION_verbosity = LogLevel.info,
65
+ use_pixel_config: OPTION_use_pixel_config = False,
66
+ institution: OPTION_site = "",
67
+ use_calib_adc: OPTION_use_calib_ADC = True,
68
+ save_local: OPTION_save_local = True,
69
+ nchips: OPTION_nchips = None,
70
+ ):
71
+ """
72
+ Records temperatures from NTC thermistors on the module PCB and from the cooling system.
73
+ """
74
+
75
+ check_module_connectivity(
76
+ hw_config_path=hw_config_path, module_connectivity=module_connectivity
77
+ )
78
+
79
+ timestart = datetime.now().strftime("%Y-%m-%d_%H%M%S")
80
+
81
+ # if -o option used, overwrite the default output directory
82
+ output_dir = module_connectivity.parent if module_connectivity else base_output_dir
83
+
84
+ if base_output_dir != Path("outputs"):
85
+ output_dir = base_output_dir
86
+
87
+ output_dir = output_dir.joinpath("Measurements", TEST_TYPE, timestart)
88
+ # Make output directory and start log file
89
+ output_dir.mkdir(parents=True, exist_ok=True)
90
+
91
+ logger.info(f"Start {TEST_TYPE.replace('_', ' ')}!")
92
+ logger.info(f"TimeStart: {timestart}")
93
+
94
+ logger.addHandler(logging.FileHandler(output_dir.joinpath("output.log")))
95
+
96
+ config_hw = load_hw_config(hw_config_path)
97
+
98
+ if module_connectivity:
99
+ config_hw["yarr"]["connectivity"] = module_connectivity
100
+
101
+ # Taking the module SN from YARR path to config in the connectivity file.
102
+ module_serial = get_sn_from_connectivity(config_hw["yarr"]["connectivity"])
103
+ layer = get_layer_from_sn(module_serial)
104
+ chip_type = get_chip_type_from_serial_number(module_serial)
105
+
106
+ # try to retrieve the BOM information from the config files
107
+ BOM_file = (
108
+ Path(config_hw["yarr"]["connectivity"]).parent / f"{module_serial}_info.json"
109
+ )
110
+ bom = get_BOMCode_from_file(BOM_file, layer)
111
+ bom_suffix = get_cutFile_suffix(bom)
112
+
113
+ # Load the measurement config and combine it with the hardware config
114
+ config = load_meas_config(
115
+ meas_config_path,
116
+ test_type=TEST_TYPE,
117
+ chip_type=chip_type,
118
+ bom_type=bom_suffix,
119
+ layer=layer,
120
+ nchips=nchips,
121
+ )
122
+ config.update(config_hw)
123
+
124
+ # initialize hardware
125
+ ps = power_supply(config["power_supply"])
126
+ yr = yarr(config["yarr"])
127
+
128
+ if not use_pixel_config:
129
+ yr.omit_pixel_config()
130
+
131
+ ps.set(v=config["v_max"], i=config["i_config"])
132
+ yr.configure()
133
+
134
+ # Measure temperature at the end of the measurement to ensure temperature stability
135
+ try:
136
+ data = run_emeas(config, ps)
137
+ except KeyboardInterrupt:
138
+ logger.info("KeyboardInterrupt")
139
+ yr.remove_tmp_connectivity()
140
+ except Exception as err:
141
+ logger.info("Error in measuring environmental conditions.")
142
+ logger.exception(err)
143
+ yr.remove_tmp_connectivity()
144
+ raise typer.Exit(1) from err
145
+
146
+ try:
147
+ data_tempmeas = run_tpmeas(config, ps, yr, use_calib_adc)
148
+ except KeyboardInterrupt:
149
+ logger.info("KeyboardInterrupt")
150
+ yr.remove_tmp_connectivity()
151
+ except Exception as err:
152
+ logger.info("Error in measuring temperature.")
153
+ logger.exception(err)
154
+ yr.remove_tmp_connectivity()
155
+ raise typer.Exit(1) from err
156
+
157
+ add_identifiers_metadata(data, module_serial, institution)
158
+ add_identifiers_metadata(data_tempmeas, module_serial, institution)
159
+
160
+ # save results in json
161
+ logger.info(
162
+ "==================================Summary=================================="
163
+ )
164
+ alloutput = {}
165
+ alloutput_chip = []
166
+ chipnames = []
167
+
168
+ # Save to an output json file
169
+ outputDF_tempmeas = outputDataFrame()
170
+ outputDF_tempmeas.set_serial_num(module_serial)
171
+ outputDF_tempmeas.set_test_type(TEST_TYPE)
172
+ outputDF_tempmeas.set_subtest_type("TP_TEMP")
173
+ outputDF_tempmeas.set_results(data)
174
+ alloutput = outputDF_tempmeas.to_dict()
175
+
176
+ for chip in yr._enabled_chip_positions:
177
+ logger.info(f"Chip-{chip + 1}")
178
+ logger.info(data_tempmeas[chip], extra={"markup": False})
179
+ chip_name = data_tempmeas[chip]._meta_data["Name"]
180
+
181
+ # Save to an output json file
182
+ outputDF_tempmeas_chip = outputDataFrame()
183
+ outputDF_tempmeas_chip.set_test_type(TEST_TYPE)
184
+ outputDF_tempmeas_chip.set_subtest_type("TP_TEMP")
185
+ outputDF_tempmeas_chip.set_results(data_tempmeas[chip])
186
+
187
+ alloutput_chip += [outputDF_tempmeas_chip.to_dict()]
188
+ chipnames += [chip_name]
189
+
190
+ with TemporaryDirectory() as tmpdirname:
191
+ alloutput["results"]["property"]["FE"] = []
192
+ alloutput["results"]["property"]["FE"].extend(alloutput_chip)
193
+ alloutput_list = [alloutput]
194
+ save_dict_list(
195
+ Path(tmpdirname).joinpath(f"{module_serial}.json"),
196
+ alloutput_list,
197
+ )
198
+
199
+ # for now, set to false until localDB upload functionality implemented
200
+ upload_failed = True
201
+ upload_implemented = False
202
+
203
+ if not save_local:
204
+ # add in logic here to upload to localDB
205
+ msg = "Not implemented yet"
206
+ raise RuntimeError(msg)
207
+
208
+ if upload_failed or save_local:
209
+ copytree(tmpdirname, output_dir)
210
+ if upload_failed and upload_implemented:
211
+ logger.warning(
212
+ "The upload to localDB failed. Please fix and retry uploading the measurement output again."
213
+ )
214
+
215
+ logger.info(f"Writing output measurements in {output_dir}")
216
+
217
+ logger.info("Done!")
218
+ logger.info(f"TimeEnd: {datetime.now().strftime('%Y-%m-%d_%H%M%S')}")
219
+
220
+ # Delete temporary files
221
+ if not use_pixel_config:
222
+ yr.remove_tmp_connectivity()
223
+
224
+
225
+ if __name__ == "__main__":
226
+ typer.run(main)
@@ -40,6 +40,7 @@ OPTION_config_meas = Annotated[
40
40
  Optional[Path],
41
41
  typer.Option(
42
42
  "-cm",
43
+ "--cm",
43
44
  "--config-meas",
44
45
  help="Measurement config file path",
45
46
  exists=True,
@@ -242,7 +243,7 @@ OPTION_test_size = Annotated[
242
243
  OPTION_mode = Annotated[
243
244
  str,
244
245
  typer.Option(
245
- "-m",
246
+ "-m", ## short option required to match the YARR executable, see `def dataMergingCheck` in `yarr.py`
246
247
  "--mode",
247
248
  help="Mode of data merging check: '4-to-1' or '2-to-1'",
248
249
  ),
@@ -301,9 +302,9 @@ def sn_callback(value: str):
301
302
  OPTION_serial_number = Annotated[
302
303
  str,
303
304
  typer.Option(
304
- "-sn",
305
+ "--sn",
305
306
  "--serial-number",
306
- help="Module serial number",
307
+ help="Serial number of the component to be measured, must be in the format of '20UGXXYYNNNNNNN'.",
307
308
  callback=sn_callback,
308
309
  ),
309
310
  ]