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.
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.zenodo.json +3 -3
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/CITATION.cff +2 -2
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/PKG-INFO +5 -5
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/README.md +1 -1
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/history.md +17 -1
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/install.md +2 -2
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/measurements.md +61 -25
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/pyproject.toml +3 -3
- module_qc_tools-2.9.0/src/module_qc_tools/_version.py +24 -0
- module_qc_tools-2.9.0/src/module_qc_tools/cli/HVGROUP_IV_MEASURE.py +303 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/globals.py +13 -1
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/main.py +2 -0
- {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
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/meas_config.json +6 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/schema/meas_config.json +23 -0
- module_qc_tools-2.9.0/src/module_qc_tools/measurements/hvgroup_iv_measure.py +340 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/yarr.py +2 -2
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tbump.toml +2 -2
- module_qc_tools-2.9.0/tests/test_emulator/lls_connectivity_OB_preprod_longeron_M6.json +400 -0
- module_qc_tools-2.9.0/tests/test_emulator/module_configs/20UPGM22601146/20UPGM22601146_info.json +9 -0
- module_qc_tools-2.9.0/tests/test_emulator/module_configs/20UPGM22601158/20UPGM22601158_info.json +9 -0
- module_qc_tools-2.9.0/tests/test_emulator/module_configs/20UPGM22601160/20UPGM22601160_info.json +9 -0
- module_qc_tools-2.9.0/tests/test_emulator/module_configs/20UPGM22601171/20UPGM22601171_info.json +9 -0
- module_qc_tools-2.9.0/tests/test_emulator/module_configs/20UPGM22601181/20UPGM22601181_info.json +9 -0
- module_qc_tools-2.9.0/tests/test_emulator/module_configs/20UPGM22601182/20UPGM22601182_info.json +9 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/test_emulator.py +31 -0
- module_qc_tools-2.8.0/src/module_qc_tools/_version.py +0 -34
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.gitattributes +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.gitignore +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.gitlab-ci.yml +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.gitmodules +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.linkcheckerrc +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/.pre-commit-config.yaml +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/LICENSE +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/.gitkeep +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/.overrides/main.html +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/.snippets/abbrs.txt +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/.snippets/links.txt +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/assets/css/custom.css +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/config.md +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/development.md +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/emulator.md +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/index.md +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/meta/authors.md +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/reference/cli.md +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/reference/gen_ref_nav.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic-CsTKlA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic2CsTKlA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic3CsTKlA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xIIzI.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfBBc4.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu4mxK.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu72xKOzY.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0mf0h.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0mf0h.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0mf0h.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0mf0h.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0mf0h.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlYIw.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlYIw.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlYIw.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ul.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlYIw.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-UlYIw.woff2 +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/fonts.css +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/docs/stylesheets/readme.txt +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/mkdocs.yml +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/__init__.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/ADC_CALIBRATION.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/ANALOG_READBACK.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/DATA_TRANSMISSION.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/INJECTION_CAPACITANCE.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/IV_MEASURE.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/LONG_TERM_STABILITY_DCS.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/LP_MODE.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/OVERVOLTAGE_PROTECTION.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/SLDO.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/THERMAL_PERFORMANCE.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/UNDERSHUNT_PROTECTION.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/VCAL_CALIBRATION.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/__init__.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/__main__.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/get_nominal_current.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/hardware_emulator.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/split_old_config.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/upload_localdb.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/cli/yarr.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/console.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/emulator/module_state_template.json +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/__init__.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/adc_calibration.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/analog_readback.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/data_transmission.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/injection_capacitance.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/iv_measure.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/long_term_stability_dcs.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/lp_mode.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/overvoltage_protection.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/sldo.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/thermal_performance.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/undershunt_protection.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/measurements/vcal_calibration.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/typing_compat.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/__init__.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/cellqc_box.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/hardware_control_base.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/hrc.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/lls_interlock.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/misc.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/mops.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/multimeter.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/ntc.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/power_supply.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/utils/subprocess_emulator.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/conftest.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/test_measurements.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/test_package.py +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/test_schema/cutter_pcb_tab.json +0 -0
- {module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/tests/test_schema/cutter_pcb_tab_BAD.json +0 -0
- {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.
|
|
5
|
-
"version": "v2.
|
|
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.
|
|
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.
|
|
80
|
+
title: 'atlas-itk-pixel-modules/mqt: v2.9.0'
|
|
81
81
|
type: software
|
|
82
|
-
version: v2.
|
|
82
|
+
version: v2.9.0
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: module_qc_tools
|
|
3
|
-
Version: 2.
|
|
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
|
+
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.
|
|
37
|
-
Requires-Dist: module-qc-database-tools>=2.
|
|
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.
|
|
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
|
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
23
|
-
running `run-full-qc
|
|
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:
|
|
31
|
-
| **ADC calib** | **00:
|
|
32
|
-
| analysis | 00:00:
|
|
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:
|
|
35
|
-
| analysis | 00:00:
|
|
35
|
+
| **Analog Readback** | **00:30:56** |
|
|
36
|
+
| analysis | 00:00:22 |
|
|
36
37
|
| update chip config | 00:00:04 |
|
|
37
|
-
|
|
|
38
|
-
|
|
|
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:
|
|
41
|
-
| analysis | 00:00:
|
|
42
|
-
| update chip config | 00:00:
|
|
43
|
-
| **Injection Cap.** | **00:
|
|
44
|
-
| analysis | 00:00:
|
|
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
|
-
| **
|
|
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:
|
|
55
|
-
| **Pixel Failure Analysis** | **00:09:
|
|
56
|
+
| **Tuning** | **00:14:26** |
|
|
57
|
+
| **Pixel Failure Analysis** | **00:09:39** |
|
|
56
58
|
| -------------------------- | ------------------- |
|
|
57
|
-
| _total_ | _01:
|
|
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.
|
|
24
|
-
"module-qc-database-tools >= 2.
|
|
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.
|
|
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
|
}
|
{module_qc_tools-2.8.0 → module_qc_tools-2.9.0}/src/module_qc_tools/data/configs/meas_config.json
RENAMED
|
@@ -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"]
|