From 4404e4472d71ff5fcd1656a7d1cd72679acbf504 Mon Sep 17 00:00:00 2001 From: Dave Casper <dcasper@uci.edu> Date: Tue, 10 Sep 2019 01:59:27 +0000 Subject: [PATCH] Construction and display (but not yet simulation) of SCT --- .../DetDescrCnvSvc/src/DetDescrCnvSvc.cxx | 4 +- .../FaserDetDescr/FaserGeoModelAthenaComps.h | 4 +- .../FaserDetectorManager.h | 2 +- .../GeoModel/FaserGeoModel/data/geomDB.sql | 6840 ++++++++++++++++- .../python/FaserGeoModelConfig.py | 3 + .../FaserGeoModel/python/GeoModelInit.py | 12 +- .../FaserGeoModel/python/SCTGMConfig.py | 52 + .../FaserGeoModel/python/ScintGMConfig.py | 21 - .../DecodeFaserVersionKey.h | 2 +- .../src/DecodeFaserVersionKey.cxx | 17 + .../GeoModelInterfaces/IGeoDbTagSvc.h | 2 + .../GeoModelInterfaces/IGeoModelSvc.h | 2 + .../GeoModel/GeoModelSvc/src/GeoDbTagSvc.cxx | 4 + .../GeoModel/GeoModelSvc/src/GeoDbTagSvc.h | 5 + .../GeoModel/GeoModelSvc/src/GeoModelSvc.cxx | 1 + .../GeoModel/GeoModelSvc/src/GeoModelSvc.h | 3 + .../GeoModelSvc/src/RDBMaterialManager.cxx | 33 +- .../GeoModelSvc/src/RDBMaterialManager.h | 2 + .../share/IdDictDetDescrCnv_joboptions.py | 2 +- .../src/IdDictDetDescrCnv.cxx | 103 +- .../ScintGeoModelUtils/src/ExtraMaterial.cxx | 1 - .../ScintIdentifier/src/VetoID.cxx | 10 - .../ExtendedAlignableTransform.h | 2 +- .../ScintDetectorDesign.h | 1 - .../ScintDetectorElement.h | 29 + .../ScintDetectorElementCollection.h | 2 +- .../ScintReadoutGeometry/ScintLocalPosition.h | 2 +- .../ScintReadoutGeometry/ScintNumerology.h | 1 - .../ScintReadoutGeometry/Version.h | 2 +- .../VetoDetectorManager.h | 4 +- .../src/ScintDetectorElement.cxx | 210 +- .../src/ScintDetectorManager.cxx | 2 +- .../src/ScintLocalPosition.cxx | 2 +- .../src/VetoDetectorManager.cxx | 39 +- .../VetoGeoModel/VetoMaterialManager.h | 2 +- .../VetoGeoModel/src/VetoDataBase.cxx | 171 +- .../VetoGeoModel/src/VetoDetectorFactory.cxx | 176 +- .../VetoGeoModel/src/VetoPlate.cxx | 49 - .../VetoGeoModel/src/VetoStation.cxx | 204 +- .../ScintIdCnv/src/VetoIDDetDescrCnv.h | 6 +- .../ScintSimEventTPCnvDict.h | 2 +- Simulation/G4Faser/G4FaserApp/test/runG4.py | 2 + .../FaserSCT_GeoModel/CMakeLists.txt | 47 + .../ATLAS_CHECK_THREAD_SAFETY | 1 + .../FaserSCT_GeoModel/FaserSCT_DetectorTool.h | 58 + .../FaserSCT_GeoModel/SCT_Barrel.h | 50 + .../SCT_BarrelModuleParameters.h | 68 + .../FaserSCT_GeoModel/SCT_BarrelParameters.h | 32 + .../FaserSCT_GeoModel/SCT_BaseBoard.h | 49 + .../FaserSCT_GeoModel/SCT_ComponentFactory.h | 89 + .../FaserSCT_GeoModel/SCT_DataBase.h | 151 + .../FaserSCT_GeoModel/SCT_DetectorFactory.h | 50 + .../FaserSCT_GeoModel/SCT_GeneralParameters.h | 45 + .../SCT_GeoModelAthenaComps.h | 30 + .../FaserSCT_GeoModel/SCT_GeometryManager.h | 65 + .../FaserSCT_GeoModel/SCT_Hybrid.h | 41 + .../FaserSCT_GeoModel/SCT_Identifier.h | 59 + .../FaserSCT_GeoModel/SCT_InnerSide.h | 89 + .../FaserSCT_GeoModel/SCT_Layer.h | 67 + .../FaserSCT_GeoModel/SCT_MaterialManager.h | 48 + .../FaserSCT_GeoModel/SCT_Module.h | 111 + .../FaserSCT_GeoModel/SCT_Options.h | 44 + .../FaserSCT_GeoModel/SCT_OuterSide.h | 78 + .../FaserSCT_GeoModel/SCT_Pigtail.h | 41 + .../FaserSCT_GeoModel/SCT_Sensor.h | 48 + .../FaserSCT_GeoModel/SCT_Ski.h | 66 + .../TrackerDetDescr/FaserSCT_GeoModel/README | 16 + .../FaserSCT_GeoModel/doc/packagedoc.h | 50 + .../python/FaserSCT_GeoModelConfig.py | 46 + .../python/FaserSCT_GeoModelConfigDb.py | 6 + .../src/FaserSCT_DetectorTool.cxx | 236 + .../FaserSCT_GeoModel/src/SCT_Barrel.cxx | 118 + .../src/SCT_BarrelModuleParameters.cxx | 238 + .../src/SCT_BarrelParameters.cxx | 50 + .../FaserSCT_GeoModel/src/SCT_BaseBoard.cxx | 56 + .../src/SCT_ComponentFactory.cxx | 40 + .../FaserSCT_GeoModel/src/SCT_DataBase.cxx | 112 + .../src/SCT_DetectorFactory.cxx | 188 + .../src/SCT_GeneralParameters.cxx | 88 + .../src/SCT_GeoModelAthenaComps.cxx | 23 + .../src/SCT_GeometryManager.cxx | 112 + .../FaserSCT_GeoModel/src/SCT_Hybrid.cxx | 50 + .../FaserSCT_GeoModel/src/SCT_Identifier.cxx | 26 + .../FaserSCT_GeoModel/src/SCT_InnerSide.cxx | 199 + .../FaserSCT_GeoModel/src/SCT_Layer.cxx | 146 + .../src/SCT_MaterialManager.cxx | 83 + .../FaserSCT_GeoModel/src/SCT_Module.cxx | 375 + .../FaserSCT_GeoModel/src/SCT_Options.cxx | 88 + .../FaserSCT_GeoModel/src/SCT_OuterSide.cxx | 211 + .../FaserSCT_GeoModel/src/SCT_Pigtail.cxx | 51 + .../FaserSCT_GeoModel/src/SCT_Sensor.cxx | 166 + .../FaserSCT_GeoModel/src/SCT_Ski.cxx | 143 + .../src/components/SCT_GeoModel_entries.cxx | 4 + .../test/FaserSCT_GMConfig_test.py | 23 + .../TrackerGeoModelUtils/CMakeLists.txt | 34 + .../TrackerGeoModelUtils/README | 9 + .../DistortedMaterialManager.h | 28 + .../TrackerGeoModelUtils/ExtraMaterial.h | 37 + .../TrackerGeoModelUtils/GenericTubeMaker.h | 55 + .../ITrackerServMatBuilderTool.h | 35 + .../TrackerGeoModelUtils/PairIndexMap.h | 29 + .../TrackerGeoModelUtils/ServiceVolume.h | 145 + .../TrackerGeoModelUtils/ServiceVolumeMaker.h | 154 + .../TrackerGeoModelUtils/TopLevelPlacements.h | 47 + .../TrackerDDAthenaComps.h | 75 + .../TrackerDetectorFactoryBase.h | 51 + .../TrackerMaterialManager.h | 244 + .../TrackerSubDetectorFactoryBase.h | 65 + .../TrackerGeoModelUtils/TubeVolData.h | 59 + .../TrackerGeoModelUtils/VolumeBuilder.h | 73 + .../TrackerGeoModelUtils/VolumeSplitter.h | 38 + .../VolumeSplitterUtils.h | 200 + .../src/DistortedMaterialManager.cxx | 46 + .../src/ExtraMaterial.cxx | 74 + .../src/GenericTubeMaker.cxx | 164 + .../TrackerGeoModelUtils/src/PairIndexMap.cxx | 20 + .../src/ServiceVolume.cxx | 383 + .../src/ServiceVolumeMaker.cxx | 375 + .../src/TopLevelPlacements.cxx | 123 + .../src/TrackerDDAthenaComps.cxx | 35 + .../src/TrackerMaterialManager.cxx | 1042 +++ .../TrackerGeoModelUtils/src/TubeVolData.cxx | 101 + .../src/VolumeBuilder.cxx | 393 + .../src/VolumeSplitter.cxx | 191 + .../src/VolumeSplitterUtils.cxx | 432 ++ .../TrackerIdDictFiles/data/IdDictTracker.xml | 41 +- .../TrackerIdentifier/CMakeLists.txt | 39 + .../TrackerIdentifier/FaserSCT_ID.h | 808 ++ .../TrackerIdentifier/TrackerIdentifierDict.h | 19 + .../TrackerIdentifier/selection.xml | 3 + .../TrackerIdentifier/src/FaserSCT_ID.cxx | 1203 +++ .../test/test_tracker_id.cxx | 935 +++ .../TrackerReadoutGeometry/CMakeLists.txt | 44 + .../ATLAS_CHECK_THREAD_SAFETY | 1 + .../ExtendedAlignableTransform.h | 57 + .../SCT_BarrelModuleSideDesign.h | 224 + .../SCT_DetectorManager.h | 166 + .../SCT_ModuleSideDesign.h | 259 + .../SCT_ReadoutScheme.h | 150 + .../TrackerReadoutGeometry/SiCellId.h | 160 + .../TrackerReadoutGeometry/SiCommonItems.h | 95 + .../TrackerReadoutGeometry/SiDetectorDesign.h | 305 + .../SiDetectorElement.h | 689 ++ .../SiDetectorElement.icc | 374 + .../SiDetectorElementCollection.h | 43 + .../SiDetectorManager.h | 152 + .../SiDiodesParameters.h | 148 + .../TrackerReadoutGeometry/SiIntersect.h | 94 + .../TrackerReadoutGeometry/SiLocalPosition.h | 204 + .../TrackerReadoutGeometry/SiNumerology.h | 104 + .../TrackerReadoutGeometry/SiNumerology.icc | 70 + .../TrackerReadoutGeometry/SiReadoutCellId.h | 77 + .../TrackerReadoutGeometry/TrackerDD_Defs.h | 22 + .../TrackerDetectorManager.h | 204 + .../TrackerReadoutGeometry/Version.h | 91 + .../src/SCT_BarrelModuleSideDesign.cxx | 279 + .../src/SCT_DetectorManager.cxx | 408 + .../src/SCT_ModuleSideDesign.cxx | 104 + .../src/SCT_ReadoutScheme.cxx | 67 + .../TrackerReadoutGeometry/src/SiCellId.cxx | 17 + .../src/SiCommonItems.cxx | 31 + .../src/SiDetectorDesign.cxx | 125 + .../src/SiDetectorElement.cxx | 1015 +++ .../src/SiDetectorElementCollection.cxx | 19 + .../src/SiDetectorManager.cxx | 149 + .../src/SiDiodesParameters.cxx | 47 + .../src/SiLocalPosition.cxx | 100 + .../src/SiNumerology.cxx | 47 + .../src/TrackerDetectorManager.cxx | 423 + .../TrackerReadoutGeometry/src/Version.cxx | 121 + .../TrackerIdCnv/CMakeLists.txt | 23 + .../share/TrackerIdCnv_jobOptions.py | 6 + .../src/FaserSCT_IDDetDescrCnv.cxx | 244 + .../TrackerIdCnv/src/FaserSCT_IDDetDescrCnv.h | 74 + .../TrackerIdCnv/src/TrackerIdCnv_entries.cxx | 6 + graphics/VTI12/VTI12Gui/src/vp1mainwindow.ui | 2 +- .../src/VolumeTreeModel.cxx | 37 +- .../VTI12TrackSystems/CMakeLists.txt | 9 +- .../src/TrackCollHandle_TruthTracks.cxx | 10 +- .../VTI12TrackSystems/src/TrkObjToString.cxx | 12 +- graphics/VTI12/VTI12Utils/CMakeLists.txt | 7 +- .../VTI12/VTI12Utils/VTI12Utils/HitToSoNode.h | 2 +- .../VTI12/VTI12Utils/VTI12Utils/VP1DetInfo.h | 16 +- .../VTI12/VTI12Utils/src/HitToSodeNode.cxx | 40 +- graphics/VTI12/VTI12Utils/src/VP1DetInfo.cxx | 37 +- 185 files changed, 26305 insertions(+), 1114 deletions(-) create mode 100644 DetectorDescription/GeoModel/FaserGeoModel/python/SCTGMConfig.py create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/CMakeLists.txt create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/ATLAS_CHECK_THREAD_SAFETY create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/FaserSCT_DetectorTool.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Barrel.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_BarrelModuleParameters.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_BarrelParameters.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_BaseBoard.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_ComponentFactory.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_DataBase.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_DetectorFactory.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_GeneralParameters.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_GeoModelAthenaComps.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_GeometryManager.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Hybrid.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Identifier.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_InnerSide.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Layer.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_MaterialManager.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Module.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Options.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_OuterSide.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Pigtail.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Sensor.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Ski.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/README create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/doc/packagedoc.h create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/python/FaserSCT_GeoModelConfig.py create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/python/FaserSCT_GeoModelConfigDb.py create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/FaserSCT_DetectorTool.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Barrel.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_BarrelModuleParameters.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_BarrelParameters.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_BaseBoard.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_ComponentFactory.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_DataBase.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_DetectorFactory.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_GeneralParameters.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_GeoModelAthenaComps.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_GeometryManager.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Hybrid.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Identifier.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_InnerSide.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Layer.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_MaterialManager.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Module.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Options.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_OuterSide.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Pigtail.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Sensor.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Ski.cxx create mode 100644 Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/components/SCT_GeoModel_entries.cxx create mode 100755 Tracker/TrackerDetDescr/FaserSCT_GeoModel/test/FaserSCT_GMConfig_test.py create mode 100644 Tracker/TrackerDetDescr/TrackerGeoModelUtils/CMakeLists.txt create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/README create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/DistortedMaterialManager.h create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ExtraMaterial.h create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/GenericTubeMaker.h create mode 100644 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ITrackerServMatBuilderTool.h create mode 100644 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/PairIndexMap.h create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ServiceVolume.h create mode 100644 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ServiceVolumeMaker.h create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TopLevelPlacements.h create mode 100644 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerDDAthenaComps.h create mode 100644 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerDetectorFactoryBase.h create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerMaterialManager.h create mode 100644 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerSubDetectorFactoryBase.h create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TubeVolData.h create mode 100644 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/VolumeBuilder.h create mode 100644 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/VolumeSplitter.h create mode 100644 Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/VolumeSplitterUtils.h create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/DistortedMaterialManager.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/ExtraMaterial.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/GenericTubeMaker.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/PairIndexMap.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/ServiceVolume.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/ServiceVolumeMaker.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TopLevelPlacements.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TrackerDDAthenaComps.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TrackerMaterialManager.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TubeVolData.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/VolumeBuilder.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/VolumeSplitter.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/VolumeSplitterUtils.cxx create mode 100644 Tracker/TrackerDetDescr/TrackerIdentifier/CMakeLists.txt create mode 100644 Tracker/TrackerDetDescr/TrackerIdentifier/TrackerIdentifier/FaserSCT_ID.h create mode 100644 Tracker/TrackerDetDescr/TrackerIdentifier/TrackerIdentifier/TrackerIdentifierDict.h create mode 100644 Tracker/TrackerDetDescr/TrackerIdentifier/TrackerIdentifier/selection.xml create mode 100644 Tracker/TrackerDetDescr/TrackerIdentifier/src/FaserSCT_ID.cxx create mode 100644 Tracker/TrackerDetDescr/TrackerIdentifier/test/test_tracker_id.cxx create mode 100644 Tracker/TrackerDetDescr/TrackerReadoutGeometry/CMakeLists.txt create mode 100644 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/ATLAS_CHECK_THREAD_SAFETY create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/ExtendedAlignableTransform.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_BarrelModuleSideDesign.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_DetectorManager.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_ModuleSideDesign.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_ReadoutScheme.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiCellId.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiCommonItems.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorDesign.h create mode 100644 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.h create mode 100644 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.icc create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElementCollection.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorManager.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDiodesParameters.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiIntersect.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiLocalPosition.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.h create mode 100644 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.icc create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiReadoutCellId.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/TrackerDD_Defs.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/TrackerDetectorManager.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/Version.h create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_BarrelModuleSideDesign.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_DetectorManager.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_ModuleSideDesign.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_ReadoutScheme.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiCellId.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiCommonItems.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorDesign.cxx create mode 100644 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorElement.cxx create mode 100644 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorElementCollection.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorManager.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDiodesParameters.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiLocalPosition.cxx create mode 100644 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiNumerology.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/TrackerDetectorManager.cxx create mode 100755 Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/Version.cxx create mode 100644 Tracker/TrackerDetDescrCnv/TrackerIdCnv/CMakeLists.txt create mode 100644 Tracker/TrackerDetDescrCnv/TrackerIdCnv/share/TrackerIdCnv_jobOptions.py create mode 100644 Tracker/TrackerDetDescrCnv/TrackerIdCnv/src/FaserSCT_IDDetDescrCnv.cxx create mode 100644 Tracker/TrackerDetDescrCnv/TrackerIdCnv/src/FaserSCT_IDDetDescrCnv.h create mode 100644 Tracker/TrackerDetDescrCnv/TrackerIdCnv/src/TrackerIdCnv_entries.cxx diff --git a/DetectorDescription/DetDescrCnvSvc/src/DetDescrCnvSvc.cxx b/DetectorDescription/DetDescrCnvSvc/src/DetDescrCnvSvc.cxx index d4482743f..ad1870e3b 100644 --- a/DetectorDescription/DetDescrCnvSvc/src/DetDescrCnvSvc.cxx +++ b/DetectorDescription/DetDescrCnvSvc/src/DetDescrCnvSvc.cxx @@ -118,8 +118,8 @@ DetDescrCnvSvc::initialize() { if (status != StatusCode::SUCCESS) return status; status = addToDetStore(131395045, "VetoID"); if (status != StatusCode::SUCCESS) return status; - // status = addToDetStore(2517, "SCT_ID"); - // if (status != StatusCode::SUCCESS) return status; + status = addToDetStore(205618430, "FaserSCT_ID"); + if (status != StatusCode::SUCCESS) return status; return status; } diff --git a/DetectorDescription/FaserDetDescr/FaserDetDescr/FaserGeoModelAthenaComps.h b/DetectorDescription/FaserDetDescr/FaserDetDescr/FaserGeoModelAthenaComps.h index 5576efe4e..0fe7834af 100644 --- a/DetectorDescription/FaserDetDescr/FaserDetDescr/FaserGeoModelAthenaComps.h +++ b/DetectorDescription/FaserDetDescr/FaserDetDescr/FaserGeoModelAthenaComps.h @@ -5,14 +5,14 @@ #ifndef GeoModelFaserUtilities_FaserGeoModelAthenaComps_H #define GeoModelFaserUtilities_FaserGeoModelAthenaComps_H -#include "InDetGeoModelUtils/InDetDDAthenaComps.h" +#include "TrackerGeoModelUtils/TrackerDDAthenaComps.h" // class VetoID; /// Class to hold various Athena components template <class ID_HELPER> -class FaserGeoModelAthenaComps : public InDetDD::AthenaComps { +class FaserGeoModelAthenaComps : public TrackerDD::AthenaComps { public: diff --git a/DetectorDescription/FaserReadoutGeometry/FaserReadoutGeometry/FaserDetectorManager.h b/DetectorDescription/FaserReadoutGeometry/FaserReadoutGeometry/FaserDetectorManager.h index 1371cc404..2d6ecf125 100644 --- a/DetectorDescription/FaserReadoutGeometry/FaserReadoutGeometry/FaserDetectorManager.h +++ b/DetectorDescription/FaserReadoutGeometry/FaserReadoutGeometry/FaserDetectorManager.h @@ -145,7 +145,7 @@ namespace FaserDD { const LevelInfo & getLevel(const std::string & key) const; /** return align folder string to use **/ - // InDetDD::AlignFolderType getAlignInfo(); + // TrackerDD::AlignFolderType getAlignInfo(); /** Process the alignment container, calls processKey */ bool processAlignmentContainer(const std::string & key) const; diff --git a/DetectorDescription/GeoModel/FaserGeoModel/data/geomDB.sql b/DetectorDescription/GeoModel/FaserGeoModel/data/geomDB.sql index 163b05690..7aeeeedc9 100644 --- a/DetectorDescription/GeoModel/FaserGeoModel/data/geomDB.sql +++ b/DetectorDescription/GeoModel/FaserGeoModel/data/geomDB.sql @@ -310,8 +310,16 @@ INSERT INTO "HVS_NODE" VALUES (11, "Veto", 1, 1, NULL); INSERT INTO "HVS_NODE" VALUES (12, "Trigger", 1, 1, NULL); INSERT INTO "HVS_NODE" VALUES (13, "Preshower", 1, 1, NULL); INSERT INTO "HVS_NODE" VALUES (2, "Tracker", 0, 1, NULL); -INSERT INTO "HVS_NODE" VALUES (3, "Calorimeter", 0, 1, NULL); -INSERT INTO "HVS_NODE" VALUES (4, "Magnet", 0, 1, NULL); +INSERT INTO "HVS_NODE" VALUES (21, "SCT", 2, 1, NULL); +INSERT INTO "HVS_NODE" VALUES (210, "SctTopLevel", 21, 0, NULL); +INSERT INTO "HVS_NODE" VALUES (211, "SctBrlModule", 21, 0, NULL); +INSERT INTO "HVS_NODE" VALUES (212, "SctBrlSensor", 21, 0, NULL); +INSERT INTO "HVS_NODE" VALUES (213, "SctFaserGeneral", 21, 0, NULL); +INSERT INTO "HVS_NODE" VALUES (214, "SctSwitches", 21, 0, NULL); +INSERT INTO "HVS_NODE" VALUES (215, "SCTMaterials", 21, 0, NULL); +INSERT INTO "HVS_NODE" VALUES (216, "SCTMatComponents", 21, 0, NULL); +INSERT INTO "HVS_NODE" VALUES (3, "Calorimeter", 0, 1, NULL); +INSERT INTO "HVS_NODE" VALUES (4, "Magnet", 0, 1, NULL); INSERT INTO "HVS_NODE" VALUES (100, "Materials", 0, 1, NULL); INSERT INTO "HVS_NODE" VALUES (101, "StdMaterials", 100, 0, NULL); INSERT INTO "HVS_NODE" VALUES (102, "StdMatComponents", 100, 0, NULL); @@ -336,6 +344,14 @@ INSERT INTO "HVS_NODE" VALUES (3005, "CaloIdentifier", 3, 0, NULL); INSERT INTO "HVS_TAG2NODE" VALUES (0, "FASER-00", 100000, NULL, 0, 0, 1549238400000000000, NULL, 22); INSERT INTO "HVS_TAG2NODE" VALUES (1, "Scintillator-00", 100001, NULL, 0, 0, 1549238400000000000, NULL, 22); INSERT INTO "HVS_TAG2NODE" VALUES (2, "Tracker-00", 100002, NULL, 0, 0, 1549238400000000000, NULL, 22); +INSERT INTO "HVS_TAG2NODE" VALUES (21, "SCT-00", 100026, NULL, 0, 0, 1567987200000000000, NULL, 22); +INSERT INTO "HVS_TAG2NODE" VALUES (210, "SctTopLevel-00", 106788, NULL, 0, 0, 1567987200000000000, NULL, 22); +INSERT INTO "HVS_TAG2NODE" VALUES (211, "SctBarrelModule-00", 107003, NULL, 0, 0, 1567987200000000000, NULL, 22); +INSERT INTO "HVS_TAG2NODE" VALUES (212, "SctBarrelSensor-00", 106730, NULL, 0, 0, 1567987200000000000, NULL, 22); +INSERT INTO "HVS_TAG2NODE" VALUES (213, "SctFaserGeneral-00", 106789, NULL, 0, 0, 1567987200000000000, NULL, 22); +INSERT INTO "HVS_TAG2NODE" VALUES (214, "SctSwitches-00", 107782, NULL, 0, 0, 1567987200000000000, NULL, 22); +INSERT INTO "HVS_TAG2NODE" VALUES (215, "SctMaterials-00", 107777, NULL, 0, 0, 1567987200000000000, NULL, 22); +INSERT INTO "HVS_TAG2NODE" VALUES (216, "SctMatComponents-00", 107778, NULL, 0, 0, 1567987200000000000, NULL, 22); INSERT INTO "HVS_TAG2NODE" VALUES (3, "Calorimeter-00", 100003, NULL, 0, 0, 1549238400000000000, NULL, 22); INSERT INTO "HVS_TAG2NODE" VALUES (4, "Magnet-00", 100004, NULL, 0, 0, 1549238400000000000, NULL, 22); INSERT INTO "HVS_TAG2NODE" VALUES (100, "Materials-00", 100005, NULL, 0, 0, 1549238400000000000, NULL, 22); @@ -375,6 +391,14 @@ INSERT INTO "HVS_LTAG2LTAG" VALUES (1, 100001, 1003, 100011); INSERT INTO "HVS_LTAG2LTAG" VALUES (1, 100001, 1004, 100012); INSERT INTO "HVS_LTAG2LTAG" VALUES (2, 100002, 2003, 100021); INSERT INTO "HVS_LTAG2LTAG" VALUES (2, 100002, 2004, 100022); +INSERT INTO "HVS_LTAG2LTAG" VALUES (2, 100002, 21, 100026); +INSERT INTO "HVS_LTAG2LTAG" VALUES (21, 100026, 210, 106788); +INSERT INTO "HVS_LTAG2LTAG" VALUES (21, 100026, 211, 107003); +INSERT INTO "HVS_LTAG2LTAG" VALUES (21, 100026, 212, 106730); +INSERT INTO "HVS_LTAG2LTAG" VALUES (21, 100026, 213, 106789); +INSERT INTO "HVS_LTAG2LTAG" VALUES (21, 100026, 214, 107782); +INSERT INTO "HVS_LTAG2LTAG" VALUES (21, 100026, 215, 107777); +INSERT INTO "HVS_LTAG2LTAG" VALUES (21, 100026, 216, 107778); INSERT INTO "HVS_LTAG2LTAG" VALUES (3, 100003, 3003, 100023); INSERT INTO "HVS_LTAG2LTAG" VALUES (3, 100003, 3004, 100024); INSERT INTO "HVS_LTAG2LTAG" VALUES (0, 100000, 110, 100013); @@ -389,6 +413,14 @@ INSERT INTO "HVS_LTAG2LTAG" VALUES (3, 100003, 3005, 100018); INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "FASER", "FASER-00", 100000); INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "Scintillator", "Scintillator-00", 100001); INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "Tracker", "Tracker-00", 100002); +INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "SCT", "SCT-00", 100026); +INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "SctTopLevel", "SCTTopLevel-00", 106788); +INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "SctBrlModule", "SCTBrlModule-00", 107003); +INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "SctBrlSensor", "SCTBrlSensor-00", 106730); +INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "SctFaserGeneral", "SCTFaserGeneral-00", 106789); +INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "SctSwitches", "SCTSwitches-00", 107782); +INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "SCTMaterials", "SCTMaterials-00", 107777); +INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "SCTMatComponents", "SCTMatComponents-00", 107778); INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "Calorimeter", "Calorimeter-00", 100003); INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "Magnet", "Magnet-00", 100004); INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "Materials", "Materials-00", 100005); @@ -988,4 +1020,6808 @@ INSERT INTO "TRACKERIDENTIFIER_DATA2TAG" VALUES (100017, 0); -- INSERT INTO "CALOIDENTIFIER_DATA" VALUES (0, "Calorimeter", "CaloIdDictFiles/IdDictCalorimeter.xml", "Baseline layout"); INSERT INTO "CALOIDENTIFIER_DATA2TAG" VALUES (100018, 0); +-- +-- +DROP TABLE IF EXISTS "SCTBRLSENSOR_DATA"; +CREATE TABLE "SCTBRLSENSOR_DATA" ( "SCTBRLSENSOR_DATA_ID" SLONGLONG ,"THICKNESS" DOUBLE ,"WIDTH" DOUBLE ,"WAFERLENGTH" DOUBLE ,"NUMWAFERS" INT ,"MATERIAL" TEXT , +"FIDUCIALSEP" DOUBLE ,"CENTERTOFIDUCIAL" DOUBLE ,"STRIPPITCH" DOUBLE ,"NUMSTRIPS" INT ,"NUMREADOUTSTRIPS" INT ,"STRIPSHIFT" INT ,"ACTIVEHALFLENGTH" DOUBLE , UNIQUE ( "SCTBRLSENSOR_DATA_ID" ) ); +INSERT INTO "SCTBRLSENSOR_DATA" VALUES(0,0.285,63.56,63.96,2,'std::Silicon',2.19,30.95,0.08,770,768,1,31.0); +DROP TABLE IF EXISTS "SCTBRLSENSOR_DATA2TAG"; +CREATE TABLE "SCTBRLSENSOR_DATA2TAG" ( "SCTBRLSENSOR_TAG_ID" SLONGLONG ,"SCTBRLSENSOR_DATA_ID" SLONGLONG ); +INSERT INTO "SCTBRLSENSOR_DATA2TAG" VALUES(106730,0); +-- +-- +DROP TABLE IF EXISTS "SCTBRLMODULE_DATA"; +CREATE TABLE "SCTBRLMODULE_DATA" ( "SCTBRLMODULE_DATA_ID" SLONGLONG ,"BASEBOARDTHICKNESS" DOUBLE ,"BASEBOARDWIDTH" DOUBLE ,"BASEBOARDLENGTH" DOUBLE , +"BASEBOARDMATERIAL" TEXT ,"BASEBOARDOFFSETY" DOUBLE ,"BASEBOARDOFFSETZ" DOUBLE ,"HYBRIDTHICKNESS" DOUBLE ,"HYBRIDWIDTH" DOUBLE ,"HYBRIDLENGTH" DOUBLE , +"HYBRIDMATERIAL" TEXT ,"HYBRIDOFFSETX" DOUBLE ,"HYBRIDOFFSETZ" DOUBLE ,"PIGTAILTHICKNESS" DOUBLE ,"PIGTAILWIDTH" DOUBLE ,"PIGTAILLENGTH" DOUBLE , +"PIGTAILMATERIAL" TEXT ,"STEREOUPPERSIGN" INT ,"STEREOANGLE" DOUBLE ,"SENSORTOSENSORGAP" DOUBLE ,"SIDEUPPER" INT , UNIQUE ( "SCTBRLMODULE_DATA_ID" ) ); +INSERT INTO "SCTBRLMODULE_DATA" VALUES(0,0.58,87.6,61.8,'sct::BrlBaseBoard',-5.7,-7.1,0.9,74.6,21.0,'sct::BrlHybrid',1.058,-15.5,0.9,25.4,35.4,'sct::PigTail',-1,40.0,0.6,0); +DROP TABLE IF EXISTS "SCTBRLMODULE_DATA2TAG"; +CREATE TABLE "SCTBRLMODULE_DATA2TAG" ( "SCTBRLMODULE_TAG_ID" SLONGLONG ,"SCTBRLMODULE_DATA_ID" SLONGLONG ); +INSERT INTO "SCTBRLMODULE_DATA2TAG" VALUES(107003,0); +-- +-- +DROP TABLE IF EXISTS "SCTTOPLEVEL_DATA"; +CREATE TABLE "SCTTOPLEVEL_DATA" ( "SCTTOPLEVEL_DATA_ID" SLONGLONG ,"POSX" DOUBLE ,"POSY" DOUBLE ,"POSZ" DOUBLE ,"ROTX" DOUBLE ,"ROTY" DOUBLE ,"ROTZ" DOUBLE ,"ROTORDER" INT ,"LABEL" TEXT , UNIQUE ( "SCTTOPLEVEL_DATA_ID" ) ); +INSERT INTO "SCTTOPLEVEL_DATA" VALUES(0,0.0,0.0,-1000.0,0.0,0.0,0.0,312,'StationA'); +INSERT INTO "SCTTOPLEVEL_DATA" VALUES(1,0.0,0.0, 0.0,0.0,0.0,0.0,312,'StationB'); +INSERT INTO "SCTTOPLEVEL_DATA" VALUES(2,0.0,0.0, 1000.0,0.0,0.0,0.0,312,'StationC'); +INSERT INTO "SCTTOPLEVEL_DATA" VALUES(3,0.0,0.0, 1000.0,0.0,0.0,0.0,312,'SCT'); +DROP TABLE IF EXISTS "SCTTOPLEVEL_DATA2TAG"; +CREATE TABLE "SCTTOPLEVEL_DATA2TAG" ( "SCTTOPLEVEL_TAG_ID" SLONGLONG ,"SCTTOPLEVEL_DATA_ID" SLONGLONG ); +INSERT INTO "SCTTOPLEVEL_DATA2TAG" VALUES(106788,0); +INSERT INTO "SCTTOPLEVEL_DATA2TAG" VALUES(106788,1); +INSERT INTO "SCTTOPLEVEL_DATA2TAG" VALUES(106788,2); +INSERT INTO "SCTTOPLEVEL_DATA2TAG" VALUES(106788,3); +-- +-- +DROP TABLE IF EXISTS "SCTFASERGENERAL_DATA"; +CREATE TABLE "SCTFASERGENERAL_DATA" ("SCTFASERGENERAL_DATA_ID" SLONGLONG, "NUMLAYERS" INT, "LAYERPITCH" DOUBLE, "ROWSPERLAYER" INT, "MODULESPERROW" INT, UNIQUE ( "SCTFASERGENERAL_DATA_ID") ); +INSERT INTO "SCTFASERGENERAL_DATA" VALUES (0, 3, 100.0, 4, 2); +DROP TABLE IF EXISTS "SCTFASERGENERAL_DATA2TAG"; +CREATE TABLE "SCTFASERGENERAL_DATA2TAG" ( "SCTFASERGENERAL_TAG_ID" SLONGLONG ,"SCTFASERGENERAL_DATA_ID" SLONGLONG ); +INSERT INTO "SCTFASERGENERAL_DATA2TAG" VALUES(106789, 0); +-- +-- +DROP TABLE IF EXISTS "SCTSWITCHES_DATA"; +CREATE TABLE "SCTSWITCHES_DATA" ( "SCTSWITCHES_DATA_ID" SLONGLONG ,"DETECTORNAME" TEXT ,"G3COMPATIBLE" INT ,"G3DIGITSCOMPATIBLE" INT ,"DC2GEOMETRY" INT ,"USEMAGFIELDSVC" INT ,"COSMICLAYOUT" INT ,"VERSIONNAME" TEXT ,"LAYOUT" TEXT ,"DESCRIPTION" TEXT , UNIQUE ( "SCTSWITCHES_DATA_ID" ) ); +INSERT INTO "SCTSWITCHES_DATA" VALUES(0,'SCT',0,0,0,1,0,'GEO','Final','Atlas Geometry 2008'); +DROP TABLE IF EXISTS "SCTSWITCHES_DATA2TAG"; +CREATE TABLE "SCTSWITCHES_DATA2TAG" ( "SCTSWITCHES_TAG_ID" SLONGLONG ,"SCTSWITCHES_DATA_ID" SLONGLONG ); +INSERT INTO "SCTSWITCHES_DATA2TAG" VALUES(107782,0); +-- +-- +DROP TABLE IF EXISTS "SCTMATCOMPONENTS_DATA"; +CREATE TABLE "SCTMATCOMPONENTS_DATA" ( "SCTMATCOMPONENTS_DATA_ID" SLONGLONG ,"MATERIAL_ID" SLONGLONG ,"COMPNAME" TEXT ,"FRACTION" DOUBLE , UNIQUE ( "SCTMATCOMPONENTS_DATA_ID" ) ); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(201,50,'Carbon',0.4816); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(202,50,'sct::AlNitride',0.1576); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(203,50,'sct::Elastosil',0.0056); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(204,50,'sct::Epoxy',0.117); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(205,50,'Aluminium',0.0212); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(206,50,'sct::FR4',0.0644); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(207,50,'sct::Glass',0.1526); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(208,51,'Carbon',0.4081); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(209,51,'sct::AlNitride',0.1528); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(210,51,'sct::Elastosil',0.0111); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(211,51,'sct::Epoxy',0.1908); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(212,51,'Aluminium',0.0156); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(213,51,'sct::FR4',0.083); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(214,51,'sct::Glass',0.1386); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(544,124,'Iron',0.187); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(545,124,'Aluminium',0.491); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(546,124,'sct::BeCu',0.322); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(897,175,'sct::CN107',0.226); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(161,42,'sct::Peek',0.0251); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(168,43,'sct::Peek',0.0327); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(174,44,'sct::Peek',0.0192); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(178,45,'sct::Peek',0.0175); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(898,175,'sct::C6F14',0.076); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(961,174,'Copper',0.575); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(962,174,'std::C3F8',0.06); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(963,174,'Iron',0.252); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(964,174,'sct::CN107',0.06); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(965,174,'sct::Rubber',0.053); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(966,188,'Copper',0.775); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(967,188,'std::C3F8',0.047); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(968,188,'sct::Rubber',0.178); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(0,0,'Carbon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(1,1,'Carbon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2,2,'Carbon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(3,3,'Carbon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(4,4,'Copper',0.863); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(5,4,'std::Kapton',0.137); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(6,5,'Aluminium',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(7,6,'Aluminium',0.369); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(24,14,'sct::AirexR82',0.057); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(9,7,'Copper',0.7); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(10,7,'Nickel',0.3); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(11,8,'sct::CN107',0.09); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(12,8,'std::C3F8',0.91); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(13,9,'Carbon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(14,10,'Carbon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(15,11,'Carbon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(16,12,'std::Polystyrene',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(17,13,'sct::CFRP',0.367); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(18,13,'std::Aluminium',0.495); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(19,13,'std::C3F8',0.116); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(20,13,'std::Kapton',0.022); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(21,14,'sct::CFRP',0.508); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(22,14,'std::Aluminium',0.193); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(23,14,'std::C3F8',0.242); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(27,15,'sct::AirexR82',0.005); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(25,15,'sct::CFRP',0.9); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(26,15,'std::Aluminium',0.095); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(28,16,'std::Aluminium',0.588); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(29,16,'std::Kapton',0.412); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(30,17,'Silicon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(31,18,'Carbon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(32,19,'Carbon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(33,20,'Hydrogen',0.092); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(34,20,'Oxygen',0.366); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(35,20,'Aluminium',0.542); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(36,21,'Aluminium',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(37,22,'std::Polystyrene',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(38,23,'std::Polyethylene',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(8,6,'std::Kapton',0.631); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(338,77,'Carbon',37.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(339,77,'Hydrogen',24.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(340,77,'Oxygen',4.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(341,77,'Nitrogen',2.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(342,78,'Hydrogen',0.026); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(343,78,'Carbon',0.692); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(344,78,'Nitrogen',0.073); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(345,78,'Oxygen',0.209); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(346,79,'Aluminium',0.0496); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(347,79,'Iron',0.0468); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(348,79,'Copper',0.185); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(349,79,'Nickel',0.0027); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(350,79,'Silicon',0.0012); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(351,79,'sct::Solder',0.0091); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(352,79,'std::Kapton',0.119); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(353,79,'sct::Peek',0.0409); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(354,79,'sct::PEI',0.0126); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(355,79,'sct::Glass',0.0136); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(356,79,'sct::Plastic',0.0085); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(357,79,'sct::CFRP',0.1192); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(358,79,'sct::FR4',0.1344); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(359,79,'sct::Adhesive',0.119); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(360,79,'sct::AlNitride',0.1384); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(490,107,'sct::Epoxy',0.6925); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(491,107,'sct::BoronNitride',0.3075); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(533,122,'sct::Peek',0.4); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(534,122,'sct::CFRP',0.45); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(535,122,'sct::PEI',0.11); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(536,122,'sct::Epoxy',0.04); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(547,125,'Iron',0.0417); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(548,125,'Copper',0.333); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(549,125,'sct::CN107',0.6249); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(550,125,'sct::solder',0.0004); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(561,128,'Silver',0.15); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(562,128,'Nickel',0.6); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(563,128,'sct::Epoxy',0.25); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(684,148,'Copper',0.9); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(685,148,'Zinc',0.1); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(686,149,'Aluminium',0.2722); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(687,149,'Iron',0.0168); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(688,149,'sct::CFRP',0.6314); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(689,149,'sct::Peek',0.0701); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(690,149,'sct::EPDM',0.0018); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(691,149,'sct::Brass',0.0077); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(737,157,'Carbon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(738,158,'Carbon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(826,142,'sct::CFRP',0.613); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(827,142,'sct::CuKaptonEC',0.053); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(828,142,'std::Kapton',0.04); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(829,142,'Copper',0.065); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(830,142,'sct::Araldite',0.072); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(831,142,'sct::CuOnAlWire',0.007); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(832,142,'std::G10',0.15); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(906,174,'Copper',0.696); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(907,174,'std::C3F8',0.052); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(908,174,'Iron',0.1); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(909,174,'sct::CN107',0.024); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(910,174,'sct::Rubber',0.128); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(937,184,'Aluminium',0.004); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(938,184,'sct::Peek',0.6584); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(939,184,'sct::Vectra',0.2431); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(940,184,'sct::Glass',0.0026); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(941,184,'sct::Plastic',0.0374); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(942,184,'sct::Silica',0.0545); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(943,185,'sct::Peek',0.6677); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(944,185,'sct::Glass',0.1638); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(945,185,'sct::Plastic',0.102); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(946,185,'sct::Araldite',0.0665); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(947,186,'Aluminium',0.0293); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(948,186,'sct::Peek',0.7988); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(949,186,'sct::Vectra',0.1237); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(950,186,'sct::Glass',0.0153); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(951,186,'sct::Silica',0.0053); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(952,186,'sct::Araldite',0.0276); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(953,187,'Aluminium',0.0021); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(954,187,'sct::Peek',0.2746); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(955,187,'sct::Vectra',0.418); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(956,187,'sct::Glass',0.026); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(957,187,'sct::Plastic',0.2038); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(958,187,'sct::Silica',0.0247); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(959,187,'std::Kapton',0.001); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(960,187,'sct::Araldite',0.0498); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(510,116,'sct::CN107',0.785); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(511,116,'std::C3F8',0.127); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(512,116,'Copper',0.088); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(513,117,'std::Kapton',0.27); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(514,117,'Copper',0.61); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(515,117,'sct::Epoxy',0.12); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(516,118,'sct::CN107',0.52); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(517,118,'std::C3F8',0.21); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(518,118,'Aluminium',0.1); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(519,118,'std::Kapton',0.03); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(520,118,'sct::BeCu',0.14); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(521,119,'sct::Plastic',0.33); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(522,119,'sct::Epoxy',0.06); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(523,119,'sct::BeCu',0.14); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(524,119,'std::Polyethylene',0.47); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(525,120,'Aluminium',0.219); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(526,120,'sct::Peek',0.522); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(527,120,'Copper',0.125); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(528,120,'Iron',0.134); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(529,121,'sct::Peek',0.4); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(530,121,'sct::CFRP',0.45); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(531,121,'sct::PEI',0.11); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(532,121,'sct::Epoxy',0.04); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(537,123,'Aluminium',0.044); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(538,123,'sct::CFRP',0.821); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(539,123,'sct::CuKapton',0.079); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(540,123,'sct::Solder',0.001); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(541,123,'Copper',0.006); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(542,123,'sct::Plastic',0.036); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(543,123,'sct::Peek',0.013); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(264,34,'sct::Plastic',0.23); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(265,34,'Copper',0.32); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(266,34,'sct::FR4',0.27); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(267,34,'sct::CuOnAlWire',0.04); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(268,34,'std::Kapton',0.14); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(604,132,'sct::Silica',0.99); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(619,138,'Copper',0.76); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(620,138,'std::Kapton',0.24); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(621,139,'sct::PEI',0.373); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(622,139,'sct::AlKapton',0.028); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(623,139,'sct::CuKaptonEC',0.166); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(624,139,'sct::Araldite',0.31); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(625,139,'std::Kapton',0.084); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(626,139,'Copper',0.024); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(627,139,'sct::CuOnAlWire',0.015); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(628,140,'sct::CFRP',0.512); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(629,140,'sct::PEI',0.163); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(630,140,'sct::CuKapton',0.117); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(631,140,'sct::Epoxy',0.208); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(632,141,'sct::Epoxy',0.106); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(633,141,'sct::PEI',0.342); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(634,141,'sct::CuKapton',0.552); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(635,142,'sct::CFRP',0.835); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(636,142,'sct::CuKapton',0.072); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(637,142,'std::Kapton',0.054); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(638,142,'Copper',0.009); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(639,142,'sct::Araldite',0.02); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(640,142,'sct::CuOnAlWire',0.01); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(641,143,'Iron',0.284); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(642,143,'sct::PEI',0.062); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(643,143,'sct::CFRP',0.522); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(644,143,'sct::Araldite',0.007); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(645,143,'std::G10',0.125); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(646,144,'sct::PEI',0.106); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(647,144,'sct::CuKapton',0.093); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(648,144,'Aluminium',0.008); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(649,144,'sct::CFRP',0.763); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(650,144,'Titanium',0.03); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(651,145,'sct::CFRP',0.796); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(652,145,'sct::PEI',0.069); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(653,145,'sct::AlKapton',0.007); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(654,145,'sct::Epoxy',0.061); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(655,145,'sct::CuKapton',0.037); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(656,145,'std::Kapton',0.012); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(657,145,'Copper',0.003); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(658,145,'sct::Araldite',0.007); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(659,145,'sct::CuOnAlWire',0.005); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(660,145,'Aluminium',0.002); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(661,145,'sct::Peek',0.001); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(662,146,'Iron',0.645); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(663,146,'sct::Peek',0.241); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(664,146,'Aluminium',0.114); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(665,147,'sct::CFRP',0.377); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(666,147,'Aluminium',0.04); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(667,147,'Iron',0.05); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(668,147,'sct::PEI',0.454); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(669,147,'sct::Silicone',0.079); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(750,145,'sct::CuKaptonEC',0.045); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(833,171,'Carbon',6.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(834,171,'Fluorine',14.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(835,172,'Carbon',15.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(836,172,'Hydrogen',6.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(837,172,'Oxygen',3.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(838,173,'sct::Polycarbonate',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(839,174,'Copper',0.684); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(840,174,'std::C3F8',0.069); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(841,174,'Iron',0.098); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(842,174,'sct::CN107',0.023); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(843,174,'sct::Rubber',0.126); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(844,175,'std::Kapton',0.18); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(845,175,'Copper',0.406); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(846,175,'sct::Epoxy',0.08); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(847,175,'sct:CN107',0.226); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(848,175,'sct:C6F14',0.076); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(849,175,'Aluminium',0.032); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(850,176,'Aluminium',0.925); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(851,176,'Iron',0.043); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(852,176,'Copper',0.002); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(853,176,'std::Kapton',0.03); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(854,155,'Aluminium',0.235); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(855,155,'Copper',0.118); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(856,155,'Iron',0.427); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(857,155,'std::Polyethylene',0.201); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(858,155,'sct::Polyester',0.019); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(859,177,'Copper',0.549); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(860,177,'sct::CN107',0.152); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(861,177,'Iron',0.265); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(862,177,'sct::Peek',0.008); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(863,177,'sct::Solder',0.026); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(864,178,'sct::CN107',0.702); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(865,178,'Copper',0.073); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(866,178,'std::C3F8',0.126); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(867,178,'sct::Rubber',0.099); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(868,179,'std::Kapton',0.258); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(869,179,'Copper',0.578); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(870,179,'sct::Epoxy',0.114); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(871,179,'Aluminium',0.05); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(872,153,'Aluminium',0.326); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(873,153,'Copper',0.196); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(874,153,'std::Polyethylene',0.478); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(875,180,'sct::Polyimide',0.021); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(876,180,'Iron',0.634); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(877,180,'sct::Polyester',0.239); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(878,180,'Aluminium',0.002); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(879,180,'Copper',0.1); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(880,180,'sct::Peek',0.004); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(881,181,'sct::PEI',0.533); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(882,181,'sct::CFRP',0.181); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(883,181,'sct::Araldite',0.041); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(884,181,'sct::Polyimide',0.002); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(885,181,'Aluminium',0.076); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(886,181,'Iron',0.03); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(887,181,'sct::Torlon',0.015); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(888,181,'sct::Silicone',0.066); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(889,181,'std::Kapton',0.021); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(890,181,'Copper',0.004); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(891,181,'sct::Polyimide',0.025); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(892,181,'sct::CuKaptonEC',0.006); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(893,182,'Aluminium',0.904); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(894,182,'Iron',0.053); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(895,182,'std::G10',0.031); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(896,182,'sct::Araldite',0.012); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(249,64,'Carbon',10.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(250,64,'Hydrogen',6.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(251,64,'Oxygen',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(252,65,'Copper',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(253,66,'sct::Plastic',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(254,67,'sct::Plastic',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(255,68,'sct::Plastic',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(256,69,'sct::Silica',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(257,70,'sct::Plastic',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(258,71,'Copper',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(222,52,'sct::Solder',0.0554); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(165,42,'sct::Araldite',0.0099); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(171,43,'sct::Araldite',0.0098); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(551,125,'sct::Solder',0.0004); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(925,149,'Aluminium',0.2152); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(926,149,'Iron',0.0013); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(116,35,'std::C3F8',0.1636); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(928,149,'sct::Peek',0.0403); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(929,149,'sct::EPDM',0.0017); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(930,183,'Aluminium',0.4829); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(931,183,'Iron',0.0733); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(932,183,'sct::CFRP',0.2265); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(933,183,'sct::Peek',0.1792); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(934,183,'sct::EPDM',0.0021); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(935,183,'sct::Epoxy',0.0002); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(936,183,'sct::Brass',0.0358); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(927,149,'sct::CFRP',0.7415); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(327,74,'Silicon',0.637); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(328,74,'Oxygen',0.363); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(329,75,'Aluminium',0.6103); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(330,75,'Copper',0.0126); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(331,75,'sct::Solder',0.1652); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(332,75,'sct::Peek',0.184); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(333,75,'sct::Silicone',0.0279); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(451,105,'sct::CN107',0.4811); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(452,105,'sct::Solder',0.0027); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(453,105,'std::C3F8',0.5162); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(558,127,'Aluminium',0.27); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(559,127,'sct::CFRP',0.72); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(560,127,'sct::Araldite',0.01); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(605,137,'Aluminium',0.4822); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(606,137,'Iron',0.0106); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(607,137,'Copper',0.0152); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(608,137,'sct::CN107',0.0012); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(609,137,'std::Kapton',0.1966); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(610,137,'sct::Peek',0.0023); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(611,137,'std::G10',0.2794); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(612,137,'sct::BeCu',0.0034); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(613,137,'sct::Glass',0.004); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(614,137,'sct::Plastic',0.0051); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(615,120,'Aluminium',0.242); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(616,120,'sct::Peek',0.471); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(617,120,'Copper',0.138); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(618,120,'Iron',0.149); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(260,53,'sct::Plastic',0.64); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(93,30,'Oxygen',0.4418); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(259,53,'sct::Glass',0.08); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(261,53,'sct::Rubber',0.23); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(262,53,'sct::Ceramic',0.03); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(263,53,'Aluminium',0.02); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(899,161,'Aluminium',0.3033); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(900,161,'Fluorine',0.3965); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(901,161,'Copper',0.1013); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(902,161,'sct::CN107',0.0797); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(903,161,'sct::Airex',0.02); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(904,161,'sct::Peek',0.0012); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(905,161,'std::C3F8',0.098); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2009,2002,'Aluminium',0.2); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2010,2002,'Carbon',0.7); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2011,2002,'Copper',0.01); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2012,2002,'Hydrogen',0.06); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2013,2002,'Oxygen',0.03); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(39,24,'Hydrogen',0.0063); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(40,24,'Boron',0.005); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(41,24,'Carbon',0.4703); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(42,24,'Nitrogen',0.0143); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(43,24,'Oxygen',0.0922); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(44,24,'Aluminium',0.0581); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(45,24,'Silicon',0.1351); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(46,24,'Chlorine',0.0033); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(47,24,'Nickel',0.0038); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(48,24,'Copper',0.1621); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(49,24,'Tin',0.0094); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(50,24,'Silver',0.0329); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(51,24,'Gold',0.0017); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(52,24,'Lead',0.0055); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(53,25,'Hydrogen',0.0032); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(54,25,'Beryllium',0.0892); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(55,25,'Boron',0.0014); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(56,25,'Carbon',0.7198); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(57,25,'Nitrogen',0.0019); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(58,25,'Oxygen',0.166); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(59,25,'Aluminium',0.0175); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(60,25,'Silver',0.001); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(61,26,'Hydrogen',0.0289); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(62,26,'Carbon',0.3713); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(63,26,'Nitrogen',0.0112); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(64,26,'Oxygen',0.091); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(65,26,'Nickel',0.0009); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(66,26,'Copper',0.4063); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(67,26,'Tin',0.0606); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(68,26,'Gold',0.0004); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(69,26,'Lead',0.0294); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(70,27,'Hydrogen',0.0348); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(71,27,'Carbon',0.5257); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(72,27,'Oxygen',0.1733); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(73,27,'Aluminium',0.0929); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(74,27,'Silicon',0.0742); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(75,27,'Iron',0.0346); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(76,27,'Copper',0.0531); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(77,27,'Silver',0.0001); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(78,27,'Tin',0.0034); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(79,27,'Lead',0.0079); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(80,28,'Hydrogen',0.0187); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(81,28,'Carbon',0.3659); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(82,28,'Nitrogen',0.0538); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(83,28,'Oxygen',0.1104); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(84,28,'Aluminium',0.1224); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(85,28,'Silicon',0.032); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(86,28,'Iron',0.0385); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(87,28,'Copper',0.2487); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(88,28,'Nickel',0.0022); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(89,28,'Tin',0.0022); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(90,28,'Lead',0.0052); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(91,29,'Aluminium',0.3595); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(92,29,'std::Kapton',0.6405); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(502,114,'sct::Plastic',0.15); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(94,30,'Silicon',0.2743); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(95,30,'Boron',0.0166); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(96,30,'Aluminium',0.0207); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(97,30,'Sodium',0.0448); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(98,30,'Potassium',0.0822); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(99,30,'Zinc',0.0882); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(100,30,'Titanium',0.0292); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(101,30,'Antimony',0.0022); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(102,31,'Copper',0.6142); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(103,31,'std::Kapton',0.3858); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(104,32,'Aluminium',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(105,32,'Nitrogen',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(106,33,'Copper',0.2571); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(107,33,'Aluminium',0.5199); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(108,33,'std::Kapton',0.223); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(109,34,'Sct:Plastic',0.346); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(110,34,'Copper',0.4613); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(111,34,'Sct::FR4',0.118); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(112,34,'Sct::CuOnAlWire',0.0157); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(113,34,'std::Kapton',0.059); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(114,35,'sct::CN107',0.747); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(115,35,'sct::Solder',0.0894); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(503,114,'Copper',0.09); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(504,114,'sct::FR4',0.5); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(505,114,'sct::CuOnAlWire',0.09); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(506,114,'std::Kapton',0.17); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(508,115,'Titanium',0.22); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(509,115,'Aluminium',0.3); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(507,115,'sct::CN107',0.48); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(552,16,'Aluminium',0.27); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(553,16,'sct::CFRP',0.72); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(554,16,'sct::Araldite',0.01); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(555,126,'Silver',0.15); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(556,126,'Nickel',0.6); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(557,126,'sct::Epoxy',0.25); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(159,42,'sct::Torlon',0.7947); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(160,42,'sct::Silica',0.0585); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(162,42,'sct::Vectra',0.0472); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(163,42,'sct::Plastic',0.0622); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(164,42,'Aluminium',0.0024); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(166,43,'sct::Torlon',0.8186); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(167,43,'sct::Silica',0.0131); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(169,43,'sct::Vectra',0.0114); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(170,43,'sct::Plastic',0.1144); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(172,44,'sct::Torlon',0.8208); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(173,44,'sct::Silica',0.1454); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(175,44,'Aluminium',0.0146); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(176,45,'sct::Torlon',0.76); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(177,45,'sct::Silica',0.196); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(179,45,'Aluminium',0.0265); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(194,49,'Carbon',0.4895); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(195,49,'sct::AlNitride',0.1511); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(196,49,'sct::Elastosil',0.0052); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(197,49,'sct::Epoxy',0.1179); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(198,49,'Aluminium',0.021); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(199,49,'sct::FR4',0.0639); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(200,49,'sct::Glass',0.1514); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(215,52,'Copper',0.2873); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(216,52,'Carbon',0.2376); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(217,52,'Silicon',0.1024); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(218,52,'std::Kapton',0.105); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(219,52,'sct::Epoxy',0.1013); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(220,52,'sct::Al2O3',0.0531); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(221,52,'sct::Plastic',0.0226); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(223,52,'sct::AlNitride',0.0179); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(224,52,'sct::EotiteP102',0.0128); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(225,52,'sct::AIT',0.0046); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(226,53,'sct::Glass',0.0825); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(227,53,'sct::Plastic',0.5408); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(228,53,'sct::Rubber',0.2291); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(229,53,'sct::Ceramic',0.0261); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(230,53,'Aluminium',0.0215); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(231,54,'Silicon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(232,54,'Oxygen',2.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(233,55,'Tin',0.3642); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(234,55,'Lead',0.6358); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(235,56,'sct::Epoxy',0.2064); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(236,56,'sct::Glass',0.7936); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(237,57,'Aluminium',2.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(238,57,'Oxygen',3.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(239,58,'sct::Plastic',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(240,59,'sct::Plastic',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(241,60,'Carbon',6.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(242,60,'Hydrogen',6.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(243,60,'Oxygen',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(244,61,'sct::AIT',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(245,62,'sct::Epoxy',0.6514); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(246,62,'Silver',0.3486); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(247,63,'Silicon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(248,63,'Hydrogen',2.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(564,129,'sct::PEI',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(565,130,'sct::Silicone',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(566,131,'Aluminium',0.15); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(567,131,'std::Kapton',0.85); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(568,132,'Silica',0.99); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(569,132,'std::Air',0.01); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(570,133,'sct::Rubber',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(571,134,'Aluminium',0.4334); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(572,134,'std::Kapton',0.0064); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(573,134,'sct::AlKapton',0.0293); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(574,134,'sct::Pyrogel',0.1619); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(575,134,'sct::CFRP',0.261); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(576,134,'sct::Airex',0.015); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(577,134,'sct::Araldite',0.0864); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(578,134,'sct::Epoxy',0.0014); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(579,134,'sct::Techsil',0.001); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(580,134,'Nickel',0.0034); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(581,134,'Silver',0.0008); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(582,135,'Aluminium',0.7898); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(583,135,'Iron',0.002); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(584,135,'sct::CN107',0.0622); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(585,135,'sct::Peek',0.0682); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(586,135,'sct::EPDM',0.0258); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(587,135,'sct::Araldite',0.0109); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(588,135,'sct::Silicone',0.0003); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(589,135,'sct::Techsil',0.0408); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(590,136,'Aluminium',0.4126); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(591,136,'Iron',0.0096); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(592,136,'Copper',0.0085); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(593,136,'std::Kapton',0.007); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(594,136,'sct::AlKapton',0.0126); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(595,136,'sct::CuKapton',0.0114); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(596,136,'sct::Pyrogel',0.0788); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(597,136,'sct::CFRP',0.241); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(598,136,'sct::Airex',0.0066); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(599,136,'sct::Peek',0.0099); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(600,136,'sct::EPDM',0.0142); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(601,136,'sct::Araldite',0.1864); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(602,136,'sct::Epoxy',0.0013); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(603,136,'sct::Solder',0.0001); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(739,145,'sct::CFRP',0.75); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(740,145,'sct::PEI',0.085); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(741,145,'sct::AlKapton',0.008); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(742,145,'sct::Epoxy',0.075); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(743,145,'sct::CuKapton',0.045); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(744,145,'std::Kapton',0.015); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(745,145,'Copper',0.004); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(746,145,'sct::Araldite',0.009); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(747,145,'sct::CuOnAlWire',0.006); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(748,145,'Aluminium',0.002); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(749,145,'sct::Peek',0.001); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(816,137,'Aluminium',0.4985); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(817,137,'Iron',0.0103); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(818,137,'Copper',0.0147); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(819,137,'sct::CN107',0.0011); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(820,137,'std::Kapton',0.1904); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(821,137,'sct::Peek',0.0022); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(822,137,'std::G10',0.2705); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(823,137,'sct::BeCu',0.0034); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(824,137,'sct::Glass',0.0039); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(825,137,'sct::Plastic',0.005); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2000,2000,'Carbon',0.7); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2001,2000,'Aluminium',0.2); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2002,2000,'Hydrogen',0.06); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2003,2000,'Oxygen',0.03); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2004,2000,'Copper',0.01); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2005,2001,'Hydrogen',0.129); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2006,2001,'Carbon',0.73); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2007,2001,'Oxygen',0.091); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(2008,2001,'Boron',0.05); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(361,80,'Copper',0.95); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(362,80,'Gold',0.05); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(363,81,'Aluminium',0.0087); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(364,81,'sct::CFRP',0.9913); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(365,82,'Aluminium',0.0086); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(366,82,'sct::CFRP',0.9914); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(367,83,'Aluminium',0.007); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(368,83,'sct::CFRP',0.993); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(369,84,'Aluminium',0.0077); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(370,84,'sct::CFRP',0.9923); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(371,85,'sct::Peek',0.0511); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(372,85,'sct::CFRP',0.9472); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(373,85,'sct::CuAu',0.0017); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(374,86,'sct::Peek',0.0373); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(375,86,'sct::CFRP',0.9616); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(376,86,'sct::CuAu',0.0011); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(377,87,'sct::Peek',0.0311); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(378,87,'sct::CFRP',0.968); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(379,87,'sct::CuAu',0.0009); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(380,88,'sct::Peek',0.0273); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(381,88,'sct::CFRP',0.9719); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(382,88,'sct::CuAu',0.0008); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(383,89,'Aluminium',0.0311); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(384,89,'Copper',0.0347); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(385,89,'sct::Peek',0.6797); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(386,89,'sct::Glass',0.1296); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(387,89,'sct::Plastic',0.0807); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(388,89,'sct::BeCu',0.0442); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(389,90,'Aluminium',0.0297); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(390,90,'Copper',0.0322); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(391,90,'sct::Peek',0.6468); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(392,90,'sct::Glass',0.1537); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(393,90,'sct::Plastic',0.0957); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(394,90,'sct::BeCu',0.0419); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(395,91,'Aluminium',0.0313); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(396,91,'Copper',0.0295); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(397,91,'sct::Peek',0.6211); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(398,91,'sct::Glass',0.172); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(399,91,'sct::Plastic',0.1071); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(400,91,'sct::BeCu',0.039); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(401,92,'Aluminium',0.028); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(402,92,'Copper',0.0285); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(403,92,'sct::Peek',0.5872); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(404,92,'sct::Glass',0.1961); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(405,92,'sct::Plastic',0.1221); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(406,92,'sct::BeCu',0.0381); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(670,123,'sct::CuKaptonEC',0.079); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(671,140,'sct::CuKaptonEC',0.117); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(672,141,'sct::CuKaptonEC',0.552); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(673,142,'sct::CuKaptonEC',0.072); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(674,144,'sct::CuKaptonEC',0.093); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(675,145,'sct::CuKaptonEC',0.037); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(676,71,'Copper',0.27); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(677,71,'Aluminium',0.73); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(678,74,'Carbon',2.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(679,74,'Hydrogen',6.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(680,74,'Oxygen',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(681,74,'Silicon',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(682,133,'Carbon',3.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(683,133,'Hydrogen',10.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(729,156,'sct::PEI',0.222); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(730,156,'std::Kapton',0.106); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(731,156,'Aluminium',0.003); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(732,156,'Copper',0.114); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(733,156,'sct::CFRP',0.191); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(734,156,'sct::Plastic',0.016); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(735,156,'sct::Araldite',0.218); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(736,156,'sct::CuOnAlWire',0.13); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(751,159,'Copper',0.054); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(752,159,'sct::CN107',0.7994); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(753,159,'std::C3F8',0.1466); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(754,160,'Aluminium',0.2755); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(755,160,'Fluorine',0.0016); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(756,160,'Copper',0.3159); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(757,160,'sct::CN107',0.2966); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(758,160,'sct::Airex',0.0182); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(759,160,'sct::Peek',0.0032); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(760,160,'std::C3F8',0.089); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(761,161,'Aluminium',0.2737); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(762,161,'Fluorine',0.4783); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(763,161,'Copper',0.0831); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(764,161,'sct::CN107',0.0654); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(765,161,'sct::Airex',0.0181); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(766,161,'sct::Peek',0.001); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(767,161,'std::C3F8',0.0804); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(768,162,'Carbon',22.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(769,162,'Hydrogen',10.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(770,162,'Oxygen',5.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(771,162,'Nitrogen',2.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(772,163,'Aluminium',0.776); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(773,163,'Iron',0.0154); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(774,163,'Copper',0.0826); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(775,163,'sct::Peek',0.0069); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(776,163,'sct::FR4',0.0962); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(777,163,'sct::Polyimide',0.0213); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(778,163,'sct::Al2O3',0.0016); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(779,164,'Aluminium',0.3856); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(780,164,'Iron',0.0548); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(781,164,'Copper',0.2619); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(782,164,'sct::Peek',0.0019); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(783,164,'sct::FR4',0.2128); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(784,164,'sct::Polyimide',0.083); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(785,165,'Aluminium',0.4381); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(786,165,'Iron',0.0425); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(787,165,'Copper',0.2352); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(788,165,'sct::FR4',0.1912); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(789,165,'sct::Polyimide',0.0746); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(790,165,'sct::Plastic',0.0056); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(791,165,'sct::BeCu',0.0103); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(792,165,'sct::Ceramic',0.0025); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(793,166,'Aluminium',0.6489); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(794,166,'Iron',0.0145); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(795,166,'Copper',0.2967); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(796,166,'sct::FR4',0.0399); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(797,167,'Aluminium',0.5534); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(798,167,'Copper',0.3901); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(799,167,'sct::Araldite',0.0109); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(800,167,'sct::Polyimide',0.0456); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(801,168,'Aluminium',0.3385); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(802,168,'Copper',0.4877); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(803,168,'sct::Araldite',0.0061); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(804,168,'sct::Polyimide',0.1677); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(805,169,'Aluminium',0.4169); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(806,169,'Copper',0.4079); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(807,169,'sct::Araldite',0.0049); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(808,169,'sct::Polyimide',0.1363); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(809,169,'sct::Glass',0.0143); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(810,169,'sct::Plastic',0.0197); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(811,170,'Aluminium',0.6634); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(812,170,'Copper',0.2682); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(813,170,'sct::CN107',0.0421); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(814,170,'sct::Araldite',0.0112); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(815,170,'sct::Polyimide',0.0151); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(911,136,'Aluminium',0.4165); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(912,136,'Iron',0.0095); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(913,136,'Copper',0.0084); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(914,136,'std::Kapton',0.007); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(915,136,'sct::AlKapton',0.0125); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(916,136,'sct::CuKapton',0.0113); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(917,136,'sct::Pyrogel',0.0783); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(918,136,'sct::CFRP',0.2394); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(919,136,'sct::Airex',0.0066); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(920,136,'sct::Peek',0.0098); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(921,136,'sct::EPDM',0.0141); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(922,136,'sct::Araldite',0.1852); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(923,136,'sct::Epoxy',0.0013); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(924,136,'sct::Solder',0.0001); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(117,36,'sct::CN107',0.7245); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(118,36,'sct::Solder',0.1189); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(119,36,'std::C3F8',0.1566); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(120,37,'sct::CN107',0.7761); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(121,37,'sct::Solder',0.048); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(122,37,'std::C3F8',0.1759); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(123,38,'Carbon',0.7909); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(124,38,'sct::Peek',0.0351); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(125,38,'Copper',0.0175); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(126,38,'Aluminium',0.1059); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(127,38,'Gold',0.0125); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(128,38,'Lead',0.0108); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(129,38,'Tin',0.0162); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(130,38,'sct::BeCu',0.0093); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(131,38,'sct::Grease',0.0018); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(132,39,'Carbon',0.7267); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(133,39,'sct::Peek',0.0288); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(134,39,'Copper',0.0229); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(135,39,'Aluminium',0.1425); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(136,39,'Gold',0.0165); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(137,39,'Lead',0.0178); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(138,39,'Tin',0.0266); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(139,39,'sct::BeCu',0.0153); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(140,39,'sct::Grease',0.0029); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(141,40,'Carbon',0.7194); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(142,40,'sct::Peek',0.069); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(143,40,'Copper',0.0232); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(144,40,'Aluminium',0.1107); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(145,40,'Gold',0.0166); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(146,40,'Lead',0.0204); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(147,40,'Tin',0.0306); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(148,40,'sct::BeCu',0.0078); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(149,40,'sct::Grease',0.0023); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(150,41,'Carbon',0.6606); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(151,41,'sct::Peek',0.0494); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(152,41,'Copper',0.0283); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(153,41,'Aluminium',0.1446); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(154,41,'Gold',0.0203); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(155,41,'Lead',0.0323); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(156,41,'Tin',0.0485); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(157,41,'sct::BeCu',0.0124); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(158,41,'sct::Grease',0.0036); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(180,46,'Aluminium',0.5957); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(181,46,'sct::Peek',0.0618); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(182,46,'sct::Plastic',0.05); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(183,46,'Copper',0.0297); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(184,46,'sct::FR4',0.1728); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(185,46,'sct::CuOnAlWire',0.0313); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(186,46,'std::Kapton',0.0587); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(187,47,'Aluminium',0.1778); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(188,47,'sct::Plastic',0.6784); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(189,47,'sct::BeCu',0.1438); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(190,48,'Aluminium',0.4371); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(191,48,'sct::CN107',0.3171); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(192,48,'sct::Solder',0.0415); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(193,48,'sct::PCB',0.2043); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(492,112,'Aluminium',0.0127); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(493,112,'Copper',0.2054); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(494,112,'sct::Solder',0.0113); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(495,112,'std::Kapton',0.0186); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(496,112,'sct::Peek',0.4896); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(497,112,'sct::FR4',0.2624); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(498,113,'Aluminium',0.3326); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(499,113,'std::Kapton',0.4874); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(500,113,'sct::Glass',0.1109); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(501,113,'sct::Plastic',0.0691); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(692,150,'sct::CFRP',0.953); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(693,150,'std::Kapton',0.025); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(694,150,'Copper',0.007); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(695,150,'sct::Araldite',0.015); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(696,151,'sct::CFRP',0.971); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(697,151,'std::Kapton',0.015); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(698,151,'Copper',0.005); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(699,151,'sct::Araldite',0.009); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(700,152,'Aluminium',0.472); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(701,152,'Iron',0.528); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(702,153,'Aluminium',0.423); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(703,153,'Iron',0.017); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(704,153,'sct::Torlon',0.006); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(705,153,'sct::PEI',0.2); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(706,153,'Carbon',0.005); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(707,153,'std::Kapton',0.04); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(708,153,'Copper',0.133); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(709,153,'sct::Epoxy',0.018); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(710,153,'sct::Silicone',0.011); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(711,153,'sct::CuKaptonEC',0.001); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(712,153,'sct::CN107',0.139); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(713,153,'sct::Solder',0.002); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(714,153,'std::Polyethylene',0.005); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(715,154,'Aluminium',0.315); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(716,154,'Copper',0.312); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(717,154,'sct::CN107',0.013); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(718,154,'Iron',0.269); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(719,154,'std::Kapton',0.058); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(720,154,'sct::Epoxy',0.026); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(721,154,'std::Polyethylene',0.007); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(270,51,'sct::AlNitride',0.2196); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(271,51,'sct::Elastosil',0.0078); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(272,51,'sct::Epoxy',0.0969); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(273,51,'Aluminium',0.0296); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(274,51,'sct::FR4',0.0898); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(275,51,'sct::Glass',0.2127); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(276,35,'sct::CN107',0.5); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(277,35,'sct::Solder',0.06); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(278,35,'std::C3F8',0.44); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(279,36,'sct::CN107',0.49); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(280,36,'sct::Solder',0.08); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(281,36,'std::C3F8',0.43); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(282,37,'sct::CN107',0.51); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(283,37,'sct::Solder',0.03); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(284,37,'std::C3F8',0.46); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(285,18,'Carbon',0.883); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(286,18,'std::Kapton',0.013); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(287,18,'sct::Epoxy',0.004); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(288,18,'Aluminium',0.02); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(289,18,'Nickel',0.016); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(290,18,'Gold',0.006); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(291,18,'Copper',0.008); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(292,18,'sct::Peek',0.05); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(293,34,'sct::Plastic',0.19); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(294,34,'Copper',0.46); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(295,34,'sct::FR4',0.21); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(296,34,'sct::CuOnAlWire',0.03); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(297,34,'std::Kapton',0.11); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(269,51,'Carbon',0.3436); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(722,155,'Aluminium',0.315); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(723,155,'Copper',0.312); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(724,155,'sct::CN107',0.013); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(725,155,'Iron',0.269); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(726,155,'std::Kapton',0.058); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(727,155,'sct::Epoxy',0.026); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(728,155,'std::Polyethylene',0.007); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(298,62,'sct::Epoxy',0.29); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(299,62,'Silver',0.71); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(300,59,'Carbon',18.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(301,59,'Hydrogen',20.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(302,59,'Oxygen',3.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(303,64,'Carbon',19.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(304,64,'Hydrogen',12.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(305,64,'Oxygen',3.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(306,58,'sct::Epoxy',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(307,60,'sct::Peek',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(308,23,'Carbon',5.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(309,23,'Hydrogen',8.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(310,55,'Tin',0.63); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(311,55,'Lead',0.37); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(312,65,'Beryllium',0.01); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(313,65,'Copper',0.99); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(314,2,'sct::Epoxy',0.3); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(315,2,'Carbon',0.7); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(316,30,'sct::Silica',0.81); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(317,30,'sct::B2O3',0.13); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(318,30,'sct::Na2O',0.04); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(319,30,'sct::Al2O3',0.02); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(320,72,'Boron',2.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(321,72,'Oxygen',3.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(322,73,'Sodium',2.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(323,73,'Oxygen',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(324,56,'sct::Epoxy',0.23); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(325,56,'sct::Glass',0.77); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(326,66,'sct::FR4',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(334,76,'Aluminium',0.1528); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(335,76,'Iron',0.057); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(336,76,'sct::Peek',0.5327); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(337,76,'sct::CFRP',0.2575); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(407,93,'Aluminium',0.0087); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(408,93,'sct::CFRP',0.9913); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(409,94,'Aluminium',0.0086); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(410,94,'sct::CFRP',0.9914); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(411,95,'Aluminium',0.007); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(412,95,'sct::CFRP',0.993); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(413,96,'Aluminium',0.0077); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(414,96,'sct::CFRP',0.9923); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(415,97,'sct::Peek',0.0511); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(416,97,'sct::CFRP',0.9472); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(417,97,'sct::CuAu',0.0017); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(418,98,'sct::Peek',0.0373); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(419,98,'sct::CFRP',0.9616); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(420,98,'sct::CuAu',0.0011); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(421,99,'sct::Peek',0.0311); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(422,99,'sct::CFRP',0.968); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(423,99,'sct::CuAu',0.0009); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(424,100,'sct::Peek',0.0273); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(425,100,'sct::CFRP',0.9719); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(426,100,'sct::CuAu',0.0008); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(427,101,'Aluminium',0.0311); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(428,101,'Copper',0.0347); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(429,101,'sct::Peek',0.6797); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(430,101,'sct::Glass',0.1296); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(431,101,'sct::Plastic',0.0807); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(432,101,'sct::BeCu',0.0442); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(433,102,'Aluminium',0.0297); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(434,102,'Copper',0.0322); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(435,102,'sct::Peek',0.6468); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(436,102,'sct::Glass',0.1537); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(437,102,'sct::Plastic',0.0957); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(438,102,'sct::BeCu',0.0419); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(439,103,'Aluminium',0.0313); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(440,103,'Copper',0.0295); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(441,103,'sct::Peek',0.6211); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(442,103,'sct::Glass',0.172); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(443,103,'sct::Plastic',0.1071); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(444,103,'sct::BeCu',0.039); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(445,104,'Aluminium',0.028); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(446,104,'Copper',0.0285); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(447,104,'sct::Peek',0.5872); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(448,104,'sct::Glass',0.1961); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(449,104,'sct::Plastic',0.1221); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(450,104,'sct::BeCu',0.0381); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(454,106,'Boron',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(455,106,'Nitrogen',1.0); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(456,107,'Epoxy',0.6925); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(457,107,'BoronNitride',0.3075); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(458,108,'Aluminium',0.0435); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(459,108,'Iron',0.0006); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(460,108,'Copper',0.0033); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(461,108,'sct::CN107',0.8631); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(462,108,'sct::Solder',0.0043); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(463,108,'std::Kapton',0.0019); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(464,108,'std::C3F8',0.083); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(465,108,'sct::ThermalGlue',0.0003); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(466,109,'Aluminium',0.043); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(467,109,'Iron',0.0006); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(468,109,'Copper',0.0032); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(469,109,'sct::CN107',0.8646); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(470,109,'sct::Solder',0.0043); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(471,109,'std::Kapton',0.0019); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(472,109,'std::C3F8',0.0821); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(473,109,'sct::ThermalGlue',0.0003); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(474,110,'Aluminium',0.0421); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(475,110,'Iron',0.0006); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(476,110,'Copper',0.0031); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(477,110,'sct::CN107',0.8675); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(478,110,'sct::Solder',0.0042); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(479,110,'std::Kapton',0.0018); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(480,110,'std::C3F8',0.0804); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(481,110,'sct::ThermalGlue',0.0003); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(482,111,'Aluminium',0.041); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(483,111,'Iron',0.0006); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(484,111,'Copper',0.003); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(485,111,'sct::CN107',0.871); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(486,111,'sct::Solder',0.0041); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(487,111,'std::Kapton',0.0018); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(488,111,'std::C3F8',0.0782); +INSERT INTO "SCTMATCOMPONENTS_DATA" VALUES(489,111,'sct::ThermalGlue',0.0003); +DROP TABLE IF EXISTS "SCTMATCOMPONENTS_DATA2TAG"; +CREATE TABLE "SCTMATCOMPONENTS_DATA2TAG" ( "SCTMATCOMPONENTS_TAG_ID" SLONGLONG ,"SCTMATCOMPONENTS_DATA_ID" SLONGLONG ); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,0); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,1); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,2); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,3); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,4); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,5); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,6); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,7); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,8); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,9); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,10); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,11); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,12); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,13); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,14); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,15); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,16); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,17); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,18); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,19); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,20); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,21); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,22); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,23); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,24); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,25); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,26); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,27); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,28); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,29); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,30); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,31); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,32); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,33); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,34); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,35); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,36); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,37); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106560,38); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,2); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,6); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,9); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,10); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,11); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,12); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,13); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,14); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,15); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,16); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,17); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,18); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,19); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,20); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,21); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,22); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,23); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,24); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,25); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,26); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,27); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,28); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,29); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,31); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,32); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,33); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,34); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,35); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,37); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,38); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,39); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,40); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,41); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,42); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,43); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,44); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,45); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,46); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,47); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,48); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,49); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,50); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,51); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,52); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,53); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,54); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,55); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,56); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,57); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,58); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,59); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,60); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,61); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,62); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,63); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,64); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,65); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,66); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,67); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,68); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,69); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,70); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,71); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,72); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,73); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,74); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,75); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,76); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,77); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,78); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,79); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,80); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,81); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,82); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,83); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,84); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,85); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,86); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,87); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,88); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,89); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,90); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,91); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,92); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,93); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,94); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,95); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,96); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,97); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,98); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,99); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,100); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,101); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,102); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,103); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,104); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,105); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,106); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,107); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,108); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,109); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,110); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,111); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,112); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,113); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,114); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,115); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,116); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,117); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,118); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,119); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,120); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,121); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,122); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,123); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,124); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,125); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,126); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,127); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,128); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,129); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,130); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,131); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,132); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,133); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,134); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,135); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,136); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,137); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,138); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,139); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,140); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,141); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,142); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,143); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,144); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,145); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,146); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,147); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,148); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,149); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,150); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,151); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,152); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,153); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,154); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,155); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,156); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,157); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,158); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,159); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,160); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,161); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,162); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,163); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,164); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,165); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,166); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,167); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,168); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,169); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,170); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,171); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,172); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,173); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,174); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,175); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,176); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,177); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,178); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,179); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,180); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,181); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,182); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,183); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,184); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,185); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,186); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,187); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,188); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,189); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,190); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,191); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,192); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,193); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,194); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,195); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,196); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,197); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,198); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,199); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,200); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,201); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,202); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,203); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,204); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,205); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,206); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,207); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,208); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,209); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,210); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,211); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,212); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,213); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,214); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,215); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,216); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,217); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,218); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,219); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,220); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,221); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,222); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,223); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,224); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,225); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,226); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,227); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,228); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,229); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,230); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,231); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,232); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,233); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,234); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,235); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,236); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,237); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,238); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,239); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,240); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,241); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,242); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,243); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,244); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,245); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,246); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,247); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,248); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,249); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,250); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,251); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,252); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,253); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,254); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,255); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,256); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,257); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(106782,258); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,2); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,6); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,9); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,10); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,11); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,12); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,13); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,14); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,15); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,16); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,17); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,18); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,19); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,20); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,21); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,22); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,23); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,24); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,25); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,26); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,27); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,28); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,29); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,31); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,32); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,33); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,34); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,35); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,37); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,38); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,39); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,40); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,41); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,42); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,43); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,44); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,45); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,46); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,47); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,48); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,49); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,50); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,51); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,52); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,53); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,54); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,55); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,56); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,57); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,58); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,59); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,60); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,61); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,62); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,63); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,64); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,65); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,66); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,67); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,68); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,69); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,70); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,71); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,72); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,73); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,74); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,75); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,76); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,77); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,78); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,79); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,80); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,81); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,82); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,83); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,84); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,85); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,86); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,87); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,88); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,89); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,90); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,91); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,92); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,93); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,94); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,95); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,96); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,97); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,98); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,99); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,100); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,101); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,102); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,103); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,104); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,105); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,106); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,107); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,108); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,114); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,115); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,116); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,117); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,118); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,119); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,120); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,121); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,122); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,123); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,124); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,125); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,126); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,127); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,128); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,129); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,130); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,131); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,132); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,133); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,134); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,135); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,136); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,137); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,138); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,139); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,140); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,141); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,142); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,143); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,144); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,145); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,146); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,147); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,148); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,149); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,150); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,151); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,152); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,153); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,154); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,155); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,156); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,157); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,158); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,159); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,160); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,161); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,162); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,163); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,164); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,165); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,166); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,167); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,168); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,169); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,170); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,171); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,172); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,173); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,174); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,175); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,176); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,177); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,178); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,179); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,180); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,181); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,182); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,183); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,184); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,185); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,186); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,187); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,188); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,189); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,190); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,191); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,192); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,193); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,194); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,195); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,196); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,197); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,198); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,199); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,200); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,201); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,202); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,203); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,204); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,205); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,206); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,207); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,208); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,209); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,210); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,211); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,212); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,213); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,214); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,215); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,216); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,217); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,218); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,219); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,220); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,221); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,222); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,223); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,224); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,225); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,231); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,232); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,233); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,234); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,235); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,236); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,237); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,238); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,239); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,240); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,241); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,242); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,243); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,244); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,245); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,246); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,247); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,248); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,249); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,250); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,251); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,252); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,253); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,254); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,255); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,256); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,257); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,258); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,259); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,260); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,261); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,262); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,263); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,264); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,265); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,266); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,267); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107032,268); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,6); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,9); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,10); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,11); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,12); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,13); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,14); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,15); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,16); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,17); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,18); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,19); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,20); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,21); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,22); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,23); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,24); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,25); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,26); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,27); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,28); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,29); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,32); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,33); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,34); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,35); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,37); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,39); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,40); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,41); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,42); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,43); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,44); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,45); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,46); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,47); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,48); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,49); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,50); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,51); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,52); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,53); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,54); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,55); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,56); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,57); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,58); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,59); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,60); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,61); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,62); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,63); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,64); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,65); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,66); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,67); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,68); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,69); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,70); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,71); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,72); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,73); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,74); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,75); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,76); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,77); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,78); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,79); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,80); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,81); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,82); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,83); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,84); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,85); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,86); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,87); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,88); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,89); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,90); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,91); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,92); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,102); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,103); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,104); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,105); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,106); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,107); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,108); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,123); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,124); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,125); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,126); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,127); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,128); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,129); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,130); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,131); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,132); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,133); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,134); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,135); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,136); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,137); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,138); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,139); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,140); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,141); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,142); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,143); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,144); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,145); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,146); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,147); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,148); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,149); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,150); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,151); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,152); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,153); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,154); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,155); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,156); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,157); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,158); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,159); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,160); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,161); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,162); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,163); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,164); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,165); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,166); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,167); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,168); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,169); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,170); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,171); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,172); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,173); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,174); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,175); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,176); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,177); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,178); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,179); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,180); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,181); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,182); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,183); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,184); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,185); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,186); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,187); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,188); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,189); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,190); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,191); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,192); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,193); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,194); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,195); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,196); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,197); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,198); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,199); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,200); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,201); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,202); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,203); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,204); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,205); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,206); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,207); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,215); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,216); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,217); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,218); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,219); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,220); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,221); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,222); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,223); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,224); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,225); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,231); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,232); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,237); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,238); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,244); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,247); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,248); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,254); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,255); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,256); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,257); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,258); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,259); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,260); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,261); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,262); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,263); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,269); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,270); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,271); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,272); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,273); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,274); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,275); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,276); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,277); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,278); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,279); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,280); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,281); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,282); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,283); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,284); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,285); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,286); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,287); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,288); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,289); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,290); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,291); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,292); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,293); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,294); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,295); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,296); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,297); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,298); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,299); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,300); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,301); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,302); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,303); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,304); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,305); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,306); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,307); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,308); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,309); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,310); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,311); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,312); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,313); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,314); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,315); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,316); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,317); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,318); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,319); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,320); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,321); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,322); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,323); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,324); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,325); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107083,326); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,9); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,10); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,13); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,14); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,15); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,16); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,17); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,18); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,19); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,20); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,21); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,22); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,23); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,24); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,25); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,26); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,27); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,32); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,33); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,34); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,35); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,37); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,39); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,40); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,41); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,42); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,43); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,44); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,45); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,46); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,47); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,48); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,49); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,50); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,51); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,52); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,53); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,54); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,55); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,56); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,57); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,58); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,59); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,60); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,61); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,62); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,63); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,64); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,65); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,66); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,67); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,68); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,69); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,102); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,103); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,104); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,105); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,106); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,107); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,108); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,123); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,124); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,125); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,126); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,127); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,128); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,129); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,130); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,131); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,132); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,133); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,134); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,135); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,136); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,137); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,138); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,139); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,140); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,141); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,142); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,143); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,144); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,145); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,146); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,147); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,148); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,149); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,150); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,151); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,152); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,153); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,154); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,155); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,156); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,157); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,158); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,159); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,160); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,161); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,162); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,163); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,164); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,165); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,166); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,167); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,168); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,169); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,170); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,171); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,172); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,173); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,174); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,175); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,176); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,177); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,178); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,179); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,180); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,181); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,182); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,183); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,184); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,185); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,186); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,187); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,188); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,189); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,190); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,191); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,192); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,193); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,194); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,195); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,196); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,197); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,198); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,199); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,200); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,201); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,202); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,203); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,204); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,205); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,206); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,207); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,215); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,216); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,217); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,218); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,219); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,220); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,221); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,222); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,223); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,224); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,225); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,231); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,232); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,237); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,238); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,244); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,247); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,248); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,254); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,255); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,256); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,257); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,259); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,260); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,261); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,262); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,263); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,269); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,270); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,271); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,272); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,273); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,274); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,275); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,276); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,277); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,278); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,279); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,280); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,281); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,282); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,283); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,284); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,285); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,286); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,287); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,288); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,289); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,290); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,291); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,292); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,293); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,294); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,295); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,296); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,297); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,298); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,299); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,300); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,301); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,302); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,303); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,304); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,305); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,306); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,307); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,308); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,309); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,310); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,311); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,312); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,313); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,314); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,315); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,316); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,317); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,318); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,319); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,320); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,321); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,322); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,323); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,324); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,325); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,326); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,329); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,330); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,331); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,332); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,333); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,334); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,335); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,336); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,337); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,338); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,339); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,340); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,341); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,342); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,343); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,344); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,345); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,346); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,347); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,348); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,349); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,350); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,351); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,352); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,353); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,354); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,355); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,356); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,357); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,358); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,359); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,360); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,361); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,362); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,407); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,408); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,409); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,410); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,411); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,412); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,413); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,414); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,415); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,416); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,417); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,418); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,419); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,420); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,421); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,422); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,423); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,424); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,425); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,426); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,427); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,428); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,429); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,430); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,431); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,432); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,433); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,434); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,435); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,436); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,437); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,438); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,439); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,440); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,441); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,442); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,443); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,444); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,445); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,446); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,447); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,448); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,449); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,450); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,451); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,452); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,453); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,454); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,455); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,458); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,459); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,460); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,461); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,462); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,463); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,464); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,465); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,466); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,467); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,468); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,469); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,470); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,471); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,472); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,473); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,474); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,475); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,476); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,477); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,478); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,479); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,480); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,481); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,482); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,483); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,484); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,485); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,486); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,487); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,488); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,489); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,490); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,491); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,492); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,493); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,494); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,495); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,496); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,497); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,498); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,499); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,500); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,501); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,502); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,503); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,504); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,505); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,506); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,507); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,508); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,509); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,510); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,511); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,512); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,513); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,514); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,515); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,516); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,517); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,518); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,519); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,520); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,521); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,522); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,523); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,524); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,533); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,534); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,535); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,536); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,537); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,538); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,540); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,541); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,542); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,543); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,544); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,545); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,546); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,547); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,548); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,549); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,551); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,552); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,553); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,554); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,558); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,559); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,560); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,561); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,562); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,563); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,564); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,565); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,566); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,567); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,569); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,571); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,572); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,573); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,574); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,575); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,576); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,577); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,578); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,579); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,580); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,581); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,582); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,583); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,584); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,585); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,586); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,587); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,588); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,589); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,590); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,591); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,592); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,593); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,594); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,595); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,596); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,597); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,598); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,599); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,600); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,601); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,602); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,603); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,604); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,605); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,606); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,607); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,608); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,609); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,610); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,611); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,612); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,613); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,614); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,615); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,616); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,617); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,618); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,619); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,620); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,621); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,622); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,623); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,624); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,625); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,626); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,627); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,628); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,629); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,631); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,632); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,633); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,635); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,637); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,638); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,639); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,640); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,641); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,642); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,643); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,644); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,645); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,646); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,648); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,649); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,650); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,662); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,663); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,664); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,665); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,666); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,667); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,668); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,669); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,670); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,671); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,672); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,673); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,674); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,676); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,677); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,678); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,679); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,680); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,681); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,682); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,683); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,684); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,685); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,686); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,687); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,688); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,689); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,690); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,691); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,692); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,693); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,694); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,695); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,696); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,697); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,698); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,699); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,700); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,701); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,702); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,703); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,704); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,705); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,706); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,707); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,708); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,709); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,710); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,711); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,712); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,713); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,714); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,722); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,723); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,724); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,725); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,726); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,727); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,728); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,729); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,730); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,731); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,732); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,733); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,734); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,735); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,736); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,737); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,738); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,739); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,740); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,741); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,742); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,744); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,745); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,746); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,747); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,748); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,749); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107129,750); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,9); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,10); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,13); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,14); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,15); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,16); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,17); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,18); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,19); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,20); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,21); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,22); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,23); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,24); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,25); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,26); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,27); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,32); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,33); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,34); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,35); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,37); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,39); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,40); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,41); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,42); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,43); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,44); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,45); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,46); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,47); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,48); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,49); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,50); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,51); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,52); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,53); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,54); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,55); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,56); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,57); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,58); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,59); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,60); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,61); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,62); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,63); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,64); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,65); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,66); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,67); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,68); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,69); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,102); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,103); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,104); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,105); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,106); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,107); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,108); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,123); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,124); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,125); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,126); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,127); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,128); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,129); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,130); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,131); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,132); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,133); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,134); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,135); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,136); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,137); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,138); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,139); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,140); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,141); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,142); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,143); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,144); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,145); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,146); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,147); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,148); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,149); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,150); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,151); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,152); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,153); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,154); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,155); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,156); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,157); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,158); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,159); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,160); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,161); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,162); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,163); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,164); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,165); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,166); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,167); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,168); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,169); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,170); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,171); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,172); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,173); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,174); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,175); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,176); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,177); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,178); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,179); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,180); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,181); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,182); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,183); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,184); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,185); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,186); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,187); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,188); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,189); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,190); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,191); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,192); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,193); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,194); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,195); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,196); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,197); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,198); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,199); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,200); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,201); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,202); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,203); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,204); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,205); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,206); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,207); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,215); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,216); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,217); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,218); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,219); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,220); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,221); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,222); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,223); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,224); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,225); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,231); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,232); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,237); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,238); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,244); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,247); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,248); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,254); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,255); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,256); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,257); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,259); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,260); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,261); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,262); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,263); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,269); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,270); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,271); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,272); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,273); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,274); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,275); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,276); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,277); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,278); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,279); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,280); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,281); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,282); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,283); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,284); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,285); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,286); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,287); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,288); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,289); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,290); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,291); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,292); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,293); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,294); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,295); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,296); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,297); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,298); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,299); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,300); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,301); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,302); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,303); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,304); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,305); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,306); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,307); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,308); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,309); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,310); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,311); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,312); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,313); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,314); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,315); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,316); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,317); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,318); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,319); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,320); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,321); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,322); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,323); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,324); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,325); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,326); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,329); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,330); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,331); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,332); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,333); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,334); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,335); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,336); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,337); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,338); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,339); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,340); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,341); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,342); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,343); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,344); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,345); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,346); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,347); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,348); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,349); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,350); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,351); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,352); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,353); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,354); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,355); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,356); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,357); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,358); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,359); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,360); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,361); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,362); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,407); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,408); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,409); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,410); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,411); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,412); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,413); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,414); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,415); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,416); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,417); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,418); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,419); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,420); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,421); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,422); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,423); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,424); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,425); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,426); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,427); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,428); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,429); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,430); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,431); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,432); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,433); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,434); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,435); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,436); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,437); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,438); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,439); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,440); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,441); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,442); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,443); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,444); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,445); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,446); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,447); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,448); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,449); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,450); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,451); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,452); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,453); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,454); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,455); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,458); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,459); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,460); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,461); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,462); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,463); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,464); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,465); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,466); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,467); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,468); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,469); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,470); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,471); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,472); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,473); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,474); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,475); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,476); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,477); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,478); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,479); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,480); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,481); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,482); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,483); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,484); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,485); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,486); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,487); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,488); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,489); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,490); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,491); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,492); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,493); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,494); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,495); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,496); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,497); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,498); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,499); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,500); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,501); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,502); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,503); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,504); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,505); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,506); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,507); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,508); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,509); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,510); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,511); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,512); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,513); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,514); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,515); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,516); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,517); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,518); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,519); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,520); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,521); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,522); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,523); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,524); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,533); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,534); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,535); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,536); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,537); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,538); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,540); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,541); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,542); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,543); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,544); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,545); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,546); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,547); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,548); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,549); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,551); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,552); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,553); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,554); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,558); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,559); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,560); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,561); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,562); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,563); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,564); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,565); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,566); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,567); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,569); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,571); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,572); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,573); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,574); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,575); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,576); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,577); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,578); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,579); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,580); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,581); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,582); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,583); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,584); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,585); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,586); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,587); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,588); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,589); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,590); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,591); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,592); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,593); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,594); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,595); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,596); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,597); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,598); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,599); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,600); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,601); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,602); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,603); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,604); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,615); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,616); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,617); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,618); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,619); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,620); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,621); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,622); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,623); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,624); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,625); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,626); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,627); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,628); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,629); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,631); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,632); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,633); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,641); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,642); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,643); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,644); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,645); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,646); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,648); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,649); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,650); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,662); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,663); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,664); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,665); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,666); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,667); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,668); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,669); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,670); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,671); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,672); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,674); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,676); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,677); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,678); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,679); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,680); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,681); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,682); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,683); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,684); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,685); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,686); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,687); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,688); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,689); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,690); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,691); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,692); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,693); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,694); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,695); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,696); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,697); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,698); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,699); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,700); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,701); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,729); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,730); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,731); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,732); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,733); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,734); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,735); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,736); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,737); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,738); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,739); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,740); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,741); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,742); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,744); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,745); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,746); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,747); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,748); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,749); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,750); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,751); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,752); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,753); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,754); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,755); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,756); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,757); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,758); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,759); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,760); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,768); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,769); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,770); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,771); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,772); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,773); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,774); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,775); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,776); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,777); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,778); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,779); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,780); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,781); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,782); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,783); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,784); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,785); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,786); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,787); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,788); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,789); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,790); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,791); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,792); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,793); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,794); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,795); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,796); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,797); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,798); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,799); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,800); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,801); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,802); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,803); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,804); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,805); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,806); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,807); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,808); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,809); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,810); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,811); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,812); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,813); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,814); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,815); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,816); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,817); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,818); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,819); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,820); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,821); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,822); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,823); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,824); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,825); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,826); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,827); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,828); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,829); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,830); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,831); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,832); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,833); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,834); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,835); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,836); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,837); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,838); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,839); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,840); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,841); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,842); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,843); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,844); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,845); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,846); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,849); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,850); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,851); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,852); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,853); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,854); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,855); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,856); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,857); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,858); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,859); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,860); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,861); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,862); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,863); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,864); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,865); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,866); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,867); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,868); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,869); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,870); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,871); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,872); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,873); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,874); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,875); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,876); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,877); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,878); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,879); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,880); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,881); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,882); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,883); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,884); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,885); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,886); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,887); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,888); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,889); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,890); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,891); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,892); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,893); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,894); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,895); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,896); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,897); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,898); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,899); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,900); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,901); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,902); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,903); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,904); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107337,905); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,9); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,10); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,13); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,14); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,15); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,16); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,17); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,18); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,19); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,20); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,21); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,22); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,23); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,24); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,25); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,26); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,27); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,32); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,33); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,34); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,35); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,37); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,39); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,40); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,41); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,42); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,43); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,44); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,45); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,46); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,47); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,48); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,49); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,50); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,51); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,52); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,53); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,54); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,55); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,56); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,57); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,58); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,59); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,60); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,61); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,62); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,63); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,64); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,65); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,66); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,67); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,68); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,69); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,102); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,103); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,104); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,105); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,106); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,107); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,108); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,123); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,124); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,125); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,126); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,127); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,128); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,129); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,130); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,131); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,132); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,133); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,134); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,135); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,136); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,137); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,138); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,139); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,140); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,141); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,142); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,143); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,144); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,145); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,146); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,147); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,148); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,149); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,150); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,151); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,152); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,153); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,154); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,155); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,156); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,157); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,158); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,159); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,160); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,161); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,162); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,163); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,164); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,165); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,166); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,167); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,168); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,169); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,170); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,171); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,172); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,173); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,174); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,175); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,176); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,177); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,178); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,179); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,180); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,181); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,182); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,183); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,184); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,185); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,186); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,187); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,188); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,189); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,190); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,191); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,192); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,193); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,194); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,195); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,196); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,197); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,198); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,199); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,200); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,201); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,202); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,203); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,204); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,205); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,206); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,207); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,215); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,216); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,217); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,218); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,219); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,220); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,221); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,222); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,223); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,224); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,225); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,231); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,232); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,237); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,238); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,244); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,247); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,248); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,254); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,255); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,256); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,257); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,259); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,260); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,261); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,262); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,263); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,269); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,270); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,271); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,272); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,273); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,274); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,275); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,276); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,277); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,278); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,279); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,280); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,281); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,282); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,283); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,284); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,285); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,286); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,287); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,288); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,289); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,290); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,291); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,292); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,293); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,294); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,295); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,296); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,297); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,298); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,299); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,300); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,301); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,302); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,303); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,304); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,305); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,306); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,307); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,308); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,309); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,310); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,311); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,312); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,313); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,314); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,315); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,316); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,317); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,318); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,319); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,320); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,321); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,322); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,323); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,324); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,325); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,326); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,329); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,330); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,331); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,332); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,333); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,334); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,335); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,336); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,337); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,338); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,339); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,340); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,341); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,342); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,343); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,344); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,345); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,346); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,347); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,348); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,349); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,350); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,351); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,352); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,353); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,354); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,355); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,356); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,357); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,358); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,359); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,360); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,361); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,362); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,407); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,408); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,409); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,410); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,411); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,412); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,413); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,414); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,415); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,416); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,417); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,418); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,419); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,420); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,421); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,422); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,423); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,424); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,425); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,426); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,427); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,428); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,429); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,430); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,431); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,432); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,433); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,434); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,435); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,436); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,437); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,438); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,439); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,440); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,441); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,442); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,443); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,444); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,445); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,446); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,447); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,448); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,449); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,450); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,451); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,452); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,453); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,454); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,455); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,458); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,459); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,460); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,461); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,462); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,463); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,464); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,465); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,466); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,467); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,468); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,469); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,470); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,471); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,472); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,473); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,474); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,475); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,476); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,477); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,478); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,479); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,480); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,481); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,482); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,483); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,484); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,485); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,486); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,487); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,488); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,489); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,490); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,491); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,492); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,493); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,494); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,495); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,496); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,497); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,498); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,499); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,500); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,501); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,502); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,503); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,504); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,505); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,506); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,507); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,508); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,509); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,510); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,511); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,512); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,513); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,514); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,515); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,516); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,517); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,518); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,519); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,520); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,521); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,522); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,523); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,524); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,533); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,534); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,535); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,536); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,537); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,538); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,540); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,541); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,542); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,543); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,544); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,545); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,546); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,547); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,548); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,549); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,551); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,552); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,553); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,554); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,558); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,559); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,560); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,561); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,562); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,563); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,564); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,565); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,566); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,567); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,569); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,571); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,572); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,573); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,574); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,575); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,576); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,577); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,578); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,579); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,580); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,581); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,582); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,583); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,584); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,585); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,586); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,587); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,588); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,589); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,604); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,615); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,616); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,617); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,618); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,619); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,620); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,621); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,622); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,623); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,624); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,625); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,626); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,627); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,628); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,629); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,631); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,632); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,633); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,641); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,642); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,643); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,644); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,645); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,646); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,648); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,649); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,650); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,662); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,663); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,664); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,665); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,666); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,667); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,668); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,669); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,670); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,671); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,672); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,674); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,676); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,677); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,678); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,679); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,680); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,681); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,682); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,683); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,684); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,685); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,692); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,693); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,694); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,695); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,696); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,697); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,698); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,699); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,700); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,701); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,729); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,730); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,731); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,732); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,733); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,734); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,735); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,736); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,737); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,738); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,739); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,740); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,741); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,742); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,744); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,745); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,746); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,747); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,748); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,749); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,750); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,751); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,752); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,753); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,754); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,755); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,756); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,757); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,758); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,759); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,760); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,768); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,769); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,770); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,771); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,772); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,773); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,774); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,775); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,776); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,777); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,778); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,779); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,780); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,781); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,782); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,783); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,784); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,785); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,786); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,787); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,788); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,789); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,790); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,791); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,792); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,793); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,794); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,795); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,796); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,797); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,798); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,799); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,800); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,801); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,802); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,803); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,804); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,805); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,806); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,807); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,808); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,809); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,810); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,811); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,812); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,813); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,814); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,815); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,816); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,817); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,818); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,819); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,820); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,821); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,822); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,823); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,824); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,825); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,826); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,827); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,828); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,829); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,830); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,831); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,832); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,833); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,834); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,835); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,836); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,837); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,838); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,844); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,845); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,846); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,849); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,850); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,851); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,852); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,853); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,854); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,855); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,856); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,857); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,858); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,859); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,860); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,861); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,862); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,863); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,864); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,865); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,866); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,867); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,868); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,869); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,870); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,871); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,872); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,873); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,874); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,875); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,876); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,877); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,878); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,879); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,880); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,881); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,882); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,883); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,884); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,885); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,886); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,887); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,888); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,889); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,890); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,891); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,892); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,893); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,894); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,895); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,896); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,897); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,898); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,899); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,900); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,901); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,902); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,903); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,904); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,905); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,906); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,907); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,908); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,909); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,910); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,911); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,912); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,913); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,914); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,915); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,916); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,917); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,918); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,919); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,920); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,921); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,922); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,923); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,924); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,925); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,926); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,927); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,928); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,929); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,930); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,931); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,932); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,933); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,934); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,935); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107453,936); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,9); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,10); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,13); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,14); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,15); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,16); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,17); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,18); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,19); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,20); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,21); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,22); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,23); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,24); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,25); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,26); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,27); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,32); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,33); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,34); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,35); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,37); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,39); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,40); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,41); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,42); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,43); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,44); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,45); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,46); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,47); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,48); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,49); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,50); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,51); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,52); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,53); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,54); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,55); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,56); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,57); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,58); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,59); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,60); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,61); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,62); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,63); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,64); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,65); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,66); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,67); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,68); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,69); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,102); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,103); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,104); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,105); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,106); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,107); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,108); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,123); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,124); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,125); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,126); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,127); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,128); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,129); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,130); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,131); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,132); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,133); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,134); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,135); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,136); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,137); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,138); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,139); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,140); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,141); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,142); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,143); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,144); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,145); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,146); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,147); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,148); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,149); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,150); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,151); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,152); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,153); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,154); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,155); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,156); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,157); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,158); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,159); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,160); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,161); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,162); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,163); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,164); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,165); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,166); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,167); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,168); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,169); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,170); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,171); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,172); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,173); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,174); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,175); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,176); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,177); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,178); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,179); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,180); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,181); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,182); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,183); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,184); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,185); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,186); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,187); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,188); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,189); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,190); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,191); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,192); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,193); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,194); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,195); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,196); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,197); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,198); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,199); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,200); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,201); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,202); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,203); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,204); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,205); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,206); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,207); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,215); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,216); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,217); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,218); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,219); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,220); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,221); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,222); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,223); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,224); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,225); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,231); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,232); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,237); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,238); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,244); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,247); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,248); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,254); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,255); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,256); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,257); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,259); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,260); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,261); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,262); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,263); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,269); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,270); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,271); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,272); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,273); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,274); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,275); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,276); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,277); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,278); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,279); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,280); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,281); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,282); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,283); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,284); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,285); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,286); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,287); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,288); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,289); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,290); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,291); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,292); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,293); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,294); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,295); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,296); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,297); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,298); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,299); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,300); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,301); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,302); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,303); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,304); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,305); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,306); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,307); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,308); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,309); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,310); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,311); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,312); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,313); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,314); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,315); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,316); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,317); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,318); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,319); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,320); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,321); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,322); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,323); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,324); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,325); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,326); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,329); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,330); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,331); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,332); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,333); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,334); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,335); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,336); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,337); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,338); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,339); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,340); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,341); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,342); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,343); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,344); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,345); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,346); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,347); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,348); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,349); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,350); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,351); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,352); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,353); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,354); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,355); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,356); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,357); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,358); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,359); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,360); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,361); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,362); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,407); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,408); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,409); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,410); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,411); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,412); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,413); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,414); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,415); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,416); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,417); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,418); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,419); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,420); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,421); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,422); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,423); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,424); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,425); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,426); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,427); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,428); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,429); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,430); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,431); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,432); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,433); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,434); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,435); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,436); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,437); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,438); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,439); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,440); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,441); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,442); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,443); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,444); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,445); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,446); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,447); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,448); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,449); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,450); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,451); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,452); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,453); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,454); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,455); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,458); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,459); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,460); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,461); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,462); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,463); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,464); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,465); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,466); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,467); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,468); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,469); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,470); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,471); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,472); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,473); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,474); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,475); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,476); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,477); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,478); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,479); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,480); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,481); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,482); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,483); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,484); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,485); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,486); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,487); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,488); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,489); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,490); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,491); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,492); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,493); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,494); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,495); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,496); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,497); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,498); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,499); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,500); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,501); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,502); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,503); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,504); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,505); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,506); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,507); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,508); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,509); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,510); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,511); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,512); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,513); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,514); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,515); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,516); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,517); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,518); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,519); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,520); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,521); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,522); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,523); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,524); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,533); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,534); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,535); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,536); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,537); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,538); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,540); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,541); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,542); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,543); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,544); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,545); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,546); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,547); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,548); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,549); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,551); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,552); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,553); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,554); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,558); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,559); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,560); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,561); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,562); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,563); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,564); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,565); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,566); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,567); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,569); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,571); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,572); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,573); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,574); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,575); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,576); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,577); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,578); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,579); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,580); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,581); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,582); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,583); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,584); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,585); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,586); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,587); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,588); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,589); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,604); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,615); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,616); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,617); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,618); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,619); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,620); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,621); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,622); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,623); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,624); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,625); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,626); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,627); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,628); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,629); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,631); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,632); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,633); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,641); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,642); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,643); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,644); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,645); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,646); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,648); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,649); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,650); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,662); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,663); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,664); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,665); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,666); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,667); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,668); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,669); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,670); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,671); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,672); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,674); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,676); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,677); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,678); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,679); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,680); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,681); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,682); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,683); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,684); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,685); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,692); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,693); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,694); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,695); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,696); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,697); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,698); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,699); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,700); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,701); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,729); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,730); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,731); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,732); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,733); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,734); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,735); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,736); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,737); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,738); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,739); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,740); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,741); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,742); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,744); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,745); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,746); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,747); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,748); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,749); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,750); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,751); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,752); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,753); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,754); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,755); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,756); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,757); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,758); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,759); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,760); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,768); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,769); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,770); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,771); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,772); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,773); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,774); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,775); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,776); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,777); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,778); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,779); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,780); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,781); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,782); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,783); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,784); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,785); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,786); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,787); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,788); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,789); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,790); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,791); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,792); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,793); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,794); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,795); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,796); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,797); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,798); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,799); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,800); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,801); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,802); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,803); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,804); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,805); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,806); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,807); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,808); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,809); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,810); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,811); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,812); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,813); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,814); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,815); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,816); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,817); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,818); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,819); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,820); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,821); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,822); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,823); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,824); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,825); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,826); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,827); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,828); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,829); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,830); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,831); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,832); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,833); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,834); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,835); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,836); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,837); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,838); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,844); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,845); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,846); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,849); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,850); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,851); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,852); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,853); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,854); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,855); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,856); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,857); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,858); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,859); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,860); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,861); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,862); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,863); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,864); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,865); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,866); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,867); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,868); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,869); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,870); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,871); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,872); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,873); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,874); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,875); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,876); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,877); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,878); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,879); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,880); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,881); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,882); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,883); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,884); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,885); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,886); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,887); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,888); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,889); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,890); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,891); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,892); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,893); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,894); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,895); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,896); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,897); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,898); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,899); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,900); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,901); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,902); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,903); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,904); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,905); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,906); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,907); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,908); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,909); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,910); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,911); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,912); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,913); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,914); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,915); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,916); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,917); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,918); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,919); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,920); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,921); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,922); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,923); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,924); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,925); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,926); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,927); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,928); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,929); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,930); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,931); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,932); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,933); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,934); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,935); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,936); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,937); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,938); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,939); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,940); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,941); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,942); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,943); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,944); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,945); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,946); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,947); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,948); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,949); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,950); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,951); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,952); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,953); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,954); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,955); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,956); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,957); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,958); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,959); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(107778,960); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,9); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,10); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,13); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,16); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,39); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,40); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,41); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,42); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,43); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,44); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,45); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,46); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,47); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,48); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,49); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,50); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,51); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,52); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,53); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,54); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,55); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,56); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,57); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,58); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,59); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,60); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,61); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,62); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,63); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,64); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,65); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,66); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,67); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,68); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,69); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,102); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,103); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,104); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,105); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,194); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,195); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,196); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,197); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,198); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,199); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,200); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,201); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,202); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,203); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,204); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,205); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,206); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,207); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,215); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,216); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,217); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,218); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,219); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,220); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,221); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,222); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,223); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,224); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,225); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,231); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,232); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,237); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,238); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,244); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,247); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,248); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,254); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,255); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,256); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,257); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,269); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,270); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,271); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,272); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,273); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,274); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,275); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,285); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,286); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,287); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,288); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,289); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,290); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,291); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,292); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,298); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,299); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,300); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,301); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,302); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,303); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,304); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,305); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,306); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,307); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,308); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,309); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,310); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,311); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,312); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,313); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,314); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,315); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,316); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,317); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,318); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,319); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,320); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,321); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,322); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,323); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,324); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,325); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,326); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,329); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,330); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,331); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,332); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,333); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,334); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,335); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,338); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,339); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,340); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,341); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,342); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,343); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,344); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,345); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,346); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,347); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,348); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,349); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,350); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,351); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,352); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,353); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,354); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,355); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,356); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,357); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,358); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,359); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,360); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,361); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,362); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,451); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,452); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,453); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,454); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,455); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,490); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,491); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,498); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,499); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,500); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,501); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,564); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,565); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,566); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,567); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,569); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,604); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,676); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,677); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,678); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,679); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,680); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,681); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,684); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,685); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,768); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,769); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,770); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,771); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,833); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,834); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,835); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,836); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,837); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,838); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,2000); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,2001); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,2002); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,2003); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,2004); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,2005); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,2006); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,2007); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108571,2008); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,9); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,10); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,13); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,16); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,39); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,40); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,41); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,42); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,43); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,44); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,45); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,46); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,47); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,48); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,49); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,50); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,51); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,52); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,53); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,54); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,55); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,56); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,57); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,58); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,59); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,60); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,61); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,62); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,63); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,64); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,65); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,66); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,67); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,68); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,69); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,102); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,103); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,104); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,105); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,194); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,195); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,196); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,197); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,198); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,199); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,200); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,201); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,202); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,203); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,204); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,205); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,206); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,207); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,215); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,216); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,217); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,218); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,219); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,220); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,221); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,222); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,223); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,224); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,225); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,231); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,232); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,237); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,238); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,244); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,247); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,248); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,254); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,255); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,256); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,257); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,269); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,270); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,271); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,272); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,273); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,274); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,275); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,285); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,286); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,287); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,288); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,289); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,290); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,291); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,292); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,298); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,299); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,300); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,301); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,302); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,303); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,304); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,305); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,306); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,307); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,308); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,309); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,310); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,311); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,312); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,313); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,314); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,315); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,316); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,317); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,318); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,319); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,320); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,321); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,322); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,323); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,324); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,325); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,326); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,329); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,330); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,331); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,332); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,333); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,334); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,335); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,338); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,339); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,340); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,341); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,342); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,343); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,344); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,345); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,346); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,347); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,348); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,349); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,350); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,351); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,352); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,353); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,354); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,355); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,356); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,357); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,358); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,359); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,360); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,361); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,362); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,451); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,452); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,453); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,454); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,455); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,490); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,491); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,498); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,499); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,500); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,501); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,564); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,565); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,566); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,567); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,569); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,604); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,676); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,677); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,678); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,679); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,680); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,681); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,684); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,685); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,768); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,769); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,770); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,771); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,833); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,834); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,835); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,836); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,837); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,838); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,2005); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,2006); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,2007); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,2008); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,2009); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,2010); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,2011); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,2012); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108823,2013); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,9); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,10); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,13); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,14); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,15); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,16); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,17); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,18); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,19); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,20); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,21); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,22); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,23); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,24); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,25); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,26); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,27); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,32); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,33); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,34); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,35); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,37); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,39); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,40); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,41); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,42); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,43); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,44); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,45); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,46); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,47); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,48); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,49); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,50); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,51); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,52); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,53); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,54); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,55); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,56); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,57); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,58); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,59); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,60); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,61); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,62); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,63); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,64); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,65); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,66); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,67); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,68); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,69); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,102); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,103); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,104); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,105); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,106); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,107); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,108); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,123); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,124); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,125); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,126); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,127); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,128); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,129); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,130); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,131); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,132); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,133); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,134); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,135); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,136); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,137); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,138); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,139); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,140); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,141); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,142); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,143); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,144); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,145); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,146); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,147); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,148); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,149); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,150); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,151); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,152); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,153); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,154); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,155); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,156); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,157); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,158); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,159); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,160); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,161); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,162); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,163); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,164); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,165); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,166); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,167); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,168); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,169); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,170); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,171); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,172); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,173); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,174); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,175); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,176); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,177); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,178); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,179); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,180); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,181); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,182); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,183); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,184); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,185); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,186); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,187); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,188); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,189); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,190); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,191); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,192); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,193); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,194); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,195); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,196); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,197); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,198); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,199); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,200); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,201); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,202); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,203); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,204); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,205); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,206); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,207); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,215); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,216); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,217); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,218); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,219); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,220); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,221); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,222); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,223); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,224); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,225); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,231); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,232); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,237); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,238); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,244); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,247); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,248); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,254); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,255); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,256); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,257); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,259); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,260); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,261); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,262); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,263); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,269); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,270); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,271); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,272); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,273); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,274); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,275); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,276); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,277); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,278); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,279); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,280); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,281); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,282); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,283); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,284); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,285); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,286); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,287); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,288); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,289); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,290); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,291); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,292); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,293); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,294); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,295); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,296); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,297); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,298); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,299); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,300); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,301); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,302); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,303); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,304); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,305); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,306); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,307); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,308); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,309); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,310); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,311); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,312); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,313); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,314); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,315); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,316); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,317); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,318); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,319); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,320); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,321); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,322); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,323); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,324); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,325); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,326); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,329); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,330); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,331); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,332); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,333); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,334); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,335); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,336); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,337); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,338); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,339); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,340); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,341); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,342); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,343); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,344); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,345); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,346); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,347); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,348); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,349); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,350); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,351); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,352); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,353); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,354); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,355); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,356); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,357); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,358); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,359); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,360); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,361); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,362); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,407); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,408); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,409); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,410); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,411); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,412); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,413); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,414); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,415); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,416); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,417); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,418); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,419); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,420); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,421); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,422); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,423); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,424); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,425); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,426); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,427); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,428); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,429); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,430); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,431); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,432); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,433); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,434); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,435); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,436); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,437); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,438); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,439); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,440); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,441); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,442); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,443); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,444); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,445); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,446); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,447); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,448); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,449); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,450); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,451); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,452); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,453); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,454); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,455); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,458); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,459); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,460); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,461); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,462); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,463); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,464); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,465); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,466); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,467); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,468); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,469); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,470); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,471); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,472); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,473); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,474); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,475); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,476); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,477); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,478); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,479); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,480); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,481); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,482); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,483); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,484); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,485); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,486); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,487); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,488); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,489); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,490); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,491); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,492); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,493); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,494); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,495); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,496); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,497); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,498); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,499); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,500); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,501); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,502); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,503); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,504); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,505); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,506); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,507); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,508); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,509); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,510); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,511); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,512); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,513); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,514); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,515); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,516); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,517); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,518); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,519); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,520); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,521); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,522); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,523); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,524); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,533); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,534); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,535); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,536); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,537); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,538); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,540); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,541); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,542); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,543); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,544); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,545); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,546); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,547); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,548); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,549); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,551); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,552); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,553); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,554); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,558); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,559); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,560); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,561); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,562); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,563); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,564); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,565); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,566); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,567); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,569); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,571); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,572); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,573); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,574); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,575); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,576); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,577); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,578); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,579); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,580); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,581); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,582); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,583); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,584); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,585); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,586); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,587); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,588); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,589); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,604); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,615); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,616); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,617); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,618); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,619); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,620); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,621); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,622); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,623); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,624); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,625); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,626); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,627); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,628); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,629); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,631); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,632); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,633); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,641); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,642); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,643); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,644); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,645); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,646); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,648); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,649); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,650); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,662); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,663); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,664); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,665); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,666); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,667); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,668); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,669); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,670); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,671); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,672); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,674); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,676); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,677); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,678); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,679); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,680); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,681); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,682); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,683); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,684); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,685); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,692); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,693); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,694); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,695); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,696); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,697); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,698); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,699); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,700); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,701); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,729); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,730); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,731); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,732); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,733); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,734); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,735); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,736); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,737); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,738); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,739); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,740); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,741); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,742); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,744); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,745); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,746); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,747); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,748); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,749); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,750); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,751); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,752); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,753); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,754); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,755); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,756); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,757); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,758); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,759); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,760); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,768); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,769); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,770); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,771); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,772); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,773); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,774); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,775); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,776); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,777); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,778); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,779); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,780); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,781); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,782); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,783); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,784); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,785); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,786); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,787); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,788); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,789); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,790); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,791); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,792); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,793); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,794); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,795); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,796); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,797); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,798); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,799); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,800); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,801); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,802); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,803); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,804); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,805); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,806); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,807); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,808); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,809); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,810); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,811); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,812); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,813); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,814); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,815); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,816); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,817); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,818); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,819); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,820); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,821); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,822); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,823); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,824); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,825); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,826); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,827); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,828); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,829); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,830); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,831); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,832); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,833); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,834); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,835); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,836); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,837); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,838); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,844); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,845); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,846); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,849); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,850); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,851); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,852); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,853); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,854); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,855); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,856); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,857); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,858); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,859); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,860); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,861); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,862); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,863); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,864); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,865); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,866); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,867); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,868); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,869); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,870); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,871); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,872); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,873); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,874); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,875); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,876); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,877); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,878); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,879); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,880); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,881); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,882); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,883); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,884); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,885); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,886); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,887); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,888); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,889); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,890); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,891); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,892); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,893); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,894); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,895); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,896); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,897); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,898); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,899); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,900); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,901); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,902); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,903); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,904); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,905); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,911); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,912); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,913); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,914); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,915); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,916); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,917); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,918); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,919); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,920); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,921); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,922); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,923); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,924); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,925); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,926); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,927); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,928); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,929); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,930); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,931); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,932); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,933); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,934); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,935); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,936); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,937); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,938); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,939); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,940); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,941); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,942); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,943); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,944); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,945); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,946); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,947); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,948); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,949); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,950); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,951); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,952); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,953); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,954); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,955); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,956); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,957); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,958); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,959); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,960); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,961); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,962); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,963); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,964); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,965); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,966); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,967); +INSERT INTO "SCTMATCOMPONENTS_DATA2TAG" VALUES(108841,968); +DROP TABLE IF EXISTS "SCTMATERIALS_DATA"; +CREATE TABLE "SCTMATERIALS_DATA" ( "SCTMATERIALS_DATA_ID" SLONGLONG ,"NAME" TEXT ,"DENSITY" DOUBLE , UNIQUE ( "SCTMATERIALS_DATA_ID" ) ); +INSERT INTO "SCTMATERIALS_DATA" VALUES(34,'ModuleConnBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(35,'DiscCoolOutBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(36,'DiscCoolMidBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(37,'DiscCoolInnBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(38,'CoolBlkMHiBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(39,'CoolBlkMLoBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(40,'CoolBlkSHiBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(41,'CoolBlkSLoBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(42,'FSIBHBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(43,'FSIBLBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(44,'FSIFHBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(45,'FSIFLBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(46,'PPF0eBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(47,'PPF0oBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(48,'PPF0cBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(49,'FwdSpineOutBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(50,'FwdSpineMidBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(51,'FwdSpineInnBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(52,'FwdHybridBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(124,'DiscFixBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(188,'FwdCryCool2Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(0,'Hybrid',3.97); +INSERT INTO "SCTMATERIALS_DATA" VALUES(1,'TPG',2.247); +INSERT INTO "SCTMATERIALS_DATA" VALUES(2,'CFRP',1.78); +INSERT INTO "SCTMATERIALS_DATA" VALUES(3,'Bracket',1.48); +INSERT INTO "SCTMATERIALS_DATA" VALUES(4,'CopperKapton',5.19); +INSERT INTO "SCTMATERIALS_DATA" VALUES(5,'CoolingBlock',3.25); +INSERT INTO "SCTMATERIALS_DATA" VALUES(6,'AluminiumKapton',1.7); +INSERT INTO "SCTMATERIALS_DATA" VALUES(7,'CN107',8.95); +INSERT INTO "SCTMATERIALS_DATA" VALUES(8,'CoolingPipe',1.83); +INSERT INTO "SCTMATERIALS_DATA" VALUES(9,'CFiberSupport',0.189); +INSERT INTO "SCTMATERIALS_DATA" VALUES(10,'Flange',1.6); +INSERT INTO "SCTMATERIALS_DATA" VALUES(11,'CFiberInterLink',1.6); +INSERT INTO "SCTMATERIALS_DATA" VALUES(12,'AirexR82',0.08); +INSERT INTO "SCTMATERIALS_DATA" VALUES(13,'TSC',1.97); +INSERT INTO "SCTMATERIALS_DATA" VALUES(14,'TSE',0.795); +INSERT INTO "SCTMATERIALS_DATA" VALUES(15,'TSP',0.569); +INSERT INTO "SCTMATERIALS_DATA" VALUES(16,'EMI',1.97); +INSERT INTO "SCTMATERIALS_DATA" VALUES(17,'FwdHybrid',1.59); +INSERT INTO "SCTMATERIALS_DATA" VALUES(18,'DiscSupport',0.1265); +INSERT INTO "SCTMATERIALS_DATA" VALUES(19,'CFiberFwdSupportFrame',0.214); +INSERT INTO "SCTMATERIALS_DATA" VALUES(20,'FwdCoolingPipe',1.52); +INSERT INTO "SCTMATERIALS_DATA" VALUES(21,'KaptonAl',1.6); +INSERT INTO "SCTMATERIALS_DATA" VALUES(22,'Foam',0.04377); +INSERT INTO "SCTMATERIALS_DATA" VALUES(23,'Rubber',2.982); +INSERT INTO "SCTMATERIALS_DATA" VALUES(77,'PEI',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(78,'Adhesive',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(79,'Dogleg',5.3051); +INSERT INTO "SCTMATERIALS_DATA" VALUES(122,'FwdRailBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(125,'SpiderBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(128,'EMIJointBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(148,'Brass',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(149,'InterlinkBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(157,'PPB1Tmp',1.8064); +INSERT INTO "SCTMATERIALS_DATA" VALUES(158,'BrlCryoServTmp',0.7742); +INSERT INTO "SCTMATERIALS_DATA" VALUES(184,'FSIFlangeBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(185,'FSIFibMaskBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(186,'FSIEndJewelBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(187,'FSIScorpionBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(116,'FwdCoolPipeBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(117,'FwdLMTBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(118,'FwdLMTCoolBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(119,'FwdFibresBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(120,'FwdNPipeBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(121,'FwdNPipeBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(123,'FwdSupportBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(138,'CuKaptonEC',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(139,'FwdOTEBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(140,'FwdITEBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(141,'FwdShShieldBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(142,'FwdFrontSupBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(143,'FwdFlangeFOBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(144,'FwdFlangeFIBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(145,'FwdRearSupBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(146,'FwdFlangeROBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(147,'FwdFlangeRIBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(171,'C6F14',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(172,'Polycarbonate',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(173,'Polyester',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(174,'FwdCryoCoolBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(175,'FwdCryoLMTBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(176,'FwdCCTBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(177,'FwdHEXConnBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(178,'FwdRadHEXBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(179,'FwdRadLMTBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(180,'FwdRadDryNBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(181,'FwdSTFTBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(182,'FwdRCTBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(64,'Peek',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(65,'BeCu',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(66,'PCB',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(67,'Vectra',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(68,'Torlon',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(69,'Ceramic',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(70,'Grease',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(71,'CuOnAlWire',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(55,'Solder',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(183,'BearingBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(74,'Silicone',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(75,'CoolingBlock',5.0107); +INSERT INTO "SCTMATERIALS_DATA" VALUES(105,'CoolingPipeBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(127,'EMIBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(137,'HSPBase',1.41104); +INSERT INTO "SCTMATERIALS_DATA" VALUES(61,'EotiteP102',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(2002,'StaveSupport',0.96); +INSERT INTO "SCTMATERIALS_DATA" VALUES(24,'BrlHybrid',2.241); +INSERT INTO "SCTMATERIALS_DATA" VALUES(25,'BrlBaseBoard',2.133); +INSERT INTO "SCTMATERIALS_DATA" VALUES(26,'PigTail',1.135); +INSERT INTO "SCTMATERIALS_DATA" VALUES(27,'BrlBracket',3.03); +INSERT INTO "SCTMATERIALS_DATA" VALUES(28,'Dogleg',6.44); +INSERT INTO "SCTMATERIALS_DATA" VALUES(29,'AlKapton',1.712); +INSERT INTO "SCTMATERIALS_DATA" VALUES(30,'Glass',2.51); +INSERT INTO "SCTMATERIALS_DATA" VALUES(31,'CuKapton',2.94); +INSERT INTO "SCTMATERIALS_DATA" VALUES(32,'AlNitride',3.3); +INSERT INTO "SCTMATERIALS_DATA" VALUES(33,'DiscPowerTape',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(115,'PPCoolingBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(126,'EMIJoint',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(53,'OptoHarness',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(54,'Silica',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(56,'FR4',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(57,'Al2O3',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(58,'Araldite',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(59,'Epoxy',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(60,'Plastic',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(114,'PPConnectorBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(62,'AIT',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(63,'Elastosil',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(129,'Airex',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(130,'Techsil',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(131,'AlKapton',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(132,'Pyrogel',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(133,'EPDM',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(134,'TSCylinderBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(135,'TSBulkheadBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(136,'TSEndPanelBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(2000,'StaveSupport',0.9); +INSERT INTO "SCTMATERIALS_DATA" VALUES(2001,'Moderator',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(80,'CuAu',9.18); +INSERT INTO "SCTMATERIALS_DATA" VALUES(81,'SupportCyl0',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(82,'SupportCyl1',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(83,'SupportCyl2',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(84,'SupportCyl3',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(85,'Flange0',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(86,'Flange1',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(87,'Flange2',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(88,'Flange3',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(89,'Clamp0',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(90,'Clamp1',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(91,'Clamp2',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(92,'Clamp3',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(156,'FwdOTEFlngBase',0.34); +INSERT INTO "SCTMATERIALS_DATA" VALUES(159,'HEXInnerBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(160,'HEXMiddleBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(161,'HEXOuterBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(162,'Polyimide',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(163,'PPB1BBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(164,'PPB1ADBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(165,'PPB1A1CBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(166,'PPB1EFEGBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(167,'CabTrayBBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(168,'CabTrayADBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(169,'CabTrayA1CBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(170,'CabTrayEFEGBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(112,'HarnessBase',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(113,'PowerTape',1.4912); +INSERT INTO "SCTMATERIALS_DATA" VALUES(150,'FwdFrntWingBase',0.33); +INSERT INTO "SCTMATERIALS_DATA" VALUES(151,'FwdRearWingBase',0.24); +INSERT INTO "SCTMATERIALS_DATA" VALUES(152,'FwdMechBase',6.54); +INSERT INTO "SCTMATERIALS_DATA" VALUES(153,'FwdRadServBase',0.815); +INSERT INTO "SCTMATERIALS_DATA" VALUES(154,'FwdRadServBase',2.107); +INSERT INTO "SCTMATERIALS_DATA" VALUES(155,'FwdCryoServBase',2.107); +INSERT INTO "SCTMATERIALS_DATA" VALUES(72,'B2O3',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(73,'Na2O',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(76,'BrlBracket',1.6177); +INSERT INTO "SCTMATERIALS_DATA" VALUES(93,'SupportCyl0Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(94,'SupportCyl1Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(95,'SupportCyl2Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(96,'SupportCyl3Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(97,'Flange0Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(98,'Flange1Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(99,'Flange2Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(100,'Flange3Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(101,'Clamp0Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(102,'Clamp1Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(103,'Clamp2Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(104,'Clamp3Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(106,'BoronNitride',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(107,'ThermalGlue',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(108,'CoolingEnd0Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(109,'CoolingEnd1Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(110,'CoolingEnd2Base',1.0); +INSERT INTO "SCTMATERIALS_DATA" VALUES(111,'CoolingEnd3Base',1.0); +DROP TABLE IF EXISTS "SCTMATERIALS_DATA2TAG"; +CREATE TABLE "SCTMATERIALS_DATA2TAG" ( "SCTMATERIALS_TAG_ID" SLONGLONG ,"SCTMATERIALS_DATA_ID" SLONGLONG ); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,0); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,1); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,2); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,3); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,4); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,5); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,6); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,7); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,8); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,9); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,10); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,11); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,12); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,13); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,14); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,15); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,16); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,17); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,18); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,19); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,20); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,21); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,22); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106559,23); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,2); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,5); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,7); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,8); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,9); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,10); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,11); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,12); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,13); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,14); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,15); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,16); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,18); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,19); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,20); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,22); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,23); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,24); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,25); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,26); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,27); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,28); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,29); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,30); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,31); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,32); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,33); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,34); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,35); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,36); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,37); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,38); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,39); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,40); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,41); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,42); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,43); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,44); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,45); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,46); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,47); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,48); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,49); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,50); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,51); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,52); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,53); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,54); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,55); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,56); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,57); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,58); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,59); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,60); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,61); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,62); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,63); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,64); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,65); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,66); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,67); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,68); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,69); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,70); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(106783,71); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,2); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,5); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,7); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,8); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,9); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,10); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,11); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,12); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,13); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,14); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,15); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,16); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,18); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,19); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,20); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,22); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,23); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,24); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,25); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,26); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,27); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,28); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,29); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,30); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,31); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,32); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,33); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,34); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,35); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,36); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,37); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,38); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,39); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,40); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,41); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,42); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,43); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,44); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,45); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,46); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,47); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,48); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,49); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,50); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,51); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,52); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,53); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,54); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,55); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,56); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,57); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,58); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,59); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,60); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,61); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,62); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,63); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,64); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,65); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,66); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,67); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,68); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,69); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,70); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,71); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,72); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107089,73); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,2); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,7); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,9); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,10); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,11); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,12); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,13); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,14); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,15); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,18); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,19); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,20); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,22); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,23); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,24); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,25); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,26); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,30); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,31); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,32); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,33); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,34); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,35); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,36); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,37); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,38); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,39); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,40); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,41); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,42); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,43); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,44); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,45); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,46); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,47); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,48); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,49); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,50); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,51); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,52); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,53); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,54); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,55); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,56); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,57); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,58); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,59); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,60); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,61); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,62); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,63); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,64); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,65); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,66); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,67); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,68); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,69); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,70); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,71); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,72); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,73); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,74); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,75); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,76); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,77); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,78); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,79); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,80); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,93); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,94); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,95); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,96); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,97); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,98); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,99); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,100); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,101); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,102); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,103); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,104); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,105); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,106); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,107); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,108); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,109); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,110); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,111); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,112); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,113); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,114); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,115); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,116); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,117); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,118); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,119); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,120); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,122); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,123); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,124); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,125); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,127); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,128); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,129); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,130); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,131); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,132); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,133); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,134); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,135); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,136); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,137); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,138); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,139); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,140); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,141); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,142); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,143); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,144); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,145); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,146); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,147); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,148); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,149); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,150); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,151); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,152); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,153); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,155); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,156); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,157); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107130,158); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,2); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,7); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,9); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,10); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,11); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,12); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,13); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,14); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,15); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,18); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,19); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,20); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,22); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,23); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,24); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,25); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,26); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,30); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,31); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,32); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,33); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,34); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,35); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,36); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,37); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,38); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,39); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,40); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,41); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,42); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,43); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,44); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,45); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,46); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,47); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,48); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,49); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,50); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,51); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,52); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,53); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,54); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,55); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,56); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,57); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,58); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,59); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,60); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,61); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,62); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,63); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,64); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,65); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,66); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,67); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,68); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,69); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,70); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,71); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,72); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,73); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,74); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,75); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,76); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,77); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,78); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,79); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,80); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,93); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,94); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,95); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,96); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,97); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,98); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,99); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,100); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,101); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,102); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,103); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,104); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,105); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,106); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,107); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,108); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,109); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,110); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,111); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,112); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,113); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,114); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,115); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,116); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,117); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,118); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,119); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,120); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,122); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,123); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,124); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,125); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,127); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,128); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,129); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,130); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,131); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,132); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,133); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,134); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,135); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,136); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,137); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,138); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,139); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,140); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,141); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,142); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,143); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,144); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,145); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,146); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,147); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,148); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,149); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,150); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,151); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,152); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,153); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,155); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,156); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,157); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,158); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,159); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,160); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,161); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,162); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,163); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,164); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,165); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,166); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,167); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,168); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,169); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,170); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,171); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,172); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,173); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,174); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,175); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,176); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,177); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,178); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,179); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,180); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,181); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107336,182); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,2); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,7); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,9); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,10); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,11); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,12); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,13); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,14); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,15); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,18); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,19); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,20); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,22); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,23); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,24); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,25); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,26); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,30); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,31); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,32); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,33); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,34); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,35); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,36); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,37); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,38); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,39); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,40); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,41); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,42); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,43); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,44); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,45); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,46); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,47); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,48); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,49); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,50); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,51); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,52); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,53); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,54); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,55); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,56); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,57); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,58); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,59); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,60); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,61); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,62); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,63); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,64); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,65); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,66); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,67); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,68); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,69); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,70); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,71); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,72); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,73); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,74); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,75); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,76); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,77); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,78); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,79); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,80); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,93); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,94); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,95); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,96); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,97); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,98); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,99); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,100); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,101); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,102); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,103); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,104); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,105); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,106); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,107); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,108); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,109); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,110); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,111); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,112); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,113); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,114); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,115); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,116); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,117); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,118); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,119); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,120); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,122); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,123); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,124); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,125); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,127); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,128); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,129); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,130); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,131); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,132); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,133); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,134); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,135); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,136); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,137); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,138); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,139); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,140); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,141); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,142); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,143); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,144); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,145); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,146); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,147); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,148); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,149); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,150); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,151); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,152); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,153); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,155); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,156); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,157); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,158); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,159); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,160); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,161); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,162); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,163); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,164); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,165); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,166); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,167); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,168); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,169); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,170); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,171); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,172); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,173); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,174); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,175); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,176); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,177); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,178); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,179); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,180); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,181); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,182); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107461,183); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,2); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,7); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,9); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,10); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,11); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,12); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,13); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,14); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,15); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,18); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,19); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,20); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,22); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,23); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,24); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,25); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,26); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,30); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,31); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,32); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,33); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,34); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,35); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,36); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,37); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,38); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,39); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,40); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,41); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,42); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,43); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,44); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,45); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,46); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,47); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,48); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,49); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,50); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,51); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,52); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,53); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,54); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,55); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,56); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,57); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,58); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,59); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,60); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,61); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,62); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,63); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,64); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,65); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,66); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,67); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,68); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,69); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,70); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,71); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,72); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,73); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,74); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,75); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,76); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,77); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,78); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,79); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,80); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,93); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,94); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,95); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,96); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,97); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,98); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,99); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,100); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,101); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,102); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,103); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,104); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,105); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,106); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,107); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,108); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,109); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,110); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,111); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,112); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,113); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,114); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,115); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,116); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,117); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,118); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,119); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,120); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,122); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,123); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,124); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,125); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,127); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,128); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,129); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,130); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,131); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,132); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,133); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,134); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,135); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,136); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,137); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,138); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,139); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,140); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,141); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,142); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,143); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,144); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,145); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,146); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,147); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,148); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,149); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,150); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,151); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,152); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,153); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,155); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,156); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,157); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,158); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,159); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,160); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,161); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,162); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,163); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,164); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,165); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,166); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,167); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,168); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,169); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,170); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,171); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,172); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,173); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,174); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,175); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,176); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,177); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,178); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,179); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,180); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,181); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,182); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,183); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,184); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,185); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,186); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(107777,187); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,2); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,7); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,9); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,12); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,18); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,22); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,23); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,24); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,25); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,26); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,30); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,31); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,32); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,49); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,50); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,51); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,52); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,54); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,55); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,56); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,57); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,58); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,59); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,60); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,61); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,62); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,63); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,64); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,65); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,66); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,67); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,68); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,69); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,70); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,71); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,72); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,73); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,74); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,75); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,77); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,78); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,79); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,80); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,105); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,106); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,107); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,113); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,129); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,130); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,131); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,132); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,148); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,162); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,171); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,172); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,173); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,2000); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108570,2001); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,2); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,7); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,9); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,12); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,18); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,22); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,23); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,24); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,25); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,26); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,30); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,31); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,32); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,49); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,50); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,51); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,52); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,54); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,55); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,56); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,57); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,58); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,59); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,60); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,61); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,62); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,63); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,64); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,65); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,66); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,67); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,68); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,69); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,70); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,71); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,72); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,73); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,74); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,75); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,77); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,78); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,79); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,80); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,105); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,106); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,107); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,113); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,129); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,130); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,131); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,132); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,148); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,162); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,171); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,172); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,173); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,2001); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108822,2002); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,2); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,7); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,9); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,10); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,11); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,12); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,13); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,14); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,15); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,18); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,19); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,20); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,22); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,23); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,24); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,25); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,26); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,30); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,31); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,32); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,33); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,34); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,35); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,36); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,37); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,38); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,39); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,40); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,41); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,42); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,43); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,44); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,45); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,46); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,47); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,48); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,49); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,50); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,51); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,52); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,53); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,54); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,55); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,56); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,57); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,58); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,59); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,60); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,61); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,62); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,63); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,64); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,65); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,66); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,67); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,68); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,69); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,70); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,71); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,72); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,73); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,74); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,75); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,76); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,77); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,78); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,79); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,80); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,93); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,94); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,95); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,96); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,97); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,98); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,99); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,100); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,101); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,102); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,103); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,104); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,105); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,106); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,107); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,108); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,109); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,110); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,111); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,112); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,113); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,114); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,115); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,116); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,117); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,118); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,119); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,120); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,122); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,123); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,124); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,125); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,127); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,128); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,129); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,130); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,131); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,132); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,133); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,134); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,135); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,136); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,137); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,138); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,139); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,140); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,141); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,142); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,143); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,144); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,145); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,146); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,147); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,148); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,149); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,150); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,151); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,152); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,153); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,155); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,156); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,157); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,158); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,159); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,160); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,161); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,162); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,163); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,164); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,165); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,166); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,167); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,168); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,169); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,170); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,171); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,172); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,173); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,174); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,175); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,176); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,177); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,178); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,179); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,180); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,181); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,182); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,183); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,184); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,185); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,186); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,187); +INSERT INTO "SCTMATERIALS_DATA2TAG" VALUES(108840,188); +-- +-- COMMIT; diff --git a/DetectorDescription/GeoModel/FaserGeoModel/python/FaserGeoModelConfig.py b/DetectorDescription/GeoModel/FaserGeoModel/python/FaserGeoModelConfig.py index ff9539259..26510fcbb 100644 --- a/DetectorDescription/GeoModel/FaserGeoModel/python/FaserGeoModelConfig.py +++ b/DetectorDescription/GeoModel/FaserGeoModel/python/FaserGeoModelConfig.py @@ -10,4 +10,7 @@ def FaserGeometryCfg (flags): from FaserGeoModel.ScintGMConfig import ScintGeometryCfg acc.merge(ScintGeometryCfg(flags)) + from FaserGeoModel.SCTGMConfig import SctGeometryCfg + acc.merge(SctGeometryCfg(flags)) + return acc diff --git a/DetectorDescription/GeoModel/FaserGeoModel/python/GeoModelInit.py b/DetectorDescription/GeoModel/FaserGeoModel/python/GeoModelInit.py index 6371517ce..3eea5bf7e 100644 --- a/DetectorDescription/GeoModel/FaserGeoModel/python/GeoModelInit.py +++ b/DetectorDescription/GeoModel/FaserGeoModel/python/GeoModelInit.py @@ -26,6 +26,10 @@ def _setupGeoModel(): from GeometryDBSvc.GeometryDBSvcConf import GeometryDBSvc svcMgr+=GeometryDBSvc("ScintGeometryDBSvc") + if not hasattr(svcMgr, 'TrackerGeometryDBSvc'): + from GeometryDBSvc.GeometryDBSvcConf import GeometryDBSvc + svcMgr+=GeometryDBSvc("TrackerGeometryDBSvc") + # from AthenaCommon import CfgGetter from VetoGeoModel.VetoGeoModelConf import VetoDetectorTool vetoDetectorTool = VetoDetectorTool( DetectorName = "Veto", @@ -36,8 +40,14 @@ def _setupGeoModel(): geoModelSvc.DetectorTools += [ vetoDetectorTool ] -## svcMgr.GeoModelSvc.DetectorTools['VetoDetectorTool'].useDynamicAlignFolders = InDetGeometryFlags.useDynamicAlignFolders() + from FaserSCT_GeoModel.FaserSCT_GeoModelConf import FaserSCT_DetectorTool + faserSCTDetectorTool = FaserSCT_DetectorTool( DetectorName = "SCT", + Alignable = True, + RDBAccessSvc = "RDBAccessSvc", + GeometryDBSvc = "TrackerGeometryDBSvc", + GeoDbTagSvc = "GeoDbTagSvc") + geoModelSvc.DetectorTools += [ faserSCTDetectorTool ] pass diff --git a/DetectorDescription/GeoModel/FaserGeoModel/python/SCTGMConfig.py b/DetectorDescription/GeoModel/FaserGeoModel/python/SCTGMConfig.py new file mode 100644 index 000000000..bee84266c --- /dev/null +++ b/DetectorDescription/GeoModel/FaserGeoModel/python/SCTGMConfig.py @@ -0,0 +1,52 @@ +# +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# + +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator + +def SctGeometryCfg (flags): + acc = ComponentAccumulator() + from FaserSCT_GeoModel.FaserSCT_GeoModelConfig import FaserSCT_GeometryCfg + acc.merge(FaserSCT_GeometryCfg( flags )) + return acc + + +if __name__ == "__main__": + import os + from AthenaCommon.Logging import log + from AthenaCommon.Constants import DEBUG + from AthenaCommon.Configurable import Configurable + from CalypsoConfiguration.AllConfigFlags import ConfigFlags + from AthenaConfiguration.MainServicesConfig import MainServicesSerialCfg + from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg + # Set up logging and new style config + log.setLevel(DEBUG) + Configurable.configurableRun3Behavior = True + ConfigFlags.addFlag("GeoModel.FaserVersion", "Faser-00") + ConfigFlags.addFlag("Detector.SimulateVeto", True) + ConfigFlags.addFlag("Detector.SimulateSCT", True) + + # from AthenaConfiguration.TestDefaults import defaultTestFiles + # Provide MC input + # ConfigFlags.Input.Files = defaultTestFiles.HITS + ConfigFlags.IOVDb.GlobalTag = "OFLCOND-MC16-SDR-16" + ConfigFlags.Detector.SimulateVeto = True + ConfigFlags.GeoModel.Align.Dynamic = False + # Provide data input + ##from AthenaConfiguration.TestDefaults import defaultTestFiles + # + ConfigFlags.lock() + # Construct ComponentAccumulator + acc = MainServicesSerialCfg() + acc.merge(PoolReadCfg(ConfigFlags)) + acc.merge(ScintGeometryCfg(ConfigFlags)) + acc.merge(FaserSCT_GeometryCfg(ConfigFlags)) + #acc.getService("StoreGateSvc").Dump=True + acc.getService("ConditionStore").Dump=True + acc.printConfig(withDetails=True) + f=open('ScintGMCfg2.pkl','w') + acc.store(f) + f.close() + ConfigFlags.dump() + # Execute and finish + acc.run(maxEvents=3) diff --git a/DetectorDescription/GeoModel/FaserGeoModel/python/ScintGMConfig.py b/DetectorDescription/GeoModel/FaserGeoModel/python/ScintGMConfig.py index afcf0ed65..9d85ee3d4 100644 --- a/DetectorDescription/GeoModel/FaserGeoModel/python/ScintGMConfig.py +++ b/DetectorDescription/GeoModel/FaserGeoModel/python/ScintGMConfig.py @@ -4,23 +4,6 @@ from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator -# def InDetServiceMaterialCfg (flags): -# from AtlasGeoModel.GeoModelConfig import GeoModelCfg -# acc,geoModelSvc = GeoModelCfg( flags ) -# from GeometryDBSvc.GeometryDBSvcConf import GeometryDBSvc -# acc.addService(GeometryDBSvc("InDetGeometryDBSvc")) -# from InDetServMatGeoModel.InDetServMatGeoModelConf import InDetServMatTool -# servMatTool = InDetServMatTool() -# if flags.GeoModel.Run=="RUN4": -# from InDetServMatGeoModel.InDetServMatGeoModelConf import InDetServMatBuilderToolSLHC -# InDetServMatBuilderToolSLHC = InDetServMatBuilderToolSLHC() -# acc.addPublicTool( InDetServMatBuilderToolSLHC ) -# servMatTool.ServiceBuilderTool = InDetServMatBuilderToolSLHC -# geoModelSvc.DetectorTools += [ servMatTool ] -# acc.addService(geoModelSvc) -# return acc - - def ScintGeometryCfg (flags): acc = ComponentAccumulator() from VetoGeoModel.VetoGeoModelConfig import VetoGeometryCfg @@ -46,14 +29,10 @@ if __name__ == "__main__": # Provide MC input # ConfigFlags.Input.Files = defaultTestFiles.HITS ConfigFlags.IOVDb.GlobalTag = "OFLCOND-MC16-SDR-16" - # ConfigFlags.Detector.SimulatePixel = True ConfigFlags.Detector.SimulateVeto = True - # ConfigFlags.Detector.SimulateTRT = True ConfigFlags.GeoModel.Align.Dynamic = False # Provide data input ##from AthenaConfiguration.TestDefaults import defaultTestFiles - ##ConfigFlags.Input.Files = defaultTestFiles.AOD - ##ConfigFlags.GeoModel.Align.Dynamic = True # ConfigFlags.lock() # Construct ComponentAccumulator diff --git a/DetectorDescription/GeoModel/GeoModelFaserUtilities/GeoModelFaserUtilities/DecodeFaserVersionKey.h b/DetectorDescription/GeoModel/GeoModelFaserUtilities/GeoModelFaserUtilities/DecodeFaserVersionKey.h index 902e683d2..f8ce8195f 100644 --- a/DetectorDescription/GeoModel/GeoModelFaserUtilities/GeoModelFaserUtilities/DecodeFaserVersionKey.h +++ b/DetectorDescription/GeoModel/GeoModelFaserUtilities/GeoModelFaserUtilities/DecodeFaserVersionKey.h @@ -20,7 +20,7 @@ class DecodeFaserVersionKey public: /// Constructor is passed a pointer to GeoModelSvc plus the node /// for which you want the tag. - /// Possible nodes are FASER, Scintillator, Tracker, Magnet, Calorimeter. + /// Possible nodes are FASER, Scintillator, SCT, Magnet, Calorimeter. DecodeFaserVersionKey(const IGeoModelSvc *, const std::string & node); // Overloading the constructor to allow adiabatic migration of clients away from the IGeoModelSvc DecodeFaserVersionKey(const IGeoDbTagSvc *, const std::string & node); diff --git a/DetectorDescription/GeoModel/GeoModelFaserUtilities/src/DecodeFaserVersionKey.cxx b/DetectorDescription/GeoModel/GeoModelFaserUtilities/src/DecodeFaserVersionKey.cxx index 3455ceb3b..3378010fc 100644 --- a/DetectorDescription/GeoModel/GeoModelFaserUtilities/src/DecodeFaserVersionKey.cxx +++ b/DetectorDescription/GeoModel/GeoModelFaserUtilities/src/DecodeFaserVersionKey.cxx @@ -34,6 +34,7 @@ void DecodeFaserVersionKey::defineTag(const T* svc, const std::string & node) { std::string nodeOverrideTag; std::string scintOverrideTag; // Scint has two levels. + std::string trackerOverrideTag; if (node == "FASER") { nodeOverrideTag = ""; } else if (node == "Scintillator") { @@ -49,6 +50,9 @@ void DecodeFaserVersionKey::defineTag(const T* svc, const std::string & node) nodeOverrideTag = svc->preshowerVersionOverride(); } else if (node == "Tracker") { nodeOverrideTag = svc->trackerVersionOverride(); + } else if (node == "SCT") { + nodeOverrideTag = svc->sctVersionOverride(); + trackerOverrideTag = svc->trackerVersionOverride(); } else if (node == "Calorimeter") { nodeOverrideTag = svc->caloVersionOverride(); } else { @@ -73,6 +77,19 @@ void DecodeFaserVersionKey::defineTag(const T* svc, const std::string & node) m_node = "Scintillator"; } + // If trackerOverrideTag is specified (and is not just "CUSTOM") then override with the tracker tag. + std::string trackerTag; + if (!trackerOverrideTag.empty()) { + // We dont care about the return value (custom = true/false). We only take notice of the custom + // flag if the override is at the node we have selected. Ie we only look at nodeOverrideTag + // in order to set m_custom. At any rate, we have to remove the CUSTOM string if it is present. + getCustomTag(trackerOverrideTag, trackerTag); + } + if (!trackerTag.empty()) { + m_tag = trackerTag; + m_node = "Tracker"; + } + // Finally if subsystem tag is overriden then use that. std::string outputTag; diff --git a/DetectorDescription/GeoModel/GeoModelInterfaces/GeoModelInterfaces/IGeoDbTagSvc.h b/DetectorDescription/GeoModel/GeoModelInterfaces/GeoModelInterfaces/IGeoDbTagSvc.h index a43d7f267..f9234a416 100644 --- a/DetectorDescription/GeoModel/GeoModelInterfaces/GeoModelInterfaces/IGeoDbTagSvc.h +++ b/DetectorDescription/GeoModel/GeoModelInterfaces/GeoModelInterfaces/IGeoDbTagSvc.h @@ -33,6 +33,7 @@ class IGeoDbTagSvc : virtual public IInterface { virtual const std::string & triggerVersion() const =0; virtual const std::string & preshowerVersion() const =0; virtual const std::string & trackerVersion() const =0; + virtual const std::string & sctVersion() const =0; virtual const std::string & caloVersion() const =0; // virtual const std::string & magFieldVersion() const =0; // virtual const std::string & cavernInfraVersion() const =0; @@ -42,6 +43,7 @@ class IGeoDbTagSvc : virtual public IInterface { virtual const std::string & triggerVersionOverride() const =0; virtual const std::string & preshowerVersionOverride() const =0; virtual const std::string & trackerVersionOverride() const =0; + virtual const std::string & sctVersionOverride() const =0; virtual const std::string & caloVersionOverride() const =0; // virtual const std::string & magFieldVersionOverride() const =0; // virtual const std::string & cavernInfraVersionOverride() const =0; diff --git a/DetectorDescription/GeoModel/GeoModelInterfaces/GeoModelInterfaces/IGeoModelSvc.h b/DetectorDescription/GeoModel/GeoModelInterfaces/GeoModelInterfaces/IGeoModelSvc.h index cbedc7231..cdd1177d4 100644 --- a/DetectorDescription/GeoModel/GeoModelInterfaces/GeoModelInterfaces/IGeoModelSvc.h +++ b/DetectorDescription/GeoModel/GeoModelInterfaces/GeoModelInterfaces/IGeoModelSvc.h @@ -31,6 +31,7 @@ public: virtual const std::string & triggerVersion() const =0; virtual const std::string & preshowerVersion() const =0; virtual const std::string & trackerVersion() const =0; + virtual const std::string & sctVersion() const =0; virtual const std::string & caloVersion() const =0; // virtual const std::string & magFieldVersion() const =0; // virtual const std::string & cavernInfraVersion() const =0; @@ -40,6 +41,7 @@ public: virtual const std::string & triggerVersionOverride() const =0; virtual const std::string & preshowerVersionOverride() const =0; virtual const std::string & trackerVersionOverride() const =0; + virtual const std::string & sctVersionOverride() const =0; virtual const std::string & caloVersionOverride() const =0; // virtual const std::string & magFieldVersionOverride() const =0; // virtual const std::string & cavernInfraVersionOverride() const =0; diff --git a/DetectorDescription/GeoModel/GeoModelSvc/src/GeoDbTagSvc.cxx b/DetectorDescription/GeoModel/GeoModelSvc/src/GeoDbTagSvc.cxx index 50b794ec9..f2f84287d 100644 --- a/DetectorDescription/GeoModel/GeoModelSvc/src/GeoDbTagSvc.cxx +++ b/DetectorDescription/GeoModel/GeoModelSvc/src/GeoDbTagSvc.cxx @@ -87,6 +87,10 @@ StatusCode GeoDbTagSvc::setupTags() ? rdbAccessSvc->getChildTag("Tracker", m_FaserVersion, "FASER", "FASERDD") : m_TrackerVersionOverride); + m_SCTVersion = (m_SCTVersionOverride.empty() + ? rdbAccessSvc->getChildTag("SCT", m_FaserVersion, "Tracker", "FASERDD") + : m_SCTVersionOverride); + m_CaloVersion = (m_CaloVersionOverride.empty() ? rdbAccessSvc->getChildTag("Calorimeter", m_FaserVersion,"FASER", "FASERDD") : m_CaloVersionOverride); diff --git a/DetectorDescription/GeoModel/GeoModelSvc/src/GeoDbTagSvc.h b/DetectorDescription/GeoModel/GeoModelSvc/src/GeoDbTagSvc.h index f93c1c431..db053c931 100644 --- a/DetectorDescription/GeoModel/GeoModelSvc/src/GeoDbTagSvc.h +++ b/DetectorDescription/GeoModel/GeoModelSvc/src/GeoDbTagSvc.h @@ -33,6 +33,7 @@ class GeoDbTagSvc : public AthService, virtual public IGeoDbTagSvc void setTriggerVersionOverride(const std::string& tag) { m_TriggerVersionOverride=tag; } void setPreshowerVersionOverride(const std::string& tag) { m_PreshowerVersionOverride=tag; } void setTrackerVersionOverride(const std::string& tag) { m_TrackerVersionOverride=tag; } + void setSCTVersionOverride(const std::string& tag) { m_SCTVersionOverride=tag; } void setCaloVersionOverride(const std::string& tag) { m_CaloVersionOverride=tag; } // void setMagFieldVersionOverride(const std::string& tag) { m_MagFieldVersionOverride=tag; } // void setCavernInfraVersionOverride(const std::string& tag) { m_CavernInfraVersionOverride=tag; } @@ -47,6 +48,7 @@ class GeoDbTagSvc : public AthService, virtual public IGeoDbTagSvc const std::string & triggerVersionOverride() const { return m_TriggerVersionOverride; } const std::string & preshowerVersionOverride() const { return m_PreshowerVersionOverride; } const std::string & trackerVersionOverride() const { return m_TrackerVersionOverride; } + const std::string & sctVersionOverride() const { return m_SCTVersionOverride; } const std::string & caloVersionOverride() const { return m_CaloVersionOverride; } // const std::string & magFieldVersionOverride() const { return m_MagFieldVersionOverride; } // const std::string & cavernInfraVersionOverride() const { return m_CavernInfraVersionOverride; } @@ -56,6 +58,7 @@ class GeoDbTagSvc : public AthService, virtual public IGeoDbTagSvc const std::string & triggerVersion() const { return m_TriggerVersion; } const std::string & preshowerVersion() const { return m_PreshowerVersion; } const std::string & trackerVersion() const { return m_TrackerVersion; } + const std::string & sctVersion() const { return m_SCTVersion; } const std::string & caloVersion() const { return m_CaloVersion; } // const std::string & magFieldVersion() const { return m_MagFieldVersion; } // const std::string & cavernInfraVersion() const { return m_CavernInfraVersion; } @@ -70,6 +73,7 @@ class GeoDbTagSvc : public AthService, virtual public IGeoDbTagSvc std::string m_TriggerVersion; std::string m_PreshowerVersion; std::string m_TrackerVersion; + std::string m_SCTVersion; std::string m_CaloVersion; // std::string m_MagFieldVersion; // std::string m_CavernInfraVersion; @@ -79,6 +83,7 @@ class GeoDbTagSvc : public AthService, virtual public IGeoDbTagSvc std::string m_TriggerVersionOverride; std::string m_PreshowerVersionOverride; std::string m_TrackerVersionOverride; + std::string m_SCTVersionOverride; std::string m_CaloVersionOverride; // std::string m_MagFieldVersionOverride; // std::string m_CavernInfraVersionOverride; diff --git a/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.cxx b/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.cxx index bd0427a1f..22c78634a 100644 --- a/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.cxx +++ b/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.cxx @@ -60,6 +60,7 @@ GeoModelSvc::GeoModelSvc(const std::string& name,ISvcLocator* svc) declareProperty( "TriggerVersionOverride", m_TriggerVersionOverride); declareProperty( "PreshowerVersionOverride", m_PreshowerVersionOverride); declareProperty( "TrackerVersionOverride", m_TrackerVersionOverride); + declareProperty( "SCTVersionOverride", m_SCTVersionOverride); declareProperty( "CaloVersionOverride", m_CaloVersionOverride); // declareProperty( "MagFieldVersionOverride", m_MagFieldVersionOverride); // declareProperty( "CavernInfraVersionOverride", m_CavernInfraVersionOverride); diff --git a/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.h b/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.h index b7b9f3615..c08a61418 100644 --- a/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.h +++ b/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.h @@ -77,6 +77,7 @@ private: std::string m_TriggerVersionOverride; std::string m_PreshowerVersionOverride; std::string m_TrackerVersionOverride; + std::string m_SCTVersionOverride; std::string m_CaloVersionOverride; // std::string m_MagFieldVersionOverride; // std::string m_CavernInfraVersionOverride; @@ -99,6 +100,7 @@ private: const std::string & triggerVersionOverride() const {return m_TriggerVersionOverride ;} const std::string & preshowerVersionOverride() const {return m_PreshowerVersionOverride ;} const std::string & trackerVersionOverride() const {return m_TrackerVersionOverride ;} + const std::string & sctVersionOverride() const {return m_SCTVersionOverride ;} const std::string & caloVersionOverride() const {return m_CaloVersionOverride ;} // const std::string & magFieldVersionOverride() const {return m_MagFieldVersionOverride ;} // const std::string & cavernInfraVersionOverride() const {return m_CavernInfraVersionOverride ;} @@ -108,6 +110,7 @@ private: const std::string & triggerVersion() const {return m_geoDbTagSvc->triggerVersion(); } const std::string & preshowerVersion() const {return m_geoDbTagSvc->preshowerVersion(); } const std::string & trackerVersion() const {return m_geoDbTagSvc->trackerVersion(); } + const std::string & sctVersion() const {return m_geoDbTagSvc->sctVersion(); } const std::string & caloVersion() const {return m_geoDbTagSvc->caloVersion(); } // const std::string & magFieldVersion() const {return m_geoDbTagSvc->magFieldVersion(); } // const std::string & cavernInfraVersion() const {return m_geoDbTagSvc->cavernInfraVersion(); } diff --git a/DetectorDescription/GeoModel/GeoModelSvc/src/RDBMaterialManager.cxx b/DetectorDescription/GeoModel/GeoModelSvc/src/RDBMaterialManager.cxx index eabd66c0d..00465e955 100644 --- a/DetectorDescription/GeoModel/GeoModelSvc/src/RDBMaterialManager.cxx +++ b/DetectorDescription/GeoModel/GeoModelSvc/src/RDBMaterialManager.cxx @@ -186,6 +186,20 @@ StatusCode RDBMaterialManager::readMaterialsFromDB(ISvcLocator* pSvcLocator) m_scintmaterials = iAccessSvc->getRecordsetPtr("ScintMaterials","ScintMaterials-00", "", "FASERDD"); } + // --- SCT materials + DecodeFaserVersionKey keySCT(iGeoModel, "SCT"); + m_sctmatcomponents = iAccessSvc->getRecordsetPtr("SCTMatComponents",keySCT.tag(),keySCT.node(),"FASERDD"); + if(m_sctmatcomponents->size()==0) { + if(log.level()<=MSG::WARNING) + log << MSG::WARNING << " Getting SCTMatComponents with default tag" <<endmsg; + m_sctmatcomponents = iAccessSvc->getRecordsetPtr("SCTMatComponents","SCTMatComponents-00", "", "FASERDD"); + } + m_sctmaterials = iAccessSvc->getRecordsetPtr("SCTMaterials",keySCT.tag(),keySCT.node(), "FASERDD"); + if(m_sctmaterials->size()==0) { + if(log.level()<=MSG::WARNING) + log << MSG::WARNING << " Getting SCTMaterials with default tag" <<endmsg; + m_trackermaterials = iAccessSvc->getRecordsetPtr("SCTMaterials","SCTMaterials-00", "", "FASERDD"); + } // --- Tracker materials DecodeFaserVersionKey keyTracker(iGeoModel, "Tracker"); m_trackermatcomponents = iAccessSvc->getRecordsetPtr("TrackerMatComponents",keyTracker.tag(),keyTracker.node(),"FASERDD"); @@ -240,7 +254,7 @@ GeoMaterial* RDBMaterialManager::searchMaterialMap(const std::string & name) if (m!=end) { if(log.level()==MSG::VERBOSE) - log << MSG::VERBOSE << " ***** in searchMaterialMap(): search sucess " << endmsg; + log << MSG::VERBOSE << " ***** in searchMaterialMap(): search success " << endmsg; return (*m).second; } else { @@ -258,7 +272,7 @@ GeoMaterial* RDBMaterialManager::searchMaterialMap(const std::string & name) con std::map< std::string, GeoMaterial * >::const_iterator end = m_materialMap.end(); if (m!=end) { if(log.level()==MSG::VERBOSE) - log << MSG::VERBOSE << " ***** in searchMaterialMap(): search sucess " << endmsg; + log << MSG::VERBOSE << " ***** in searchMaterialMap(): search success " << endmsg; return (*m).second; } else { @@ -413,6 +427,14 @@ GeoMaterial* RDBMaterialManager::getMaterial(const std::string & name) { tmp_matcomponents = m_trackermatcomponents; data_id = "TRACKERMATERIALS_DATA_ID"; } + else if(name.find("sct",0) == 0) + { + detector = "sct"; + tmp_materials = m_sctmaterials; + tmp_matcomponents = m_sctmatcomponents; + data_id = "SCTMATERIALS_DATA_ID"; + } + else if(name.find("calo",0) == 0) { detector = "calo"; @@ -579,6 +601,13 @@ const GeoMaterial* RDBMaterialManager:: getMaterial(const std::string &name) co tmp_matcomponents = m_trackermatcomponents; data_id = "TRACKERMATERIALS_DATA_ID"; } + else if(name.find("sct",0) == 0) + { + detector = "sct"; + tmp_materials = m_sctmaterials; + tmp_matcomponents = m_sctmatcomponents; + data_id = "SCTMATERIALS_DATA_ID"; + } else if(name.find("calo",0) == 0) { detector = "calo"; diff --git a/DetectorDescription/GeoModel/GeoModelSvc/src/RDBMaterialManager.h b/DetectorDescription/GeoModel/GeoModelSvc/src/RDBMaterialManager.h index 14af632fe..ec34b734d 100644 --- a/DetectorDescription/GeoModel/GeoModelSvc/src/RDBMaterialManager.h +++ b/DetectorDescription/GeoModel/GeoModelSvc/src/RDBMaterialManager.h @@ -87,6 +87,8 @@ class RDBMaterialManager: public StoredMaterialManager { IRDBRecordset_ptr m_scintmatcomponents; IRDBRecordset_ptr m_trackermaterials; IRDBRecordset_ptr m_trackermatcomponents; + IRDBRecordset_ptr m_sctmaterials; + IRDBRecordset_ptr m_sctmatcomponents; IRDBRecordset_ptr m_calomaterials; IRDBRecordset_ptr m_calomatcomponents; diff --git a/DetectorDescription/IdDictDetDescrCnv/share/IdDictDetDescrCnv_joboptions.py b/DetectorDescription/IdDictDetDescrCnv/share/IdDictDetDescrCnv_joboptions.py index f80fb77d9..5d5693cfa 100644 --- a/DetectorDescription/IdDictDetDescrCnv/share/IdDictDetDescrCnv_joboptions.py +++ b/DetectorDescription/IdDictDetDescrCnv/share/IdDictDetDescrCnv_joboptions.py @@ -1,5 +1,5 @@ # -# Joboptions for the loading of the of InDetDDMgr +# Joboptions for loading # # DLLs diff --git a/DetectorDescription/IdDictDetDescrCnv/src/IdDictDetDescrCnv.cxx b/DetectorDescription/IdDictDetDescrCnv/src/IdDictDetDescrCnv.cxx index 846a3ce29..3dc2b94a7 100644 --- a/DetectorDescription/IdDictDetDescrCnv/src/IdDictDetDescrCnv.cxx +++ b/DetectorDescription/IdDictDetDescrCnv/src/IdDictDetDescrCnv.cxx @@ -845,96 +845,7 @@ IdDictDetDescrCnv::getFileNamesFromTags() << ", dictionary tag: " << m_caloIdDictTag << endmsg; } - else log << MSG::WARNING << " no record set found - using default dictionary " << endmsg; - - // Calo neighbor files: - // IRDBRecordset_ptr caloNeighborTable = rdbAccessSvc->getRecordsetPtr("CaloNeighborTable", - // detectorKey.tag(), - // detectorKey.node()); - // if (caloNeighborTable->size()==0) { - // caloNeighborTable = rdbAccessSvc->getRecordsetPtr("CaloNeighborTable","CaloNeighborTable-00"); - // } - // // Size == 0 if not found - // if (caloNeighborTable->size()) { - // const IRDBRecord* neighborTable = (*caloNeighborTable)[0]; - // m_fullAtlasNeighborsName = neighborTable->getString("FULLATLASNEIGHBORS"); - // m_fcal2dNeighborsName = neighborTable->getString("FCAL2DNEIGHBORS"); - // m_fcal3dNeighborsNextName = neighborTable->getString("FCAL3DNEIGHBORSNEXT"); - // m_fcal3dNeighborsPrevName = neighborTable->getString("FCAL3DNEIGHBORSPREV"); - // m_tileNeighborsName = neighborTable->getString("TILENEIGHBORS"); - // log << MSG::DEBUG << " using neighbor files: " << endmsg; - // log << MSG::DEBUG << " FullAtlasNeighborsFileName: " << m_fullAtlasNeighborsName - // << endmsg; - // log << MSG::DEBUG << " FCAL2DNeighborsFileName: " << m_fcal2dNeighborsName - // << endmsg; - // log << MSG::DEBUG << " FCAL3DNeighborsNextFileName: " << m_fcal3dNeighborsNextName - // << endmsg; - // log << MSG::DEBUG << " FCAL3DNeighborsPrevFileName: " << m_fcal3dNeighborsPrevName - // << endmsg; - // log << MSG::DEBUG << " TileNeighborsFileName: " << m_tileNeighborsName - // << endmsg; - // } - // else log << MSG::ERROR << " no record set found neighbor file " << endmsg; - - - - // Get Muon - // detectorKey = DecodeVersionKey(geoModelSvc, "MuonSpectrometer"); - // log << MSG::DEBUG << "From Version Tag: " - // << detectorKey.tag() << " at Node: " << detectorKey.node() << endmsg; - // idDictSet = rdbAccessSvc->getRecordsetPtr("MuonIdentifier", - // detectorKey.tag(), - // detectorKey.node()); - // // Size == 0 if not found - // if (idDictSet->size()) { - // idDictTable = (*idDictSet)[0]; - // dictName = idDictTable->getString("DICT_NAME"); - // m_muonIDFileName = idDictTable->getString("DICT_FILENAME"); - // m_muonIdDictTag = idDictSet->tagName(); - // log << MSG::DEBUG << " using Dictionary: " << dictName - // << ", file: " << m_muonIDFileName - // << ", dictionary tag: " << m_muonIdDictTag - // << endmsg; - // if (m_muonIDFileName == "") { - // log << MSG::ERROR << "MuonIDFileName CANNOT be empty " << endmsg; - // return StatusCode::FAILURE; - // } - // else if (m_muonIDFileName == "IdDictMuonSpectrometer.xml") { - // log << MSG::ERROR << "MuonIDFileName must NOT be IdDictMuonSpectrometer.xml " - // << endmsg; - // return StatusCode::FAILURE; - // } - - // } - // else log << MSG::WARNING << " no record set found - using default dictionary " << endmsg; - - // Get Forward - // detectorKey = DecodeVersionKey(geoModelSvc, "ForwardDetectors"); - // log << MSG::DEBUG << "From Version Tag: " << detectorKey.tag() - // << " at Node: " << detectorKey.node() << endmsg; - // idDictSet = rdbAccessSvc->getRecordsetPtr("ForDetIdentifier", - // detectorKey.tag(), - // detectorKey.node()); - // // For older datasets use ForDetIdentifier-00 as fallback - // if (0 == idDictSet->size()) { - // idDictSet = rdbAccessSvc->getRecordsetPtr("ForDetIdentifier", - // "ForDetIdentifier-00"); - // log << MSG::DEBUG << " explicitly requesting ForDetIdentifier-00 tag for pre-forward detector data " - // << endmsg; - // } - // // Size == 0 if not found - // if (idDictSet->size()) { - // idDictTable = (*idDictSet)[0]; - // dictName = idDictTable->getString("DICT_NAME"); - // m_forwardIDFileName = idDictTable->getString("DICT_FILENAME"); - // m_forwardIdDictTag = idDictSet->tagName(); - // log << MSG::DEBUG << " using Dictionary: " << dictName - // << ", file: " << m_forwardIDFileName - // << ", dictionary tag: " << m_forwardIdDictTag - // << endmsg; - // } - // else log << MSG::WARNING << " no record set found - using default dictionary " << endmsg; - + else log << MSG::WARNING << " no record set found - using default dictionary " << endmsg; log << MSG::DEBUG << "End access to RDB for id dictionary info " << endmsg; @@ -973,18 +884,6 @@ IdDictDetDescrCnv::registerFilesWithParser() << m_caloIDFileName << endmsg; } - // if ("" != m_muonIDFileName) { - // m_parser->register_external_entity("MuonSpectrometer", m_muonIDFileName); - // log << MSG::INFO << "Reading MuonSpectrometer IdDict file " - // << m_muonIDFileName - // << endmsg; - // } - // if ("" != m_forwardIDFileName) { - // m_parser->register_external_entity("ForwardDetectors", m_forwardIDFileName); - // log << MSG::INFO << "Reading ForwardDetectors IdDict file " - // << m_forwardIDFileName - // << endmsg; - // } return StatusCode::SUCCESS ; } diff --git a/Scintillator/ScintDetDescr/ScintGeoModelUtils/src/ExtraMaterial.cxx b/Scintillator/ScintDetDescr/ScintGeoModelUtils/src/ExtraMaterial.cxx index 9f8a385a1..93756890c 100644 --- a/Scintillator/ScintDetDescr/ScintGeoModelUtils/src/ExtraMaterial.cxx +++ b/Scintillator/ScintDetDescr/ScintGeoModelUtils/src/ExtraMaterial.cxx @@ -6,7 +6,6 @@ #include "ScintGeoModelUtils/GenericTubeMaker.h" #include "ScintGeoModelUtils/TubeVolData.h" #include "ScintGeoModelUtils/DistortedMaterialManager.h" -//#include "ScintGeoModelUtils/InDetMaterialManager.h" #include "RDBAccessSvc/IRDBRecordset.h" #include "RDBAccessSvc/IRDBRecord.h" #include "GeoPrimitives/GeoPrimitives.h" diff --git a/Scintillator/ScintDetDescr/ScintIdentifier/src/VetoID.cxx b/Scintillator/ScintDetDescr/ScintIdentifier/src/VetoID.cxx index 28c0bf3ae..1d55a6194 100644 --- a/Scintillator/ScintDetDescr/ScintIdentifier/src/VetoID.cxx +++ b/Scintillator/ScintDetDescr/ScintIdentifier/src/VetoID.cxx @@ -767,16 +767,6 @@ VetoID::initLevelsFromDict() std::cout << " DEBUG pmt " << m_pmt_impl.show_to_string() << std::endl; } -// std::cout << "VetoID::initLevelsFromDict - found levels " << std::endl; -// std::cout << "subdet " << m_INDET_INDEX << std::endl; -// std::cout << "part " << m_SCT_INDEX << std::endl; -// std::cout << "barrel_endcap " << m_BARREL_EC_INDEX << std::endl; -// std::cout << "layer or disk " << m_LAYER_DISK_INDEX << std::endl; -// std::cout << "phi_module " << m_PHI_MODULE_INDEX << std::endl; -// std::cout << "eta_module " << m_ETA_MODULE_INDEX << std::endl; -// std::cout << "side " << m_SIDE_INDEX << std::endl; -// std::cout << "strip " << m_STRIP_INDEX << std::endl; - std::cout << "scint " << m_scint_impl.decode_index() << " " << (std::string)m_scint_impl.ored_field() << " " << std::hex << m_scint_impl.mask() << " " diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ExtendedAlignableTransform.h b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ExtendedAlignableTransform.h index 74076d823..814a5eee2 100644 --- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ExtendedAlignableTransform.h +++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ExtendedAlignableTransform.h @@ -54,4 +54,4 @@ namespace ScintDD { } // end namespace -#endif // SCINTINDETREADOUTGEOMETRY_EXTENDEDALIGNABLETRANSFORM_H +#endif // SCINTREADOUTGEOMETRY_EXTENDEDALIGNABLETRANSFORM_H diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorDesign.h b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorDesign.h index 02500895d..556b1667d 100644 --- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorDesign.h +++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorDesign.h @@ -12,7 +12,6 @@ #define SCINTREADOUTGEOMETRY_SCINTDETECTORDESIGN_H // Input/output classes -// #include "InDetReadoutGeometry/SiDiodesParameters.h" #include "ScintReadoutGeometry/ScintDD_Defs.h" #include "CLHEP/Geometry/Point3D.h" #include "CLHEP/Geometry/Vector3D.h" diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorElement.h b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorElement.h index 27ac6a4b9..08d89603b 100644 --- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorElement.h +++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorElement.h @@ -173,6 +173,8 @@ namespace ScintDD { /////////////////////////////////////////////////////////////////// //@{ + const ScintDetectorElement* nextInZ() const; + const ScintDetectorElement* prevInZ() const; //@} /////////////////////////////////////////////////////////////////// @@ -382,6 +384,10 @@ namespace ScintDD { //@} ////////////////////////////////////////////////////////////////////////////////////// + + void setNextInZ(const ScintDetectorElement* element); + void setPrevInZ(const ScintDetectorElement* element); + ////////////////////////////////////////////////////////////////////////////////////// public: @@ -439,6 +445,9 @@ namespace ScintDD { const ScintDetectorDesign *m_design; // local description of this detector element const ScintCommonItems * m_commonItems; + const ScintDetectorElement* m_prevInZ; + const ScintDetectorElement* m_nextInZ; + bool m_isVeto; bool m_isTrigger; bool m_isPreshower; @@ -664,6 +673,26 @@ namespace ScintDD { { return m_commonItems; } + + inline const ScintDetectorElement* ScintDetectorElement::prevInZ() const + { + return m_prevInZ; + } + + inline const ScintDetectorElement* ScintDetectorElement::nextInZ() const + { + return m_nextInZ; + } + + inline void ScintDetectorElement::setPrevInZ(const ScintDetectorElement* element) + { + m_prevInZ = element; + } + + inline void ScintDetectorElement::setNextInZ(const ScintDetectorElement* element) + { + m_nextInZ = element; + } } // namespace ScintDD diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorElementCollection.h b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorElementCollection.h index 3e3c092bc..896f810d0 100644 --- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorElementCollection.h +++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintDetectorElementCollection.h @@ -41,4 +41,4 @@ CLASS_DEF( ScintDD::ScintDetectorElementCollection , 1090173979 , 1 ) #include "AthenaKernel/CondCont.h" CONDCONT_DEF( ScintDD::ScintDetectorElementCollection, 1189378543 ); -#endif // INDETREADOUTGEOMETRY_SIDETECTORELEMENTCOLLECTION_H +#endif // SCINTREADOUTGEOMETRY_SCINTDETECTORELEMENTCOLLECTION_H diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintLocalPosition.h b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintLocalPosition.h index 69770e0b7..9fe68ef5f 100644 --- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintLocalPosition.h +++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintLocalPosition.h @@ -15,7 +15,7 @@ #include "TrkEventPrimitives/ParamDefs.h" #include <cmath> -namespace Trk { +namespace ScintDD { enum ExtraLocalPosParam {distDepth = 2}; // These will be defined in Trk soon. } diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintNumerology.h b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintNumerology.h index 05883b0f5..92bf30e73 100644 --- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintNumerology.h +++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/ScintNumerology.h @@ -19,7 +19,6 @@ namespace ScintDD { /** @class ScintNumerology Class to extract numerology for Veto, Trigger and Preshower. For example number of stations, plates, pmts, etc. - See InnerDetector/InDetExample/InDetDetDescrExample/src/SiReadSiDetectorElements.cxx for example of usage. @author Grant Gorfine */ diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/Version.h b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/Version.h index 0792d719a..67f9c6a9e 100644 --- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/Version.h +++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/Version.h @@ -86,6 +86,6 @@ namespace ScintDD { int m_patch; }; -} // namespace InDetDD +} // namespace ScintDD #endif // SCINTREADOUTGEOMETRY_VERSION diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/VetoDetectorManager.h b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/VetoDetectorManager.h index 86cc4d527..9c64091a9 100644 --- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/VetoDetectorManager.h +++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/ScintReadoutGeometry/VetoDetectorManager.h @@ -117,7 +117,7 @@ namespace ScintDD { const CondAttrListCollection* obj, GeoVAlignmentStore* alignStore) const override; - // comply with InDetDetectorManager interface + // comply with ScintDetectorManager interface bool processSpecialAlignment(const std::string & key, ScintDD::AlignFolderType alignfolder) const override; @@ -160,7 +160,7 @@ namespace ScintDD { }; -} // namespace InDetDD +} // namespace ScintDD #ifndef GAUDI_NEUTRAL #include "AthenaKernel/CLASS_DEF.h" diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/ScintDetectorElement.cxx b/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/ScintDetectorElement.cxx index 84261bf17..7c5c8f2df 100644 --- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/ScintDetectorElement.cxx +++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/ScintDetectorElement.cxx @@ -25,10 +25,7 @@ #include "CLHEP/Units/PhysicalConstants.h" // for M_PI #include "CLHEP/Units/SystemOfUnits.h" -// #include "InDetReadoutGeometry/SiCellId.h" -// #include "InDetReadoutGeometry/SiReadoutCellId.h" #include "ScintReadoutGeometry/ScintDetectorDesign.h" -// #include "InDetReadoutGeometry/StripStereoAnnulusDesign.h" #include "ScintReadoutGeometry/ScintCommonItems.h" @@ -43,7 +40,7 @@ namespace ScintDD { using Trk::distEta; using Trk::distPhi; -using Trk::distDepth; +// using Trk::distDepth; // Constructor with parameters: ScintDetectorElement::ScintDetectorElement(const Identifier &id, @@ -56,6 +53,8 @@ ScintDetectorElement::ScintDetectorElement(const Identifier &id, m_idHash(64000), m_design(design), m_commonItems(commonItems), + m_prevInZ(nullptr), + m_nextInZ(nullptr), m_cacheValid(false), m_firstTime(true), m_mutex(), @@ -598,209 +597,6 @@ bool ScintDetectorElement::isPreshower() const return m_isPreshower; } -// bool ScintDetectorElement::isDBM() const -// { -// return m_isDBM; -// } - -// bool ScintDetectorElement::isBlayer() const -// { -// if (isPixel() && isBarrel()) { -// const PixelID* p_pixelId = static_cast<const PixelID *>(getIdHelper()); -// return (0==p_pixelId->layer_disk(m_id)); -// } else { -// return false; -// } -// } - -// bool ScintDetectorElement::isInnermostPixelLayer() const -// { -// if (isPixel() && isBarrel()) { -// const PixelID* p_pixelId = static_cast<const PixelID *>(getIdHelper()); -// return (0==p_pixelId->layer_disk(m_id)); -// } else { -// return false; -// } -// } - -// bool ScintDetectorElement::isNextToInnermostPixelLayer() const -// { -// if (isPixel() && isBarrel()) { -// const PixelID* p_pixelId = static_cast<const PixelID *>(getIdHelper()); -// return (1==p_pixelId->layer_disk(m_id)); -// } else { -// return false; -// } -// } - -// // compute sin(tilt angle) at center: -// double ScintDetectorElement::sinTilt() const -// { -// std::lock_guard<std::recursive_mutex> lock(m_mutex); -// if (!m_cacheValid) updateCache(); - -// // Tilt is defined as the angle between a refVector and the sensor normal. -// // In barrel refVector = unit vector radial. -// // in endcap it is assumed there is no tilt. -// // sinTilt = (refVector cross normal) . z - -// // tilt angle is not defined for the endcap -// if (isEndcap()) return 0; - -// // Angle between normal and radial vector. -// // HepGeom::Vector3D<double> refVector(m_center.x(), m_center.y(), 0); -// // return (refVector.cross(m_normal)).z()/refVector.mag(); -// // or the equivalent -// return (m_center.x() * m_normal.y() - m_center.y() * m_normal.x()) / m_center.perp(); -// } - -// double ScintDetectorElement::sinTilt(const Amg::Vector2D &localPos) const -// { -// std::lock_guard<std::recursive_mutex> lock(m_mutex); -// if (!m_cacheValid) updateCache(); - -// // tilt angle is not defined for the endcap -// if (isEndcap()) return 0; - -// HepGeom::Point3D<double> point=globalPositionCLHEP(localPos); -// return sinTilt(point); -// } - -// double ScintDetectorElement::sinTilt(const HepGeom::Point3D<double> &globalPos) const -// { -// std::lock_guard<std::recursive_mutex> lock(m_mutex); -// if (!m_cacheValid) updateCache(); - -// // It is assumed that the global position is already in the plane of the element. - -// // tilt angle is not defined for the endcap -// if (isEndcap()) return 0; - -// // Angle between normal and radial vector. -// //HepGeom::Vector3D<double> refVector(globalPos.x(), globalPos.y(), 0); -// //return (refVector.cross(m_normal)).z()/refVector.mag(); -// // or the equivalent -// return (globalPos.x() * m_normal.y() - globalPos.y() * m_normal.x()) / globalPos.perp(); -// } - -// double ScintDetectorElement::sinStereo() const -// { -// std::lock_guard<std::recursive_mutex> lock(m_mutex); -// if (!m_cacheValid) updateCache(); - -// // Stereo is the angle between a refVector and a vector along the strip/pixel in eta direction. -// // I'm not sure how the sign should be defined. I've defined it here -// // with rotation sense respect to normal, -// // where normal is away from IP in barrel and in -ve z direction in endcap - -// // In Barrel refVector = unit vector along z axis, -// // in endcap refVector = unit vector radial. -// // -// // sinStereo = (refVector cross stripAxis) . normal -// // = (refVector cross etaAxis) . normal -// // = refVector . (etaAxis cross normal) -// // = refVector . phiAxis -// // -// // in Barrel we use -// // sinStereo = refVector . phiAxis -// // = phiAxis.z() -// // -// // in endcap we use -// // sinStereo = (refVector cross etaAxis) . normal -// // = -(center cross etaAxis) . zAxis -// // = (etaAxis cross center). z() - -// double sinStereo; -// if (isBarrel()) { -// sinStereo = m_phiAxis.z(); -// } else { // endcap -// sinStereo = (m_center.y() * m_etaAxis.x() - m_center.x() * m_etaAxis.y()) / m_center.perp(); -// } -// return sinStereo; -// } - -// double ScintDetectorElement::sinStereo(const Amg::Vector2D &localPos) const -// { -// std::lock_guard<std::recursive_mutex> lock(m_mutex); -// if (!m_cacheValid) updateCache(); - -// HepGeom::Point3D<double> point=globalPositionCLHEP(localPos); -// return sinStereo(point); -// } - -// double ScintDetectorElement::sinStereo(const HepGeom::Point3D<double> &globalPos) const -// { -// // -// // sinStereo = (refVector cross stripAxis) . normal -// // - -// std::lock_guard<std::recursive_mutex> lock(m_mutex); -// if (!m_cacheValid) updateCache(); - -// double sinStereo; -// if (isBarrel()) { -// if (m_design->shape() != InDetDD::Trapezoid) { -// sinStereo = m_phiAxis.z(); -// } else { // trapezoid -// assert (minWidth() != maxWidth()); -// double radius = width() * length() / (maxWidth() - minWidth()); -// HepGeom::Vector3D<double> stripAxis = radius * m_etaAxisCLHEP + globalPos - m_centerCLHEP; -// sinStereo = (stripAxis.x() * m_normal.y() - stripAxis.y() * m_normal.x()) / stripAxis.mag(); -// } -// } else { // endcap -// if (m_design->shape() != InDetDD::Trapezoid) { -// sinStereo = (globalPos.y() * m_etaAxis.x() - globalPos.x() * m_etaAxis.y()) / globalPos.perp(); -// } else { // trapezoid -// assert (minWidth() != maxWidth()); -// double radius = width() * length() / (maxWidth() - minWidth()); -// // Only need projection in xy plane. -// double stripAxisX = globalPos.x() - m_center.x() + m_etaAxis.x()*radius; -// double stripAxisY = globalPos.y() - m_center.y() + m_etaAxis.y()*radius; -// double norm = 1./(radius*sqrt(stripAxisX*stripAxisX + stripAxisY*stripAxisY)); -// sinStereo = norm * (stripAxisX * globalPos.y() - stripAxisY * globalPos.x()); -// } -// } -// return sinStereo; -// } - -// bool -// ScintDetectorElement::isStereo() const -// { -// std::lock_guard<std::recursive_mutex> lock(m_mutex); -// if (m_firstTime) updateCache(); -// return m_isStereo; -// } - - -// double -// ScintDetectorElement::sinStereoLocal(const Amg::Vector2D &localPos) const -// { -// // The equation below will work for rectangle detectors as well in which -// // case it will return 0. But we return zero immediately as there is no point doing the calculation. -// if (m_design->shape() == InDetDD::Box) return 0; -// double oneOverRadius = (maxWidth() - minWidth()) / (width() * length()); -// double x = localPos[distPhi]; -// double y = localPos[distEta]; -// return -x*oneOverRadius / sqrt( (1+y*oneOverRadius)*(1+y*oneOverRadius) + x*oneOverRadius*x*oneOverRadius ); -// } - - -// double -// ScintDetectorElement::sinStereoLocal(const HepGeom::Point3D<double> &globalPos) const -// { -// return sinStereoLocal(localPosition(globalPos)); -// } - -// // Special method for SCT to retrieve the two ends of a "strip" -// std::pair<Amg::Vector3D,Amg::Vector3D> ScintDetectorElement::endsOfStrip(const Amg::Vector2D &position) const -// { -// const std::pair<Amg::Vector2D,Amg::Vector2D> localEnds= -// m_design->endsOfStrip(position); -// return std::pair<Amg::Vector3D,Amg::Vector3D >(globalPosition(localEnds.first), -// globalPosition(localEnds.second)); -// } - - Trk::Surface & ScintDetectorElement::surface() { diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/ScintDetectorManager.cxx b/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/ScintDetectorManager.cxx index 048dcbbe4..a3a2b415e 100644 --- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/ScintDetectorManager.cxx +++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/ScintDetectorManager.cxx @@ -28,7 +28,7 @@ namespace ScintDD m_design {nullptr} { // Add default folder - addFolder("/Scint/Align"); + // addFolder("/Scint/Align"); } const std::string& ScintDetectorManager::tag() const diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/ScintLocalPosition.cxx b/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/ScintLocalPosition.cxx index fd36b55b3..c3576fdca 100644 --- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/ScintLocalPosition.cxx +++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/ScintLocalPosition.cxx @@ -97,4 +97,4 @@ ScintLocalPosition operator/(const ScintLocalPosition &position,const double fac return result; } -} // namespace InDetDD +} // namespace ScintDD diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/VetoDetectorManager.cxx b/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/VetoDetectorManager.cxx index 3146c8cdd..61d6030d1 100644 --- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/VetoDetectorManager.cxx +++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/src/VetoDetectorManager.cxx @@ -135,35 +135,26 @@ namespace ScintDD { void VetoDetectorManager::initNeighbours() { - // ScintDetectorElementCollection::iterator iter; + ScintDetectorElementCollection::iterator iter; - // // Loop over all elements and set the neighbours - // for (iter = m_elementCollection.begin(); iter != m_elementCollection.end(); ++iter){ + // Loop over all elements and set the neighbours + for (iter = m_elementCollection.begin(); iter != m_elementCollection.end(); ++iter){ - // ScintDetectorElement * element = *iter; - // if (element) { + ScintDetectorElement * element = *iter; + if (element) { - // IdentifierHash idHash = element->identifyHash(); - // IdentifierHash idHashOther; + IdentifierHash idHash = element->identifyHash(); + IdentifierHash idHashOther; - // int result; - // // If no neighbour, result != 0 in which case we leave neighbour as null - // result = m_idHelper->get_next_in_eta(idHash, idHashOther); - // if (result==0) element->setNextInEta(m_elementCollection[idHashOther]); + int result; + // If no neighbour, result != 0 in which case we leave neighbour as null + result = m_idHelper->get_next_in_z(idHash, idHashOther); + if (result==0) element->setNextInZ(m_elementCollection[idHashOther]); - // result = m_idHelper->get_prev_in_eta(idHash, idHashOther); - // if (result==0) element->setPrevInEta(m_elementCollection[idHashOther]); - - // result = m_idHelper->get_next_in_phi(idHash, idHashOther); - // if (result==0) element->setNextInPhi(m_elementCollection[idHashOther]); - - // result = m_idHelper->get_prev_in_phi(idHash, idHashOther); - // if (result==0) element->setPrevInPhi(m_elementCollection[idHashOther]); - - // result = m_idHelper->get_other_side(idHash, idHashOther); - // if (result==0) element->setOtherSide(m_elementCollection[idHashOther]); - // } - // } + result = m_idHelper->get_prev_in_z(idHash, idHashOther); + if (result==0) element->setPrevInZ(m_elementCollection[idHashOther]); + } + } } const VetoID* VetoDetectorManager::getIdHelper() const diff --git a/Scintillator/ScintDetDescr/VetoGeoModel/VetoGeoModel/VetoMaterialManager.h b/Scintillator/ScintDetDescr/VetoGeoModel/VetoGeoModel/VetoMaterialManager.h index 9fad943ae..1b641b05f 100644 --- a/Scintillator/ScintDetDescr/VetoGeoModel/VetoGeoModel/VetoMaterialManager.h +++ b/Scintillator/ScintDetDescr/VetoGeoModel/VetoGeoModel/VetoMaterialManager.h @@ -5,7 +5,7 @@ #ifndef VETOMATERIALMANAGER_H #define VETOMATERIALMANAGER_H -// SCT_MaterialManager. This provides an interface to the InDetMaterialManager which in turn +// VetoMaterialManager. This provides an interface to the ScintMaterialManager which in turn // is an interface to GeoModel Material Manager with some additional functionality. #include "ScintGeoModelUtils/ScintMaterialManager.h" diff --git a/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoDataBase.cxx b/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoDataBase.cxx index 6d322cc2b..3f059b7a4 100644 --- a/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoDataBase.cxx +++ b/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoDataBase.cxx @@ -26,13 +26,13 @@ VetoDataBase::VetoDataBase(const VetoGeoModelAthenaComps * athenaComps) std::string versionTag = versionKey.tag(); std::string versionNode = versionKey.node(); - // Get version tag and node for InnerDetector. + // Get version tag and node for Scintillator. DecodeFaserVersionKey scintVersionKey(geoDbTag,"Scintillator"); // Access the RDB IRDBAccessSvc* rdbSvc = m_athenaComps->rdbAccessSvc(); - // SCT version tag + // Veto version tag m_vetoVersionTag = rdbSvc->getChildTag("Veto", versionKey.tag(), versionKey.node(), "FASERDD"); @@ -71,123 +71,12 @@ VetoDataBase::VetoDataBase(const VetoGeoModelAthenaComps * athenaComps) // m_conditions = rdbSvc->getRecordsetPtr("VetoConditions", versionTag, versionNode, "FASERDD"); // msg(MSG::DEBUG) << "Table VetoConditions Fetched" << endmsg; -// // -// // SCT Barrel -// // -// m_brlSensor = rdbSvc->getRecordsetPtr("SctBrlSensor", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctBrlSensor Fetched" << endmsg; - -// m_brlModule = rdbSvc->getRecordsetPtr("SctBrlModule", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctBrlModule Fetched" << endmsg; - -// m_brlSki = rdbSvc->getRecordsetPtr("SctBrlSki", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctBrlSki Fetched" << endmsg; - -// m_brlSkiZ = rdbSvc->getRecordsetPtr("SctBrlSkiZ", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctBrlSkiZ Fetched" << endmsg; - -// m_brlLayer = rdbSvc->getRecordsetPtr("SctBrlLayer", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctBrlLayer Fetched" << endmsg; - -// m_brlServices = rdbSvc->getRecordsetPtr("SctBrlServices", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctBrlServices Fetched" << endmsg; - -// m_brlServPerLayer = rdbSvc->getRecordsetPtr("SctBrlServPerLayer", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctBrlServPerLayer Fetched" << endmsg; - -// m_brlThermalShield = rdbSvc->getRecordsetPtr("SctBrlThermalShield", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctBrlThermalShield Fetched" << endmsg; - m_stationGeneral = rdbSvc->getRecordsetPtr("VetoStationGeneral", versionTag, versionNode, "FASERDD"); msg(MSG::DEBUG) << "Table VetoStationGeneral Fetched" << endmsg; m_plateGeneral = rdbSvc->getRecordsetPtr("VetoPlateGeneral", versionTag, versionNode, "FASERDD"); msg(MSG::DEBUG) << "Table VetoPlateGeneral Fetched" << endmsg; -// m_brlFSI = rdbSvc->getRecordsetPtr("SctBrlFSI", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctBrlFSI Fetched" << endmsg; - -// m_brlFSILocation = rdbSvc->getRecordsetPtr("SctBrlFSILocation", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctBrlFSILocation Fetched" << endmsg; - -// m_fwdSensor = rdbSvc->getRecordsetPtr("SctFwdSensor", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdSensor Fetched" << endmsg; - -// m_fwdHybrid = rdbSvc->getRecordsetPtr("SctFwdHybrid", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdHybrid Fetched" << endmsg; - -// m_fwdSpine = rdbSvc->getRecordsetPtr("SctFwdSpine", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdSpine Fetched" << endmsg; - -// m_fwdModule = rdbSvc->getRecordsetPtr("SctFwdModule", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdModule Fetched" << endmsg; - -// m_fwdModuleConnector = rdbSvc->getRecordsetPtr("SctFwdModuleConnector", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdModuleConnector Fetched" << endmsg; - -// // -// // SCT Forward -// // -// m_fwdRing = rdbSvc->getRecordsetPtr("SctFwdRing", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdRing Fetched" << endmsg; - -// m_fwdWheel = rdbSvc->getRecordsetPtr("SctFwdWheel", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdWheel Fetched" << endmsg; - -// m_fwdWheelRingMap = rdbSvc->getRecordsetPtr("SctFwdWheelRingMap", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdWheelRingMap Fetched" << endmsg; - -// m_fwdDiscSupport = rdbSvc->getRecordsetPtr("SctFwdDiscSupport", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdDiscSupport Fetched" << endmsg; - -// m_fwdPatchPanelLoc = rdbSvc->getRecordsetPtr("SctFwdPatchPanelLoc", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdPatchPanelLoc Fetched" << endmsg; - -// m_fwdPatchPanel = rdbSvc->getRecordsetPtr("SctFwdPatchPanel", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdPatchPanel Fetched" << endmsg; - -// m_fwdPPConnector = rdbSvc->getRecordsetPtr("SctFwdPPConnector", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdPPConnector Fetched" << endmsg; - -// m_fwdPPCooling = rdbSvc->getRecordsetPtr("SctFwdPPCooling", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdPPCooling Fetched" << endmsg; - -// m_fwdCoolingBlock = rdbSvc->getRecordsetPtr("SctFwdCoolingBlock", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdCoolingBlock Fetched" << endmsg; - -// m_fwdRingServices = rdbSvc->getRecordsetPtr("SctFwdRingServices", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdRingServices Fetched" << endmsg; - -// m_fwdServices = rdbSvc->getRecordsetPtr("SctFwdServices", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdServices Fetched" << endmsg; - -// m_fwdFSILocation = rdbSvc->getRecordsetPtr("SctFwdFSILocation", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdFSILocation Fetched" << endmsg; - -// m_fwdFSIType = rdbSvc->getRecordsetPtr("SctFwdFSIType", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdFSIType Fetched" << endmsg; - -// m_fwdFSI = rdbSvc->getRecordsetPtr("SctFwdFSI", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdFSI Fetched" << endmsg; - -// m_fwdThermalShield = rdbSvc->getRecordsetPtr("SctFwdThermalShield", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdThermalShield Fetched" << endmsg; - -// m_fwdGeneral = rdbSvc->getRecordsetPtr("SctFwdGeneral", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdGeneral Fetched" << endmsg; - -// m_fwdOptoHarness = rdbSvc->getRecordsetPtr("SctFwdOptoHarness", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdOptoHarness Fetched" << endmsg; - -// m_fwdDiscFixation = rdbSvc->getRecordsetPtr("SctFwdDiscFixation", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdDiscFixation Fetched" << endmsg; - -// m_fwdCylServ = rdbSvc->getRecordsetPtr("SctFwdCylServ", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdCyServ Fetched" << endmsg; - -// m_fwdCylServLoc = rdbSvc->getRecordsetPtr("SctFwdCylServLoc", versionTag, versionNode); -// msg(MSG::DEBUG) << "Table SctFwdCylServLoc Fetched" << endmsg; - } const VetoGeoModelAthenaComps* VetoDataBase::athenaComps() const { return m_athenaComps; } @@ -202,64 +91,8 @@ IRDBRecordset_ptr VetoDataBase::topLevelTable() const {return m_topLevel;} // IRDBRecordset_ptr VetoDataBase::conditionsTable() const {return m_conditions;} // const IRDBRecord* VetoDataBase::conditions() const {return (*m_conditions)[0];} -// const IRDBRecord* VetoDataBase::brlSensor() const {return (*m_brlSensor)[0];} -// const IRDBRecord* VetoDataBase::brlModule() const {return (*m_brlModule)[0];} - -// const IRDBRecord* VetoDataBase::brlSki() const {return (*m_brlSki)[0];} -// const IRDBRecord* VetoDataBase::brlSkiZ(int i) const {return (*m_brlSkiZ)[i];} -// int VetoDataBase::brlSkiZSize() const {return m_brlSkiZ->size();} -// const IRDBRecord* VetoDataBase::brlLayer(int i) const {return (*m_brlLayer)[i];} -// const IRDBRecord* VetoDataBase::brlServices() const {return (*m_brlServices)[0];} -// const IRDBRecord* VetoDataBase::brlServPerLayer(int i) const {return (*m_brlServPerLayer)[i];} -// const IRDBRecord* VetoDataBase::brlThermalShield() const {return (*m_brlThermalShield)[0];} const IRDBRecord* VetoDataBase::stationGeneral() const {return (*m_stationGeneral)[0];} const IRDBRecord* VetoDataBase::plateGeneral() const {return (*m_plateGeneral)[0];} -// const IRDBRecord* VetoDataBase::brlFSI() const {return (*m_brlFSI)[0];} -// int VetoDataBase::brlFSISize() const {return m_brlFSI->size();} -// const IRDBRecord* VetoDataBase::brlFSILocation(int i) const {return (*m_brlFSILocation)[i];} - -// const IRDBRecord* VetoDataBase::fwdSensor(int i) const {return (*m_fwdSensor)[i];} -// const IRDBRecord* VetoDataBase::fwdHybrid() const {return (*m_fwdHybrid)[0];} -// const IRDBRecord* VetoDataBase::fwdSpine(int i) const {return (*m_fwdSpine)[i];} -// const IRDBRecord* VetoDataBase::fwdModule(int i) const {return (*m_fwdModule)[i];} -// int VetoDataBase::fwdModuleSize() const {return m_fwdModule->size();} -// IRDBRecordset_ptr VetoDataBase::fwdModuleConnectorTable() const {return m_fwdModuleConnector;} -// const IRDBRecord* VetoDataBase::fwdModuleConnector() const {return (*m_fwdModuleConnector)[0];} - -// const IRDBRecord* VetoDataBase::fwdRing(int i) const {return (*m_fwdRing)[i];} -// int VetoDataBase::fwdRingSize() const {return m_fwdRing->size();} -// const IRDBRecord* VetoDataBase::fwdWheel(int i) const {return (*m_fwdWheel)[i];} -// const IRDBRecord* VetoDataBase::fwdWheelRingMap(int i) const {return (*m_fwdWheelRingMap)[i];} -// int VetoDataBase::fwdWheelRingMapSize() const {return m_fwdWheelRingMap->size();} -// const IRDBRecord* VetoDataBase::fwdDiscSupport() const {return (*m_fwdDiscSupport)[0];} -// const IRDBRecord* VetoDataBase::fwdPatchPanelLoc(int i) const {return (*m_fwdPatchPanelLoc)[i];} -// int VetoDataBase::fwdPatchPanelLocSize() const {return m_fwdPatchPanelLoc->size();} -// const IRDBRecord* VetoDataBase::fwdPatchPanel(int i) const {return (*m_fwdPatchPanel)[i];} -// int VetoDataBase::fwdPatchPanelSize() const {return m_fwdPatchPanel->size();} -// const IRDBRecord* VetoDataBase::fwdPPConnector() const {return (*m_fwdPPConnector)[0];} -// int VetoDataBase::fwdPPConnectorSize() const {return m_fwdPPConnector->size();} -// const IRDBRecord* VetoDataBase::fwdPPCooling() const {return (*m_fwdPPCooling)[0];} -// int VetoDataBase::fwdPPCoolingSize() const {return m_fwdPPCooling->size();} -// const IRDBRecord* VetoDataBase::fwdCoolingBlock(int i) const {return (*m_fwdCoolingBlock)[i];} -// const IRDBRecord* VetoDataBase::fwdRingServices(int i) const {return (*m_fwdRingServices)[i];} -// const IRDBRecord* VetoDataBase::fwdServices() const {return (*m_fwdServices)[0];} -// const IRDBRecord* VetoDataBase::fwdFSILocation(int i) const {return (*m_fwdFSILocation)[i];} -// int VetoDataBase::fwdFSILocationSize() const {return m_fwdFSILocation->size();} -// const IRDBRecord* VetoDataBase::fwdFSIType(int i) const {return (*m_fwdFSIType)[i];} -// int VetoDataBase::fwdFSITypeSize() const {return m_fwdFSIType->size();} -// const IRDBRecord* VetoDataBase::fwdFSI(int i) const {return (*m_fwdFSI)[i];} -// int VetoDataBase::fwdFSISize() const {return m_fwdFSI->size();} -// const IRDBRecord* VetoDataBase::fwdThermalShield(int i) const {return (*m_fwdThermalShield)[i];} -// int VetoDataBase::fwdThermalShieldSize() const {return m_fwdThermalShield->size();} -// const IRDBRecord* VetoDataBase::fwdGeneral() const {return (*m_fwdGeneral)[0];} -// IRDBRecordset_ptr VetoDataBase::fwdOptoHarnessTable() const {return m_fwdOptoHarness;} -// const IRDBRecord* VetoDataBase::fwdOptoHarness(int i) const {return (*m_fwdOptoHarness)[i];} -// const IRDBRecord* VetoDataBase::fwdDiscFixation() const {return (*m_fwdDiscFixation)[0];} -// IRDBRecordset_ptr VetoDataBase::fwdDiscFixationTable() const {return m_fwdDiscFixation;} -// const IRDBRecord* VetoDataBase::fwdCylServ(int i) const {return (*m_fwdCylServ)[i];} -// int VetoDataBase::fwdCylServSize() const {return m_fwdCylServ->size();} -// const IRDBRecord* VetoDataBase::fwdCylServLoc(int i) const {return (*m_fwdCylServLoc)[i];} -// int VetoDataBase::fwdCylServLocSize() const {return m_fwdCylServLoc->size();} const std::string & VetoDataBase::versionTag() const { return m_vetoVersionTag; diff --git a/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoDetectorFactory.cxx b/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoDetectorFactory.cxx index 73f99499b..f2d43e879 100644 --- a/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoDetectorFactory.cxx +++ b/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoDetectorFactory.cxx @@ -214,109 +214,6 @@ void VetoDetectorFactory::create(GeoPhysVol *world) m_detectorManager->addAlignableTransform(1, id.getPlateId(), stationB_Transform, stationB_PV); } -// // -// // The Barrel -// // -// if (barrelPresent) { - -// msg(MSG::DEBUG) << "Building the SCT Barrel." << endmsg; - -// m_detectorManager->numerology().addBarrel(0); - -// // Create the SCT Barrel -// SCT_Barrel sctBarrel("SCT_Barrel", m_detectorManager, m_geometryManager, m_materials); - -// SCT_Identifier id{m_geometryManager->athenaComps()->getIdHelper()}; -// id.setBarrelEC(0); -// GeoVPhysVol * barrelPV = sctBarrel.build(id); -// GeoAlignableTransform * barrelTransform = new GeoAlignableTransform(sctTransform * sctGeneral->partTransform(barrelLabel)); - -// //indet->add(new GeoNameTag("SCT_Barrel")); -// // The name tag here is what is used by the GeoModel viewer. -// GeoNameTag *topLevelNameTag = new GeoNameTag("SCT"); -// indet->add(topLevelNameTag); -// indet->add(new GeoIdentifierTag(0)); -// indet->add(barrelTransform); -// indet->add(barrelPV); -// m_detectorManager->addTreeTop(barrelPV); - -// // Store alignable transform -// m_detectorManager->addAlignableTransform(3, id.getWaferId(), barrelTransform, barrelPV); - -// } - -// // -// // The Positive Z Endcap (EndcapA) -// // -// if (forwardPlusPresent) { - -// msg(MSG::DEBUG) << "Building the SCT Endcap A (positive z)." << endmsg; - -// m_detectorManager->numerology().addEndcap(2); - -// // Create the Forward -// SCT_Forward sctForwardPlus("SCT_ForwardA", +2, m_detectorManager, m_geometryManager, m_materials); - -// SCT_Identifier idFwdPlus{m_geometryManager->athenaComps()->getIdHelper()}; -// idFwdPlus.setBarrelEC(2); -// GeoVPhysVol * forwardPlusPV = sctForwardPlus.build(idFwdPlus); -// GeoTrf::Transform3D fwdTransformPlus(sctTransform -// * sctGeneral->partTransform(forwardPlusLabel) -// * GeoTrf::TranslateZ3D(sctForwardPlus.zCenter())); -// GeoAlignableTransform * fwdGeoTransformPlus = new GeoAlignableTransform(fwdTransformPlus); - -// //indet->add(new GeoNameTag("SCT_ForwardPlus")); -// // The name tag here is what is used by the GeoModel viewer. -// GeoNameTag *topLevelNameTag = new GeoNameTag("SCT"); -// indet->add(topLevelNameTag); -// indet->add(new GeoIdentifierTag(2)); -// indet->add(fwdGeoTransformPlus); -// indet->add(forwardPlusPV); -// m_detectorManager->addTreeTop(forwardPlusPV); - -// // Store alignable transform -// m_detectorManager->addAlignableTransform(3, idFwdPlus.getWaferId(), fwdGeoTransformPlus, forwardPlusPV); -// } - -// // -// // The Negative Z Endcap (EndcapC) -// // - -// if (forwardMinusPresent) { - -// msg(MSG::DEBUG) << "Building the SCT Endcap C (negative z)." << endmsg; - -// m_detectorManager->numerology().addEndcap(-2); - -// SCT_Forward sctForwardMinus("SCT_ForwardC", -2, m_detectorManager, m_geometryManager, m_materials); - -// SCT_Identifier idFwdMinus{m_geometryManager->athenaComps()->getIdHelper()}; -// idFwdMinus.setBarrelEC(-2); -// GeoVPhysVol * forwardMinusPV = sctForwardMinus.build(idFwdMinus); - -// GeoTrf::Transform3D rot; -// rot = GeoTrf::RotateY3D(180 * Gaudi::Units::degree); - -// GeoTrf::Transform3D fwdTransformMinus(sctTransform -// * sctGeneral->partTransform(forwardMinusLabel) -// * rot -// * GeoTrf::TranslateZ3D(sctForwardMinus.zCenter())); -// GeoAlignableTransform * fwdGeoTransformMinus = new GeoAlignableTransform(fwdTransformMinus); - -// //indet->add(new GeoNameTag("SCT_ForwardMinus")); -// // The name tag here is what is used by the GeoModel viewer. -// GeoNameTag *topLevelNameTag = new GeoNameTag("SCT"); -// indet->add(topLevelNameTag); -// indet->add(new GeoIdentifierTag(-2)); -// indet->add(fwdGeoTransformMinus); -// indet->add(forwardMinusPV); -// m_detectorManager->addTreeTop(forwardMinusPV); - - -// // Store alignable transform -// m_detectorManager->addAlignableTransform(3, idFwdMinus.getWaferId(), fwdGeoTransformMinus, forwardMinusPV); -// } - // Set the neighbours m_detectorManager->initNeighbours(); @@ -340,76 +237,15 @@ void VetoDetectorFactory::create(GeoPhysVol *world) if (!m_useDynamicAlignFolders){ m_detectorManager->addAlignFolderType(ScintDD::static_run1); - m_detectorManager->addFolder("/Scint/Align"); - m_detectorManager->addChannel("/Scint/Align/Scint",3,ScintDD::global); - m_detectorManager->addChannel("/Scint/Align/Veto",2,ScintDD::global); - - // if (barrelPresent) { - // m_detectorManager->addChannel("/Indet/Align/SCTB1",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTB2",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTB3",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTB4",1,InDetDD::local); - // } - // if (forwardPlusPresent) { - // m_detectorManager->addChannel("/Indet/Align/SCTEA1",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEA2",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEA3",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEA4",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEA5",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEA6",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEA7",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEA8",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEA9",1,InDetDD::local); - // } - // if (forwardMinusPresent) { - // m_detectorManager->addChannel("/Indet/Align/SCTEC1",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEC2",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEC3",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEC4",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEC5",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEC6",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEC7",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEC8",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/Align/SCTEC9",1,InDetDD::local); - // } + // m_detectorManager->addFolder("/Scint/Align"); } - else { m_detectorManager->addAlignFolderType(ScintDD::timedependent_run2); - m_detectorManager->addGlobalFolder("/Scint/AlignL1/Scint"); - m_detectorManager->addGlobalFolder("/Scint/AlignL2/Veto"); - m_detectorManager->addChannel("/Scint/AlignL1/Scint",3,ScintDD::global); - m_detectorManager->addChannel("/Scint/AlignL2/Veto",2,ScintDD::global); - m_detectorManager->addFolder("/Scint/AlignL3"); - - // if (barrelPresent) { - // m_detectorManager->addChannel("/Indet/AlignL3/SCTB1",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTB2",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTB3",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTB4",1,InDetDD::local); - // } - // if (forwardPlusPresent) { - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEA1",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEA2",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEA3",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEA4",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEA5",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEA6",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEA7",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEA8",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEA9",1,InDetDD::local); - // } - // if (forwardMinusPresent) { - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEC1",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEC2",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEC3",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEC4",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEC5",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEC6",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEC7",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEC8",1,InDetDD::local); - // m_detectorManager->addChannel("/Indet/AlignL3/SCTEC9",1,InDetDD::local); - // } + // m_detectorManager->addGlobalFolder("/Scint/AlignL1/Scint"); + // m_detectorManager->addGlobalFolder("/Scint/AlignL2/Veto"); + // m_detectorManager->addChannel("/Scint/AlignL1/Scint",3,ScintDD::global); + // m_detectorManager->addChannel("/Scint/AlignL2/Veto",2,ScintDD::global); + // m_detectorManager->addFolder("/Scint/AlignL3"); } // Return precision to its original value diff --git a/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoPlate.cxx b/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoPlate.cxx index 96cd5edaa..457336c34 100644 --- a/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoPlate.cxx +++ b/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoPlate.cxx @@ -75,59 +75,10 @@ VetoPlate::makeDesign() const VetoPlateParameters * parameters = m_geometryManager->plateParameters(); -// double stripPitch = parameters->sensorStripPitch(); -// double stripLength = parameters->sensorStripLength(); -// int crystals = parameters->sensorNumWafers(); -// double distCenterToCenter = parameters->sensorDistCenterToCenter(); - - //int cells = parameters->sensorNumReadoutStrips(); - //int diodes = parameters->sensorNumStrips(); - //int shift = parameters->sensorStripShift(); - - // For consistency with older version we keep shift = 0. -// int cells = parameters->sensorNumReadoutStrips(); -// int diodes = cells; -// int shift = 0; - -// double totalDeadLength = distCenterToCenter - stripLength; - -// double xEtaStripPatternCenter = 0; -// double xPhiStripPatternCenter = 0; - -// // Readout direction is in same direction as local phi direction -// bool swapStripReadout = false; - -// // The readout side is at the +ve depth direction -// int readoutSide = +1; - -// m_design = new SCT_BarrelModuleSideDesign(m_thickness, -// crystals, -// diodes, -// cells, -// shift, -// swapStripReadout, -// InDetDD::holes, -// stripPitch, -// stripLength, -// xEtaStripPatternCenter, -// xPhiStripPatternCenter, -// totalDeadLength, -// readoutSide); m_design = new ScintDetectorDesign(m_thickness, m_length, m_width, parameters->platePmts()); - // - // Flags to signal if axis can be swapped. - // For rectangular detector these are all true. - // This is the default and no action is required. - // Can force axes not to be swapped by setting to false. - // - // bool phiSyGaudi::Units::mmetric = true; - // bool etaSyGaudi::Units::mmetric = true; - // bool depthSyGaudi::Units::mmetric = true; - // m_design->setSyGaudi::Units::mmetry(phiSyGaudi::Units::mmetric, etaSyGaudi::Units::mmetric, depthSyGaudi::Units::mmetric, - // } diff --git a/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoStation.cxx b/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoStation.cxx index 2e99328b6..c15e5aa41 100644 --- a/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoStation.cxx +++ b/Scintillator/ScintDetDescr/VetoGeoModel/src/VetoStation.cxx @@ -72,9 +72,6 @@ VetoStation::preBuild() const GeoBox* stationEnvelopeShape = new GeoBox(0.5 * m_width, 0.5 * m_length, 0.5 * m_thickness); GeoLogVol* stationLog = new GeoLogVol(getName(), stationEnvelopeShape, m_materials->gasMaterial()); return stationLog; -// const GeoTube * barrelEnvelopeShape = new GeoTube(m_innerRadius, m_outerRadius, 0.5 * m_length); -// GeoLogVol * barrelLog = new GeoLogVol(getName(), barrelEnvelopeShape, m_materials->gasMaterial()); -// return barrelLog; } GeoVPhysVol * @@ -83,25 +80,6 @@ VetoStation::build(VetoIdentifier id) GeoFullPhysVol * station = new GeoFullPhysVol(m_logVolume); - id.setPlate(0); // temporary to suppress warning - - // There is only one type of plate. So we create it just the once. -// VetoPlate plate("Plate", m_detectorManager, m_geometryManager, m_materials); - - - - // Create the interlinks -// VetoInterLink interLink("InterLink", m_detectorManager, m_geometryManager, m_materials); - - // Calculte the length of the layer cylinder. This is the barrel length less the thermal - // shield and interlink width. - // This is only used for 'OldGeometry". In new geometry, layer length is set internally, - // and is equal to support cylinder length -// double layerLength = m_length - 2*m_thermalShieldEndWallThickness - 2*interLink.length(); - -// // We reduce to allow some alignment clearance -// layerLength -= 2*m_zClearance; - double activeDepth = m_thickness - m_safety/2; double plateThickness = m_plate->thickness(); for (int iPlate = 0; iPlate < m_numPlates; iPlate++) @@ -116,187 +94,7 @@ VetoStation::build(VetoIdentifier id) GeoVPhysVol* platePV = m_plate->build(id); station->add(platePV); m_detectorManager->addAlignableTransform(0, id.getPlateId(), transform, platePV); - } - -// for (int iLayer = 0; iLayer < m_numLayers; iLayer++) { - -// // Create the layers - -// layerLength = 0.; -// VetoLayer layer("Layer"+intToString(iLayer), iLayer, &module, m_detectorManager, m_geometryManager, m_materials); -// barrel->add(new GeoNameTag("Layer#"+intToString(iLayer))); -// barrel->add(new GeoIdentifierTag(iLayer)); // Identifier layer= iLayer -// id.setLayerDisk(iLayer); -// GeoAlignableTransform * transform = new GeoAlignableTransform(GeoTrf::Transform3D::Identity()); -// barrel->add(transform); -// GeoVPhysVol * layerPV = layer.build(id); -// barrel->add(layerPV); -// // Store alignable transform -// m_detectorManager->addAlignableTransform(2, id.getWaferId(), transform, layerPV); -// layerLength = std::max(layerLength,layer.length()); -// } - -// // Build and place the interlinks -// double interLinkZPos = 0.; -// interLinkZPos = 0.5 * layerLength + m_zClearance + 0.5 * interLink.length(); -// barrel->add(new GeoTransform(GeoTrf::TranslateZ3D(+interLinkZPos))); -// barrel->add(interLink.getVolume()); -// barrel->add(new GeoTransform(GeoTrf::TranslateZ3D(-interLinkZPos))); -// barrel->add(interLink.getVolume()); - -// // Build and place the cooling spiders -// double spiderZPos = 0.; -// VetoSpider spider("Spider", m_detectorManager, m_geometryManager, m_materials); -// spiderZPos = interLinkZPos + 0.5*interLink.length() + 0.5*spider.length(); -// barrel->add(new GeoTransform(GeoTrf::TranslateZ3D(+spiderZPos))); -// barrel->add(spider.getVolume()); -// barrel->add(new GeoTransform(GeoTrf::TranslateZ3D(-spiderZPos))); -// barrel->add(spider.getVolume()); - -// // Build and place the thermal shield. -// buildThermalShield(barrel); - -// // Build and place the EMI shield (inner thermal shield). -// buildEMIShield(barrel); - -// // Build and place SCT to Pixel attachment -// VetoPixelAttachment pixelAttachment("AttachmentPixelToSCT", m_detectorManager, m_geometryManager, m_materials); -// barrel->add(new GeoTransform(GeoTrf::TranslateZ3D(+pixelAttachment.zPosition()))); // +ve z -// barrel->add(pixelAttachment.getVolume()); -// barrel->add(new GeoTransform(GeoTrf::TranslateZ3D(-pixelAttachment.zPosition()))); // -ve z -// barrel->add(pixelAttachment.getVolume()); - - // Extra Material -// Unclear whether the geometrical assumptions are valid for a box shape (likely NOT) -// ScintDD::ExtraMaterial xMat(m_geometryManager->distortedMatManager()); -// xMat.add(station, "VetoStation"); - + } return station; - } -// void VetoStation::buildThermalShield(GeoFullPhysVol * parent) const -// { - -// // The thermal shield is now in 3 parts: -// // (a) outer cylinder -// // (b) bulkheads -// // (c) end panels -// // The inner cylinder is called 'EMI shield' for backwards compatibility - -// const VetoStationParameters * parameters = m_geometryManager->barrelParameters(); - -// double cylinderOuterRadius = parameters->thermalShieldOuterRadius(); -// double cylinderInnerRadius = parameters->thermalShieldInnerRadius(); -// double cylinderLength = parameters->cylinderLength(); -// double bulkheadInnerRadius = parameters->thermalShieldBulkheadInnerRadius(); -// double bulkheadOuterRadius = parameters->thermalShieldBulkheadOuterRadius(); -// double bulkheadThickness = parameters->thermalShieldEndCapCylThickness(); -// double endPanelInnerRadius = parameters->thermalShieldEndPanelInnerRadius(); -// double endPanelOuterRadius = parameters->thermalShieldEndPanelOuterRadius(); -// double endPanelThickness = parameters->thermalShieldEndCapThickness(); -// double endPanelZMax = parameters->thermalShieldEndZMax(); - -// std::string cylinderMaterialName = parameters->thermalShieldMaterialCyl(); -// std::string bulkheadMaterialName = parameters->thermalShieldMaterialOuterSect(); -// std::string endPanelMaterialName = parameters->thermalShieldMaterialInnerSect(); - - -// // The outer cylinder part of thermal shield. -// const GeoTube * cylinderShape = new GeoTube(cylinderInnerRadius, cylinderOuterRadius, 0.5*cylinderLength); -// const GeoMaterial* cylinderMaterial = m_materials->getMaterialForVolume(cylinderMaterialName,cylinderShape->volume()); -// const GeoLogVol * cylinderLog = new GeoLogVol("ThShieldOuterCyl", cylinderShape, cylinderMaterial); -// GeoPhysVol * cylinder = new GeoPhysVol(cylinderLog); -// parent->add(cylinder); - -// // The bulkheads -// const GeoTube * bulkheadShape = new GeoTube(bulkheadInnerRadius, bulkheadOuterRadius, 0.5*bulkheadThickness); -// const GeoMaterial* bulkheadMaterial = m_materials->getMaterialForVolume(bulkheadMaterialName,bulkheadShape->volume()); -// const GeoLogVol * bulkheadLog = new GeoLogVol("ThShieldBulkhead", bulkheadShape, bulkheadMaterial); -// GeoPhysVol * bulkhead = new GeoPhysVol(bulkheadLog); -// GeoTransform * bulkheadPosPlus = new GeoTransform(GeoTrf::TranslateZ3D(+(endPanelZMax-endPanelThickness-0.5*bulkheadThickness))); -// GeoTransform * bulkheadPosMinus = new GeoTransform(GeoTrf::TranslateZ3D(-(endPanelZMax-endPanelThickness-0.5*bulkheadThickness))); -// parent->add(bulkheadPosPlus); -// parent->add(bulkhead); -// parent->add(bulkheadPosMinus); -// parent->add(bulkhead); - -// // The end panels -// const GeoTube * endPanelShape = new GeoTube(endPanelInnerRadius, endPanelOuterRadius, 0.5*endPanelThickness); -// const GeoMaterial* endPanelMaterial = m_materials->getMaterialForVolume(endPanelMaterialName,endPanelShape->volume()); -// const GeoLogVol * endPanelLog = new GeoLogVol("ThShieldEndPanel", endPanelShape, endPanelMaterial); -// GeoPhysVol * endPanel = new GeoPhysVol(endPanelLog); -// GeoTransform * endPanelPosPlus = new GeoTransform(GeoTrf::TranslateZ3D(+(endPanelZMax-0.5*endPanelThickness))); -// GeoTransform * endPanelPosMinus = new GeoTransform(GeoTrf::TranslateZ3D(-(endPanelZMax-0.5*endPanelThickness))); -// parent->add(endPanelPosPlus); -// parent->add(endPanel); -// parent->add(endPanelPosMinus); -// parent->add(endPanel); - -// } - -// void VetoStation::buildEMIShield(GeoFullPhysVol * parent) const -// { - -// const VetoStationParameters * parameters = m_geometryManager->barrelParameters(); - -// // Parameters of cylinder -// double innerRadius = parameters->emiShieldInnerRadius(); -// double deltaR = parameters->emiShieldDeltaR(); -// double outerRadius = innerRadius + deltaR; -// double length = 2 * parameters->emiShieldZMax(); -// std::string materialName = parameters->emiShieldMaterial(); - -// // Parameters of Electrical Shield Joint -// double jointDeltaR = 0; -// double jointRPhi = 0; -// std::string jointMaterialName; -// if(!m_isOldGeometry) { -// jointDeltaR = parameters->emiJointDeltaR(); -// jointRPhi = parameters->emiJointRPhi(); -// jointMaterialName = parameters->emiJointMaterial(); -// } - -// // Parameters of Pixel Attachment - needed for cut-out -// double pixelAttachmentLength = parameters->pixelAttachmentDeltaZ(); -// double pixelAttachmentZpos = parameters->pixelAttachmentZMin() + 0.5 * pixelAttachmentLength; - -// // Build cylinder (with cut-outs) -// const GeoShape * emiShieldShape = 0; -// const GeoMaterial * material; -// const GeoTube * emiShieldTube = new GeoTube(innerRadius, outerRadius, 0.5*length); -// if (m_isOldGeometry) { -// emiShieldShape = emiShieldTube; -// material = m_materials->getMaterial(materialName); -// } else { -// const GeoTube* cutOut = new GeoTube(innerRadius, outerRadius, 0.5*pixelAttachmentLength); -// const GeoShape* emiTemp = (GeoShape*)&(emiShieldTube->subtract(*cutOut << GeoTrf::TranslateZ3D(pixelAttachmentZpos))); -// emiShieldShape = (GeoShape*)&emiTemp->subtract(*cutOut << GeoTrf::TranslateZ3D(-pixelAttachmentZpos)); -// double emiVolume = emiShieldTube->volume() - 2. * cutOut->volume(); -// material = m_materials->getMaterialForVolume(materialName, emiVolume); -// } -// const GeoLogVol * emiShieldLog = new GeoLogVol("EMIShield", emiShieldShape, material); -// GeoPhysVol * emiShield = new GeoPhysVol(emiShieldLog); -// parent->add(emiShield); - -// // Build electrical shield joints (with cut-outs) -// if (!m_isOldGeometry) { -// double dphi = jointRPhi / outerRadius; -// const GeoTubs* emiJointTubs = new GeoTubs(outerRadius, outerRadius+jointDeltaR, 0.5*length, -// -0.5 * dphi * Gaudi::Units::radian, dphi * Gaudi::Units::radian); -// const GeoTubs* jointCutOut = new GeoTubs(outerRadius, outerRadius+jointDeltaR, 0.5*pixelAttachmentLength, -// -0.5 * dphi * Gaudi::Units::radian, dphi * Gaudi::Units::radian); -// const GeoShape* jointTemp = (GeoShape*)&(emiJointTubs->subtract(*jointCutOut << GeoTrf::TranslateZ3D(pixelAttachmentZpos))); -// const GeoShape* emiJointShape = (GeoShape*)&jointTemp->subtract(*jointCutOut << GeoTrf::TranslateZ3D(-pixelAttachmentZpos)); -// double jointVolume = emiJointTubs->volume() - 2. * jointCutOut->volume(); -// const GeoMaterial * jointMaterial = m_materials->getMaterialForVolume(jointMaterialName, jointVolume); -// const GeoLogVol * emiJointLog = new GeoLogVol("EMIShieldJoint", emiJointShape, jointMaterial); -// GeoPhysVol * emiJoint = new GeoPhysVol(emiJointLog); -// // Place 3 copies -// for (int i=0; i<3; i++) { -// double angle = (90. + i * 120.) * Gaudi::Units::degree; -// parent->add(new GeoTransform(GeoTrf::RotateZ3D(angle))); -// parent->add(emiJoint); -// } -// } -// } diff --git a/Scintillator/ScintDetDescrCnv/ScintIdCnv/src/VetoIDDetDescrCnv.h b/Scintillator/ScintDetDescrCnv/ScintIdCnv/src/VetoIDDetDescrCnv.h index 49c09c78f..8d7cb70d1 100644 --- a/Scintillator/ScintDetDescrCnv/ScintIdCnv/src/VetoIDDetDescrCnv.h +++ b/Scintillator/ScintDetDescrCnv/ScintIdCnv/src/VetoIDDetDescrCnv.h @@ -50,13 +50,13 @@ private: /// The helper - only will create it once VetoID* m_vetoId; - /// File to be read for InDet ids + /// File to be read for Scint ids std::string m_scintIDFileName; - /// Tag of RDB record for InDet ids + /// Tag of RDB record for Scint ids std::string m_scintIdDictTag; - /// Internal InDet id tag + /// Internal Scint id tag std::string m_scintIDTag; /// Whether or not diff --git a/Scintillator/ScintEventCnv/ScintSimEventTPCnv/ScintSimEventTPCnv/ScintSimEventTPCnvDict.h b/Scintillator/ScintEventCnv/ScintSimEventTPCnv/ScintSimEventTPCnv/ScintSimEventTPCnvDict.h index b18bdb772..f0042a97e 100644 --- a/Scintillator/ScintEventCnv/ScintSimEventTPCnv/ScintSimEventTPCnv/ScintSimEventTPCnvDict.h +++ b/Scintillator/ScintEventCnv/ScintSimEventTPCnv/ScintSimEventTPCnv/ScintSimEventTPCnvDict.h @@ -17,4 +17,4 @@ #include "ScintSimEventTPCnv/ScintHits/ScintHitCollection_p1.h" #include "ScintSimEventTPCnv/ScintHits/ScintHit_p1.h" -#endif // SCINTEVENTTPCNV_INDETSIMEVENTTPCNVDICT_H +#endif // SCINTEVENTTPCNV_SCINTSIMEVENTTPCNVDICT_H diff --git a/Simulation/G4Faser/G4FaserApp/test/runG4.py b/Simulation/G4Faser/G4FaserApp/test/runG4.py index 998084c53..5a27b8c68 100644 --- a/Simulation/G4Faser/G4FaserApp/test/runG4.py +++ b/Simulation/G4Faser/G4FaserApp/test/runG4.py @@ -64,6 +64,8 @@ if __name__ == "__main__": # ConfigFlags.Detector.SimulateVeto = True ConfigFlags.Detector.GeometryVeto = True + ConfigFlags.Detector.SimulateSCT = True + ConfigFlags.Detector.GeometrySCT = True ConfigFlags.GeoModel.Align.Dynamic = False ConfigFlags.Sim.ReleaseGeoModel = False # diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/CMakeLists.txt b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/CMakeLists.txt new file mode 100644 index 000000000..1258b9536 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/CMakeLists.txt @@ -0,0 +1,47 @@ +################################################################################ +# Package: FaserSCT_GeoModel +################################################################################ + +# Declare the package name: +atlas_subdir( FaserSCT_GeoModel ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PUBLIC + Control/AthenaKernel + Database/RDBAccessSvc + DetectorDescription/GeoModel/GeoModelFaserUtilities + DetectorDescription/GeoModel/GeoModelUtilities + DetectorDescription/GeoPrimitives + GaudiKernel + Tracker/TrackerDetDescr/TrackerGeoModelUtils + Tracker/TrackerDetDescr/TrackerReadoutGeometry + PRIVATE + Control/SGTools + Control/StoreGate + Database/AthenaPOOL/AthenaPoolUtilities + DetectorDescription/DetDescrCond/DetDescrConditions + DetectorDescription/GeoModel/GeoModelInterfaces + DetectorDescription/GeometryDBSvc + DetectorDescription/Identifier + Tracker/TrackerDetDescr/TrackerIdentifier ) + +# External dependencies: +find_package( Boost COMPONENTS filesystem thread system ) +find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess ) +find_package( Eigen ) +find_package( GeoModel ) + +# Component(s) in the package: +atlas_add_component( FaserSCT_GeoModel + src/*.cxx + src/components/*.cxx + INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} + LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel GeoModelFaserUtilities GeoModelUtilities GaudiKernel TrackerGeoModelUtils TrackerReadoutGeometry SGTools StoreGateLib SGtests AthenaPoolUtilities DetDescrConditions Identifier TrackerIdentifier ) + +atlas_add_test( FaserSCT_GMConfig_test + SCRIPT test/FaserSCT_GMConfig_test.py + PROPERTIES TIMEOUT 300 ) + +# Install files from the package: +atlas_install_python_modules( python/*.py ) +atlas_install_scripts( test/*.py ) diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/ATLAS_CHECK_THREAD_SAFETY b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/ATLAS_CHECK_THREAD_SAFETY new file mode 100644 index 000000000..31adb4093 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/ATLAS_CHECK_THREAD_SAFETY @@ -0,0 +1 @@ +Tracker/TrackerDetDescr/SCT_GeoModel diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/FaserSCT_DetectorTool.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/FaserSCT_DetectorTool.h new file mode 100644 index 000000000..4b63e9d92 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/FaserSCT_DetectorTool.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GEOMODEL_SCT_DETECTORTOOL_H +#define FASERSCT_GEOMODEL_SCT_DETECTORTOOL_H + +#include "GeoModelUtilities/GeoModelTool.h" +#include "FaserSCT_GeoModel/SCT_GeoModelAthenaComps.h" + +#include "GeometryDBSvc/IGeometryDBSvc.h" +#include "GeoModelInterfaces/IGeoDbTagSvc.h" +#include "RDBAccessSvc/IRDBAccessSvc.h" + +#include "GaudiKernel/ServiceHandle.h" + +#include <string> + +namespace TrackerDD { + class SCT_DetectorManager; +} + +class FaserSCT_DetectorTool : public GeoModelTool { + +public: + // Standard Constructor + FaserSCT_DetectorTool(const std::string& type, const std::string& name, const IInterface* parent); + + virtual StatusCode create() override final; + virtual StatusCode clear() override final; + + // Register callback function on ConDB object + virtual StatusCode registerCallback() override final; + + // Callback function itself + virtual StatusCode align(IOVSVC_CALLBACK_ARGS) override; + +private: + StringProperty m_detectorName{this, "DetectorName", "SCT"}; + BooleanProperty m_alignable{this, "Alignable", true}; + BooleanProperty m_useDynamicAlignFolders{this, "useDynamicAlignFolders", false}; + bool m_cosmic; + + const TrackerDD::SCT_DetectorManager* m_manager; + + SCT_GeoModelAthenaComps m_athenaComps; + + ServiceHandle< IGeoDbTagSvc > m_geoDbTagSvc; + ServiceHandle< IRDBAccessSvc > m_rdbAccessSvc; + ServiceHandle< IGeometryDBSvc > m_geometryDBSvc; + + StringProperty m_run1Folder{this, "Run1Folder", "/Indet/Align"}; + StringProperty m_run2L1Folder{this, "Run2L1Folder", "/Indet/AlignL1/ID"}; + StringProperty m_run2L2Folder{this, "Run2L2Folder", "/Indet/AlignL2/SCT"}; + StringProperty m_run2L3Folder{this, "Run2L3Folder", "/Indet/AlignL3"}; +}; + +#endif // FASERSCT_GEOMODEL_SCT_DETECTORTOOL_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Barrel.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Barrel.h new file mode 100644 index 000000000..2a4f370cd --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Barrel.h @@ -0,0 +1,50 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GEOMODEL_SCT_BARREL_H +#define FASERSCT_GEOMODEL_SCT_BARREL_H + +#include "FaserSCT_GeoModel/SCT_ComponentFactory.h" + +class GeoVPhysVol; +class GeoFullPhysVol; +class GeoLogVol; +class SCT_Identifier; +class SCT_Layer; + +class SCT_Barrel : public SCT_UniqueComponentFactory +{ + +public: + SCT_Barrel(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials); + virtual GeoVPhysVol * build(SCT_Identifier id); + +public: + int numLayers() const { return m_numLayers; } + double layerPitch() const { return m_layerPitch; } + double width() const {return m_width;} + double height() const {return m_height;} + double thickness() const {return m_thickness;} + +private: + void getParameters(); + virtual const GeoLogVol * preBuild(); + + SCT_Layer* m_layer; + + int m_numLayers; + double m_layerPitch; + + double m_width; + double m_height; + double m_thickness; + + double m_safety; + +}; + +#endif // SCT_GEOMODEL_SCT_BARREL_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_BarrelModuleParameters.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_BarrelModuleParameters.h new file mode 100644 index 000000000..9c04ab397 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_BarrelModuleParameters.h @@ -0,0 +1,68 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GeoModel_SCT_BarrelModuleParameters_H +#define FASERSCT_GeoModel_SCT_BarrelModuleParameters_H + +#include <string> + +class SCT_DataBase; + +class SCT_BarrelModuleParameters { + +public: + + // Constructor + SCT_BarrelModuleParameters(SCT_DataBase* rdb); + + // Sensors + double sensorThickness() const; + double sensorWidth() const; + double sensorLength() const; + int sensorNumWafers() const; + std::string sensorMaterial() const; + double sensorDistCenterToCenter() const; + double sensorStripLength() const; + double sensorStripPitch() const; + int sensorNumStrips() const; + int sensorNumReadoutStrips() const; + int sensorStripShift() const; + + // BaseBoard + double baseBoardThickness() const; + double baseBoardWidth() const; + double baseBoardLength() const; + std::string baseBoardMaterial() const; + double baseBoardOffsetY() const; + double baseBoardOffsetZ() const; + + // Hybrid + double hybridThickness() const; + double hybridWidth() const; + double hybridLength() const; + std::string hybridMaterial() const; + double hybridOffsetX() const; + double hybridOffsetZ() const; + + // Pigtail + double pigtailThickness() const; + double pigtailWidth() const; + double pigtailLength() const; + std::string pigtailMaterial() const; + + // Module + int moduleStereoUpperSign() const; + int moduleUpperSideNumber() const; + double moduleStereoAngle() const; + double moduleSensorToSensorGap() const; + + +private: + + SCT_DataBase * m_rdb; + +}; + + +#endif // FASERSCT_GeoModel_SCT_BarrelModuleParameters_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_BarrelParameters.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_BarrelParameters.h new file mode 100644 index 000000000..0c94262c0 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_BarrelParameters.h @@ -0,0 +1,32 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FaserSCT_GeoModel_SCT_BarrelParameters_H +#define FaserSCT_GeoModel_SCT_BarrelParameters_H + +#include <string> + +class SCT_DataBase; + +class SCT_BarrelParameters { + +public: + + // Constructor + SCT_BarrelParameters(SCT_DataBase* rdb); + + int modulesPerRow() const; + int rowsPerLayer() const; + + + // Barrel General + int numLayers() const; + double layerPitch() const; + private: + SCT_DataBase * m_rdb; + +}; + + +#endif // FaserSCT_GeoModel_SCT_BarrelParameters_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_BaseBoard.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_BaseBoard.h new file mode 100644 index 000000000..2b4437960 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_BaseBoard.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GEOMODEL_SCT_BaseBoard_H +#define FASERSCT_GEOMODEL_SCT_BaseBoard_H + +#include "FaserSCT_GeoModel/SCT_ComponentFactory.h" + +#include <string> + +class GeoMaterial; +class GeoVPhysVol; + +class SCT_BaseBoard: public SCT_SharedComponentFactory +{ +public: + SCT_BaseBoard(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials); + +public: + const GeoMaterial * material() const {return m_material;} + double thickness() const {return m_thickness;} + double width() const {return m_width;} + double length() const {return m_length;} + + //double baseBoardOffsetX() const {return m_baseBoardOffsetX;} // Thu 16th Jun 2005 D.Naito removed. + //double baseBoardOffsetY() const {return m_baseBoardOffsetY;} // Thu 16th Jun 2005 D.Naito removed. + //double baseBoardOffsetZ() const {return m_baseBoardOffsetZ;} // Thu 16th Jun 2005 D.Naito removed. + +private: + void getParameters(); + virtual GeoVPhysVol * build(); + + const GeoMaterial * m_material; + double m_thickness; + double m_width; + double m_length; + + //double m_baseBoardOffsetX; // Thu 16th Jun 2005 D.Naito removed. + //double m_baseBoardOffsetY; // Thu 16th Jun 2005 D.Naito removed. + //double m_baseBoardOffsetZ; // Thu 16th Jun 2005 D.Naito removed. + double m_safety; + +}; + +#endif // FASERSCT_GEOMODEL_SCT_BaseBoard_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_ComponentFactory.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_ComponentFactory.h new file mode 100644 index 000000000..01aa0e276 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_ComponentFactory.h @@ -0,0 +1,89 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GEOMODEL_SCT_COMPONENTFACTORY_H +#define FASERSCT_GEOMODEL_SCT_COMPONENTFACTORY_H + +#include "FaserSCT_GeoModel/SCT_Identifier.h" +#include <string> + +namespace TrackerDD{class SCT_DetectorManager;} +class SCT_GeometryManager; +class SCT_MaterialManager; + +class GeoLogVol; +class GeoVPhysVol; + + +class SCT_ComponentFactory +{ + +public: + SCT_ComponentFactory(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials); + + const std::string & getName() const {return m_name;} + + // utility function to covert int to string + std::string intToString(int i) const; + +protected: + TrackerDD::SCT_DetectorManager* m_detectorManager; + const SCT_GeometryManager* m_geometryManager; + SCT_MaterialManager* m_materials; + + double epsilon() const; + virtual ~SCT_ComponentFactory(); + +private: + std::string m_name; + static const double s_epsilon; + +}; + + +class SCT_SharedComponentFactory : public SCT_ComponentFactory +{ + +public: + SCT_SharedComponentFactory(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials=nullptr) : + SCT_ComponentFactory(name, detectorManager, geometryManager, materials), + m_physVolume(nullptr) + {}; + + GeoVPhysVol * getVolume() {return m_physVolume;} + +protected: + GeoVPhysVol * m_physVolume; + virtual GeoVPhysVol * build() = 0; + +}; + +class SCT_UniqueComponentFactory : public SCT_ComponentFactory +{ + +public: + SCT_UniqueComponentFactory(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials=nullptr) : + SCT_ComponentFactory(name, detectorManager, geometryManager, materials), + m_logVolume{nullptr} + {}; + + virtual GeoVPhysVol * build(SCT_Identifier id) = 0; + +protected: + const GeoLogVol * m_logVolume; + + virtual const GeoLogVol * preBuild() = 0; + +}; + +#endif // FASERSCT_GEOMODEL_SCT_COMPONENTFACTORY_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_DataBase.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_DataBase.h new file mode 100644 index 000000000..da77f9ad1 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_DataBase.h @@ -0,0 +1,151 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GeoModel_SCT_DataBase_H +#define FASERSCT_GeoModel_SCT_DataBase_H + +#include "FaserSCT_GeoModel/SCT_GeoModelAthenaComps.h" +#include <string> + +#include "RDBAccessSvc/IRDBAccessSvc.h" +class IRDBRecord; + + +class SCT_DataBase +{ + + +public: + + SCT_DataBase(const SCT_GeoModelAthenaComps* athenaComps); + + const SCT_GeoModelAthenaComps* athenaComps() const; + + IRDBRecordset_ptr weightTable() const; + IRDBRecordset_ptr scalingTable() const; + IRDBRecordset_ptr topLevelTable() const; + + // IRDBRecordset_ptr conditionsTable() const; + // const IRDBRecord* conditions() const; + + const IRDBRecord* brlSensor() const; + const IRDBRecord* brlModule() const; + + // const IRDBRecord* brlSki() const; + // const IRDBRecord* brlSkiZ(int i) const; + // int brlSkiZSize() const; + // const IRDBRecord* brlLayer(int i) const; + // const IRDBRecord* brlServices() const; + // const IRDBRecord* brlServPerLayer(int i) const; + // const IRDBRecord* brlThermalShield() const; + const IRDBRecord* brlGeneral() const; + // const IRDBRecord* brlFSI() const; + // int brlFSISize() const; + // const IRDBRecord* brlFSILocation(int i) const; + + // const IRDBRecord* fwdSensor(int i) const; + // const IRDBRecord* fwdHybrid() const; + // const IRDBRecord* fwdSpine(int i) const; + // const IRDBRecord* fwdModule(int i) const; + // int fwdModuleSize() const; + // IRDBRecordset_ptr fwdModuleConnectorTable() const; + // const IRDBRecord* fwdModuleConnector() const; + + // const IRDBRecord* fwdRing(int i) const; + // int fwdRingSize() const; + // const IRDBRecord* fwdWheel(int i) const; + // const IRDBRecord* fwdWheelRingMap(int i) const; + // int fwdWheelRingMapSize() const; + // const IRDBRecord* fwdDiscSupport() const; + // const IRDBRecord* fwdPatchPanelLoc(int i) const; + // int fwdPatchPanelLocSize() const; + // const IRDBRecord* fwdPatchPanel(int i) const; + // int fwdPatchPanelSize() const; + // const IRDBRecord* fwdPPConnector() const; + // int fwdPPConnectorSize() const; + // const IRDBRecord* fwdPPCooling() const; + // int fwdPPCoolingSize() const; + // const IRDBRecord* fwdCoolingBlock(int i) const; + // const IRDBRecord* fwdRingServices(int i) const; + // const IRDBRecord* fwdServices() const; + // const IRDBRecord* fwdFSILocation(int i) const; + // int fwdFSILocationSize() const; + // const IRDBRecord* fwdFSIType(int i) const; + // int fwdFSITypeSize() const; + // const IRDBRecord* fwdFSI(int i) const; + // int fwdFSISize() const; + // const IRDBRecord* fwdThermalShield(int i) const; + // int fwdThermalShieldSize() const; + // const IRDBRecord* fwdGeneral() const; + // IRDBRecordset_ptr fwdOptoHarnessTable() const; + // const IRDBRecord* fwdOptoHarness(int i) const; + // IRDBRecordset_ptr fwdDiscFixationTable() const; + // const IRDBRecord* fwdDiscFixation() const; + // const IRDBRecord* fwdCylServ(int i) const; + // int fwdCylServSize() const; + // const IRDBRecord* fwdCylServLoc(int i) const; + // int fwdCylServLocSize() const; + + // Return the SCT version tag. + const std::string & versionTag() const; + + MsgStream& msg (MSG::Level lvl) const; + +private: + + SCT_DataBase(const SCT_DataBase &); + SCT_DataBase& operator= (const SCT_DataBase &); + +private: + + const SCT_GeoModelAthenaComps* m_athenaComps; + + std::string m_sctVersionTag; + + IRDBRecordset_ptr m_weightTable; + IRDBRecordset_ptr m_scalingTable; + IRDBRecordset_ptr m_topLevel; + // IRDBRecordset_ptr m_conditions; + + IRDBRecordset_ptr m_brlSensor; + IRDBRecordset_ptr m_brlModule; + // IRDBRecordset_ptr m_brlSki; + // IRDBRecordset_ptr m_brlSkiZ; + // IRDBRecordset_ptr m_brlLayer; + // IRDBRecordset_ptr m_brlServices; + // IRDBRecordset_ptr m_brlServPerLayer; + // IRDBRecordset_ptr m_brlThermalShield; + IRDBRecordset_ptr m_brlGeneral; + // IRDBRecordset_ptr m_brlFSI; + // IRDBRecordset_ptr m_brlFSILocation; + // IRDBRecordset_ptr m_fwdSensor; + // IRDBRecordset_ptr m_fwdHybrid; + // IRDBRecordset_ptr m_fwdSpine; + // IRDBRecordset_ptr m_fwdModule; + // IRDBRecordset_ptr m_fwdModuleConnector; + // IRDBRecordset_ptr m_fwdRing; + // IRDBRecordset_ptr m_fwdWheel; + // IRDBRecordset_ptr m_fwdWheelRingMap; + // IRDBRecordset_ptr m_fwdDiscSupport; + // IRDBRecordset_ptr m_fwdPatchPanelLoc; + // IRDBRecordset_ptr m_fwdPatchPanel; + // IRDBRecordset_ptr m_fwdPPConnector; + // IRDBRecordset_ptr m_fwdPPCooling; + // IRDBRecordset_ptr m_fwdCoolingBlock; + // IRDBRecordset_ptr m_fwdRingServices; + // IRDBRecordset_ptr m_fwdServices; + // IRDBRecordset_ptr m_fwdFSILocation; + // IRDBRecordset_ptr m_fwdFSIType; + // IRDBRecordset_ptr m_fwdFSI; + // IRDBRecordset_ptr m_fwdThermalShield; + // IRDBRecordset_ptr m_fwdGeneral; + // IRDBRecordset_ptr m_fwdOptoHarness; + // IRDBRecordset_ptr m_fwdDiscFixation; + // IRDBRecordset_ptr m_fwdCylServ; + // IRDBRecordset_ptr m_fwdCylServLoc; + + +}; + +#endif //FASERSCT_GeoModel_SCT_DataBase_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_DetectorFactory.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_DetectorFactory.h new file mode 100644 index 000000000..52b9a644f --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_DetectorFactory.h @@ -0,0 +1,50 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GEOMODEL_SCT_DETECTORFACTORY_H +#define FASERSCT_GEOMODEL_SCT_DETECTORFACTORY_H + +#include "TrackerGeoModelUtils/TrackerDetectorFactoryBase.h" +#include "TrackerReadoutGeometry/SCT_DetectorManager.h" +#include "TrackerReadoutGeometry/TrackerDD_Defs.h" + +class GeoPhysVol; +class SCT_DataBase; +class SCT_GeometryManager; +class SCT_GeoModelAthenaComps; +class SCT_MaterialManager; +class SCT_Options; + +class SCT_DetectorFactory : public TrackerDD::DetectorFactoryBase +{ + + public: + // Constructor + SCT_DetectorFactory(const SCT_GeoModelAthenaComps * athenaComps, + const SCT_Options & options); + + // Destructor + virtual ~SCT_DetectorFactory(); + + // Creation of geometry: + virtual void create(GeoPhysVol *world); + + // Access to the results: + virtual const TrackerDD::SCT_DetectorManager * getDetectorManager() const; + + private: + // Copy and assignments operations illegal and so are made private + SCT_DetectorFactory(const SCT_DetectorFactory &right); + const SCT_DetectorFactory & operator=(const SCT_DetectorFactory &right); + + TrackerDD::SCT_DetectorManager *m_detectorManager; + SCT_GeometryManager *m_geometryManager; + SCT_DataBase* m_db; + SCT_MaterialManager* m_materials; + bool m_useDynamicAlignFolders; + +}; + +#endif + diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_GeneralParameters.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_GeneralParameters.h new file mode 100644 index 000000000..63323d5b1 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_GeneralParameters.h @@ -0,0 +1,45 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GeoModel_SCT_GeneralParameters_H +#define FASERSCT_GeoModel_SCT_GeneralParameters_H + +#include "GeoModelKernel/GeoDefinitions.h" + +#include <map> +#include <string> + +class SCT_DataBase; +class TopLevelPlacements; + +class SCT_GeneralParameters { + +public: + + SCT_GeneralParameters(SCT_DataBase* rdb); + ~SCT_GeneralParameters(); + //Explicitly disallow copy, assignment to appease coverity + SCT_GeneralParameters(const SCT_GeneralParameters &) = delete; + SCT_GeneralParameters & operator=(const SCT_GeneralParameters &) = delete; + + // General + double safety() const; + + //Default conditions. + // double temperature() const; + // double biasVoltage() const; + // double depletionVoltage() const; + + const GeoTrf::Transform3D & partTransform(const std::string & partName) const; + bool partPresent(const std::string & partName) const; + +private: + + SCT_DataBase * m_rdb; + TopLevelPlacements * m_placements; + +}; + + +#endif // FASERSCT_GeoModel_SCT_GeneralParameters_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_GeoModelAthenaComps.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_GeoModelAthenaComps.h new file mode 100644 index 000000000..8d29e38dc --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_GeoModelAthenaComps.h @@ -0,0 +1,30 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GeoModel_SCT_GeoModelAthenaComps_H +#define FASERSCT_GeoModel_SCT_GeoModelAthenaComps_H + +#include "TrackerGeoModelUtils/TrackerDDAthenaComps.h" + +class FaserSCT_ID; + + +/// Class to hold various Athena components +class SCT_GeoModelAthenaComps : public TrackerDD::AthenaComps { + +public: + + SCT_GeoModelAthenaComps(); + + void setIdHelper(const FaserSCT_ID* idHelper); + + const FaserSCT_ID* getIdHelper() const; + +private: + const FaserSCT_ID* m_idHelper; + +}; + +#endif // FASERSCT_GeoModel_SCT_GeoModelAthenaComps_H + diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_GeometryManager.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_GeometryManager.h new file mode 100644 index 000000000..fbe0c7937 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_GeometryManager.h @@ -0,0 +1,65 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GeoModel_SCT_GeometryManager_H +#define FASERSCT_GeoModel_SCT_GeometryManager_H + +#include "FaserSCT_GeoModel/SCT_Options.h" + +#include <memory> + +namespace TrackerDD { + class SiCommonItems; + class DistortedMaterialManager; +} +class SCT_BarrelParameters; +class SCT_BarrelModuleParameters; +class SCT_DataBase; +class SCT_GeneralParameters; +class SCT_GeoModelAthenaComps; + +class SCT_GeometryManager { + +public: + + // Constructor + SCT_GeometryManager(SCT_DataBase* rdb); + + // Destructor + ~SCT_GeometryManager(); + + // Access to run time options + const SCT_Options & options() const; + void setOptions(const SCT_Options & options); + + // Access to athena components + const SCT_GeoModelAthenaComps * athenaComps() const; + + // To be passed to detector element. + const TrackerDD::SiCommonItems * commonItems() const; + + const SCT_BarrelParameters * barrelParameters() const; + const SCT_BarrelModuleParameters * barrelModuleParameters() const; + const SCT_GeneralParameters * generalParameters() const; + const TrackerDD::DistortedMaterialManager * distortedMatManager() const; + + SCT_GeometryManager& operator=(const SCT_GeometryManager& right); + SCT_GeometryManager(const SCT_GeometryManager& right); + +private: + + SCT_Options m_options; + const SCT_GeoModelAthenaComps * m_athenaComps; + TrackerDD::SiCommonItems * m_commonItems; + SCT_DataBase* m_rdb; + + std::unique_ptr<SCT_BarrelParameters> m_barrelParameters; + std::unique_ptr<SCT_BarrelModuleParameters> m_barrelModuleParameters; + std::unique_ptr<SCT_GeneralParameters> m_generalParameters; + std::unique_ptr<TrackerDD::DistortedMaterialManager> m_distortedMatManager; + +}; + + +#endif // SCT_GeoModel_SCT_GeometryManager_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Hybrid.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Hybrid.h new file mode 100644 index 000000000..92ad19c92 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Hybrid.h @@ -0,0 +1,41 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GEOMODEL_SCT_Hybrid_H +#define FASERSCT_GEOMODEL_SCT_Hybrid_H + +#include "FaserSCT_GeoModel/SCT_ComponentFactory.h" + +#include <string> + +class GeoMaterial; +class GeoVPhysVol; + +class SCT_Hybrid: public SCT_SharedComponentFactory + +{ +public: + SCT_Hybrid(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials); + +public: + const GeoMaterial * material() const {return m_material;} + double thickness() const {return m_thickness;} + double width() const {return m_width;} + double length() const {return m_length;} + +private: + void getParameters(); + virtual GeoVPhysVol * build(); + + const GeoMaterial * m_material; + double m_thickness; + double m_width; + double m_length; + +}; + +#endif // FASERSCT_GEOMODEL_SCT_Hybrid_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Identifier.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Identifier.h new file mode 100644 index 000000000..8cb02a19d --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Identifier.h @@ -0,0 +1,59 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GEOMODEL_SCT_IDENTIFIER_H +#define FASERSCT_GEOMODEL_SCT_IDENTIFIER_H + +class Identifier; +class FaserSCT_ID; + +class SCT_Identifier +{ +public: + + SCT_Identifier(const FaserSCT_ID* idHelper, + int station = 0, + int layer = 0, + int phiModule = 0, + int etaModule = 0, + int side = 0) + : m_idHelper{idHelper}, + m_station{station}, + m_layer{layer}, + m_phiModule{phiModule}, + m_etaModule{etaModule}, + m_side{side} + {}; + + + void setStation(int i) {m_station = i;} + int getStation() const {return m_station;} + + void setLayer(int i) {m_layer = i;} + int getLayer() const {return m_layer;} + + void setEtaModule(int i) {m_etaModule = i;} + int getEtaModule() const {return m_etaModule;} + + void setPhiModule(int i) {m_phiModule = i;} + int getPhiModule() const {return m_phiModule;} + + void setSide(int i) {m_side = i;} + int getSide() const {return m_side;} + + Identifier getWaferId(); + + // For debugging purposes. + void print(); + +private: + const FaserSCT_ID* m_idHelper; + int m_station; + int m_layer; + int m_phiModule; + int m_etaModule; + int m_side; +}; + +#endif // FASERSCT_GEOMODEL_SCT_IDENTIFIER_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_InnerSide.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_InnerSide.h new file mode 100644 index 000000000..8aa896f3a --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_InnerSide.h @@ -0,0 +1,89 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// +// 13rd Mar 2005 D.Naito +// 28th Mar 2005 S.Mima +// Wed 15th Jun 2005 D.Naito modified. +// +#ifndef FASERSCT_GEOMODEL_SCT_INNERSIDE_H +#define FASERSCT_GEOMODEL_SCT_INNERSIDE_H + +#include "GeoPrimitives/GeoPrimitives.h" +#include "FaserSCT_GeoModel/SCT_ComponentFactory.h" +#include "GeoModelKernel/GeoDefinitions.h" + +#include <string> + +class GeoMaterial; +class GeoVPhysVol; +class GeoLogVol; +class GeoTransform; +class SCT_Identifier; +class SCT_Hybrid; +class SCT_Sensor; + +class SCT_InnerSide: public SCT_UniqueComponentFactory + +{ +public: + + SCT_InnerSide(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials); + + //explicitly disallow copy, assign, to appease coverity + SCT_InnerSide(const SCT_InnerSide &) = delete; + SCT_InnerSide & operator=(const SCT_InnerSide &) = delete; + + ~SCT_InnerSide(); + virtual GeoVPhysVol * build(SCT_Identifier id); + +public: + double thickness() const {return m_thickness;} + double width() const {return m_width;} + double length() const {return m_length;} + + const GeoTrf::Vector3D * env1RefPointVector() const {return m_env1RefPointVector;} + const GeoTrf::Vector3D * env2RefPointVector() const {return m_env2RefPointVector;} + // *** End of modified lines. ------------------ (00)********************************* + + + const SCT_Hybrid * hybrid() const {return m_hybrid;} + const SCT_Sensor * sensor() const {return m_sensor;} + + double hybridOffsetX() const {return m_hybridOffsetX;} + //double hybridOffsetY() const {return m_hybridOffsetY;} // 16:30 Wed 15th Jun 2005 D.Naito removed. + double hybridOffsetZ() const {return m_hybridOffsetZ;} + + +private: + void getParameters(); + virtual const GeoLogVol * preBuild(); + + double m_thickness; + double m_width; + double m_length; + + double m_hybridOffsetX; + //double m_hybridOffsetY; // 16:30 Wed 15th Jun 2005 D.Naito removed. + double m_hybridOffsetZ; + double m_safety; + + SCT_Hybrid * m_hybrid; + SCT_Sensor * m_sensor; + + GeoTransform * m_hybridPos; + GeoTransform * m_sensorPos; + + // *** 16:30 Wed 15th Jun 2005 D.Naito modified. (02)********************************* + // *** -->> (02)********************************* + GeoTrf::Vector3D * m_env1RefPointVector; + GeoTrf::Vector3D * m_env2RefPointVector; + // *** End of modified lines. ------------------ (02)********************************* + +}; + +#endif // SCT_GEOMODEL_SCT_INNERSIDE_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Layer.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Layer.h new file mode 100644 index 000000000..f9e291800 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Layer.h @@ -0,0 +1,67 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// +// CPW 17/8/06 +// Version using new model of services from A. Tricoli +// +#ifndef FASERSCT_GEOMODEL_SCT_LAYER_H +#define FASERSCT_GEOMODEL_SCT_LAYER_H + +#include "FaserSCT_GeoModel/SCT_ComponentFactory.h" + +#include <string> + +class GeoMaterial; +class GeoVPhysVol; +class GeoLogVol; +class SCT_Ski; +class SCT_Module; +class SCT_Identifier; + +class SCT_Layer: public SCT_UniqueComponentFactory +{ +public: + SCT_Layer(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials); + + ~SCT_Layer(); + //Explicitly disallow copy, assign to appease coverity + SCT_Layer(const SCT_Layer &) = delete; + SCT_Layer & operator=(const SCT_Layer &) = delete; + + virtual GeoVPhysVol * build(SCT_Identifier id); + + +public: + + double width() const {return m_width;} // x dimension of layer + double height() const {return m_height;} // y dimension of layer + double thickness() const {return m_thickness;} // z dimension of layer + +private: + void getParameters(); + virtual const GeoLogVol * preBuild(); + + void activeEnvelopeExtent(double & dx, double & dy, double & dz); + + // Layer number + double m_safety; + + double m_width; + double m_height; + double m_thickness; + double m_activeWidth; + double m_activeHeight; + double m_activeThickness; + + int m_rowsPerLayer; + + SCT_Ski* m_ski; + const GeoLogVol* m_logVolume; +}; + +#endif // FASERSCT_GEOMODEL_SCT_LAYER_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_MaterialManager.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_MaterialManager.h new file mode 100644 index 000000000..1eca20f62 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_MaterialManager.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_MATERIALMANAGER_H +#define FASERSCT_MATERIALMANAGER_H + +// SCT_MaterialManager. This provides an interface to the TrackerMaterialManager which in turn +// is an interface to GeoModel Material Manager with some additional functionality. +#include "TrackerGeoModelUtils/TrackerMaterialManager.h" + +#include <memory> +#include <string> + +class GeoMaterial; +class GeoElement; +class TrackerMaterialManager; +class SCT_DataBase; + +class SCT_MaterialManager +{ + +public: + + SCT_MaterialManager(SCT_DataBase* db); + + const GeoMaterial* getMaterial(const std::string & materialName) const; + const GeoElement* getElement(const std::string & elementName) const; + + const GeoMaterial* getMaterial(const std::string & originalMaterial, + double density, + const std::string & newName = ""); + const GeoMaterial *getMaterialForVolume(const std::string & materialName, double volume); + + // Default gas material + const GeoMaterial* gasMaterial() const; + +private: + void loadMaterials(); + void addMaterial(GeoMaterial* material); + + std::unique_ptr<TrackerMaterialManager> m_materialManager; + const GeoMaterial* m_gasMaterial; + +}; + + +#endif // FASERSCT_MATERIALMANAGER_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Module.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Module.h new file mode 100644 index 000000000..6be41e1de --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Module.h @@ -0,0 +1,111 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef SCT_GEOMODEL_SCT_MODULE_H +#define SCT_GEOMODEL_SCT_MODULE_H + +#include "GeoPrimitives/GeoPrimitives.h" +#include "FaserSCT_GeoModel/SCT_ComponentFactory.h" +#include "GeoModelKernel/GeoDefinitions.h" + +#include <string> + +class GeoMaterial; +class GeoVPhysVol; +class GeoLogVol; + +class SCT_InnerSide; +class SCT_OuterSide; +class SCT_BaseBoard; + +class SCT_Module: public SCT_UniqueComponentFactory + +{ +public: + + SCT_Module(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials); + + ~SCT_Module(); + //Explicitly disallow copy, assign to appease coverity + SCT_Module(const SCT_Module &) = delete; + SCT_Module & operator=(const SCT_Module &) = delete; + + virtual GeoVPhysVol * build(SCT_Identifier id); + +public: + double thickness() const {return m_thickness;} + double width() const {return m_width;} + double length() const {return m_length;} + + double env1Thickness() const {return m_env1Thickness;} + double env1Width() const {return m_env1Width;} + double env1Length() const {return m_env1Length;} + double env2Thickness() const {return m_env2Thickness;} + double env2Width() const {return m_env2Width;} + double env2Length() const {return m_env2Length;} + + const GeoTrf::Vector3D * env1RefPointVector() const {return m_env1RefPointVector;} + const GeoTrf::Vector3D * env2RefPointVector() const {return m_env2RefPointVector;} + + double sensorGap() const {return m_sensorGap;} + double stereoInner() const {return m_stereoInner;} + double stereoOuter() const {return m_stereoOuter;} + double stereoAngle() const {return m_stereoAngle;} + + double activeWidth() const {return m_activeWidth;} + + double baseBoardOffsetY() const {return m_baseBoardOffsetY;} + double baseBoardOffsetZ() const {return m_baseBoardOffsetZ;} + + const SCT_InnerSide * innerSide() const {return m_innerSide;} + const SCT_OuterSide * outerSide() const {return m_outerSide;} + const SCT_BaseBoard * baseBoard() const {return m_baseBoard;} + + +private: + void getParameters(); + virtual const GeoLogVol * preBuild(); + + double m_thickness; + double m_width; + double m_length; + + double m_env1Thickness; + double m_env1Width; + double m_env1Length; + double m_env2Thickness; + double m_env2Width; + double m_env2Length; + + double m_activeWidth; + + double m_baseBoardOffsetY; + double m_baseBoardOffsetZ; + + double m_sensorGap; + double m_stereoInner; + double m_stereoOuter; + double m_stereoAngle; + //int m_stereoSign; + int m_upperSide; + double m_safety; + + SCT_InnerSide * m_innerSide; + SCT_OuterSide * m_outerSide; + SCT_BaseBoard * m_baseBoard; + //const SCT_Sensor * m_sensor; // 14:00 Thu 14th Jul 2005 D.Naito removed. + + GeoTrf::Transform3D * m_innerSidePos; + GeoTrf::Transform3D * m_outerSidePos; + GeoTrf::Translate3D * m_baseBoardPos; // 6th Apr 2005 S.Mima + + GeoTrf::Vector3D * m_env1RefPointVector; + GeoTrf::Vector3D * m_env2RefPointVector; + +}; + +#endif // SCT_GEOMODEL_SCT_MODULE_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Options.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Options.h new file mode 100644 index 000000000..d0433a2c6 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Options.h @@ -0,0 +1,44 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GeoModel_SCT_Options_H +#define FASERSCT_GeoModel_SCT_Options_H + +// Class for any run time options. + + +class SCT_Options +{ + +public: + SCT_Options(); + bool g3Compatible() const; + bool versionDC1() const; + bool versionDC2() const; + bool alignable() const; + bool alignAtModuleLevel() const; + + void setG3Compatible(bool flag = true); + void setDC1Geometry(); + void setDC2Geometry(); + void setAlignable(bool flag = true); + void setAlignAtModuleLevel(bool flag = true); + + //dynamic alignment folders + void setDynamicAlignFolders(const bool flag = true); + bool dynamicAlignFolders() const; + +private: + + bool m_g3Compatible; + bool m_dc1Geometry; + bool m_dc2Geometry; + bool m_alignable; + bool m_alignModule; + bool m_dynAlignFolders; //controls which set of alignment folders is used + +}; + + +#endif // FASERSCT_GeoModel_SCT_Options_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_OuterSide.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_OuterSide.h new file mode 100644 index 000000000..307d4bdae --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_OuterSide.h @@ -0,0 +1,78 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GEOMODEL_SCT_OUTERSIDE_H +#define FASERSCT_GEOMODEL_SCT_OUTERSIDE_H + +#include "GeoPrimitives/GeoPrimitives.h" +#include "FaserSCT_GeoModel/SCT_ComponentFactory.h" +#include "GeoModelKernel/GeoDefinitions.h" +#include <string> + +class GeoMaterial; +class GeoVPhysVol; +class GeoLogVol; +class GeoTransform; + +class SCT_Identifier; +class SCT_Hybrid; +class SCT_Pigtail; +class SCT_Sensor; + +class SCT_OuterSide: public SCT_UniqueComponentFactory + +{ +public: + + SCT_OuterSide(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials); + + ~SCT_OuterSide(); + //Explicitly disallow copy, assign to appease coverity + SCT_OuterSide(const SCT_OuterSide &) = delete; + SCT_OuterSide & operator=(const SCT_OuterSide &) = delete; + virtual GeoVPhysVol * build(SCT_Identifier id); + +public: + double thickness() const {return m_thickness;} + double width() const {return m_width;} + double length() const {return m_length;} + + const GeoTrf::Vector3D * env1RefPointVector() const {return m_env1RefPointVector;} + const GeoTrf::Vector3D * env2RefPointVector() const {return m_env2RefPointVector;} + + const SCT_Hybrid * hybrid() const {return m_hybrid;} + const SCT_Pigtail * pigtail() const {return m_pigtail;} + const SCT_Sensor * sensor() const {return m_sensor;} + + double hybridOffsetX() const {return m_hybridOffsetX;} + double hybridOffsetZ() const {return m_hybridOffsetZ;} + +private: + void getParameters(); + virtual const GeoLogVol * preBuild(); + + double m_thickness; + double m_width; + double m_length; + + double m_hybridOffsetX; + double m_hybridOffsetZ; + double m_safety; + + SCT_Hybrid * m_hybrid; + SCT_Pigtail * m_pigtail; + SCT_Sensor * m_sensor; + + GeoTransform * m_hybridPos; + GeoTransform * m_pigtailPos; + GeoTransform * m_sensorPos; + GeoTrf::Vector3D * m_env1RefPointVector; + GeoTrf::Vector3D * m_env2RefPointVector; + +}; + +#endif // FASERSCT_GEOMODEL_SCT_OUTERSIDE_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Pigtail.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Pigtail.h new file mode 100644 index 000000000..1dd60af16 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Pigtail.h @@ -0,0 +1,41 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GEOMODEL_SCT_Pigtail_H +#define FASERSCT_GEOMODEL_SCT_Pigtail_H + +#include "FaserSCT_GeoModel/SCT_ComponentFactory.h" + +#include <string> + +class GeoMaterial; +class GeoVPhysVol; + +class SCT_Pigtail: public SCT_SharedComponentFactory + +{ +public: + SCT_Pigtail(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials); + +public: + const GeoMaterial * material() const {return m_material;} + double thickness() const {return m_thickness;} + double width() const {return m_width;} + double length() const {return m_length;} + +private: + void getParameters(); + virtual GeoVPhysVol * build(); + + const GeoMaterial * m_material; + double m_thickness; + double m_width; + double m_length; + +}; + +#endif // FASERSCT_GEOMODEL_SCT_Pigtail_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Sensor.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Sensor.h new file mode 100644 index 000000000..ce8e62487 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Sensor.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef FASERSCT_GEOMODEL_SCT_SENSOR_H +#define FASERSCT_GEOMODEL_SCT_SENSOR_H + +#include "FaserSCT_GeoModel/SCT_ComponentFactory.h" + +#include <atomic> +#include <string> + +class GeoMaterial; +class GeoVPhysVol; +namespace TrackerDD{class SiDetectorDesign;} + +class SCT_Sensor: public SCT_UniqueComponentFactory +{ +public: + SCT_Sensor(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials); + +public: + const GeoMaterial * material() const {return m_material;} + double thickness() const {return m_thickness;} + double width() const {return m_width;} + double length() const {return m_length;} + + virtual GeoVPhysVol * build(SCT_Identifier id); + +private: + void getParameters(); + virtual const GeoLogVol * preBuild(); + void makeDesign(); + + const GeoMaterial * m_material; + double m_thickness; + double m_width; + double m_length; + + TrackerDD::SiDetectorDesign * m_design; + + mutable std::atomic_bool m_noElementWarning; +}; + +#endif // FASERSCT_GEOMODEL_SCT_SENSOR_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Ski.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Ski.h new file mode 100644 index 000000000..35c2b8195 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/FaserSCT_GeoModel/SCT_Ski.h @@ -0,0 +1,66 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// +// CPW 17/8/06 +// Version using new model of services from A. Tricoli +// +#ifndef FASERSCT_GEOMODEL_SCT_SKI_H +#define FASERSCT_GEOMODEL_SCT_SKI_H + +#include "FaserSCT_GeoModel/SCT_ComponentFactory.h" + +#include <string> + +class GeoMaterial; +class GeoVPhysVol; +class GeoLogVol; +class SCT_Module; +class SCT_Identifier; + +class SCT_Ski: public SCT_UniqueComponentFactory +{ +public: + SCT_Ski(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials); + + ~SCT_Ski(); + //Explicitly disallow copy, assign to appease coverity + SCT_Ski(const SCT_Ski &) = delete; + SCT_Ski & operator=(const SCT_Ski &) = delete; + + virtual GeoVPhysVol * build(SCT_Identifier id); + + +public: + + double width() const { return m_width; } // y dimension of ski + double length() const { return m_length; } // z dimension of ski + double thickness() const { return m_thickness; } // x dimension of ski + +private: + void getParameters(); + virtual const GeoLogVol * preBuild(); + + void activeEnvelopeExtent(double & dx, double & dy, double & dz); + + // Layer number + double m_safety; + + double m_width; + double m_length; + double m_thickness; + double m_activeWidth; + double m_activeThickness; + double m_activeLength; + + int m_modulesPerRow; + + SCT_Module* m_module; + const GeoLogVol* m_logVolume; +}; + +#endif // FASERSCT_GEOMODEL_SCT_SKI_H diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/README b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/README new file mode 100644 index 000000000..72da3d328 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/README @@ -0,0 +1,16 @@ +Package: offline/Tracker/TrackerDetDescr/SCT_GeoModel + +Responsible: Pat Ward <cpw1@hep.phy.cam.ac.uk> + +Description: GeoModel description of the SCT. Creates the raw geometry and + readout elements. + +Inputs: Detector Description, Identifiers + +Outputs: Geometry, Detector Elements. + +Dependencies: Geometry Database, Identifiers, Detector Description. + +JobOptions: + +Last modified: December 11, 2008 by Pat Ward diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/doc/packagedoc.h b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/doc/packagedoc.h new file mode 100644 index 000000000..79faf688d --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/doc/packagedoc.h @@ -0,0 +1,50 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/** + +@page SCT_GeoModel_page SCT_GeoModel Package + +@authors Grant Gorfine + +@section SCT_GeoModel_SCT_GeoModelIntro Introduction + +This package contains the factories for building the GeoModel Detector +Description of the SCT. It builds both the material geometry using the +GeoModelKernel and the readout geometry using classes in +InDetReadoutGeometry. + +The creation of the geometry is initiated by the DetectorTool +(SCT_DetectorTool) which is called from GeoModelSvc. The DetectorTool +calls a top level factory (eg SCT_DetectorFactory) which starts the +building process. + +The version of geometry is controlled by the Detector Description tag which +can be specified at various levels (ATLAS, InnerDetector or SCT node). + +See https://uimon.cern.ch/twiki/bin/view/Atlas/InDetGeometryVersions for current versions supported. + +See the InDetDetDescrExample package for examples of how to load the geometry +and access detector elements. + +@section SCT_GeoModel_SCT_GeoModelClassOverview Class Overview + +The package contains several helper factories which build the different components of the SCT. +Some of the other classes are described here: + + - SCT_DetectorTool: Tool called by GeoModelSvc to start the building process + - SCT_DetectorFactory: Top level factory for SCT. It in turn calls the component factories. + - SCT_DetectorFactoryCosmic: Top level factory for building SCT barrel for Cosmic run in SR1 building. + - SCT_ComponentFactory: %Base class for all component factories. + - SCT_GeometryManager: General manager. + - SCT_Identifier: Helper class for building up the ATLAS Identifier + - SCT_DataBase: Access the Detector Description database + - SCT_xxxParameters: Interfaces for primary numbers. + - SCT_MaterialManager: Interface to the material manager. + - SCT_Options: Class to contain various building options. + - SCT_DefaultConditions: Class to store default conditions data. + + + +*/ diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/python/FaserSCT_GeoModelConfig.py b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/python/FaserSCT_GeoModelConfig.py new file mode 100644 index 000000000..ad3cc8477 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/python/FaserSCT_GeoModelConfig.py @@ -0,0 +1,46 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + +from AthenaCommon import CfgMgr + +def getFaserSCT_DetectorTool(name="FaserSCT_DetectorTool", **kwargs): + kwargs.setdefault("DetectorName", "SCT") + kwargs.setdefault("Alignable", True) + kwargs.setdefault("RDBAccessSvc", "RDBAccessSvc") + kwargs.setdefault("GeometryDBSvc", "TrackerGeometryDBSvc") + kwargs.setdefault("GeoDbTagSvc", "GeoDbTagSvc") + return CfgMgr.FaserSCT_DetectorTool(name, **kwargs) + + +from IOVDbSvc.IOVDbSvcConfig import addFoldersSplitOnline + +def FaserSCT_GeometryCfg( flags ): + from FaserGeoModel.GeoModelConfig import GeoModelCfg + acc = GeoModelCfg( flags ) + geoModelSvc=acc.getPrimary() + from GeometryDBSvc.GeometryDBSvcConf import GeometryDBSvc + acc.addService(GeometryDBSvc("TrackerGeometryDBSvc")) + from FaserSCT_GeoModel.FaserSCT_GeoModelConf import FaserSCT_DetectorTool + sctDetectorTool = FaserSCT_DetectorTool() + + sctDetectorTool.useDynamicAlignFolders = flags.GeoModel.Align.Dynamic + geoModelSvc.DetectorTools += [ sctDetectorTool ] + + # if flags.GeoModel.Align.Dynamic: + # acc.merge(addFoldersSplitOnline(flags,"INDET","/Indet/Onl/AlignL1/ID","/Indet/AlignL1/ID",className="CondAttrListCollection")) + # acc.merge(addFoldersSplitOnline(flags,"INDET","/Indet/Onl/AlignL2/SCT","/Indet/AlignL2/SCT",className="CondAttrListCollection")) + # acc.merge(addFoldersSplitOnline(flags,"INDET","/Indet/Onl/AlignL3","/Indet/AlignL3",className="AlignableTransformContainer")) + # else: + # if (not flags.Detector.SimulateSCT) or flags.Detector.OverlaySCT: + # acc.merge(addFoldersSplitOnline(flags,"INDET","/Indet/Onl/Align","/Indet/Align",className="AlignableTransformContainer")) + # else: + # acc.merge(addFoldersSplitOnline(flags,"INDET","/Indet/Onl/Align","/Indet/Align")) + # if flags.Common.Project is not "AthSimulation": # Protection for AthSimulation builds + # if (not flags.Detector.SimulateSCT) or flags.Detector.OverlaySCT: + # from SCT_ConditionsAlgorithms.SCT_ConditionsAlgorithmsConf import SCT_AlignCondAlg + # sctAlignCondAlg = SCT_AlignCondAlg(name = "SCT_AlignCondAlg", + # UseDynamicAlignFolders = flags.GeoModel.Align.Dynamic) + # acc.addCondAlgo(sctAlignCondAlg) + # from SCT_ConditionsAlgorithms.SCT_ConditionsAlgorithmsConf import SCT_DetectorElementCondAlg + # sctDetectorElementCondAlg = SCT_DetectorElementCondAlg(name = "SCT_DetectorElementCondAlg") + # acc.addCondAlgo(sctDetectorElementCondAlg) + return acc diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/python/FaserSCT_GeoModelConfigDb.py b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/python/FaserSCT_GeoModelConfigDb.py new file mode 100644 index 000000000..585ac9672 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/python/FaserSCT_GeoModelConfigDb.py @@ -0,0 +1,6 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + +from AthenaCommon.CfgGetter import addAlgorithm,addTool +# add tools and algorithms to the ConfiguredFactory, see: +# https://twiki.cern.ch/twiki/bin/viewauth/AtlasComputing/ConfiguredFactory +addTool("FaserSCT_GeoModel.FaserSCT_GeoModelConfig.FasergetSCT_DetectorTool","FaserSCT_DetectorTool") diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/FaserSCT_DetectorTool.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/FaserSCT_DetectorTool.cxx new file mode 100644 index 000000000..d459b373f --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/FaserSCT_DetectorTool.cxx @@ -0,0 +1,236 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/FaserSCT_DetectorTool.h" + +#include "FaserSCT_GeoModel/SCT_DetectorFactory.h" +#include "FaserSCT_GeoModel/SCT_DataBase.h" +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" +#include "FaserSCT_GeoModel/SCT_Options.h" + +#include "TrackerReadoutGeometry/SCT_DetectorManager.h" +#include "DetDescrConditions/AlignableTransformContainer.h" + +#include "GeoModelUtilities/GeoModelExperiment.h" +#include "GeoModelFaserUtilities/DecodeFaserVersionKey.h" +#include "StoreGate/DataHandle.h" +#include "RDBAccessSvc/IRDBRecord.h" +#include "RDBAccessSvc/IRDBRecordset.h" + +#include "AthenaKernel/ClassID_traits.h" +#include "SGTools/DataProxy.h" + +using TrackerDD::SCT_DetectorManager; +using TrackerDD::SiDetectorManager; + +// +// Constructor +// +FaserSCT_DetectorTool::FaserSCT_DetectorTool(const std::string& type, + const std::string& name, + const IInterface* parent) + : GeoModelTool(type, name, parent), + m_cosmic{false}, + m_manager{nullptr}, + m_geoDbTagSvc{"GeoDbTagSvc", name}, + m_rdbAccessSvc{"RDBAccessSvc", name}, + m_geometryDBSvc{"TrackerGeometryDBSvc", name} +{ + // Get parameter values from jobOptions file + declareProperty("GeoDbTagSvc", m_geoDbTagSvc); + declareProperty("RDBAccessSvc", m_rdbAccessSvc); + declareProperty("GeometryDBSvc", m_geometryDBSvc); +} + +// +// Create the Geometry via the factory corresponding to this tool +// + +StatusCode +FaserSCT_DetectorTool::create() +{ + // Get the detector configuration. + ATH_CHECK(m_geoDbTagSvc.retrieve()); + + DecodeFaserVersionKey versionKey{&*m_geoDbTagSvc, "SCT"}; + // Issue error if AUTO. + if (versionKey.tag() == "AUTO") { + ATH_MSG_ERROR("AUTO Faser version. Please select a version."); + } + ATH_MSG_INFO("Building SCT with Version Tag: " << versionKey.tag() << " at Node: " << versionKey.node()); + + ATH_CHECK(m_rdbAccessSvc.retrieve()); + // Print the SCT version tag: + std::string sctVersionTag{m_rdbAccessSvc->getChildTag("SCT", versionKey.tag(), versionKey.node(),"FASERDD")}; + ATH_MSG_INFO("SCT Version: " << sctVersionTag << " Package Version: " << PACKAGE_VERSION); + // Check if version is empty. If so, then the SCT cannot be built. This may or may not be intentional. We + // just issue an INFO message. + if (sctVersionTag.empty()) { + ATH_MSG_INFO("No SCT Version. SCT will not be built."); + } else { + std::string versionName; + if (versionKey.custom()) { + ATH_MSG_WARNING("SCT_DetectorTool: Detector Information coming from a custom configuration!!"); + } else { + ATH_MSG_DEBUG("SCT_DetectorTool: Detector Information coming from the database and job options IGNORED."); + ATH_MSG_DEBUG("Keys for SCT Switches are " << versionKey.tag() << " " << versionKey.node()); + + IRDBRecordset_ptr switchSet{m_rdbAccessSvc->getRecordsetPtr("SctSwitches", versionKey.tag(), versionKey.node(), "FASERDD")}; + const IRDBRecord* switches{(*switchSet)[0]}; + m_detectorName.setValue(switches->getString("DETECTORNAME")); + + m_cosmic = false; + if (not switches->isFieldNull("COSMICLAYOUT")) { + m_cosmic = switches->getInt("COSMICLAYOUT"); + } + if (not switches->isFieldNull("VERSIONNAME")) { + versionName = switches->getString("VERSIONNAME"); + } + } + + ATH_MSG_DEBUG("Creating the SCT"); + ATH_MSG_DEBUG("SCT Geometry Options: "); + ATH_MSG_DEBUG(" Alignable: " << (m_alignable.value() ? "true" : "false")); + ATH_MSG_DEBUG(" CosmicLayout: " << (m_cosmic ? "true" : "false")); + ATH_MSG_DEBUG(" VersionName: " << versionName); + + SCT_Options options; + options.setAlignable(m_alignable.value()); + options.setDynamicAlignFolders(m_useDynamicAlignFolders.value()); + m_manager = nullptr; + + // + // Locate the top level experiment node + // + GeoModelExperiment* theExpt{nullptr}; + ATH_CHECK(detStore()->retrieve(theExpt, "FASER")); + + // Retrieve the Geometry DB Interface + ATH_CHECK(m_geometryDBSvc.retrieve()); + + // Pass athena services to factory, etc + m_athenaComps.setDetStore(detStore().operator->()); + m_athenaComps.setGeoDbTagSvc(&*m_geoDbTagSvc); + m_athenaComps.setGeometryDBSvc(&*m_geometryDBSvc); + m_athenaComps.setRDBAccessSvc(&*m_rdbAccessSvc); + const FaserSCT_ID* idHelper{nullptr}; + ATH_CHECK(detStore()->retrieve(idHelper, "FaserSCT_ID")); + m_athenaComps.setIdHelper(idHelper); + + // + // This strange way of casting is to avoid an + // utterly brain damaged compiler warning. + // + GeoPhysVol* world{&*theExpt->getPhysVol()}; + + SCT_DetectorFactory theSCT{&m_athenaComps, options}; + theSCT.create(world); + m_manager = theSCT.getDetectorManager(); + + if (m_manager==nullptr) { + ATH_MSG_FATAL("SCT_DetectorManager not created"); + return StatusCode::FAILURE; + } + + // Get the manager from the factory and store it in the detector store. + // m_detector is non constant so I can not set it to a const pointer. + // m_detector = theSCT.getDetectorManager(); + + ATH_MSG_DEBUG("Registering SCT_DetectorManager. "); + ATH_CHECK(detStore()->record(m_manager, m_manager->getName())); + theExpt->addManager(m_manager); + + // Create a symLink to the SiDetectorManager base class + const SiDetectorManager* siDetManager{m_manager}; + ATH_CHECK(detStore()->symLink(m_manager, siDetManager)); + } + + return StatusCode::SUCCESS; +} + +StatusCode +FaserSCT_DetectorTool::clear() +{ + SG::DataProxy* proxy{detStore()->proxy(ClassID_traits<SCT_DetectorManager>::ID(), m_manager->getName())}; + if (proxy) { + proxy->reset(); + m_manager = nullptr; + } + return StatusCode::SUCCESS; +} + +StatusCode +FaserSCT_DetectorTool::registerCallback ATLAS_NOT_THREAD_SAFE () +{ + StatusCode sc{StatusCode::FAILURE, true}; + if (m_alignable.value()) { + if (m_useDynamicAlignFolders.value()) { + + if (detStore()->contains<CondAttrListCollection>(m_run2L1Folder.value())) { + ATH_MSG_DEBUG("Registering callback on global Container with folder " << m_run2L1Folder.value()); + const DataHandle<CondAttrListCollection> calc; + ATH_CHECK(detStore()->regFcn(&IGeoModelTool::align, dynamic_cast<IGeoModelTool*>(this), calc, m_run2L1Folder.value())); + sc = StatusCode::SUCCESS; + } else { + ATH_MSG_WARNING("Unable to register callback on global Container with folder " << m_run2L1Folder.value()); + return StatusCode::FAILURE; + } + + if (detStore()->contains<CondAttrListCollection>(m_run2L2Folder.value())) { + ATH_MSG_DEBUG("Registering callback on global Container with folder " << m_run2L2Folder.value()); + const DataHandle<CondAttrListCollection> calc; + ATH_CHECK(detStore()->regFcn(&IGeoModelTool::align, dynamic_cast<IGeoModelTool*>(this), calc, m_run2L2Folder.value())); + sc = StatusCode::SUCCESS; + } else { + ATH_MSG_WARNING("Unable to register callback on global Container with folder " << m_run2L2Folder.value()); + return StatusCode::FAILURE; + } + + if (detStore()->contains<AlignableTransformContainer>(m_run2L3Folder.value())) { + ATH_MSG_DEBUG("Registering callback on AlignableTransformContainer with folder " << m_run2L3Folder.value()); + const DataHandle<AlignableTransformContainer> atc; + ATH_CHECK(detStore()->regFcn(&IGeoModelTool::align, dynamic_cast<IGeoModelTool*>(this), atc, m_run2L3Folder.value())); + sc = StatusCode::SUCCESS; + } else { + ATH_MSG_WARNING("Unable to register callback on AlignableTransformContainer with folder " << m_run2L3Folder.value()); + return StatusCode::FAILURE; + } + + } else { + + if (detStore()->contains<AlignableTransformContainer>(m_run1Folder.value())) { + ATH_MSG_DEBUG("Registering callback on AlignableTransformContainer with folder " << m_run1Folder.value()); + const DataHandle<AlignableTransformContainer> atc; + ATH_CHECK(detStore()->regFcn(&IGeoModelTool::align, dynamic_cast<IGeoModelTool*>(this), atc, m_run1Folder.value())); + sc = StatusCode::SUCCESS; + } else { + ATH_MSG_WARNING("Unable to register callback on AlignableTransformContainer with folder " + << m_run1Folder.value() << ", Alignment disabled (only if no Run2 scheme is loaded)!"); + return StatusCode::FAILURE; + } + } + + } else { + ATH_MSG_INFO("Alignment disabled. No callback registered"); + // We return failure otherwise it will try and register + // a GeoModelSvc callback associated with this callback. + return StatusCode::FAILURE; + } + return sc; +} + +StatusCode +FaserSCT_DetectorTool::align(IOVSVC_CALLBACK_ARGS_P(I, keys)) +{ + if (m_manager==nullptr) { + ATH_MSG_FATAL("Manager does not exist"); + return StatusCode::FAILURE; + } + if (m_alignable.value()) { + return m_manager->align(I, keys); + } else { + ATH_MSG_DEBUG("Alignment disabled. No alignments applied"); + return StatusCode::SUCCESS; + } +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Barrel.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Barrel.cxx new file mode 100644 index 000000000..f5d23f80f --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Barrel.cxx @@ -0,0 +1,118 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_Barrel.h" + +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" + +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" +#include "FaserSCT_GeoModel/SCT_BarrelParameters.h" +#include "FaserSCT_GeoModel/SCT_GeneralParameters.h" +#include "FaserSCT_GeoModel/SCT_Identifier.h" + +#include "FaserSCT_GeoModel/SCT_Layer.h" + +#include "TrackerReadoutGeometry/SCT_DetectorManager.h" + +#include "TrackerGeoModelUtils/ExtraMaterial.h" + +#include "GeoModelKernel/GeoBox.h" +#include "GeoModelKernel/GeoTubs.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoFullPhysVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/GeoIdentifierTag.h" +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoAlignableTransform.h" +#include "GeoModelKernel/GeoMaterial.h" +#include "GeoModelKernel/GeoShape.h" +#include "GeoModelKernel/GeoShapeShift.h" +#include "GaudiKernel/SystemOfUnits.h" + +#include <iostream> + +SCT_Barrel::SCT_Barrel(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials) + : SCT_UniqueComponentFactory(name, detectorManager, geometryManager, materials) +{ + getParameters(); + m_logVolume = preBuild(); +} + + +void +SCT_Barrel::getParameters() +{ + const SCT_GeneralParameters* generalParameters = m_geometryManager->generalParameters(); + m_safety = generalParameters->safety(); + + const SCT_BarrelParameters * parameters = m_geometryManager->barrelParameters(); + + m_numLayers = parameters->numLayers(); + m_layerPitch = parameters->layerPitch(); + int modulesPerRow = parameters->modulesPerRow(); + int rowsPerLayer = parameters->rowsPerLayer(); + std::cout << "Retrieved parameters: " << m_numLayers << " "<< m_layerPitch << " " << modulesPerRow << " " << rowsPerLayer << std::endl; + // Set numerology + std::cout << "Setting num layers" << std::endl; + // Set numerology + m_detectorManager->numerology().setNumLayers(m_numLayers); + std::cout << "Setting modules per layer" << std::endl; + for (int i = 0; i < m_numLayers; i++) + { + m_detectorManager->numerology().setNumEtaModulesForLayer(i, modulesPerRow); + m_detectorManager->numerology().setNumPhiModulesForLayer(i, rowsPerLayer); + } +} + +const GeoLogVol * +SCT_Barrel::preBuild() +{ + std::cout << "Instantiating Layer" << std::endl; + m_layer = new SCT_Layer("Layer", m_detectorManager, m_geometryManager, m_materials); + m_width = m_layer->width() + m_safety; + m_height = m_layer->height() + m_safety; + m_thickness = m_layer->thickness() * m_numLayers + m_layerPitch * (m_numLayers - 1) + m_safety; + + // Create the barrel volume + // Tube envelope containing the barrel. + const GeoBox* stationEnvelopeShape = new GeoBox(0.5 * m_width, 0.5 * m_height, 0.5 * m_thickness); + GeoLogVol* stationLog = new GeoLogVol(getName(), stationEnvelopeShape, m_materials->gasMaterial()); + return stationLog; +} + +GeoVPhysVol * +SCT_Barrel::build(SCT_Identifier id) +{ + + GeoFullPhysVol * barrel = new GeoFullPhysVol(m_logVolume); + + double activeDepth = m_thickness - m_safety/2; + + double layerThickness = m_layer->thickness(); + for (int iLayer = 0; iLayer < m_numLayers; iLayer++) { + // Create the layers + barrel->add(new GeoNameTag("Layer#"+intToString(iLayer))); + barrel->add(new GeoIdentifierTag(iLayer)); // Identifier layer= iLayer + id.setLayer(iLayer); + GeoAlignableTransform* transform = new GeoAlignableTransform(GeoTrf::Translate3D(0.0, + 0.0, + (layerThickness - activeDepth)/2 + iLayer * m_layerPitch) ); + barrel->add(transform); + GeoVPhysVol * layerPV = m_layer->build(id); + barrel->add(layerPV); + // Store alignable transform + m_detectorManager->addAlignableTransform(2, id.getWaferId(), transform, layerPV); + } + + // Extra Material + TrackerDD::ExtraMaterial xMat(m_geometryManager->distortedMatManager()); + xMat.add(barrel, "SCTBarrel"); + + return barrel; + +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_BarrelModuleParameters.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_BarrelModuleParameters.cxx new file mode 100644 index 000000000..39bb7ca80 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_BarrelModuleParameters.cxx @@ -0,0 +1,238 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_BarrelModuleParameters.h" +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" + +#include "FaserSCT_GeoModel/SCT_DataBase.h" + +#include "RDBAccessSvc/IRDBRecord.h" + +#include "GaudiKernel/SystemOfUnits.h" + +#include <cmath> + +using std::abs; + +SCT_BarrelModuleParameters::SCT_BarrelModuleParameters(SCT_DataBase* rdb) +{ + m_rdb = rdb; +} + +// +// Barrel Sensors +// +double +SCT_BarrelModuleParameters::sensorThickness() const +{ + return m_rdb->brlSensor()->getDouble("THICKNESS") * Gaudi::Units::mm; +} + +double +SCT_BarrelModuleParameters::sensorWidth() const +{ + return m_rdb->brlSensor()->getDouble("WIDTH") * Gaudi::Units::mm; +} + +double +SCT_BarrelModuleParameters::sensorLength() const +{ + return m_rdb->brlSensor()->getDouble("WAFERLENGTH") * Gaudi::Units::mm; +} + +int +SCT_BarrelModuleParameters::sensorNumWafers() const +{ + return m_rdb->brlSensor()->getInt("NUMWAFERS"); +} + +std::string +SCT_BarrelModuleParameters::sensorMaterial() const +{ + return m_rdb->brlSensor()->getString("MATERIAL"); +} + +double +SCT_BarrelModuleParameters::sensorDistCenterToCenter() const +{ + return 2 * m_rdb->brlSensor()->getDouble("CENTERTOFIDUCIAL") * Gaudi::Units::mm + + m_rdb->brlSensor()->getDouble("FIDUCIALSEP") * Gaudi::Units::mm; +} + +double +SCT_BarrelModuleParameters::sensorStripLength() const +{ + return 2 * m_rdb->brlSensor()->getDouble("ACTIVEHALFLENGTH") * Gaudi::Units::mm; +} + +double +SCT_BarrelModuleParameters::sensorStripPitch() const +{ + return m_rdb->brlSensor()->getDouble("STRIPPITCH") * Gaudi::Units::mm; +} + +int +SCT_BarrelModuleParameters::sensorNumStrips() const +{ + return m_rdb->brlSensor()->getInt("NUMSTRIPS"); +} + + +int +SCT_BarrelModuleParameters::sensorNumReadoutStrips() const +{ + return m_rdb->brlSensor()->getInt("NUMREADOUTSTRIPS"); +} + +int +SCT_BarrelModuleParameters::sensorStripShift() const +{ + return m_rdb->brlSensor()->getInt("STRIPSHIFT"); +} + + + +// +// Barrel BaseBoard +// +double +SCT_BarrelModuleParameters::baseBoardThickness() const +{ + return m_rdb->brlModule()->getDouble("BASEBOARDTHICKNESS") * Gaudi::Units::mm; +} + +double +SCT_BarrelModuleParameters::baseBoardWidth() const +{ + return m_rdb->brlModule()->getDouble("BASEBOARDWIDTH") * Gaudi::Units::mm; +} + +double +SCT_BarrelModuleParameters::baseBoardLength() const +{ + return m_rdb->brlModule()->getDouble("BASEBOARDLENGTH") * Gaudi::Units::mm; +} + +std::string +SCT_BarrelModuleParameters::baseBoardMaterial() const +{ + return m_rdb->brlModule()->getString("BASEBOARDMATERIAL"); +} + +double +SCT_BarrelModuleParameters::baseBoardOffsetY() const +{ + return m_rdb->brlModule()->getDouble("BASEBOARDOFFSETY") * Gaudi::Units::mm; +} + +double +SCT_BarrelModuleParameters::baseBoardOffsetZ() const +{ + return m_rdb->brlModule()->getDouble("BASEBOARDOFFSETZ") * Gaudi::Units::mm; +} + +// +// Barrel Hybrid +// +double +SCT_BarrelModuleParameters::hybridThickness() const +{ + return m_rdb->brlModule()->getDouble("HYBRIDTHICKNESS") * Gaudi::Units::mm; +} + +double +SCT_BarrelModuleParameters::hybridWidth() const +{ + return m_rdb->brlModule()->getDouble("HYBRIDWIDTH") * Gaudi::Units::mm; +} + +double +SCT_BarrelModuleParameters::hybridLength() const +{ + return m_rdb->brlModule()->getDouble("HYBRIDLENGTH") * Gaudi::Units::mm; +} + +std::string +SCT_BarrelModuleParameters::hybridMaterial() const +{ + return m_rdb->brlModule()->getString("HYBRIDMATERIAL"); +} + +double +SCT_BarrelModuleParameters::hybridOffsetX() const +{ + return m_rdb->brlModule()->getDouble("HYBRIDOFFSETX") * Gaudi::Units::mm; +} + +double +SCT_BarrelModuleParameters::hybridOffsetZ() const +{ + return m_rdb->brlModule()->getDouble("HYBRIDOFFSETZ") * Gaudi::Units::mm; +} + +// +// Barrel Pigtail +// +double +SCT_BarrelModuleParameters::pigtailThickness() const +{ + return m_rdb->brlModule()->getDouble("PIGTAILTHICKNESS") * Gaudi::Units::mm; +} + +double +SCT_BarrelModuleParameters::pigtailWidth() const +{ + return m_rdb->brlModule()->getDouble("PIGTAILWIDTH") * Gaudi::Units::mm; +} + +double +SCT_BarrelModuleParameters::pigtailLength() const +{ + return m_rdb->brlModule()->getDouble("PIGTAILLENGTH") * Gaudi::Units::mm; +} + +std::string +SCT_BarrelModuleParameters::pigtailMaterial() const +{ + return m_rdb->brlModule()->getString("PIGTAILMATERIAL"); +} + + + +// +// Barrel Module +// +int +SCT_BarrelModuleParameters::moduleStereoUpperSign() const +{ + return m_rdb->brlModule()->getInt("STEREOUPPERSIGN"); +} + +int +SCT_BarrelModuleParameters::moduleUpperSideNumber() const +{ + // Old geometries have lower module side = 0 and upper = 1 + if (m_rdb->brlModule()->isFieldNull("SIDEUPPER")) { + return 1; + } + return m_rdb->brlModule()->getInt("SIDEUPPER"); +} + + +double +SCT_BarrelModuleParameters::moduleStereoAngle() const +{ + return m_rdb->brlModule()->getDouble("STEREOANGLE") * Gaudi::Units::milliradian; +} + + +double +SCT_BarrelModuleParameters::moduleSensorToSensorGap() const +{ + return m_rdb->brlModule()->getDouble("SENSORTOSENSORGAP") * Gaudi::Units::mm; +} + + + + diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_BarrelParameters.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_BarrelParameters.cxx new file mode 100644 index 000000000..4798f4b50 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_BarrelParameters.cxx @@ -0,0 +1,50 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_BarrelParameters.h" +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" + +#include "FaserSCT_GeoModel/SCT_DataBase.h" + +#include "RDBAccessSvc/IRDBRecord.h" +#include "GaudiKernel/SystemOfUnits.h" + +#include <cmath> + + +SCT_BarrelParameters::SCT_BarrelParameters(SCT_DataBase* rdb) +{ + m_rdb = rdb; +} + + +// +// Barrel Layer +// + + int + SCT_BarrelParameters::modulesPerRow() const + { + return m_rdb->brlGeneral()->getInt("MODULESPERROW"); + } + + int + SCT_BarrelParameters::rowsPerLayer() const + { + return m_rdb->brlGeneral()->getInt("ROWSPERLAYER"); + } +// +// Barrel General +// +int +SCT_BarrelParameters::numLayers() const +{ + return m_rdb->brlGeneral()->getInt("NUMLAYERS"); +} + +double +SCT_BarrelParameters::layerPitch() const +{ + return m_rdb->brlGeneral()->getDouble("LAYERPITCH"); +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_BaseBoard.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_BaseBoard.cxx new file mode 100644 index 000000000..3a65563db --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_BaseBoard.cxx @@ -0,0 +1,56 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_BaseBoard.h" + +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" + +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" +#include "FaserSCT_GeoModel/SCT_BarrelModuleParameters.h" +#include "FaserSCT_GeoModel/SCT_GeneralParameters.h" + +#include "GeoModelKernel/GeoBox.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoMaterial.h" + +SCT_BaseBoard::SCT_BaseBoard(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials) + : SCT_SharedComponentFactory(name, detectorManager, geometryManager, materials) +{ + getParameters(); + m_physVolume = build(); +} + +void +SCT_BaseBoard::getParameters() +{ + const SCT_GeneralParameters * generalParameters = m_geometryManager->generalParameters(); + const SCT_BarrelModuleParameters * parameters = m_geometryManager->barrelModuleParameters(); + + m_material = m_materials->getMaterial(parameters->baseBoardMaterial()); + m_safety = generalParameters->safety(); + m_thickness = parameters->baseBoardThickness(); + m_width = parameters->baseBoardWidth(); + m_length = parameters->baseBoardLength(); + +} + +GeoVPhysVol * +SCT_BaseBoard::build() +{ + // Make BaseBoard. Just a simple box. + const GeoBox * simpleBaseBoardShape = new GeoBox(0.5*m_thickness, + 0.5*m_width, + 0.5*m_length); + + const GeoLogVol * simpleBaseBoardLog = + new GeoLogVol(getName(), simpleBaseBoardShape, m_material); + + GeoPhysVol * simpleBaseBoard = new GeoPhysVol(simpleBaseBoardLog); + + return simpleBaseBoard; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_ComponentFactory.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_ComponentFactory.cxx new file mode 100644 index 000000000..1ecd5d372 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_ComponentFactory.cxx @@ -0,0 +1,40 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_ComponentFactory.h" +#include "GaudiKernel/SystemOfUnits.h" + +#include <sstream> +#include <string> + +using TrackerDD::SCT_DetectorManager; + +const double SCT_ComponentFactory::s_epsilon = 1.0e-6 * Gaudi::Units::mm; + +SCT_ComponentFactory::SCT_ComponentFactory(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials) + : m_detectorManager(detectorManager), + m_geometryManager(geometryManager), + m_materials(materials), + m_name(name) +{} + +SCT_ComponentFactory::~SCT_ComponentFactory() +{} + +std::string +SCT_ComponentFactory::intToString(int i) const +{ + std::ostringstream str; + str << i; + return str.str(); +} + +double +SCT_ComponentFactory::epsilon() const +{ + return s_epsilon; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_DataBase.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_DataBase.cxx new file mode 100644 index 000000000..badca6d6a --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_DataBase.cxx @@ -0,0 +1,112 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_DataBase.h" + +#include "RDBAccessSvc/IRDBAccessSvc.h" +#include "RDBAccessSvc/IRDBRecordset.h" +#include "RDBAccessSvc/IRDBRecord.h" + +#include "GeoModelInterfaces/IGeoDbTagSvc.h" +#include "GeoModelFaserUtilities/DecodeFaserVersionKey.h" + +#include "FaserSCT_GeoModel/SCT_GeoModelAthenaComps.h" + +#include <iostream> + +SCT_DataBase::SCT_DataBase(const SCT_GeoModelAthenaComps * athenaComps) +{ + m_athenaComps = athenaComps; + + IGeoDbTagSvc * geoDbTag = m_athenaComps->geoDbTagSvc(); + + // Get version tag and node for SCT + DecodeFaserVersionKey versionKey(geoDbTag,"SCT"); + std::string versionTag = versionKey.tag(); + std::string versionNode = versionKey.node(); + + // Get version tag and node for Tracker. + DecodeFaserVersionKey trackerVersionKey(geoDbTag,"Tracker"); + + // Access the RDB + IRDBAccessSvc* rdbSvc = m_athenaComps->rdbAccessSvc(); + + // SCT version tag + m_sctVersionTag = rdbSvc->getChildTag("SCT", versionKey.tag(), versionKey.node(), "FASERDD"); + + +///////////////////////////////////////////////////////// +// +// Gets the structures +// +///////////////////////////////////////////////////////// + + msg(MSG::INFO) << "Retrieving Record Sets from database ..." << endmsg; + msg(MSG::DEBUG) << " Using version tag: " << versionTag << endmsg; + msg(MSG::DEBUG) << " at node: " << versionNode << endmsg; + msg(MSG::DEBUG) << " SCT Version: " << m_sctVersionTag << endmsg; + + // ATLS - not sure I use it. + // General atlas parameters + + // + // SCT General + // + + // SCT TopLevel + m_topLevel = rdbSvc->getRecordsetPtr("SctTopLevel", versionTag, versionNode, "FASERDD"); + msg(MSG::DEBUG) << "Table SctTopLevel Fetched" << endmsg; + + // Weight Table + m_weightTable = rdbSvc->getRecordsetPtr("SctWeights", versionTag, versionNode, "FASERDD"); + msg(MSG::DEBUG) << "Table SctWeights Fetched" << endmsg; + + // // Extra Scaling Table. This is used for extra material studies. For nominal material the table should be empty. + // // NB this is at Tracker level node. + m_scalingTable = rdbSvc->getRecordsetPtr("SctMatScaling", trackerVersionKey.tag(), trackerVersionKey.node(), "FASERDD"); + msg(MSG::DEBUG) << "Table SctMatScaling Fetched" << endmsg; + + // // Default conditions + // m_conditions = rdbSvc->getRecordsetPtr("SctConditions", versionTag, versionNode, "FASERDD"); + // msg(MSG::DEBUG) << "Table SctConditions Fetched" << endmsg; + + // + // SCT Barrel + // + m_brlSensor = rdbSvc->getRecordsetPtr("SctBrlSensor", versionTag, versionNode, "FASERDD"); + msg(MSG::DEBUG) << "Table SctBrlSensor Fetched" << endmsg; + + m_brlModule = rdbSvc->getRecordsetPtr("SctBrlModule", versionTag, versionNode, "FASERDD"); + msg(MSG::DEBUG) << "Table SctBrlModule Fetched" << endmsg; + + m_brlGeneral = rdbSvc->getRecordsetPtr("SctFaserGeneral", versionTag, versionNode, "FASERDD"); + msg(MSG::DEBUG) << "Table SctBrlGeneral Fetched" << endmsg; + +} + +const SCT_GeoModelAthenaComps* SCT_DataBase::athenaComps() const { return m_athenaComps; } + +IRDBRecordset_ptr SCT_DataBase::weightTable() const {return m_weightTable;} + +IRDBRecordset_ptr SCT_DataBase::scalingTable() const {return m_scalingTable;} + +//const IRDBRecord* SCT_DataBase::atls() const {return *m_atls)[0];} +IRDBRecordset_ptr SCT_DataBase::topLevelTable() const {return m_topLevel;} + +// IRDBRecordset_ptr SCT_DataBase::conditionsTable() const {return m_conditions;} +// const IRDBRecord* SCT_DataBase::conditions() const {return (*m_conditions)[0];} + +const IRDBRecord* SCT_DataBase::brlSensor() const {return (*m_brlSensor)[0];} +const IRDBRecord* SCT_DataBase::brlModule() const {return (*m_brlModule)[0];} + +const IRDBRecord* SCT_DataBase::brlGeneral() const {return (*m_brlGeneral)[0];} + +const std::string & SCT_DataBase::versionTag() const { + return m_sctVersionTag; +} + +MsgStream& SCT_DataBase::msg (MSG::Level lvl) const +{ + return m_athenaComps->msg(lvl); +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_DetectorFactory.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_DetectorFactory.cxx new file mode 100644 index 000000000..a61998839 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_DetectorFactory.cxx @@ -0,0 +1,188 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// +// SCT_DetectorFactory: This is the top level node +// + + +#include "FaserSCT_GeoModel/SCT_DetectorFactory.h" + +#include "FaserSCT_GeoModel/SCT_DataBase.h" +#include "FaserSCT_GeoModel/SCT_Identifier.h" +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" +#include "FaserSCT_GeoModel/SCT_GeneralParameters.h" +#include "TrackerReadoutGeometry/Version.h" +#include "TrackerReadoutGeometry/SiCommonItems.h" +#include "TrackerReadoutGeometry/TrackerDD_Defs.h" +#include "TrackerReadoutGeometry/SCT_ModuleSideDesign.h" + +#include "FaserSCT_GeoModel/SCT_Barrel.h" +#include "FaserSCT_GeoModel/SCT_DataBase.h" +#include "FaserSCT_GeoModel/SCT_GeoModelAthenaComps.h" + +// +// GeoModel include files: +// +#include "GeoModelKernel/GeoMaterial.h" +#include "GeoModelKernel/GeoTube.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/GeoIdentifierTag.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoVPhysVol.h" +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoAlignableTransform.h" +#include "GeoModelKernel/GeoShape.h" +#include "GeoModelKernel/GeoShapeUnion.h" +#include "GeoModelKernel/GeoShapeShift.h" +#include "GeoModelInterfaces/StoredMaterialManager.h" +#include "GeoModelInterfaces/IGeoDbTagSvc.h" +#include "GeoModelFaserUtilities/DecodeFaserVersionKey.h" +#include "RDBAccessSvc/IRDBAccessSvc.h" +#include "RDBAccessSvc/IRDBRecordset.h" +#include "RDBAccessSvc/IRDBRecord.h" +#include "AthenaPoolUtilities/CondAttrListCollection.h" +#include "DetDescrConditions/AlignableTransformContainer.h" +# +#include "StoreGate/StoreGateSvc.h" +#include "GaudiKernel/ISvcLocator.h" + +#include "GeoModelKernel/GeoDefinitions.h" +#include "GaudiKernel/SystemOfUnits.h" + + + +#include <iostream> +#include <iomanip> +#include <string> + +using TrackerDD::SCT_DetectorManager; +using TrackerDD::SiCommonItems; + +SCT_DetectorFactory::SCT_DetectorFactory(const SCT_GeoModelAthenaComps * athenaComps, + const SCT_Options & options) + : TrackerDD::DetectorFactoryBase(athenaComps), + m_useDynamicAlignFolders(false) +{ + + // Create the detector manager + m_detectorManager = new SCT_DetectorManager(detStore()); + + // Create the database + m_db = new SCT_DataBase{athenaComps}; + + // Create the material manager + m_materials = new SCT_MaterialManager{m_db}; + + // Create the geometry manager. + m_geometryManager = new SCT_GeometryManager{m_db}; + m_geometryManager->setOptions(options); + + m_useDynamicAlignFolders = options.dynamicAlignFolders(); + + // Set Version information + // Get the geometry tag + DecodeFaserVersionKey versionKey(geoDbTagSvc(),"SCT"); + IRDBRecordset_ptr switchSet + = rdbAccessSvc()->getRecordsetPtr("SctSwitches", versionKey.tag(), versionKey.node(), "FASERDD"); + const IRDBRecord *switches = (*switchSet)[0]; + + std::string layout = "Final"; + std::string description; + if (!switches->isFieldNull("LAYOUT")) { + layout = switches->getString("LAYOUT"); + } + if (!switches->isFieldNull("DESCRIPTION")) { + description = switches->getString("DESCRIPTION"); + } + + std::string versionTag = rdbAccessSvc()->getChildTag("SCT", versionKey.tag(), versionKey.node(),"FASERDD"); + std::string versionName = switches->getString("VERSIONNAME"); + int versionMajorNumber = 3; + int versionMinorNumber = 6; + int versionPatchNumber = 0; + TrackerDD::Version version(versionTag, + versionName, + layout, + description, + versionMajorNumber, + versionMinorNumber, + versionPatchNumber); + m_detectorManager->setVersion(version); + +} + + +SCT_DetectorFactory::~SCT_DetectorFactory() +{ + // NB the detector manager (m_detectorManager)is stored in the detector store by the + // Tool and so we don't delete it. + delete m_db; + delete m_materials; + delete m_geometryManager; +} + +void SCT_DetectorFactory::create(GeoPhysVol *world) +{ + + msg(MSG::INFO) << "Building SCT Detector." << endmsg; + msg(MSG::INFO) << " " << m_detectorManager->getVersion().fullDescription() << endmsg; + + // Change precision. + int oldPrecision = std::cout.precision(6); + + // The tree tops get added to world. We name it "tracker" though. + GeoPhysVol *tracker = world; + + msg(MSG::ALWAYS) << "Retrieving general parameters" << endmsg; + const SCT_GeneralParameters * sctGeneral = m_geometryManager->generalParameters(); + + msg(MSG::ALWAYS) << "Retrieving part transform for SCT" << endmsg; + GeoTrf::Transform3D sctTransform = sctGeneral->partTransform("SCT"); + msg(MSG::ALWAYS) << "Instantiating station object" << endmsg; + SCT_Barrel station("Station", m_detectorManager, m_geometryManager, m_materials); + + msg(MSG::ALWAYS) << "Beginning loop over stations" << endmsg; + std::vector<std::string> partNames {"StationA", "StationB", "StationC"}; + for (int iStation = -1; iStation <= 1; iStation++) + { + if (sctGeneral->partPresent(partNames[iStation+1])) + { + msg(MSG::ALWAYS) << "Found part " << partNames[iStation+1] << endmsg; + m_detectorManager->numerology().addBarrel(iStation); + SCT_Identifier id{m_geometryManager->athenaComps()->getIdHelper()}; + id.setStation(iStation); + tracker->add(new GeoNameTag("SCT")); + tracker->add(new GeoIdentifierTag(iStation)); + GeoAlignableTransform* stationTransform = new GeoAlignableTransform(sctTransform * sctGeneral->partTransform(partNames[iStation+1])); + tracker->add(stationTransform); + GeoVPhysVol* stationPhys = station.build(id); + tracker->add(stationPhys); + m_detectorManager->addTreeTop(stationPhys); + m_detectorManager->addAlignableTransform(3, id.getWaferId(), stationTransform, stationPhys); + } + } + + // Set the neighbours + m_detectorManager->initNeighbours(); + + // Set maximum number of strips in numerology. + for (int iDesign = 0; iDesign < m_detectorManager->numDesigns(); iDesign++) { + m_detectorManager->numerology().setMaxNumPhiCells(m_detectorManager->getSCT_Design(iDesign)->cells()); + } + + // Return precision to its original value + std::cout.precision(oldPrecision); + +} + + +const SCT_DetectorManager * SCT_DetectorFactory::getDetectorManager() const +{ + return m_detectorManager; +} + + diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_GeneralParameters.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_GeneralParameters.cxx new file mode 100644 index 000000000..b20eebbca --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_GeneralParameters.cxx @@ -0,0 +1,88 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_GeneralParameters.h" +#include "FaserSCT_GeoModel/SCT_DataBase.h" +#include "RDBAccessSvc/IRDBRecord.h" +#include "RDBAccessSvc/IRDBRecordset.h" +#include "GaudiKernel/SystemOfUnits.h" +#include "GeoModelKernel/GeoDefinitions.h" +#include "TrackerGeoModelUtils/TopLevelPlacements.h" + +const double SCT_SAFETY = 0.01 * Gaudi::Units::mm; // Used in some places to make envelopes slightly larger to ensure + // no overlaps due to rounding errors. + + +SCT_GeneralParameters::SCT_GeneralParameters(SCT_DataBase* rdb) +{ + m_rdb = rdb; + m_placements = new TopLevelPlacements(m_rdb->topLevelTable()); +} + + +SCT_GeneralParameters::~SCT_GeneralParameters() +{ + delete m_placements; +} + + +const GeoTrf::Transform3D & +SCT_GeneralParameters::partTransform(const std::string & partName) const +{ + return m_placements->transform(partName); +} + + +bool +SCT_GeneralParameters::partPresent(const std::string & partName) const +{ + return m_placements->present(partName); +} + + + +// +// General +// +double +SCT_GeneralParameters::safety() const +{ + return SCT_SAFETY; +} + +// Default Conditions. Values should be come form conditions data base. These values provide +// default vlaues if nothing from the conditions database is provided. + + +// double +// SCT_GeneralParameters::temperature() const +// { +// if (m_rdb->conditionsTable()->size() == 0) { +// return 266.15 * Gaudi::Units::kelvin; // -7 C +// } +// return (m_rdb->conditions()->getDouble("TEMPERATURE") + 273.15) * Gaudi::Units::kelvin; +// } + + +// double +// SCT_GeneralParameters::biasVoltage() const +// { +// if (m_rdb->conditionsTable()->size() == 0) { +// return 100 * Gaudi::Units::volt; +// } +// return m_rdb->conditions()->getDouble("BIASVOLT") * Gaudi::Units::volt; +// } + +// double +// SCT_GeneralParameters::depletionVoltage() const +// { +// if (m_rdb->conditionsTable()->size() == 0) { +// return 20 * Gaudi::Units::volt; +// } +// return m_rdb->conditions()->getDouble("DEPLETIONVOLT") * Gaudi::Units::volt; +// } + + + + diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_GeoModelAthenaComps.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_GeoModelAthenaComps.cxx new file mode 100644 index 000000000..e03d2f8e0 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_GeoModelAthenaComps.cxx @@ -0,0 +1,23 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_GeoModelAthenaComps.h" + +SCT_GeoModelAthenaComps::SCT_GeoModelAthenaComps() + : TrackerDD::AthenaComps("SCT_GeoModel"), + m_idHelper(0) +{} + +void +SCT_GeoModelAthenaComps::setIdHelper(const FaserSCT_ID* idHelper) +{ + m_idHelper = idHelper; +} + +const FaserSCT_ID* +SCT_GeoModelAthenaComps::getIdHelper() const +{ + return m_idHelper; +} + diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_GeometryManager.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_GeometryManager.cxx new file mode 100644 index 000000000..1a3852a64 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_GeometryManager.cxx @@ -0,0 +1,112 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" + +#include "TrackerGeoModelUtils/DistortedMaterialManager.h" +#include "TrackerIdentifier/FaserSCT_ID.h" +#include "TrackerReadoutGeometry/SiCommonItems.h" +#include "FaserSCT_GeoModel/SCT_BarrelParameters.h" +#include "FaserSCT_GeoModel/SCT_BarrelModuleParameters.h" +#include "FaserSCT_GeoModel/SCT_DataBase.h" +#include "FaserSCT_GeoModel/SCT_GeneralParameters.h" +#include "FaserSCT_GeoModel/SCT_GeoModelAthenaComps.h" + +SCT_GeometryManager::SCT_GeometryManager(SCT_DataBase* rdb) + : m_athenaComps{rdb->athenaComps()}, + m_rdb{rdb} +{ + // This class uses reference counting. Should not be delete'd in destructor. + m_commonItems = new TrackerDD::SiCommonItems(m_athenaComps->getIdHelper()); + + m_barrelParameters = std::make_unique<SCT_BarrelParameters>(m_rdb); + m_barrelModuleParameters = std::make_unique<SCT_BarrelModuleParameters>(m_rdb); + m_generalParameters = std::make_unique<SCT_GeneralParameters>(m_rdb); + m_distortedMatManager = std::make_unique<TrackerDD::DistortedMaterialManager>(); +} + +SCT_GeometryManager::~SCT_GeometryManager() +{ +} + +// +// Access to run time options. +// +const SCT_Options & +SCT_GeometryManager::options() const +{ + return m_options; +} + +void +SCT_GeometryManager::setOptions(const SCT_Options & options) +{ + m_options = options; +} + +const SCT_GeoModelAthenaComps * +SCT_GeometryManager::athenaComps() const +{ + return m_athenaComps; +} + +// +// SiCommonItems which are passed to SiDetectorElements. +// + +const TrackerDD::SiCommonItems * +SCT_GeometryManager::commonItems() const +{ + return m_commonItems; +} + +const SCT_BarrelParameters * +SCT_GeometryManager::barrelParameters() const +{ + return m_barrelParameters.get(); +} + +const SCT_BarrelModuleParameters * +SCT_GeometryManager::barrelModuleParameters() const +{ + return m_barrelModuleParameters.get(); +} + +const SCT_GeneralParameters * +SCT_GeometryManager::generalParameters() const +{ + return m_generalParameters.get(); +} + +const TrackerDD::DistortedMaterialManager * +SCT_GeometryManager::distortedMatManager() const +{ + return m_distortedMatManager.get(); +} + +SCT_GeometryManager& +SCT_GeometryManager::operator=(const SCT_GeometryManager& right) { + if (this != &right) { + m_options = right.m_options; + m_athenaComps = right.m_athenaComps; + m_commonItems = right.m_commonItems; + m_rdb = right.m_rdb; + m_barrelParameters.reset(new SCT_BarrelParameters(m_rdb)); + m_barrelModuleParameters.reset(new SCT_BarrelModuleParameters(m_rdb)); + m_generalParameters.reset(new SCT_GeneralParameters(m_rdb)); + m_distortedMatManager.reset(new TrackerDD::DistortedMaterialManager()); + } + return *this; +} + +SCT_GeometryManager::SCT_GeometryManager(const SCT_GeometryManager& right) { + m_options = right.m_options; + m_athenaComps = right.m_athenaComps; + m_commonItems = right.m_commonItems; + m_rdb = right.m_rdb; + m_barrelParameters.reset(new SCT_BarrelParameters(m_rdb)); + m_barrelModuleParameters.reset(new SCT_BarrelModuleParameters(m_rdb)); + m_generalParameters.reset(new SCT_GeneralParameters(m_rdb)); + m_distortedMatManager.reset(new TrackerDD::DistortedMaterialManager()); +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Hybrid.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Hybrid.cxx new file mode 100644 index 000000000..d8f78c0a6 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Hybrid.cxx @@ -0,0 +1,50 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_Hybrid.h" + +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" + +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" +#include "FaserSCT_GeoModel/SCT_BarrelModuleParameters.h" + +#include "GeoModelKernel/GeoBox.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoMaterial.h" +#include "GeoModelKernel/Units.h" + +SCT_Hybrid::SCT_Hybrid(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManage, + SCT_MaterialManager* materials) + : SCT_SharedComponentFactory(name, detectorManager, geometryManage, materials) +{ + getParameters(); + m_physVolume = build(); +} + +void +SCT_Hybrid::getParameters() +{ + const SCT_BarrelModuleParameters * parameters = m_geometryManager->barrelModuleParameters(); + m_material = m_materials->getMaterial(parameters->hybridMaterial()); + m_thickness = parameters->hybridThickness(); + m_length = parameters->hybridLength(); + m_width = parameters->hybridWidth(); +} + +GeoVPhysVol * +SCT_Hybrid::build() +{ + // Build the . Just a simple box. + const GeoBox * simpleHybridShape = new GeoBox(0.5*m_thickness, + 0.5*m_width, + 0.5*m_length); + const GeoLogVol * simpleHybridLog = + new GeoLogVol(getName(), simpleHybridShape, m_material); + GeoPhysVol * simpleHybrid = new GeoPhysVol(simpleHybridLog); + + return simpleHybrid; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Identifier.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Identifier.cxx new file mode 100644 index 000000000..bfe91e182 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Identifier.cxx @@ -0,0 +1,26 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_Identifier.h" +#include "TrackerIdentifier/FaserSCT_ID.h" +#include "Identifier/Identifier.h" + +#include <cassert> +#include <iostream> + +Identifier +SCT_Identifier::getWaferId() +{ + assert (m_idHelper); + return m_idHelper->wafer_id(m_station, m_layer, m_phiModule, m_etaModule, m_side); +} + +void SCT_Identifier::print() +{ + std::cout << "2/1/" << m_station << "/" + << m_layer << "/" + << m_phiModule << "/" + << m_etaModule << "/" + << m_side << std::endl; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_InnerSide.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_InnerSide.cxx new file mode 100644 index 000000000..4905997d4 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_InnerSide.cxx @@ -0,0 +1,199 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// +// 13rd Mar 2005 D.Naito +// 28th Mar 2005 S.Mima +// Wed 15th Jun 2005 D.Naito modified. +// +#include "FaserSCT_GeoModel/SCT_InnerSide.h" + +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" + +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" +#include "FaserSCT_GeoModel/SCT_BarrelModuleParameters.h" +#include "FaserSCT_GeoModel/SCT_GeneralParameters.h" +#include "FaserSCT_GeoModel/SCT_Identifier.h" + +// module parts. +#include "FaserSCT_GeoModel/SCT_Sensor.h" +#include "FaserSCT_GeoModel/SCT_Hybrid.h" + +#include "TrackerReadoutGeometry/SCT_DetectorManager.h" + +#include "GeoModelKernel/GeoBox.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoFullPhysVol.h" +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/GeoIdentifierTag.h" +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoShape.h" +#include "GeoModelKernel/GeoShapeUnion.h" +#include "GeoModelKernel/GeoShapeShift.h" +#include "GeoModelKernel/GeoDefinitions.h" +#include "GaudiKernel/SystemOfUnits.h" + +#include <cmath> + +SCT_InnerSide::SCT_InnerSide(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials) + : SCT_UniqueComponentFactory(name, detectorManager, geometryManager, materials), + m_hybrid(0), + m_sensor(0) +{ + getParameters(); + m_logVolume = preBuild(); +} + + +SCT_InnerSide::~SCT_InnerSide() +{ + delete m_hybrid; + delete m_sensor; + delete m_env1RefPointVector; + delete m_env2RefPointVector; + if (m_hybridPos) m_hybridPos->unref(); + if (m_sensorPos) m_sensorPos->unref(); +} + + +void +SCT_InnerSide::getParameters() +{ + const SCT_BarrelModuleParameters * parameters = m_geometryManager->barrelModuleParameters(); + const SCT_GeneralParameters * generalParameters = m_geometryManager->generalParameters(); + + m_safety = generalParameters->safety(); + m_hybridOffsetZ = parameters->hybridOffsetZ(); + m_hybridOffsetX = parameters->hybridOffsetX(); +} + + +const GeoLogVol * +SCT_InnerSide::preBuild() +{ + // Create child components + m_sensor = new SCT_Sensor("BRLSensor", m_detectorManager, m_geometryManager, m_materials); + m_hybrid = new SCT_Hybrid("Hybrid", m_detectorManager, m_geometryManager, m_materials); + + // + // Define constants for convenience. + // t_XXX: thickness of XXX. + // w_XXX: width of XXX. + // l_XXX: length of XXX. + // + const double t_hybrid = m_hybrid->thickness(); + const double w_hybrid = m_hybrid->width(); + const double l_hybrid = m_hybrid->length(); + + const double t_sensor = m_sensor->thickness(); + const double w_sensor = m_sensor->width(); + const double l_sensor = m_sensor->length(); + + // + // Calculate a few things. + // + const double sensorPosX = 0.0; + const double sensorPosY = 0.0; + const double sensorPosZ = 0.0; + + const double hybridPosX = m_hybridOffsetX; + const double hybridPosY = 0.0; + const double hybridPosZ = m_hybridOffsetZ; + + // + // ise : InnerSideEnvelope + // Reference: sct_module_geometry.ps + // + // 28th Mar S.Mima modified + // Wed 15th Jun 2005 D.Naito modified. + const double w_ise1 = w_sensor + m_safety; + const double t_ise1 = t_sensor + m_safety; + const double l_ise1 = l_sensor + m_safety; + + const double t_ise2 = t_hybrid + m_safety; + const double w_ise2 = w_hybrid + m_safety; + const double l_ise2 = l_hybrid + m_safety; + + const double ise2PosX = hybridPosX; + const double ise2PosY = hybridPosY; + const double ise2PosZ = hybridPosZ; + + // *** 16:30 Wed 15th Jun 2005 D.Naito modified. (00)********************************* + // *** -->> (00)********************************* + m_env1RefPointVector = new GeoTrf::Vector3D(0.0, 0.0, 0.0); + m_env2RefPointVector = new GeoTrf::Vector3D(-ise2PosX, -ise2PosY, -ise2PosZ); + // *** End of modified lines. ------------------ (00)********************************* + + m_hybridPos = new GeoTransform(GeoTrf::Translate3D(hybridPosX, hybridPosY, hybridPosZ)); + m_hybridPos->ref(); + + // The depth axis goes from the backside to the implant side + // and so point away from the module center. + // The two sensor+hybrid combinations are built in a similar way. + // + // ^ + // --- hybrid | + // ------- sensor | x-axis + // + // Shown is the outer side. The inner side is the same but with a rotation of 180 deg around the z-axis. + // + //Gaudi::Units::HepRotation rotSensor; + //rotSensor.rotateZ(180*Gaudi::Units::deg); + //m_outerSidePos = new GeoTrf::Transform3D(rotOuter, GeoTrf::Vector3D(0.5 * (m_sensorGap + sectThickness), 0., 0.)); + //m_sensorPos = new GeoTransform(GeoTrf::Transform3D(rotSensor, GeoTrf::Vector3D(sensorPosX, sensorPosY, sensorPosZ))); + m_sensorPos = new GeoTransform(GeoTrf::Translate3D(sensorPosX, sensorPosY, sensorPosZ)); + m_sensorPos->ref(); + + // + // Make an envelope for the whole module. + // + const GeoBox * ise1Shape = new GeoBox(0.5 * t_ise1, + 0.5 * w_ise1, + 0.5 * l_ise1); + const GeoBox * ise2Shape = new GeoBox(0.5 * t_ise2, + 0.5 * w_ise2, + 0.5 * l_ise2); + + const GeoShape & InnerSideEnvelopeShape = (*ise1Shape). + add(*ise2Shape << GeoTrf::Translate3D(ise2PosX, ise2PosY, ise2PosZ)); + + const GeoLogVol * InnerSideEnvelopeLog = new GeoLogVol("InnerSideEnvelope", + &InnerSideEnvelopeShape, + m_materials->gasMaterial()); + // 28th Mar S.Mima modified + // *** 16:30 Wed 15th Jun 2005 D.Naito modified. (00)********************************* + //m_thickness = 0.5*t_sensor + hybridPosX + 0.5*t_ise2; + // *** -->> (00)********************************* + m_thickness = 0.5*t_ise1 + hybridPosX + 0.5*t_ise2; + // *** End of modified lines. ------------------ (00)********************************* + m_width = w_ise1; + m_length = l_ise1; + + return InnerSideEnvelopeLog; +} + + +GeoVPhysVol * +SCT_InnerSide::build(SCT_Identifier id) +{ + GeoFullPhysVol * innerSide = new GeoFullPhysVol(m_logVolume); + + // + // Build the innerSide + // + // Add Sensor + innerSide->add(new GeoIdentifierTag(1000)); + innerSide->add(m_sensorPos); + innerSide->add(m_sensor->build(id)); + + // Add Hybrid + innerSide->add(m_hybridPos); + innerSide->add(m_hybrid->getVolume()); + + return innerSide; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Layer.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Layer.cxx new file mode 100644 index 000000000..4e3811f20 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Layer.cxx @@ -0,0 +1,146 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// +// CPW 17/8/06 +// Version using new model of services from A. Tricoli +// +#include "FaserSCT_GeoModel/SCT_Layer.h" +#include "FaserSCT_GeoModel/SCT_Identifier.h" +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" +#include "FaserSCT_GeoModel/SCT_BarrelParameters.h" +#include "FaserSCT_GeoModel/SCT_GeneralParameters.h" +#include "FaserSCT_GeoModel/SCT_Ski.h" +#include "FaserSCT_GeoModel/SCT_Module.h" + +#include "TrackerGeoModelUtils/ExtraMaterial.h" +#include "TrackerReadoutGeometry/SCT_DetectorManager.h" + +#include "GeoModelKernel/GeoBox.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoFullPhysVol.h" +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/GeoIdentifierTag.h" +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoAlignableTransform.h" +#include "GeoModelKernel/GeoMaterial.h" +#include "GeoModelKernel/GeoShapeSubtraction.h" +#include "GeoModelKernel/GeoDefinitions.h" +#include "GaudiKernel/SystemOfUnits.h" + +#include <sstream> +#include <cmath> + +inline double sqr(double x) {return x * x;} + +SCT_Layer::SCT_Layer(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials) + : SCT_UniqueComponentFactory(name, detectorManager, geometryManager, materials) +{ + getParameters(); + m_logVolume = preBuild(); +} + +SCT_Layer::~SCT_Layer() +{ +} + +void +SCT_Layer::getParameters() +{ + const SCT_BarrelParameters * parameters = m_geometryManager->barrelParameters(); + const SCT_GeneralParameters * generalParameters = m_geometryManager->generalParameters(); + + m_safety = generalParameters->safety(); + m_rowsPerLayer = parameters->rowsPerLayer(); + +} + +const GeoLogVol * +SCT_Layer::preBuild() +{ + std::cout << "Instantiating Ski" << std::endl; + m_ski = new SCT_Ski("Row", m_detectorManager, m_geometryManager, m_materials); + // + // Active Layer Envelope extent + // Envelope for the active part (ie containing all the skis for the layer) + // + double activeWidth, activeHeight, activeThickness; + + // Returns the outer dimensions of the active envelope + activeEnvelopeExtent(activeWidth, activeHeight, activeThickness); + + // Add some safety + activeWidth += m_safety; + activeHeight += m_safety; + activeThickness += m_safety; + + m_activeWidth = activeWidth; + m_activeHeight = activeHeight; + m_activeThickness = activeThickness; + // + // Overall Layer Envelope extent + // + // Same as active dimensions, since there is no support material yet + m_width = m_activeWidth; + m_height = m_activeHeight; + m_thickness = m_activeThickness; + // + // Make envelope for layer + // + const GeoBox* layerEnvelopeBox = new GeoBox(0.5 * m_width, 0.5 * m_height, 0.5 * m_thickness); + GeoLogVol* logVolume = new GeoLogVol(getName(), layerEnvelopeBox, m_materials->gasMaterial()); + + // Check for overlap. + + return logVolume; +} + +GeoVPhysVol * +SCT_Layer::build(SCT_Identifier id) +{ + // We make this a fullPhysVol + GeoFullPhysVol * layer = new GeoFullPhysVol(m_logVolume); + + double activeHeight = m_height - m_safety/2; + double rowHeight = m_ski->width(); + for (int iPhi = 0; iPhi < m_rowsPerLayer; iPhi++) + { + layer->add(new GeoNameTag("Row#"+intToString(iPhi))); + layer->add(new GeoIdentifierTag(iPhi)); + id.setPhiModule(iPhi); + GeoAlignableTransform* transform = new GeoAlignableTransform(GeoTrf::Translate3D(0.0, + (rowHeight - activeHeight)/2 + iPhi * rowHeight, + 0.0 ) * + GeoTrf::RotateY3D(90*Gaudi::Units::deg)); + layer->add(transform); + GeoVPhysVol * skiPV = m_ski->build(id); + layer->add(skiPV); + // Store alignable transform + m_detectorManager->addAlignableTransform(2, id.getWaferId(), transform, skiPV); + } + + // Extra Material + TrackerDD::ExtraMaterial xMat(m_geometryManager->distortedMatManager()); + xMat.add(layer, "SCTLayer"); + + return layer; +} + +void +SCT_Layer::activeEnvelopeExtent(double & dx, double & dy, double & dz) +{ + // Do this in a very simple-minded and unrealistic way to start + double layerThickness = m_ski->thickness() + m_safety; // this is the x-coordinate of the module/ski and the z-coordinate of the layer + double layerWidth = m_ski->length() + m_safety; // this is the z-coordinate (eta) of the module/ski, and the x-coordinate of the layer + double layerHeight = m_rowsPerLayer * m_ski->width() + m_safety; // this is the y-coordinate (phi) of the module/ski, and the y-coordinate of the layer + + dx = layerWidth; + dy = layerHeight; + dz = layerThickness; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_MaterialManager.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_MaterialManager.cxx new file mode 100644 index 000000000..6efce9ce9 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_MaterialManager.cxx @@ -0,0 +1,83 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" +#include "GeoModelKernel/GeoMaterial.h" +#include "GeoModelKernel/GeoElement.h" +#include "FaserSCT_GeoModel/SCT_DataBase.h" +#include "RDBAccessSvc/IRDBRecordset.h" +#include "StoreGate/StoreGateSvc.h" +#include "GaudiKernel/Bootstrap.h" +#include "GaudiKernel/ISvcLocator.h" +#include "GaudiKernel/SystemOfUnits.h" + +#include <iostream> + +// Constructor +SCT_MaterialManager::SCT_MaterialManager(SCT_DataBase* db) +{ + // Get my material manager. + ISvcLocator* svcLocator = Gaudi::svcLocator(); // from Bootstrap + StoreGateSvc* detStore; + StatusCode sc = svcLocator->service("DetectorStore", detStore ); + if (sc.isFailure()) { + std::cout << "Could not locate DetectorStore" << std::endl; + return; + } + + m_materialManager = std::make_unique<TrackerMaterialManager>("SCT_MaterialManager", db->athenaComps()); + m_materialManager->addWeightTable(db->weightTable(), "sct"); + m_materialManager->addScalingTable(db->scalingTable()); + + loadMaterials(); + + m_gasMaterial = m_materialManager->getMaterial("std::Air"); +} + +// Add materials not yet in the database +void +SCT_MaterialManager::loadMaterials() +{ +} + +const GeoElement* +SCT_MaterialManager::getElement(const std::string & elementName) const +{ + return m_materialManager->getElement(elementName); +} + +const GeoMaterial* +SCT_MaterialManager::getMaterial(const std::string & materialName) const +{ + return m_materialManager->getMaterial(materialName); +} + +void +SCT_MaterialManager::addMaterial(GeoMaterial* material) +{ + return m_materialManager->addMaterial(material); +} + +const GeoMaterial* +SCT_MaterialManager::getMaterial(const std::string & originalMaterial, + double density, + const std::string & newName) +{ + + return m_materialManager->getMaterial(originalMaterial, density, newName); +} + +const GeoMaterial * +SCT_MaterialManager::getMaterialForVolume(const std::string & materialName, double volume) +{ + return m_materialManager->getMaterialForVolume(materialName, volume); +} + + + +const GeoMaterial* +SCT_MaterialManager::gasMaterial() const +{ + return m_gasMaterial; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Module.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Module.cxx new file mode 100644 index 000000000..5356dcbea --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Module.cxx @@ -0,0 +1,375 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_Module.h" + +#include "FaserSCT_GeoModel/SCT_Identifier.h" +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" + +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" +#include "FaserSCT_GeoModel/SCT_BarrelModuleParameters.h" +#include "FaserSCT_GeoModel/SCT_GeneralParameters.h" + +#include "FaserSCT_GeoModel/SCT_Sensor.h" +#include "FaserSCT_GeoModel/SCT_Hybrid.h" +#include "FaserSCT_GeoModel/SCT_Pigtail.h" +#include "FaserSCT_GeoModel/SCT_InnerSide.h" +#include "FaserSCT_GeoModel/SCT_OuterSide.h" +#include "FaserSCT_GeoModel/SCT_BaseBoard.h" + +#include "TrackerReadoutGeometry/SCT_DetectorManager.h" + +#include "GeoModelKernel/GeoShape.h" +#include "GeoModelKernel/GeoShapeShift.h" +#include "GeoModelKernel/GeoShapeUnion.h" +#include "GeoModelKernel/GeoBox.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoVPhysVol.h" +#include "GeoModelKernel/GeoFullPhysVol.h" +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/GeoIdentifierTag.h" +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoAlignableTransform.h" +#include "GeoModelKernel/GeoDefinitions.h" +#include "GaudiKernel/SystemOfUnits.h" +// 8th Aug 2005 S.Mima modified. +#include "GeoModelKernel/GeoShapeSubtraction.h" + +#include <cmath> + +SCT_Module::SCT_Module(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials) +: SCT_UniqueComponentFactory(name, detectorManager, geometryManager, materials), + m_innerSide(0), + m_outerSide(0), + m_baseBoard(0) + +{ + getParameters(); + m_logVolume = preBuild(); +} + + +SCT_Module::~SCT_Module() +{ + // Clean up + delete m_baseBoardPos; // 6th Apr 2005 S.Mima modified. + delete m_innerSidePos; + delete m_outerSidePos; + + delete m_innerSide; + delete m_outerSide; + delete m_baseBoard; + + delete m_env1RefPointVector; + delete m_env2RefPointVector; +} + + +void +SCT_Module::getParameters() +{ + const SCT_BarrelModuleParameters * parameters = m_geometryManager->barrelModuleParameters(); + const SCT_GeneralParameters * generalParameters = m_geometryManager->generalParameters(); + + m_safety = generalParameters->safety(); + + m_sensorGap = parameters->moduleSensorToSensorGap(); + + m_stereoAngle = parameters->moduleStereoAngle(); + int sign = parameters->moduleStereoUpperSign(); + m_upperSide = parameters->moduleUpperSideNumber(); + m_stereoInner = -0.5*sign*m_stereoAngle; + m_stereoOuter = 0.5*sign*m_stereoAngle; + + m_baseBoardOffsetY = parameters->baseBoardOffsetY(); + m_baseBoardOffsetZ = parameters->baseBoardOffsetZ(); +} + + +const GeoLogVol * +SCT_Module::preBuild() +{ + // Create child components + m_outerSide = new SCT_OuterSide("OuterSide", m_detectorManager, m_geometryManager, m_materials); + m_baseBoard = new SCT_BaseBoard("BaseBoard", m_detectorManager, m_geometryManager, m_materials); + m_innerSide = new SCT_InnerSide("InnerSide", m_detectorManager, m_geometryManager, m_materials); + + // + // We have 2 envelopes. + // 1. It contains two sensors and baseBoard. + // 2. It contains hybrid and pigtail. + // + // See "doc/cornerName.ps". + // + + // We need to take into account the safety incorporated in the inner and outer side + // envelopes. + double sensorWidth = m_innerSide->sensor()->width() + m_safety; + double sensorLength = m_innerSide->sensor()->length() + m_safety; + double innerSideHybridWidth = m_innerSide->hybrid()->width() + m_safety; + double innerSideHybridLength = m_innerSide->hybrid()->length() + m_safety; + double outerSideHybridWidth = m_outerSide->hybrid()->width() + m_safety; + double outerSideHybridLength = m_outerSide->hybrid()->length() + m_safety; + double baseBoardWidth = m_baseBoard->width() + m_safety; + double baseBoardLength = m_baseBoard->length() + m_safety; + double outerSidePigtailLength = m_outerSide->pigtail()->length() + m_safety; + + + // Define constants for convenience. + // for corner of outer side sensor. + GeoTrf::Vector3D a(0.0, 0.5 * sensorWidth, 0.5 * sensorLength); + GeoTrf::Vector3D b(0.0, -0.5 * sensorWidth, a.z()); + GeoTrf::Vector3D c(0.0, b.y(),-0.5 * sensorLength); + GeoTrf::Vector3D d(0.0, a.y(), c.z()); + + // for corner of inner side sensor. + GeoTrf::Vector3D e(0.0, a.y(), a.z()); + GeoTrf::Vector3D f(0.0, b.y(), b.z()); + GeoTrf::Vector3D g(0.0, c.y(), c.z()); + GeoTrf::Vector3D h(0.0, d.y(), d.z()); + + // for corner of base board. + GeoTrf::Vector3D u(0.0, + m_baseBoardOffsetY + 0.5*baseBoardWidth, + m_baseBoardOffsetZ + 0.5*baseBoardLength); + GeoTrf::Vector3D v(0.0, m_baseBoardOffsetY - 0.5*baseBoardWidth, u.z()); + GeoTrf::Vector3D w(0.0, v.y(), m_baseBoardOffsetZ - 0.5*baseBoardLength); + GeoTrf::Vector3D x(0.0, u.y(),w.z()); + + // for corner of hybrid, connectorouter and pigtail of outer side. + GeoTrf::Vector3D i(0.0, + 0.5*outerSideHybridWidth, + m_outerSide->hybridOffsetZ() + 0.5*outerSidePigtailLength); + GeoTrf::Vector3D l(0.0, + -0.5*outerSideHybridWidth - m_outerSide->pigtail()->width(), i.z()); + GeoTrf::Vector3D m(0.0, l.y(), + m_outerSide->hybridOffsetZ() - 0.5*outerSidePigtailLength); + GeoTrf::Vector3D p(0.0, i.y(), + m.z()); + + + + // for corner of hybrid and interConnect of inner side. + GeoTrf::Vector3D q(0.0, 0.5*outerSideHybridWidth, m_outerSide->hybridOffsetZ() + 0.5*outerSideHybridLength ); + GeoTrf::Vector3D r(0.0, -0.5*innerSideHybridWidth, q.z()); + GeoTrf::Vector3D s(0.0, r.y(), m_innerSide->hybridOffsetZ() - 0.5*innerSideHybridLength); + GeoTrf::Vector3D t(0.0, q.y(), s.z()); + + // All points turn +-20 mGaudi::Units::rad around physical center of module. + a = GeoTrf::RotateX3D(m_stereoOuter/Gaudi::Units::radian)*a; + b = GeoTrf::RotateX3D(m_stereoOuter/Gaudi::Units::radian)*b; + c = GeoTrf::RotateX3D(m_stereoOuter/Gaudi::Units::radian)*c; + d = GeoTrf::RotateX3D(m_stereoOuter/Gaudi::Units::radian)*d; + + e = GeoTrf::RotateX3D(m_stereoInner/Gaudi::Units::radian)*e; + f = GeoTrf::RotateX3D(m_stereoInner/Gaudi::Units::radian)*f; + g = GeoTrf::RotateX3D(m_stereoInner/Gaudi::Units::radian)*g; + h = GeoTrf::RotateX3D(m_stereoInner/Gaudi::Units::radian)*h; + + i = GeoTrf::RotateX3D(m_stereoOuter/Gaudi::Units::radian)*i; + //k.rotateX(m_stereoOuter/Gaudi::Units::radian); + l = GeoTrf::RotateX3D(m_stereoOuter/Gaudi::Units::radian)*l; + m = GeoTrf::RotateX3D(m_stereoOuter/Gaudi::Units::radian)*m; + //n.rotateX(m_stereoOuter/Gaudi::Units::radian); + p = GeoTrf::RotateX3D(m_stereoOuter/Gaudi::Units::radian)*p; + + q = GeoTrf::RotateX3D(m_stereoInner/Gaudi::Units::radian)*q; + r = GeoTrf::RotateX3D(m_stereoInner/Gaudi::Units::radian)*r; + s = GeoTrf::RotateX3D(m_stereoInner/Gaudi::Units::radian)*s; + t = GeoTrf::RotateX3D(m_stereoInner/Gaudi::Units::radian)*t; + + // Calculate demension of envelope1. + const double z_ab = std::max(a.z(), b.z()); + const double z_ef = std::max(e.z(), f.z()); + const double z_cd = std::min(c.z(), d.z()); + const double z_gh = std::min(g.z(), h.z()); + + const double y_ad = std::max(a.y(), d.y()); + const double y_eh = std::max(e.y(), h.y()); + const double y_bc = std::min(b.y(), c.y()); + const double y_fg = std::min(f.y(), g.y()); + + const double zmaxEnv1 = std::max(z_ab, z_ef); + const double zminEnv1 = std::min(z_cd, z_gh); + + const double ypre_maxEnv1 = std::max(y_ad, y_eh); + const double ypre_minEnv1 = std::min(y_bc, y_fg); + + const double ymaxEnv1 = std::max(ypre_maxEnv1, u.y()); + const double yminEnv1 = std::min(ypre_minEnv1, v.y()); + + // some temporary value. + const double thicknessEnv1 = m_sensorGap + 2.0*m_outerSide->sensor()->thickness(); + const double lengthEnv1 = zmaxEnv1 - zminEnv1; + const double widthEnv1 = ymaxEnv1 - yminEnv1; + + // Center of evnelope1. + const double xCenterEnv1 = 0.0; + const double yCenterEnv1 = yminEnv1 + 0.5*widthEnv1; + const double zCenterEnv1 = zmaxEnv1 - 0.5*lengthEnv1; + + m_env1RefPointVector = new GeoTrf::Vector3D(-xCenterEnv1, -yCenterEnv1, -zCenterEnv1); + + // Calculate demension of envelope2. + const double z_ikl = std::max(i.z(), l.z()); + const double z_qr = std::max(q.z(), r.z()); + const double z_mnp = std::min(m.z(), p.z()); + const double z_st = std::min(s.z(), t.z()); + + const double y_ip = std::max(i.y(), p.y()); + const double y_qt = std::max(q.y(), t.y()); + const double y_lm = std::min(l.y(), m.y()); + const double y_rs = std::min(r.y(), s.y()); + + const double zmaxEnv2 = std::max(z_ikl, z_qr); + const double zminEnv2 = std::min(z_mnp, z_st); + + const double ymaxEnv2 = std::max(y_ip, y_qt); + const double yminEnv2 = std::min(y_lm, y_rs); + + const double thicknessEnv2 = 2.0*(m_outerSide->hybridOffsetX() + + 0.5*m_innerSide->sensor()->thickness() + + 0.5*m_sensorGap + + 0.5*m_outerSide->hybrid()->thickness()); + const double lengthEnv2 = zmaxEnv2 - zminEnv2; + const double widthEnv2 = ymaxEnv2 - yminEnv2; + + // Center of envelope2. + const double xCenterEnv2 = 0.0; + const double yCenterEnv2 = ymaxEnv2 - 0.5*widthEnv2; + const double zCenterEnv2 = zmaxEnv2 - 0.5*lengthEnv2; + + m_env2RefPointVector = new GeoTrf::Vector3D(-xCenterEnv2, -yCenterEnv2, -zCenterEnv2); + + // 8th Aug 2005 S.Mima modified. + // Calculate dimension of subbox + const double xmaxSubBox = - 0.5*m_baseBoard->thickness() - m_safety; + const double xminSubBox = - 0.5*thicknessEnv2 - 2.0*m_safety; + + const double ymaxSubBox = std::min(r.y(), s.y()) - m_safety; + const double yminSubBox = yminEnv2 - 2.0*m_safety; + + const double zmaxSubBox = zmaxEnv1 + 2.0*m_safety; + const double zminSubBox = zminEnv1 - 2.0*m_safety; + + const double thicknessSubBox = xmaxSubBox - xminSubBox; + const double widthSubBox = ymaxSubBox - yminSubBox; + const double lengthSubBox = zmaxSubBox - zminSubBox; + + // Center of subbox. + const double xCenterSubBox = xmaxSubBox - 0.5*thicknessSubBox; + const double yCenterSubBox = ymaxSubBox - 0.5*widthSubBox; + const double zCenterSubBox = zmaxSubBox - 0.5*lengthSubBox; + + + m_env1Thickness = thicknessEnv1 + 2*m_safety; + m_env1Width = widthEnv1 + 2*m_safety; + m_env1Length = lengthEnv1 + 2*m_safety; + + m_env2Thickness = thicknessEnv2 + 2*m_safety; + m_env2Width = widthEnv2 + 2*m_safety; + m_env2Length = lengthEnv2 + 2*m_safety; + + // Envelope 2 defines the overall thickness. NB. The ski assumes the + // the envelope "thickness" is centered on x, which it is. + m_thickness = m_env2Thickness; + m_activeWidth = m_env2Width; + m_width = m_env2Width; + m_length = m_env1Length; + + // Calculate a few things. + const double OSPosX = 0.5*m_sensorGap + 0.5*m_innerSide->sensor()->thickness(); + const double ISPosX = -(0.5*m_sensorGap + 0.5*m_innerSide->sensor()->thickness()); + + // + // Make an envelope for the whole module. + // + // 6th Feb 2005 D.Naito modified. + const GeoBox * envelope1 = new GeoBox(0.5*m_env1Thickness, 0.5*m_env1Width, 0.5*m_env1Length); + const GeoBox * envelope2 = new GeoBox(0.5*m_env2Thickness, 0.5*m_env2Width, 0.5*m_env2Length); + + // 8th Aug 2005 S.Mima modified. + const GeoBox * subBox = new GeoBox(0.5*thicknessSubBox, 0.5*widthSubBox, 0.6*lengthSubBox); + + // In the following, envelope1 and envelope2 are added and SUBBOX is pulled. + const GeoShape & moduleEnvelope = (*envelope1 << GeoTrf::Translate3D(xCenterEnv1, yCenterEnv1, zCenterEnv1)). + add(*envelope2 << GeoTrf::Translate3D(xCenterEnv2, yCenterEnv2, zCenterEnv2)). + subtract(*subBox << GeoTrf::Translate3D(xCenterSubBox, yCenterSubBox, zCenterSubBox)); + + const GeoLogVol * moduleLog = new GeoLogVol(getName(), &moduleEnvelope, m_materials->gasMaterial()); + + // + // inner side + // + GeoTrf::Transform3D rotInner = GeoTrf::RotateX3D(m_stereoInner) * GeoTrf::RotateZ3D(180*Gaudi::Units::deg); + m_innerSidePos = new GeoTrf::Transform3D(GeoTrf::Transform3D(GeoTrf::Translation3D(ISPosX, 0.0, 0.0)*rotInner)); + + // + // outer side + // + GeoTrf::RotateX3D rotOuter(m_stereoOuter); + m_outerSidePos = new GeoTrf::Transform3D(GeoTrf::Transform3D(GeoTrf::Translation3D(OSPosX, 0.0, 0.0)*rotOuter)); + + // + // base board + // 6th Apr 2005 S.Mima modified. + // + const double baseBoardPosY = m_baseBoardOffsetY; + const double baseBoardPosZ = m_baseBoardOffsetZ; + m_baseBoardPos = new GeoTrf::Translate3D(0.0, baseBoardPosY, baseBoardPosZ); + + + return moduleLog; +} + + +GeoVPhysVol * +SCT_Module::build(SCT_Identifier id) +{ + GeoFullPhysVol * module = new GeoFullPhysVol(m_logVolume); + + // We make these fullPhysVols for the alignment code. + // We probably should make the transform for the sensor + // alignable rather than the "side" to save making an extra full phys volume. + + // + // Build the module + // + // Add Baseboard + GeoTransform * baseBoardTransform = new GeoTransform(*m_baseBoardPos); + module->add(baseBoardTransform); + module->add(m_baseBoard->getVolume()); + + // Add innerside + GeoAlignableTransform * innerTransform = new GeoAlignableTransform(*m_innerSidePos); + module->add(innerTransform); + int innerSideNumber = (m_upperSide) ? 0 : 1; + module->add(new GeoNameTag("Side#"+intToString(innerSideNumber))); // Identifier side=0 + module->add(new GeoIdentifierTag(innerSideNumber)); + id.setSide(innerSideNumber); + Identifier innerId = id.getWaferId(); + GeoVPhysVol * innerSide = m_innerSide->build(id); + module->add(innerSide); + // Store alignable transform + m_detectorManager->addAlignableTransform(0, innerId, innerTransform, innerSide); + + // Add outerside + GeoAlignableTransform * outerTransform = new GeoAlignableTransform(*m_outerSidePos); + module->add(outerTransform); + int outerSideNumber = m_upperSide; + module->add(new GeoNameTag("Side#"+intToString(outerSideNumber))); // Identifier side=1 + module->add(new GeoIdentifierTag(outerSideNumber)); + id.setSide(outerSideNumber); + Identifier outerId = id.getWaferId(); + GeoVPhysVol * outerSide = m_outerSide->build(id); + module->add(outerSide); + // Store alignable transform + m_detectorManager->addAlignableTransform(0, outerId, outerTransform, outerSide); + + return module; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Options.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Options.cxx new file mode 100644 index 000000000..0eb5c3721 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Options.cxx @@ -0,0 +1,88 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_Options.h" + +SCT_Options::SCT_Options() + : m_g3Compatible(false), + m_dc1Geometry(false), + m_dc2Geometry(true), + m_alignable(true), + m_alignModule(true), + m_dynAlignFolders(false) +{} + +void +SCT_Options::setG3Compatible(bool flag) +{ + m_g3Compatible = flag; + if (flag) setDC1Geometry(); +} + +bool +SCT_Options::g3Compatible() const +{ + return m_g3Compatible; +} + +void +SCT_Options::setDC1Geometry() +{ + m_dc1Geometry = true; + m_dc2Geometry = false; +} + +bool +SCT_Options::versionDC1() const +{ + return m_dc1Geometry; +} + +void +SCT_Options::setDC2Geometry() +{ + m_dc1Geometry = false; + m_dc2Geometry = true; + m_g3Compatible = false; +} + +bool +SCT_Options::versionDC2() const +{ + return m_dc2Geometry; +} + +void +SCT_Options::setAlignable(bool flag) +{ + m_alignable = flag; +} + +bool +SCT_Options::alignable() const +{ + return m_alignable; +} + +void +SCT_Options::setAlignAtModuleLevel(bool flag) +{ + m_alignModule = flag; +} + +bool +SCT_Options::alignAtModuleLevel() const +{ + return m_alignModule; +} + +void SCT_Options::setDynamicAlignFolders(const bool flag) +{ + m_dynAlignFolders = flag; +} + +bool SCT_Options::dynamicAlignFolders() const +{ + return m_dynAlignFolders; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_OuterSide.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_OuterSide.cxx new file mode 100644 index 000000000..67a8958fc --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_OuterSide.cxx @@ -0,0 +1,211 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_OuterSide.h" + +#include "FaserSCT_GeoModel/SCT_Identifier.h" +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" +#include "FaserSCT_GeoModel/SCT_BarrelModuleParameters.h" +#include "FaserSCT_GeoModel/SCT_GeneralParameters.h" + +// module parts. +#include "FaserSCT_GeoModel/SCT_Sensor.h" +#include "FaserSCT_GeoModel/SCT_Hybrid.h" +#include "FaserSCT_GeoModel/SCT_Pigtail.h" + +#include "TrackerReadoutGeometry/SCT_DetectorManager.h" + +#include "GeoModelKernel/GeoBox.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoFullPhysVol.h" +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/GeoIdentifierTag.h" +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoShape.h" +#include "GeoModelKernel/GeoShapeUnion.h" +#include "GeoModelKernel/GeoShapeShift.h" +#include "GeoModelKernel/GeoDefinitions.h" +#include "GaudiKernel/SystemOfUnits.h" + +#include <cmath> + +SCT_OuterSide::SCT_OuterSide(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials) + : SCT_UniqueComponentFactory(name, detectorManager, geometryManager, materials), + m_hybrid(0), + m_pigtail(0), + m_sensor(0) +{ + getParameters(); + m_logVolume = preBuild(); +} + + +SCT_OuterSide::~SCT_OuterSide() +{ + delete m_hybrid; + delete m_pigtail; + delete m_sensor; + delete m_env1RefPointVector; + delete m_env2RefPointVector; + if (m_hybridPos) m_hybridPos->unref(); + if (m_pigtailPos) m_pigtailPos->unref(); + if (m_sensorPos) m_sensorPos->unref(); +} + + +void +SCT_OuterSide::getParameters() +{ + const SCT_GeneralParameters * generalParameters = m_geometryManager->generalParameters(); + const SCT_BarrelModuleParameters * parameters = m_geometryManager->barrelModuleParameters(); + + m_safety = generalParameters->safety(); + m_hybridOffsetZ = parameters->hybridOffsetZ(); + m_hybridOffsetX = parameters->hybridOffsetX(); +} + + +const GeoLogVol * +SCT_OuterSide::preBuild() +{ + // Create child components + m_sensor = new SCT_Sensor("BRLSensor", m_detectorManager, m_geometryManager, m_materials); + m_hybrid = new SCT_Hybrid("Hybrid", m_detectorManager, m_geometryManager, m_materials); + m_pigtail = new SCT_Pigtail("Pigtail", m_detectorManager, m_geometryManager, m_materials); + + // + // Define constants for convenience. + // t_XXX: thickness of XXX. + // w_XXX: width of XXX. + // l_XXX: length of XXX. + // + const double t_hybrid = m_hybrid->thickness(); + const double w_hybrid = m_hybrid->width(); + //const double l_hybrid = m_hybrid->length(); + + const double t_pigtail = m_pigtail->thickness(); + const double w_pigtail = m_pigtail->width(); + const double l_pigtail = m_pigtail->length(); + + const double t_sensor = m_sensor->thickness(); + const double w_sensor = m_sensor->width(); + const double l_sensor = m_sensor->length(); + + // + // Calculate a few things. + // + const double sensorPosX = 0.0; + const double sensorPosY = 0.0; + const double sensorPosZ = 0.0; + + const double hybridPosX = m_hybridOffsetX; + const double hybridPosY = 0.0; + const double hybridPosZ = m_hybridOffsetZ; + + const double pigtailPosX = hybridPosX + 0.5*t_hybrid - 0.5*t_pigtail; + const double pigtailPosY = -0.5*w_hybrid - 0.5*w_pigtail; + const double pigtailPosZ = hybridPosZ; + + // + // ose : OuterSideEnvelope + // Reference: sct_module_geometry.ps + // + const double w_ose1 = w_sensor + m_safety; + const double t_ose1 = t_sensor + m_safety; + const double l_ose1 = l_sensor + m_safety; + + const double t_ose2 = t_hybrid + m_safety; + const double w_ose2 = w_hybrid + w_pigtail + m_safety; + const double l_ose2 = l_pigtail + m_safety; + + const double ose2PosX = hybridPosX; + const double ose2PosY = hybridPosY - 0.5*w_pigtail; + const double ose2PosZ = hybridPosZ; + + // *** 16:30 Wed 15th Jun 2005 D.Naito modified. (02)********************************* + // *** -->> (02)********************************* + m_env1RefPointVector = new GeoTrf::Vector3D(0.0, 0.0, 0.0); + m_env2RefPointVector = new GeoTrf::Vector3D(-ose2PosX, -ose2PosY, -ose2PosZ); + // *** End of modified lines. ------------------ (02)********************************* + + m_hybridPos = new GeoTransform(GeoTrf::Translate3D(hybridPosX, hybridPosY, hybridPosZ)); + m_hybridPos->ref(); + m_pigtailPos = new GeoTransform(GeoTrf::Translate3D(pigtailPosX, pigtailPosY, pigtailPosZ)); + m_pigtailPos->ref(); + + // The depth axis goes from the backside to the implant side + // and so point to away from the module center. + // The two sensor+hybrid combinations are built in a similar way. + // + // ^ + // --- hybrid | + // ------- sensor | x-axis + // + // Shown is the outer side. The inner side is the same but with a rotation of 180 Gaudi::Units::deg around the z-axis. + // + //Gaudi::Units::HepRotation rotSensor; + //rotSensor.rotateZ(180*Gaudi::Units::deg); + //m_outerSidePos = new GeoTrf::Transform3D(rotOuter, GeoTrf::Vector3D(0.5 * (m_sensorGap + sectThickness), 0., 0.)); + //m_sensorPos = new GeoTransform(GeoTrf::Transform3D(rotSensor, GeoTrf::Vector3D(sensorPosX, sensorPosY, sensorPosZ))); + m_sensorPos = new GeoTransform(GeoTrf::Translate3D(sensorPosX, sensorPosY, sensorPosZ)); + m_sensorPos->ref(); + + // + // Make an envelope for the whole module. + // + const GeoBox * ose1Shape = new GeoBox(0.5 * t_ose1, + 0.5 * w_ose1, + 0.5 * l_ose1); + const GeoBox * ose2Shape = new GeoBox(0.5 * t_ose2, + 0.5 * w_ose2, + 0.5 * l_ose2); + + const GeoShape & OuterSideEnvelopeShape = (*ose1Shape). + add(*ose2Shape << GeoTrf::Translate3D(ose2PosX, ose2PosY, ose2PosZ)); + + const GeoLogVol * OuterSideEnvelopeLog = new GeoLogVol("OuterSideEnvelope", + &OuterSideEnvelopeShape, + m_materials->gasMaterial()); + + // 28th Mar S.Mima modified. + // *** 16:30 Wed 15th Jun 2005 D.Naito modified. (03)********************************* + //m_thickness = 0.5*t_sensor + m_hybridOffsetX + 0.5*t_ose2; + // *** -->> (03)********************************* + m_thickness = 0.5*t_ose1 + m_hybridOffsetX + 0.5*t_ose2; + // *** End of modified lines. ------------------ (03)********************************* + m_width = w_ose2; + m_length = l_ose1; + + return OuterSideEnvelopeLog; +} + + +GeoVPhysVol * +SCT_OuterSide::build(SCT_Identifier id) +{ + GeoFullPhysVol * outerSide = new GeoFullPhysVol(m_logVolume); + + // + // Build the outerSide + // + // Add Sensor + outerSide->add(new GeoIdentifierTag(1000)); + outerSide->add(m_sensorPos); + outerSide->add(m_sensor->build(id)); + + // Add Hybrid + outerSide->add(m_hybridPos); + outerSide->add(m_hybrid->getVolume()); + + // Add Pigtail + outerSide->add(m_pigtailPos); + outerSide->add(m_pigtail->getVolume()); + + return outerSide; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Pigtail.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Pigtail.cxx new file mode 100644 index 000000000..3d5916765 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Pigtail.cxx @@ -0,0 +1,51 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_Pigtail.h" + +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" + +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" +#include "FaserSCT_GeoModel/SCT_BarrelModuleParameters.h" + +#include "GeoModelKernel/GeoBox.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoMaterial.h" +#include "GeoModelKernel/Units.h" + +SCT_Pigtail::SCT_Pigtail(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials) + : SCT_SharedComponentFactory(name, detectorManager, geometryManager, materials) +{ + getParameters(); + m_physVolume = build(); +} + +void +SCT_Pigtail::getParameters() +{ + const SCT_BarrelModuleParameters * parameters = m_geometryManager->barrelModuleParameters(); + m_material = m_materials->getMaterial(parameters->pigtailMaterial()); + m_thickness = parameters->pigtailThickness(); + m_length = parameters->pigtailLength(); + m_width = parameters->pigtailWidth(); +} + +GeoVPhysVol * +SCT_Pigtail::build() +{ + + // Build the Pigtail. Just a simple box. + const GeoBox * pigtailShape = new GeoBox(0.5*m_thickness, + 0.5*m_width, + 0.5*m_length); + const GeoLogVol * pigtailLog = + new GeoLogVol(getName(), pigtailShape, m_material); + GeoPhysVol * pigtail = new GeoPhysVol(pigtailLog); + + return pigtail; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Sensor.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Sensor.cxx new file mode 100644 index 000000000..d8efd8f1e --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Sensor.cxx @@ -0,0 +1,166 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "FaserSCT_GeoModel/SCT_Sensor.h" + +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" + +#include "FaserSCT_GeoModel/SCT_BarrelModuleParameters.h" + +#include "GeoModelKernel/GeoBox.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoFullPhysVol.h" +#include "GeoModelKernel/GeoMaterial.h" + +#include "TrackerReadoutGeometry/SCT_DetectorManager.h" +#include "TrackerReadoutGeometry/SCT_BarrelModuleSideDesign.h" +#include "TrackerReadoutGeometry/SiDetectorElement.h" +#include "TrackerReadoutGeometry/TrackerDD_Defs.h" +#include "TrackerReadoutGeometry/SiCommonItems.h" + +#include "GaudiKernel/SystemOfUnits.h" + +using namespace TrackerDD; + +SCT_Sensor::SCT_Sensor(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials) + : SCT_UniqueComponentFactory(name, detectorManager, geometryManager, materials), + m_noElementWarning{true} +{ + getParameters(); + m_logVolume = preBuild(); +} + + +void +SCT_Sensor::getParameters() +{ + + const SCT_BarrelModuleParameters * parameters = m_geometryManager->barrelModuleParameters(); + m_material = m_materials->getMaterial(parameters->sensorMaterial()); + m_thickness = parameters->sensorThickness(); + m_length = 0; + if (parameters->sensorNumWafers() == 2) { + m_length = parameters->sensorLength() + parameters->sensorDistCenterToCenter(); + } else { + m_length = parameters->sensorLength(); + } + m_width = parameters->sensorWidth(); + +} + +const GeoLogVol * +SCT_Sensor::preBuild() +{ + + // Build the sensor. Just a simple box. + const GeoBox * sensorShape = new GeoBox(0.5*m_thickness, 0.5*m_width, 0.5*m_length); + GeoLogVol * sensorLog = new GeoLogVol(getName(), sensorShape, m_material); + + // Make the moduleside design for this sensor + makeDesign(); + + m_detectorManager->addDesign(m_design); + + return sensorLog; +} + + +void +SCT_Sensor::makeDesign() +{ + //SiDetectorDesign::Axis etaAxis = SiDetectorDesign::zAxis; + //SiDetectorDesign::Axis phiAxis = SiDetectorDesign::yAxis; + //SiDetectorDesign::Axis depthAxis = SiDetectorDesign::xAxis; + + const SCT_BarrelModuleParameters * parameters = m_geometryManager->barrelModuleParameters(); + + double stripPitch = parameters->sensorStripPitch(); + double stripLength = parameters->sensorStripLength(); + int crystals = parameters->sensorNumWafers(); + double distCenterToCenter = parameters->sensorDistCenterToCenter(); + + //int cells = parameters->sensorNumReadoutStrips(); + //int diodes = parameters->sensorNumStrips(); + //int shift = parameters->sensorStripShift(); + + // For consistency with older version we keep shift = 0. + int cells = parameters->sensorNumReadoutStrips(); + int diodes = cells; + int shift = 0; + + double totalDeadLength = distCenterToCenter - stripLength; + + double xEtaStripPatternCenter = 0; + double xPhiStripPatternCenter = 0; + + // Readout direction is in same direction as local phi direction + bool swapStripReadout = false; + + // The readout side is at the +ve depth direction + int readoutSide = +1; + + m_design = new SCT_BarrelModuleSideDesign(m_thickness, + crystals, + diodes, + cells, + shift, + swapStripReadout, + TrackerDD::holes, + stripPitch, + stripLength, + xEtaStripPatternCenter, + xPhiStripPatternCenter, + totalDeadLength, + readoutSide); + // + // Flags to signal if axis can be swapped. + // For rectangular detector these are all true. + // This is the default and no action is required. + // Can force axes not to be swapped by setting to false. + // + // bool phiSyGaudi::Units::mmetric = true; + // bool etaSyGaudi::Units::mmetric = true; + // bool depthSyGaudi::Units::mmetric = true; + // m_design->setSyGaudi::Units::mmetry(phiSyGaudi::Units::mmetric, etaSyGaudi::Units::mmetric, depthSyGaudi::Units::mmetric, + // +} + + + +GeoVPhysVol * +SCT_Sensor::build(SCT_Identifier id) +{ + GeoFullPhysVol * sensor = new GeoFullPhysVol(m_logVolume); + + // Make detector element and add to collection + // Only do so if we have a valid id helper. + + //id.print(); // for debugging only + + const SiCommonItems* commonItems = m_geometryManager->commonItems(); + + if (commonItems->getIdHelper()) { + + SiDetectorElement * detElement; + + detElement = new SiDetectorElement(id.getWaferId(), + m_design, + sensor, + commonItems); + + // Add the detector element. + m_detectorManager->addDetectorElement(detElement); + + } else { + if (m_noElementWarning) { + std::cout << "WARNING!!!!: No SCT id helper and so no elements being produced." << std::endl; + m_noElementWarning = false; + } + } + return sensor; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Ski.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Ski.cxx new file mode 100644 index 000000000..c01541f6d --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/SCT_Ski.cxx @@ -0,0 +1,143 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// +// CPW 17/8/06 +// Version using new model of services from A. Tricoli +// +#include "FaserSCT_GeoModel/SCT_Ski.h" +#include "FaserSCT_GeoModel/SCT_Identifier.h" +#include "FaserSCT_GeoModel/SCT_GeometryManager.h" +#include "FaserSCT_GeoModel/SCT_MaterialManager.h" +#include "FaserSCT_GeoModel/SCT_BarrelParameters.h" +#include "FaserSCT_GeoModel/SCT_GeneralParameters.h" +#include "FaserSCT_GeoModel/SCT_Module.h" + +#include "TrackerGeoModelUtils/ExtraMaterial.h" +#include "TrackerReadoutGeometry/SCT_DetectorManager.h" + +#include "GeoModelKernel/GeoBox.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoFullPhysVol.h" +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/GeoIdentifierTag.h" +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoAlignableTransform.h" +#include "GeoModelKernel/GeoMaterial.h" +#include "GeoModelKernel/GeoShapeSubtraction.h" +#include "GeoModelKernel/GeoDefinitions.h" +#include "GaudiKernel/SystemOfUnits.h" + +#include <sstream> +#include <cmath> + +inline double sqr(double x) {return x * x;} + +SCT_Ski::SCT_Ski(const std::string & name, + TrackerDD::SCT_DetectorManager* detectorManager, + const SCT_GeometryManager* geometryManager, + SCT_MaterialManager* materials) + : SCT_UniqueComponentFactory(name, detectorManager, geometryManager, materials) +{ + getParameters(); + m_logVolume = preBuild(); +} + +SCT_Ski::~SCT_Ski() +{ +} + +void +SCT_Ski::getParameters() +{ + const SCT_BarrelParameters * parameters = m_geometryManager->barrelParameters(); + const SCT_GeneralParameters * generalParameters = m_geometryManager->generalParameters(); + + m_safety = generalParameters->safety(); + m_modulesPerRow = parameters->modulesPerRow(); + +} + +const GeoLogVol * +SCT_Ski::preBuild() +{ + std::cout << "Instantiating Module" << std::endl; + m_module = new SCT_Module("Module", m_detectorManager, m_geometryManager, m_materials); + std::cout << "Module created" << std::endl; + // + // Active Layer Envelope extent + // Envelope for the active part (ie containing all the skis for the layer) + // + double activeWidth, activeThickness, activeLength; + + // Returns the outer dimensions of the active envelope + activeEnvelopeExtent(activeThickness, activeWidth, activeLength); + + // Add some safety + activeWidth += m_safety; + activeThickness += m_safety; + activeLength += m_safety; + + m_activeWidth = activeWidth; + m_activeThickness = activeThickness; + m_activeLength = activeLength; + // + // Overall Layer Envelope extent + // + // Same as active dimensions, since there is no support material yet + m_width = m_activeWidth; + m_thickness = m_activeThickness; + m_length = m_activeLength; + // + // Make envelope for layer + // + const GeoBox* skiEnvelopeBox = new GeoBox(0.5 * m_thickness, 0.5 * m_width, 0.5 * m_length); + GeoLogVol* logVolume = new GeoLogVol(getName(), skiEnvelopeBox, m_materials->gasMaterial()); + + // Check for overlap. + + return logVolume; +} + +GeoVPhysVol * +SCT_Ski::build(SCT_Identifier id) +{ + // We make this a fullPhysVol + GeoFullPhysVol * ski = new GeoFullPhysVol(m_logVolume); + + double activeLength = m_length - m_safety/2; + double moduleLength = m_module->length(); + for (int iEta = -m_modulesPerRow/2; iEta <= m_modulesPerRow/2; iEta++) + { + if (iEta == 0) continue; + ski->add(new GeoNameTag("Module#"+intToString(iEta))); + ski->add(new GeoIdentifierTag(iEta)); + id.setEtaModule(iEta); + double zEta = (iEta < 0 ? iEta + 0.5 : iEta - 0.5); + GeoAlignableTransform* transform = new GeoAlignableTransform(GeoTrf::Translate3D(0.0, + 0.0, + (moduleLength - activeLength)/2 + zEta * moduleLength)); + ski->add(transform); + GeoVPhysVol * modulePV = m_module->build(id); + ski->add(modulePV); + // Store alignable transform + m_detectorManager->addAlignableTransform(1, id.getWaferId(), transform, modulePV); + } + + return ski; +} + +void +SCT_Ski::activeEnvelopeExtent(double & dx, double & dy, double & dz) +{ + // Do this in a very simple-minded and unrealistic way to start + double layerThickness = m_module->thickness() + m_safety; // this is the x-coordinate of the module/ski + double layerWidth = m_module->width() + m_safety; // this is the y-coordinate (phi) of the module/ski + double layerLength = m_modulesPerRow * m_module->length() + m_safety; // this is the z-coordinate (eta) of the module/ski + + dx = layerThickness; + dy = layerWidth; + dz = layerLength; +} diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/components/SCT_GeoModel_entries.cxx b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/components/SCT_GeoModel_entries.cxx new file mode 100644 index 000000000..7b5af3938 --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/src/components/SCT_GeoModel_entries.cxx @@ -0,0 +1,4 @@ +#include "FaserSCT_GeoModel/FaserSCT_DetectorTool.h" + +DECLARE_COMPONENT( FaserSCT_DetectorTool ) + diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/test/FaserSCT_GMConfig_test.py b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/test/FaserSCT_GMConfig_test.py new file mode 100755 index 000000000..c72b8ad2e --- /dev/null +++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/test/FaserSCT_GMConfig_test.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python +"""Run tests on SCT_GeoModel configuration + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +if __name__ == "__main__": + from AthenaCommon.Configurable import Configurable + Configurable.configurableRun3Behavior=1 + from CalypsoConfiguration.AllConfigFlags import ConfigFlags + from AthenaConfiguration.TestDefaults import defaultTestFiles + + ConfigFlags.Input.Files = defaultTestFiles.HITS + ConfigFlags.IOVDb.GlobalTag = "OFLCOND-MC16-SDR-16" + ConfigFlags.Detector.SimulateSCT = False + ConfigFlags.GeoModel.Align.Dynamic = False + ConfigFlags.lock() + + from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator + from FaserSCT_GeoModel.FaserSCT_GeoModelConfig import FaserSCT_GeometryCfg + acc = FaserSCT_GeometryCfg(ConfigFlags) + f=open('FaserSCT_GeometryCfg.pkl','w') + acc.store(f) + f.close() diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/CMakeLists.txt b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/CMakeLists.txt new file mode 100644 index 000000000..ba356f000 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/CMakeLists.txt @@ -0,0 +1,34 @@ +################################################################################ +# Package: TrackerGeoModelUtils +################################################################################ + +# Declare the package name: +atlas_subdir( TrackerGeoModelUtils ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PUBLIC + Control/AthenaKernel + Database/RDBAccessSvc + GaudiKernel + PRIVATE + Control/StoreGate + DetectorDescription/GeoModel/GeoModelInterfaces + DetectorDescription/GeoModel/GeoModelUtilities + DetectorDescription/GeoPrimitives + DetectorDescription/GeometryDBSvc ) + +# External dependencies: +find_package( Boost COMPONENTS filesystem thread system ) +find_package( CLHEP ) +find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess ) +find_package( GeoModel ) + +# Component(s) in the package: +atlas_add_library( TrackerGeoModelUtils + src/*.cxx + PUBLIC_HEADERS TrackerGeoModelUtils + INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} + DEFINITIONS ${CLHEP_DEFINITIONS} + LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${CLHEP_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel GaudiKernel StoreGateLib SGtests + PRIVATE_LINK_LIBRARIES GeoModelUtilities ) + diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/README b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/README new file mode 100755 index 000000000..07f491588 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/README @@ -0,0 +1,9 @@ +This package held code common to PixelGeoModel, SCT_GeoModel, TRT_GeoModel +and InDetServMatGeoModel + +Package: offline/InnerDetector/InDetDetDescr/InDetGeoModelUtils + +Responsible: Grant Gorfine <Grant.Gorfine@cern.ch> + + + diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/DistortedMaterialManager.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/DistortedMaterialManager.h new file mode 100755 index 000000000..9eeed8f0a --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/DistortedMaterialManager.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TrackerGeoModelUtils_DistortedMaterialManager_h +#define TrackerGeoModelUtils_DistortedMaterialManager_h + +class AbsMaterialManager; +#include "RDBAccessSvc/IRDBAccessSvc.h" + +namespace TrackerDD { + +class DistortedMaterialManager +{ +public: + DistortedMaterialManager(); + IRDBRecordset_ptr extraMaterialTable() const {return m_xMatTable;} + const AbsMaterialManager * materialManager() const {return m_materialManager;} + +private: + const AbsMaterialManager * m_materialManager; + IRDBRecordset_ptr m_xMatTable; +}; + + +} // endnamespace + +#endif // TrackerGeoModelUtils_DistortedMaterialManager_h diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ExtraMaterial.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ExtraMaterial.h new file mode 100755 index 000000000..60238055f --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ExtraMaterial.h @@ -0,0 +1,37 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TrackerGeoModelUtils_ExtraMaterial +#define TrackerGeoModelUtils_ExtraMaterial + +#include <cmath> +#include <string> +#include <sstream> +#include "RDBAccessSvc/IRDBAccessSvc.h" + +class GeoPhysVol; +class GeoFullPhysVol; +class AbsMaterialManager; + +namespace TrackerDD { + +class DistortedMaterialManager; + +class ExtraMaterial +{ +public: + ExtraMaterial(IRDBRecordset_ptr xMatTable, const AbsMaterialManager * matManager); + ExtraMaterial(const TrackerDD::DistortedMaterialManager * manager); + void add(GeoPhysVol * parent, const std::string & parentName, double zPos = 0); + void add(GeoFullPhysVol * parent, const std::string & parentName, double zPos = 0); + +private: + void add(GeoPhysVol * parent, GeoFullPhysVol * fullparent, const std::string & parentName, double zPos); + IRDBRecordset_ptr m_xMatTable; + const AbsMaterialManager * m_matManager; +}; + +} // end namespace + +#endif // TrackerGeoModelUtils_ExtraMaterial diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/GenericTubeMaker.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/GenericTubeMaker.h new file mode 100755 index 000000000..d7a7ddb21 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/GenericTubeMaker.h @@ -0,0 +1,55 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TrackerGeoModelUtils_GenericTubeMaker_h +#define TrackerGeoModelUtils_GenericTubeMaker_h + +#include "TrackerGeoModelUtils/TubeVolData.h" +#include <string> + +class GeoVPhysVol; +class GeoPhysVol; +class GeoFullPhysVol; +class GeoShape; +class IRDBRecord; + +/// Helper class to make general tubes used mainly for services. +/// Takes as input a DB table which has the following columns +/// Handles numberouse cases +/// Simple tubes: Rmin2, Rmax2 <=0. +/// Cones: Uses Rmin2 and Rmax2. +/// Tube and cone sectors: Uses phi start and phi delta. +/// If RadialDiv > 0 then simulates the CLHEP::radial dependence of tubes/cables going outward CLHEP::radially. +/// + +namespace TrackerDD { + +class GenericTubeMaker +{ +public: + GenericTubeMaker(const IRDBRecord *); + const TubeVolData & volData() const {return m_volData;} + std::string name() const; + std::string materialName() const; + const GeoShape * buildShape(); + void placeVolume(GeoPhysVol * parent, GeoVPhysVol * child, double zParent = 0); + void placeVolume(GeoFullPhysVol * fullparent, GeoVPhysVol * child, double zParent = 0); + void placeVolTwoSide(GeoPhysVol * parentPos, GeoPhysVol * parentNeg, GeoVPhysVol * child, double zParent = 0); + void placeVolTwoSide(GeoFullPhysVol * fullparentPos, GeoFullPhysVol * fullparentNeg, GeoVPhysVol * child, double zParent = 0); + + +private: + + void placeVolume(GeoPhysVol * parent, GeoFullPhysVol * fullparent, GeoVPhysVol * child, double zParent); + void placeVolTwoSide(GeoPhysVol * parentPos, GeoPhysVol * parentNeg, + GeoFullPhysVol * fullparentPos, GeoFullPhysVol * fullparentNeg, + GeoVPhysVol * child, double zParent); + + const IRDBRecord * m_record; + TubeVolData m_volData; +}; + +} // end namespace + +#endif // TrackerGeoModelUtils_GenericTubeMaker_h diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ITrackerServMatBuilderTool.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ITrackerServMatBuilderTool.h new file mode 100644 index 000000000..8d3e0c16f --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ITrackerServMatBuilderTool.h @@ -0,0 +1,35 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// ITrackerServMatBuilderTool.h, (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// +#ifndef ITrackerServMatBuilderTool_H +#define ITrackerServMatBuilderTool_H + +#include "GaudiKernel/IAlgTool.h" + +#include <list> + +namespace TrackerDD { + class ServiceVolume; +} + +static const InterfaceID IID_ITrackerServMatBuilderTool("ITrackerServMatBuilderTool", 1, 0); + + +/// Tool for building services in SLHC geometry +class ITrackerServMatBuilderTool : virtual public IAlgTool { +public: + static const InterfaceID& interfaceID( ) ; + + virtual const std::vector<const TrackerDD::ServiceVolume *> & getServices() = 0; +}; + +inline const InterfaceID& ITrackerServMatBuilderTool::interfaceID() +{ + return IID_ITrackerServMatBuilderTool; +} + +#endif //ITrackerServMatBuilderTool_H diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/PairIndexMap.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/PairIndexMap.h new file mode 100644 index 000000000..022ed04b2 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/PairIndexMap.h @@ -0,0 +1,29 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TrackerGeoModelUtils_PairIndexMap_H +#define TrackerGeoModelUtils_PairIndexMap_H + + +#include <map> +#include <utility> + +namespace TrackerDD { + + /// Class to store map between pair of two ints and an int. + /// Used to help read in database tables which are a lookup via two ints. + class PairIndexMap { + + public : + void add(int first, int second, int value); + int find(int first, int second) const; + + private: + typedef std::map<std::pair<int,int>, int> MapType; + MapType m_map; + + }; +} + +#endif // TrackerGeoModelUtils_PairIndexMap_H diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ServiceVolume.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ServiceVolume.h new file mode 100755 index 000000000..68a6c2196 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ServiceVolume.h @@ -0,0 +1,145 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TrackerDD_ServiceVolume_H +#define TrackerDD_ServiceVolume_H + +#include <string> +#include <cmath> + +class GeoMaterial; +class GeoShape; + +namespace TrackerDD { + + // class to hold GeoShape pointer. This takes care of the GeoShape ref counting and + // avoids needing to write a copy constructor for ServiceVolume + class GeoShapeHolder { + public: + GeoShapeHolder(); + GeoShapeHolder(const GeoShape *); + GeoShapeHolder(const GeoShapeHolder &); + GeoShapeHolder & operator=(const GeoShapeHolder &); + GeoShapeHolder & operator=(GeoShapeHolder &&); + ~GeoShapeHolder(); + const GeoShape * get() const {return m_geoShape;} + void set(const GeoShape *); + void reset(); + private: + const GeoShape * m_geoShape; + }; + + class ServiceVolume { + + public: + ServiceVolume(); + void setRmin(double rmin) {m_rmin = rmin; resetGeoShape();} + void setRmax(double rmax) {m_rmax = rmax; resetGeoShape();} + void setRmin2(double rmin2) {m_rmin2 = rmin2; resetGeoShape();} + void setRmax2(double rmax2) {m_rmax2 = rmax2; resetGeoShape();} + void setZmin(double zmin) {m_zmin = zmin; resetGeoShape();} + void setZmax(double zmax) {m_zmax = zmax; resetGeoShape();} + //void setVolId(int num) {m_volId = num;} + void setZsymm(bool zsymm) {m_zsymm = zsymm;} + void setMaterial(const std::string & mat) {m_materialName = mat;} + void setMaterial(const GeoMaterial * mat) {m_material = mat;} + void setVolName(const std::string & name) {m_volName = name;} + void setShapeType(const std::string & shapeType) {m_shapeType = shapeType; setSplittable();} + void setPhiLoc(double phiLoc) {m_phiLoc = phiLoc; resetGeoShape();} + void setPhiWidth(double phiWidth) {m_phiWidth = phiWidth; resetGeoShape();} + void setNeedsRotation(bool flag) {m_needsRotation = flag;} + void setSides(int sides) {m_sides = sides; resetGeoShape();} + void setNCopies(int num) {m_nCopies = num;} + void setRegion(const std::string & region) {m_region = region;} + void setLabel(const std::string & name, int volId); + void setLabel(const std::string & name) {m_label = name;} + void addLabel(const std::string & name) {m_label += name;} + //void setLength() {m_origLength = std::abs(m_zmax - m_zmin);} + void setOrigVolume(double volume) {m_origVolume = volume;} + void resetGeoShape() {if (!m_lockGeoShape) m_geoShape.reset();} + void reduceSize(double safety); + // Set a custom shape. A volume can be specified. + // This should be used when the shapes volume calculation is unreliable (eg boolean volumes) + // NB. rmin,rmax,zmin,zmax should still be set to determine z position and to determine which zone it belongs. + void setGeoShape(const GeoShape * geoShape, double volume=0); + void setEnvelopeNum(int num) { m_envNum=num; } + void setParentEnvelope(int num) { m_envParentNum=num; } + void setZShift(double shift) { m_zShift=shift; } + + double rmin() const {return m_rmin;} + double rmax() const {return m_rmax;} + double rmin2() const {return m_rmin2;} + double rmax2() const {return m_rmax2;} + double zmin() const {return m_zmin+m_safety;} + double zmax() const {return m_zmax-m_safety;} + //int volId() const {return m_volId;} + bool zsymm() const {return m_zsymm;} + const std::string & materialName() const {return m_materialName;} + const GeoMaterial * material() const {return m_material;} + const std::string & volName() const {return m_volName;} + const std::string & shapeType() const {return m_shapeType;} + double phiLoc() const {return m_phiLoc;} + double phiWidth() const {return m_phiWidth;} + bool needsRotation() const {return m_needsRotation;} + int sides() const {return m_sides;} + int nCopies() const {return m_nCopies;} + //double origLength() const {return m_origLength;} + const std::string & region() const {return m_region;} + std::string fullLabel() const; + double length() const {return std::abs(m_zmax - m_zmin) - 2*m_safety;} + double zposition() const {return 0.5 * (m_zmin + m_zmax);} + double rposition() const {return 0.5 * (m_rmin + m_rmax);} + //double fractionInRegion() const {return std::abs(m_zmax - m_zmin)/m_origLength;} + double volume() const; + double origVolume() const; + const GeoShape * getShape() const; + bool splittableInR() const {return m_splittableR;} + bool splittableInZ() const {return m_splittableZ;} + int envelopeNum() const {return m_envNum; } + int envelopeParent() const {return m_envParentNum; } + double zShift() const {return m_zShift; } + + // For debugging + void print() const; + + private: + void setSplittable(); + + double m_rmin; + double m_rmax; + double m_rmin2; + double m_rmax2; + double m_zmin; + double m_zmax; + //int m_volId; + bool m_zsymm; + mutable GeoShapeHolder m_geoShape; + const GeoMaterial * m_material; + std::string m_materialName; + std::string m_volName; + std::string m_shapeType; + double m_phiLoc; + double m_phiWidth; + bool m_needsRotation; + int m_sides; + int m_nCopies; + //double m_origLength; + double m_origVolume; + mutable double m_volume; + double m_safety; + std::string m_region; + std::string m_label; + bool m_lockGeoShape; + bool m_splittableR; + bool m_splittableZ; + + int m_envNum; + int m_envParentNum; + double m_zShift; + }; + +} // End namespace + + +#endif diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ServiceVolumeMaker.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ServiceVolumeMaker.h new file mode 100644 index 000000000..78f1abb68 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/ServiceVolumeMaker.h @@ -0,0 +1,154 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef ServiceVolumeMaker_H +#define ServiceVolumeMaker_H + +#include <string> +#include <vector> +#include "RDBAccessSvc/IRDBAccessSvc.h" + +class IGeometryDBSvc; + +namespace TrackerDD { + + class ServiceVolume; + class AthenaComps; + + class ServiceVolumeSchema { + public: + ServiceVolumeSchema(); + + void setPixelSchema(); + void setDefaultSchema(); + void setSimpleSchema(); + + std::string rmin() const {return m_rmin;} + std::string rmax() const {return m_rmax;} + std::string rmin2() const {return m_rmin2;} + std::string rmax2() const {return m_rmax2;} + std::string zmin() const {return m_zmin;} + std::string zmax() const {return m_zmax;} + std::string zsymm() const {return m_zsymm;} + std::string shapeType() const {return m_shapeType;} + std::string materialName() const {return m_materialName;} + std::string volName() const {return m_volName;} + std::string phiWidth() const {return m_phiWidth;} + std::string width() const {return m_width;} + std::string repeat() const {return m_repeat;} + std::string phiStart() const {return m_phiStart;} + std::string phiDelta() const {return m_phiDelta;} + std::string phiStep() const {return m_phiStep;} + std::string radialDiv() const {return m_radialDiv;} + std::string volId() const {return m_volId;} + std::string shiftFlag() const {return m_shiftFlag;} + + void set_rmin (const std::string & s) {m_rmin = s;} + void set_rmax (const std::string & s) {m_rmax = s;} + void set_rmin2 (const std::string & s) {m_rmin2 = s;} + void set_rmax2 (const std::string & s) {m_rmax2 = s;} + void set_zmin (const std::string & s) {m_zmin = s;} + void set_zmax (const std::string & s) {m_zmax = s;} + void set_zsymm (const std::string & s) {m_zsymm = s;} + void set_shapeType (const std::string & s) {m_shapeType = s;} + void set_materialName(const std::string & s) {m_materialName = s;} + void set_volName (const std::string & s) {m_volName = s;} + void set_phiWidth (const std::string & s) {m_phiWidth = s;} + void set_width (const std::string & s) {m_width = s;} + void set_repeat (const std::string & s) {m_repeat = s;} + void set_phiStart (const std::string & s) {m_phiStart = s;} + void set_phiDelta (const std::string & s) {m_phiDelta = s;} + void set_phiStep (const std::string & s) {m_phiStep = s;} + void set_radialDiv (const std::string & s) {m_radialDiv = s;} + void set_volId (const std::string & s) {m_volId = s;} + void set_shiftFlag (const std::string & s) {m_shiftFlag = s;} + + bool simple() const {return m_rmin2.empty();} + bool has_volId() const {return !m_volId.empty();} + bool has_shiftFlag() const {return !m_shiftFlag.empty();} + bool has_shapeType() const {return !m_shapeType.empty();} + bool has_width() const {return !m_width.empty();} + bool has_radial() const {return !m_radialDiv.empty();} + bool has_phiStep() const {return !m_phiStep.empty();} + + private: + std::string m_rmin; + std::string m_rmax; + std::string m_rmin2; + std::string m_rmax2; + std::string m_zmin; + std::string m_zmax; + std::string m_zsymm; + std::string m_shapeType; + std::string m_materialName; + std::string m_volName; + std::string m_phiWidth; + std::string m_width; + std::string m_repeat; + std::string m_phiStart; + std::string m_phiDelta; + std::string m_phiStep; + std::string m_radialDiv; + std::string m_volId; + std::string m_shiftFlag; + + }; + + class ServiceVolumeMakerMgr { + public: + ServiceVolumeMakerMgr(IRDBRecordset_ptr table, const ServiceVolumeSchema & schema, + const TrackerDD::AthenaComps * athenaComps); + + double rmin(int index) const; + double rmax(int index) const; + double rmin2(int index) const; + double rmax2(int index) const; + double zmin(int index) const; + double zmax(int index) const; + double width(int index) const; + double phiStart(int index) const; + double phiDelta(int index) const; + double phiStep(int index) const; + bool zsymm(int index) const; + int repeat(int index) const; + int radialDiv(int index) const; + int volId(int index) const; + int shiftFlag(int index) const; + std::string shapeType(int index) const; + std::string volName(int index) const; + std::string materialName(int index) const; + + unsigned int numElements() const; + + const IGeometryDBSvc *db() const; + const ServiceVolumeSchema & schema() const {return m_schema;} + + private: + IRDBRecordset_ptr m_table; + IRDBRecordset_ptr m_layer; + ServiceVolumeSchema m_schema; + const TrackerDD::AthenaComps * m_athenaComps; + }; + + class ServiceVolumeMaker { + public: + ServiceVolumeMaker(const std::string & label, + IRDBRecordset_ptr table, + const ServiceVolumeSchema & schema, + const TrackerDD::AthenaComps *); + ServiceVolumeMaker(const ServiceVolumeMaker &) = delete; + ServiceVolumeMaker & operator =(const ServiceVolumeMaker &) = delete; + ~ServiceVolumeMaker(); + const std::vector<const ServiceVolume *> & makeAll(); + ServiceVolume * make(int index); + unsigned int numElements() const; + + private: + std::string m_label; + ServiceVolumeMakerMgr * m_mgr; + std::vector<const ServiceVolume *> m_services; + }; +} // end namespace + +#endif diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TopLevelPlacements.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TopLevelPlacements.h new file mode 100755 index 000000000..ab191e1d2 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TopLevelPlacements.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRACKERGEOMODELUTILS_TOPLEVELPLACEMENTS_H +#define TRACKERGEOMODELUTILS_TOPLEVELPLACEMENTS_H + +#include "RDBAccessSvc/IRDBAccessSvc.h" +#include "GeoPrimitives/GeoPrimitives.h" +#include "GeoModelKernel/GeoDefinitions.h" + +#include <map> +#include <string> + +class IRDBRecord; + +class TopLevelPlacements +{ + +public: + + TopLevelPlacements(IRDBRecordset_ptr topLevelTable); + ~TopLevelPlacements(); + + bool present(const std::string & partName) const; + const GeoTrf::Transform3D & transform(const std::string & partName) const; + + +private: + + class Part { + public: + std::string label; + GeoTrf::Transform3D transform; + }; + + void fillPlacements(IRDBRecordset_ptr topLevelTable); + GeoTrf::Transform3D partTransform(const IRDBRecord* record) const; + Part * getPart(const std::string & partName) const; + + std::map<std::string, Part *> m_parts; + bool m_noTopLevelTable; + + static GeoTrf::Transform3D s_identityTransform; +}; + +#endif // TRACKERGEOMODELUTILS_TOPLEVELPLACEMENTS_H diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerDDAthenaComps.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerDDAthenaComps.h new file mode 100644 index 000000000..851944d44 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerDDAthenaComps.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TrackerGeoModelUtils_TrackerDDAthenaComps_H +#define TrackerGeoModelUtils_TrackerDDAthenaComps_H + +// Message Stream Member +#include "AthenaKernel/MsgStreamMember.h" +class StoreGateSvc; +class IGeoDbTagSvc; +class IRDBAccessSvc; +class IGeometryDBSvc; + +#include <string> +namespace TrackerDD { + +/// Class to hold various Athena components. +class AthenaComps { + +public: + + AthenaComps(const std::string & msgStreamName); + + //Declaring the Message method for further use + MsgStream& msg (MSG::Level lvl) const { return m_msg << lvl; } + + //Declaring the Method providing Verbosity Level + bool msgLvl (MSG::Level lvl) const { return m_msg.get().level() <= lvl; } + + void setDetStore(StoreGateSvc *); + void setGeoDbTagSvc(IGeoDbTagSvc *); + void setRDBAccessSvc(IRDBAccessSvc *); + void setGeometryDBSvc(IGeometryDBSvc *); + + StoreGateSvc * detStore() const; + IGeoDbTagSvc * geoDbTagSvc() const; + IRDBAccessSvc * rdbAccessSvc() const; + IGeometryDBSvc * geomDB() const; + +private: + //Declaring private message stream member. + mutable Athena::MsgStreamMember m_msg; + + StoreGateSvc * m_detStore; + IGeoDbTagSvc * m_geoDbTagSvc; + IRDBAccessSvc * m_rdbAccessSvc; + IGeometryDBSvc * m_geometryDBSvc; + +}; + +inline StoreGateSvc * AthenaComps::detStore() const +{ + return m_detStore; +} + +inline IGeoDbTagSvc * AthenaComps::geoDbTagSvc() const +{ + return m_geoDbTagSvc; +} + +inline IRDBAccessSvc * AthenaComps::rdbAccessSvc() const +{ + return m_rdbAccessSvc; +} + +inline IGeometryDBSvc * AthenaComps::geomDB() const +{ + return m_geometryDBSvc; +} + +} // endnamespace + +#endif // TrackerGeoModelUtils_TrackerDDAthenaComps_H + diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerDetectorFactoryBase.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerDetectorFactoryBase.h new file mode 100644 index 000000000..8b23bb0dc --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerDetectorFactoryBase.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TrackerGeoModelUtils_DetectorFactoryBase_H +#define TrackerGeoModelUtils_DetectorFactoryBase_H + +#include "AthenaKernel/MsgStreamMember.h" +#include "GeoModelKernel/GeoVDetectorFactory.h" +#include "TrackerGeoModelUtils/TrackerDDAthenaComps.h" + +class StoreGateSvc; +class IGeoDbTagSvc; +class IRDBAccessSvc; + +namespace TrackerDD { + +class DetectorFactoryBase : public GeoVDetectorFactory +{ + +public: + DetectorFactoryBase(const TrackerDD::AthenaComps * athenaComps) + : m_athenaComps(athenaComps) + {} + + StoreGateSvc * detStore() const {return m_athenaComps->detStore();} + + IGeoDbTagSvc * geoDbTagSvc() const {return m_athenaComps->geoDbTagSvc();} + + IRDBAccessSvc * rdbAccessSvc() const {return m_athenaComps->rdbAccessSvc();} + + IGeometryDBSvc * geomDB() const {return m_athenaComps->geomDB();} + + //Declaring the Message method for further use + MsgStream& msg (MSG::Level lvl) const { return m_athenaComps->msg(lvl); } + + //Declaring the Method providing Verbosity Level + bool msgLvl (MSG::Level lvl) const { return m_athenaComps->msgLvl(lvl); } + + const TrackerDD::AthenaComps * getAthenaComps() {return m_athenaComps;} + +private: + + const TrackerDD::AthenaComps * m_athenaComps; + +}; + +} // end namespace + +#endif // TrackerGeoModelUtils_DetectorFactoryBase_H + diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerMaterialManager.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerMaterialManager.h new file mode 100755 index 000000000..d88768c12 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerMaterialManager.h @@ -0,0 +1,244 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRACKERMATERIALMANAGER_H +#define TRACKERMATERIALMANAGER_H + +// Message Stream Member +#include "AthenaKernel/MsgStreamMember.h" +#include "RDBAccessSvc/IRDBAccessSvc.h" + +class GeoMaterial; +class GeoElement; +class AbsMaterialManager; +class StoreGateSvc; +class IGeometryDBSvc; + +namespace TrackerDD +{ + class AthenaComps; +} + +#include <string> +#include <map> + +/// TrackerMaterialManager. This provides an interface to the GeoModel Material Manager +/// as well as allowing additional materials to be defined or standard ones redefined. +/// It also allows creating new materials based on existing ones but with a different +/// density. It is also possible to specify a weight table and this is used to create +/// materials with a density such that the the total weight is correct. + + +class TrackerMaterialManager +{ + +public: + + TrackerMaterialManager(const std::string & managerName, StoreGateSvc* detStore); + TrackerMaterialManager(const std::string & managerName, StoreGateSvc* detStore, + IRDBRecordset_ptr weightTable, + const std::string & space = "", + bool extraFunctionality = false); + TrackerMaterialManager(const std::string & managerName, StoreGateSvc* detStore, + IRDBRecordset_ptr weightTable, + IRDBRecordset_ptr compositionTable, + const std::string & space = ""); + TrackerMaterialManager(const std::string & managerName, + const TrackerDD::AthenaComps *); + ~TrackerMaterialManager(); + + void addWeightTable(IRDBRecordset_ptr weightTable, const std::string & space = ""); + void addWeightMaterial(std::string materialName, std::string materialBase, double weight, int linearWeightFlag); + void addCompositionTable(IRDBRecordset_ptr compositionTable, const std::string & space = ""); + void addScalingTable(IRDBRecordset_ptr scalingTable); + + + bool hasMaterial(const std::string &materialName) const; + + /// Get material. First looks for locally defined material and if not found looks in GeoModel material manager. + const GeoMaterial* getMaterial(const std::string & materialName); + + /// Get element from GeoModel material manager + const GeoElement* getElement(const std::string & elementName) const; + + /// Create and get material with a specified density based on an existing material. + /// If a newName is supplied it creates the new material even if the orginal material + /// has the same density. It however first checks if the material with NewName exists. + /// If no newName is supplied then it checks the density of + /// the existing material. If it is consistent it returns the material. + /// If it is different it creates a material with the string "Modified" added to the + /// name. + const GeoMaterial* getMaterial(const std::string & origMaterialName, + double density, + const std::string & newName = ""); + + // Creates a new material based on origMaterialName but with denisty scaled + // by scaleFactor. If no newName then will add the string containing the scale + // factor. Eg if scale 12.345678 "Silicon" -> "Silicon12_3456" + // If the scale factor is 1 and there is no newName then it just returns the + // original material. + // scaleFactor must be between 0.001 and 1000. + const GeoMaterial* getMaterialScaled(const std::string & origMaterialName, + double scaleFactor, + const std::string & newName = ""); + + /// Create and get material with a density calculated to give weight in predefined weight table. + const GeoMaterial * getMaterialForVolume(const std::string & materialName, + double volume, + const std::string & newName = ""); + + // Similar to getMaterialForVolume but if weight table uses linear weight, then determine weight + // using length. First looks in special table of material compositions which can specify several + // components and their count. + const GeoMaterial * getMaterialForVolumeLength(const std::string & materialName, + double volume, + double length, + const std::string & newName = ""); + + // As above but rather than using the special table of material compositions, the compositions is specified + // in the arguments as a vector of materials and multiplictive factors. + const GeoMaterial * getMaterialForVolumeLength(const std::string & name, + const std::vector<std::string> & materialComponents, + const std::vector<double> factors, + double volume, + double length); + + // As above but only one material making up the composition. + const GeoMaterial * getMaterialForVolumeLength(const std::string & name, + const std::string & materialComponent, + double factor, + double volume, + double length); + + // Define composite material : function used to create dynamically a new composite material by adding + // a defined volume of glue/grease to an already existing material (IBL stave) + const GeoMaterial * getCompositeMaterialForVolume(const std::string & newMatName, + const double volumeTot, + const double volume1, const std::string & matName1, + const double volume2, const std::string & matName2 + ); + + // Define a new material composition. + const GeoMaterial * getMaterial(const std::string & name, + const std::vector<std::string> & materialComponents, + const std::vector<double> & fractWeights, + double density); + + + /// Add material + void addMaterial(GeoMaterial *material); + + //Declaring the Message method for further use + MsgStream& msg (MSG::Level lvl) const { return m_msg << lvl; } + + //Declaring the Method providing Verbosity Level + bool msgLvl (MSG::Level lvl){ return m_msg.get().level() <= lvl; } + + +private: + + class MaterialByWeight { + public: + MaterialByWeight() : weight(0), linearWeightFlag(false) {} + MaterialByWeight(const std::string & name_in, double weight_in, bool linearWeightFlag_in) + : name(name_in), weight(weight_in), linearWeightFlag(linearWeightFlag_in) {} + MaterialByWeight(double weight_in) + : weight(weight_in), linearWeightFlag(false) {} + std::string name; + double weight; + bool linearWeightFlag; + }; + + class MaterialComponent { + public: + MaterialComponent() : factor(1), actualLength(-1) {} + MaterialComponent(const std::string & name_in, double factor_in = 1, bool actualLength_in = -1) + : name(name_in), factor(factor_in), actualLength(actualLength_in) {} + std::string name; + double factor; + double actualLength; + }; + + /// Class to hold information need to create a material + class MaterialDef { + public: + MaterialDef(); + MaterialDef(const std::string & name, double density); + void addComponent(const std::string & compName, double fraction); + void setCreated() {m_created = true;} + unsigned int numComponents() const {return m_components.size();} + bool isCreated() const {return m_created;} + const std::string & name() const {return m_name;} + double density() const {return m_density;} + const std::string & compName(unsigned int i) const {return m_components[i];} + double fraction(unsigned int i) const {return m_fractions[i];} + double totalFraction() const; + + private: + std::string m_name; + double m_density; + std::vector<std::string> m_components; + std::vector<double> m_fractions; + bool m_created; + }; + + + const AbsMaterialManager * retrieveManager(StoreGateSvc* detStore); + const GeoMaterial* getAdditionalMaterial(const std::string & materialName) const; + bool compareDensity(double d1, double d2) const; + void addWeightTableOld(IRDBRecordset_ptr weightTable, const std::string & space); + + // Internal versions. The public versions allow materials to be have extra scaling. + const GeoMaterial* getMaterialInternal(const std::string & materialName) const; + const GeoMaterial* getMaterialInternal(const std::string & origMaterialName, + double density, + const std::string & newName = ""); + const GeoMaterial* getMaterialScaledInternal(const std::string & origMaterialName, + double scaleFactor, + const std::string & newName = ""); + const GeoMaterial * getMaterialInternal(const std::string & name, + const std::vector<std::string> & materialComponents, + const std::vector<double> & fractWeights, + double density); + + // Methods to return material with extra scaling. + const GeoMaterial * extraScaledMaterial(const std::string & materialName, + const std::string & newName, + const GeoMaterial * origMaterial); + + const GeoMaterial * extraScaledMaterial(const std::string & materialName, + const GeoMaterial * origMaterial); + + const IGeometryDBSvc * db(); + void addTextFileMaterials(); + void createMaterial(const MaterialDef & material); + double getExtraScaleFactor(const std::string & materialName); + + const AbsMaterialManager *m_materialManager; + std::string m_managerName; + + typedef std::map<std::string, const GeoMaterial *> MaterialStore; + MaterialStore m_store; + + typedef std::map<std::string, MaterialByWeight > MaterialWeightMap; + MaterialWeightMap m_weightMap; + + typedef std::map<std::string, MaterialComponent > MaterialCompositionMap; + MaterialCompositionMap m_matCompositionMap; + + typedef std::map<std::string, double > ExtraScaleFactorMap; + ExtraScaleFactorMap m_scalingMap; + + //Declaring private message stream member. + mutable Athena::MsgStreamMember m_msg; + + // Has linear weight flag. + bool m_extraFunctionality; + + const TrackerDD::AthenaComps * m_athenaComps; + +}; + + +#endif // TRACKERMATERIALMANAGER_H diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerSubDetectorFactoryBase.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerSubDetectorFactoryBase.h new file mode 100644 index 000000000..38814f360 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TrackerSubDetectorFactoryBase.h @@ -0,0 +1,65 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TrackerGeoModelUtils_SubDetectorFactoryBase_H +#define TrackerGeoModelUtils_SubDetectorFactoryBase_H + +#include "AthenaKernel/MsgStreamMember.h" +#include "TrackerGeoModelUtils/TrackerDDAthenaComps.h" + +class StoreGateSvc; +class IGeoDbTagSvc; +class IRDBAccessSvc; +class TrackerMaterialManager; + +namespace TrackerDD { + +// This is the same as Tracker::DetectorFactoryBase but without the +// inheretance of GeoVDetectorFactory and with the addition of +// access to the material manager. + +class SubDetectorFactoryBase +{ + +public: + SubDetectorFactoryBase(const TrackerDD::AthenaComps * athenaComps) + : m_athenaComps(athenaComps), + m_materialManager(0) + {} + + SubDetectorFactoryBase(const TrackerDD::AthenaComps * athenaComps, + TrackerMaterialManager * matManager) + : m_athenaComps(athenaComps), + m_materialManager(matManager) + {} + + StoreGateSvc * detStore() const {return m_athenaComps->detStore();} + + IGeoDbTagSvc * geoDbTagSvc() const {return m_athenaComps->geoDbTagSvc();} + + IRDBAccessSvc * rdbAccessSvc() const {return m_athenaComps->rdbAccessSvc();} + + IGeometryDBSvc * geomDB() const {return m_athenaComps->geomDB();} + + TrackerMaterialManager * materialManager() const {return m_materialManager;} + + //Declaring the Message method for further use + MsgStream& msg (MSG::Level lvl) const { return m_athenaComps->msg(lvl); } + + //Declaring the Method providing Verbosity Level + bool msgLvl (MSG::Level lvl) const { return m_athenaComps->msgLvl(lvl); } + + const TrackerDD::AthenaComps * getAthenaComps() {return m_athenaComps;} + +private: + const TrackerDD::AthenaComps * m_athenaComps; + +protected: + TrackerMaterialManager * m_materialManager; +}; + +} // end namespace + +#endif // TrackerGeoModelUtils_SubDetectorFactoryBase_H + diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TubeVolData.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TubeVolData.h new file mode 100755 index 000000000..fd282d0ec --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/TubeVolData.h @@ -0,0 +1,59 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TrackerGeoModelUtils_TubeVolData_h +#define TrackerGeoModelUtils_TubeVolData_h + +class IRDBRecord; +#include <string> + +namespace TrackerDD { + + +/// Helper class to read in generic TUBE, TUBS, CONS or PCON type volumes. + +class TubeVolData +{ + public: + enum VolShape {TUBE, TUBS, CONS, RADIAL}; + + TubeVolData(const IRDBRecord *); + double rmin() const {return m_rmin1;} + double rmax() const {return m_rmax1;} + double rmin2() const {return m_rmin2;} + double rmax2() const {return m_rmax2;} + double length() const {return m_length;} + double zMid() const {return m_zMid;} + double phiStart() const {return m_phiStart;} + double phiDelta() const {return m_phiDelta;} + double phiStep() const {return m_phiStep;} + int nRepeat() const {return m_nRepeat;} + int radialDivisions() const {return m_radialDiv;} + bool bothZ() const {return m_bothZ;} + + VolShape shape() const {return m_shape;} + std::string material() const; + + double maxRadius() const; + + private: + const IRDBRecord * m_record; + bool m_bothZ; + int m_nRepeat; + int m_radialDiv; + double m_phiStart; + double m_phiDelta; + double m_phiStep; + double m_rmin1; + double m_rmin2; + double m_rmax1; + double m_rmax2; + double m_length; + double m_zMid; + VolShape m_shape{CONS}; +}; + +} // end namespace + +#endif // TrackerGeoModelUtils_TubeVolData diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/VolumeBuilder.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/VolumeBuilder.h new file mode 100644 index 000000000..fa28ce3b6 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/VolumeBuilder.h @@ -0,0 +1,73 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TrackerGeoModelUtils_VolumeBuilder_H +#define TrackerGeoModelUtils_VolumeBuilder_H + +#include "TrackerGeoModelUtils/VolumeSplitterUtils.h" +#include "TrackerGeoModelUtils/VolumeSplitter.h" +#include "AthenaKernel/MsgStreamMember.h" + +#include <string> +#include <vector> + +class TrackerMaterialManager; +class GeoPhysVol; +class GeoFullPhysVol; +class GeoVPhysVol; +class GeoTransform; +class GeoShape; + +namespace TrackerDD { + class ServiceVolume; + + class VolumeBuilder + { + public: + VolumeBuilder( const Zone & zone, const std::vector<const ServiceVolume * > & services); + VolumeBuilder(const std::vector<const ServiceVolume * > & services); + VolumeBuilder( const Zone & zone, const std::vector<const ServiceVolume * > & services, + const std::vector<const ServiceVolume * > & servEnv, const std::vector<const ServiceVolume * > & servChild ); + + void setRegion(const std::string & region, double zcenter); + void setMaterialManager(TrackerMaterialManager * matManager) {m_matManager = matManager; } + const std::vector<const ServiceVolume *> & services(); + const std::vector<const ServiceVolume * > & servicesEnv() ; + const std::vector<const ServiceVolume * > & servicesChild() ; + + void buildAndPlace(const std::string & region, GeoPhysVol * parent, double zcenter = 0); + void buildAndPlace(const std::string & region, GeoFullPhysVol * parent, double zcenter = 0); + void buildAndPlaceEnvelope(const std::string & region, GeoFullPhysVol * parent, int iParent, int iElement, double zcenter = 0); + void buildAndPlaceEnvelope(const std::string & region, GeoPhysVol * parent, int iParent, int iElement, double zcenter = 0); + void addServices(const Zone & zone, const std::vector<const ServiceVolume * > & services); + GeoVPhysVol* build(int iElement); + int numCopies(int iElement); + GeoTransform * getPlacement(int iElement, int iCopy); + GeoTransform * getPlacementEnvelope(int iElement, int iCopy, int iMothElement); + + MsgStream& msg (MSG::Level lvl) const { return m_msg.get() << lvl; } + bool msgLvl (MSG::Level lvl) const { return m_msg.get().level() <= lvl; } + + bool isEnvelopeOrChild(int iElement); + int getEnvelopeNum(int iElement); + int getParentNum(int iElement); + bool isChildService(int iElt,int iChld); + double getZcenter(int iElt); + + private: + //const GeoShape * getShape(const ServiceVolume & param, double & volume); + + mutable Athena::MsgStreamMember m_msg; + std::string m_region; + double m_zcenter; + const std::vector<const ServiceVolume *>* m_services; + const std::vector<const ServiceVolume *>* m_servEnvelope; + const std::vector<const ServiceVolume *>* m_servChild; + VolumeSplitter m_splitter; + TrackerMaterialManager * m_matManager; + + }; + +} +#endif // TrackerGeoModelUtils_VolumeBuidler_H diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/VolumeSplitter.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/VolumeSplitter.h new file mode 100644 index 000000000..0a5a28fcb --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/VolumeSplitter.h @@ -0,0 +1,38 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TrackerGeoModelUtils_VolumeSplitter_H +#define TrackerGeoModelUtils_VolumeSplitter_H + +#include "TrackerGeoModelUtils/VolumeSplitterUtils.h" + +#include <string> +#include <vector> + +namespace TrackerDD { + class ServiceVolume; + + class VolumeSplitter + { + public: + VolumeSplitter(); + ~VolumeSplitter(); + const std::vector<const ServiceVolume *> & splitAll(const Zone & zone, const std::vector<const ServiceVolume *>); + void split(const Zone & zone, const ServiceVolume & origVolume); + const std::vector<const ServiceVolume *> & getVolumes() const {return m_volumes;} + // Take ownership of volumes. If called user must delete the volumes. + void takeOwnership() {m_ownVolumes = false;} + private: + Ray makeRay(const ServiceVolume & origVolume); + void makeVolumes(const Zone * zone, const ServiceVolume & origVolume); + void splitVolume(const Zone * zone, const ServiceVolume & vol); + void adjustR(const ServiceVolume & param, ServiceVolume * paramNew); + + bool m_ownVolumes; + double m_epsilon; + std::vector<const ServiceVolume *> m_volumes; + }; + +} +#endif // TrackerGeoModelUtils_VolumeSplitter_H diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/VolumeSplitterUtils.h b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/VolumeSplitterUtils.h new file mode 100644 index 000000000..7c821c879 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/TrackerGeoModelUtils/VolumeSplitterUtils.h @@ -0,0 +1,200 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TrackerGeoModelUtils_VolumeSplitterUtils_H +#define TrackerGeoModelUtils_VolumeSplitterUtils_H + +#include <string> +#include <vector> +#include <iostream> + +class GeoTube; +class GeoPcon; + +namespace TrackerDD { + + class Zone; + + class Point + { + public: + Point(); + Point(double z, double r); + bool valid() const {return m_valid;} + bool exit() const {return m_exit;} //point is an exit point. + bool last() const {return m_last;} + + double z() const {return m_z;} + double r() const {return m_r;} + const Zone * child() const {return m_child;} // point belongs to child + void setChild(const Zone * zone) {m_child = zone;} + void setInvalid() {m_valid = false;} + void setExit() {m_exit = true;} + void setLast() {m_last = true;} + private: + bool m_valid; + bool m_exit; + bool m_last; + double m_z; + double m_r; + const Zone * m_child; + }; + + class Ray { + public: + Ray(); + Ray(const Point & start, const Point & end); + void set(const Point & start, const Point & end); + const Point & start() const {return m_start;} + const Point & end() const {return m_end;} + bool valid() const {return m_valid;} + bool foundStart() const {return m_found;} + bool horizontal() const {return m_horizontal;} + bool vertical() const {return m_vertical;} + void setFound() {m_found = true;} + void setInvalid() {m_valid = false;} + + private: + void setDirection(); + + bool m_valid; + bool m_found; + bool m_horizontal; + bool m_vertical; + Point m_start; + Point m_end; + }; + + + + class Zone { + public: + typedef std::vector<const Zone *>::const_iterator ChildIterator; + Zone(const std::string & label, bool rotated = false); + virtual ~Zone(); + virtual bool inSide(const Point & point) const = 0; + virtual Point findEntry(const Ray & ray) const = 0; + virtual Point findExit(const Ray & ray) const = 0; + void add(const Zone *); + ChildIterator begin() const {return m_children.begin();} + ChildIterator end() const {return m_children.end();} + const std::string & label() const {return m_label;} + bool rotated() const {return m_rotated;} + private: + std::string m_label; + bool m_rotated; + std::vector<const Zone *> m_children; + }; + + class UnboundedZone : public Zone { + public: + UnboundedZone(const std::string & label); + virtual bool inSide(const Point & point) const; + virtual Point findEntry(const Ray & ray) const; + virtual Point findExit(const Ray & ray) const; + }; + + class TubeZone : public Zone + { + public: + TubeZone(const std::string & label, double zmin, double zmax, double rmin, double rmax, bool rotated = false); + TubeZone(const std::string & label, const GeoTube * shape, double zOffset, bool rotated = false); + virtual bool inSide(const Point & point) const; + virtual Point findEntry(const Ray & ray) const; + virtual Point findExit(const Ray & ray) const; + virtual double getRmin() const { return m_rmin; } + virtual double getRmax() const { return m_rmax; } + virtual double getZmin() const { return m_zmin; } + virtual double getZmax() const { return m_zmax; } + private: + bool inR(double r) const; + bool inZ(double z) const; + double m_zmin; + double m_zmax; + double m_rmin; + double m_rmax; + }; + + class PconZone : public Zone + { + public: + PconZone( const std::string & label, bool rotated = false); + PconZone(const std::string & label, const GeoPcon * shape, bool rotated = false); + void addPlane(double z, double rmin, double rmax); + virtual bool inSide(const Point & point) const; + virtual Point findEntry(const Ray & ray) const; + virtual Point findExit(const Ray & ray) const; + private: + bool inR(unsigned int i, double r) const; + bool inZ(unsigned int i, double z) const; + std::vector<double> m_z; + std::vector<double> m_rmin; + std::vector<double> m_rmax; + }; + + class Segment { + public: + Segment(const std::string & label, const Point & start, const Point & end, bool rotated = false); + const std::string & label() const {return m_label;} + bool rotated() const {return m_rotated;} + double zmin() const {return m_zmin;} + double zmax() const {return m_zmax;} + double rmin() const {return m_rmin;} + double rmax() const {return m_rmax;} + void print() const; + private: + std::string m_label; + bool m_rotated; + double m_zmin; + double m_zmax; + double m_rmin; + double m_rmax; + }; + + class SegmentList + { + public: + void add(const std::string & label, const Point & start, const Point & end, bool rotated = false); + void add(const Segment & segment); + unsigned int size() const {return m_segments.size();} + const Segment & getSegment(unsigned int i) const {return m_segments[i];} + bool horizontal() const; + void print() const; + //std::string getSegmentLabel(int i); + //double getSegmentZmin(int i); + //double getSegmentZmax(int i); + //double getSegmentRmin(int i); + //double getSegmentRmax(int i); + private: + std::vector<Segment> m_segments; + }; + + + class SegmentSplitter + { + public: + const SegmentList & split(const Zone *, const Ray &); + + private: + Ray addChildSegment(const Zone *, const Ray &); + void addSegment(const Zone *, const Point & start, const Point & end); + Point getNextBoundary(const Zone *, const Ray &); + Ray searchPoint(const Zone * zone, const Ray & ray); + Point nearestPoint(const Point & point1, const Point & point2); + + private: + SegmentList m_segments; + //m_ray; + + }; + + + std::ostream & operator<<(std::ostream & os, const TrackerDD::Point & point); + std::ostream & operator<<(std::ostream & os, const TrackerDD::Ray & ray); + + +} + + +#endif // TrackerGeoModelUtils_VolumeSplitterUtils_H diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/DistortedMaterialManager.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/DistortedMaterialManager.cxx new file mode 100755 index 000000000..321fa22cc --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/DistortedMaterialManager.cxx @@ -0,0 +1,46 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + + +#include "TrackerGeoModelUtils/DistortedMaterialManager.h" +#include "GeoModelInterfaces/StoredMaterialManager.h" +#include "GeoModelUtilities/DecodeVersionKey.h" +#include "AthenaKernel/MsgStreamMember.h" +#include "StoreGate/StoreGate.h" +#include "RDBAccessSvc/IRDBAccessSvc.h" +#include "GaudiKernel/ISvcLocator.h" +#include "GaudiKernel/Bootstrap.h" + +namespace TrackerDD { + DistortedMaterialManager::DistortedMaterialManager() { + ISvcLocator* svcLocator = Gaudi::svcLocator(); // from Bootstrap + + Athena::MsgStreamMember log("ExtraMaterialManager"); + log << MSG::DEBUG << "Initialized Tracker Distorted Material Manager" << endmsg; + + StoreGateSvc* detStore; + StatusCode sc; + sc = svcLocator->service("DetectorStore", detStore); + if (sc.isFailure()) log << MSG::FATAL << "Could not locate DetectorStore" << endmsg; + + IRDBAccessSvc* rdbSvc; + sc = svcLocator->service("RDBAccessSvc", rdbSvc); + if (sc.isFailure()) log << MSG::FATAL << "Could not locate RDBAccessSvc" << endmsg; + + // Get version tag and node for Tracker. + DecodeVersionKey versionKey("Tracker"); + std::string detectorKey = versionKey.tag(); + std::string detectorNode = versionKey.node(); + + log << MSG::DEBUG << "Retrieving Record Sets from database ..." << endmsg; + log << MSG::DEBUG << "Key = " << detectorKey << " Node = " << detectorNode << endmsg; + + m_xMatTable = rdbSvc->getRecordsetPtr("TrackerExtraMaterial", detectorKey, detectorNode, "FASERDD"); + + const StoredMaterialManager* theGeoMaterialManager = 0; + sc = detStore->retrieve(theGeoMaterialManager, "MATERIALS"); + if (sc.isFailure()) log << MSG::FATAL << "Could not locate GeoModel Material manager" << endmsg; + m_materialManager = theGeoMaterialManager; + } +} // end namespace diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/ExtraMaterial.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/ExtraMaterial.cxx new file mode 100755 index 000000000..fc9d83c81 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/ExtraMaterial.cxx @@ -0,0 +1,74 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + +#include "TrackerGeoModelUtils/ExtraMaterial.h" +#include "TrackerGeoModelUtils/GenericTubeMaker.h" +#include "TrackerGeoModelUtils/TubeVolData.h" +#include "TrackerGeoModelUtils/DistortedMaterialManager.h" +#include "RDBAccessSvc/IRDBRecordset.h" +#include "RDBAccessSvc/IRDBRecord.h" +#include "GeoPrimitives/GeoPrimitives.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoFullPhysVol.h" +#include "GeoModelKernel/GeoTube.h" +#include "GeoModelKernel/GeoTubs.h" +#include "GeoModelKernel/GeoCons.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoMaterial.h" + +#include "GeoModelInterfaces/AbsMaterialManager.h" + +#include <string> +#include <sstream> +#include <iostream> + +namespace TrackerDD { + ExtraMaterial::ExtraMaterial(IRDBRecordset_ptr xMatTable, const AbsMaterialManager* matManager) + : m_xMatTable(xMatTable), + m_matManager(matManager) + {} + + ExtraMaterial::ExtraMaterial(const DistortedMaterialManager* manager) + : m_xMatTable(manager->extraMaterialTable()), + m_matManager(manager->materialManager()) + {} + + void + ExtraMaterial::add(GeoPhysVol* parent, const std::string& region, double zParent) { + add(parent, 0, region, zParent); + } + + void + ExtraMaterial::add(GeoFullPhysVol* parent, const std::string& region, double zParent) { + add(0, parent, region, zParent); + } + + void + ExtraMaterial::add(GeoPhysVol* parent, GeoFullPhysVol* fullparent, const std::string& region, double zParent) { + //std::cout << "Adding Extra material for region: " << region << ", zParent = " << zParent << std::endl; + + for (unsigned int i = 0; i < m_xMatTable->size(); i++) { + std::ostringstream volnamestr; + volnamestr << "ExtraMaterial" << i; + + //std::cout << "In Extra material " << i << std::endl; + + if ((*m_xMatTable)[i]->getString("REGION") == region) { + //std::cout << "Extra material Match " << i << std::endl; + + GenericTubeMaker tubeHelper((*m_xMatTable)[i]); + const GeoMaterial* material = m_matManager->getMaterial(tubeHelper.volData().material()); + const GeoShape* shape = tubeHelper.buildShape(); + GeoLogVol* logVol = new GeoLogVol(volnamestr.str(), shape, material); + GeoPhysVol* physVol = new GeoPhysVol(logVol); + + if (parent) { + tubeHelper.placeVolume(parent, physVol, zParent); + } else { + tubeHelper.placeVolume(fullparent, physVol, zParent); + } + } + } + } +} // end namespace diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/GenericTubeMaker.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/GenericTubeMaker.cxx new file mode 100755 index 000000000..623cc4eb7 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/GenericTubeMaker.cxx @@ -0,0 +1,164 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + +#include "TrackerGeoModelUtils/GenericTubeMaker.h" +#include "TrackerGeoModelUtils/TubeVolData.h" + +#include "GeoModelKernel/GeoTube.h" +#include "GeoModelKernel/GeoTubs.h" +#include "GeoModelKernel/GeoCons.h" +#include "GeoModelKernel/GeoPcon.h" +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoFullPhysVol.h" +#include "GeoModelKernel/GeoDefinitions.h" +#include "GaudiKernel/SystemOfUnits.h" + +#include "RDBAccessSvc/IRDBRecord.h" + +namespace TrackerDD { + GenericTubeMaker::GenericTubeMaker(const IRDBRecord* record) + : m_record(record), + m_volData(record) + {} + + std::string + GenericTubeMaker::materialName() const { + return m_record->getString("MATERIAL"); + } + + std::string + GenericTubeMaker::name() const { + return m_record->getString("NAME"); + } + + const GeoShape* + GenericTubeMaker::buildShape() { + const GeoShape* shape = 0; + + switch (m_volData.shape()) { + case TubeVolData::TUBE: + shape = new GeoTube(m_volData.rmin(), m_volData.rmax(), 0.5 * m_volData.length()); + break; + + case TubeVolData::TUBS: + shape = new GeoTubs(m_volData.rmin(), m_volData.rmax(), 0.5 * m_volData.length(), + m_volData.phiStart(), m_volData.phiDelta()); + break; + + case TubeVolData::CONS: + shape = new GeoCons(m_volData.rmin(), m_volData.rmin2(), m_volData.rmax(), m_volData.rmax2(), + 0.5 * m_volData.length(), m_volData.phiStart(), m_volData.phiDelta()); + break; + + case TubeVolData::RADIAL: + // This simulates the radial decrease in density. + double zstart = -0.5 * m_volData.length(); + GeoPcon* shapeTmp = new GeoPcon(m_volData.phiStart(), m_volData.phiDelta()); + shapeTmp->addPlane(zstart, m_volData.rmin(), m_volData.rmax()); + double radialDelta = (m_volData.rmax() - m_volData.rmin()) / m_volData.radialDivisions(); + for (int i = 0; i < m_volData.radialDivisions(); i++) { + double rIntermediate = m_volData.rmax() - i * radialDelta; + double reductionFactor = m_volData.rmin() / rIntermediate; + shapeTmp->addPlane(zstart + reductionFactor * m_volData.length(), m_volData.rmin(), rIntermediate); + } + shapeTmp->addPlane(zstart + m_volData.length(), m_volData.rmin(), m_volData.rmin()); + shape = shapeTmp; + break; + } + + return shape; + } + + void + GenericTubeMaker::placeVolume(GeoPhysVol* parent, GeoVPhysVol* child, double zParent) { + placeVolume(parent, 0, child, zParent); + } + + void + GenericTubeMaker::placeVolume(GeoFullPhysVol* fullparent, GeoVPhysVol* child, double zParent) { + placeVolume(0, fullparent, child, zParent); + } + + void + GenericTubeMaker::placeVolTwoSide(GeoPhysVol* parentPos, GeoPhysVol* parentNeg, GeoVPhysVol* child, double zParent) { + placeVolTwoSide(parentPos, parentNeg, 0, 0, child, zParent); + } + + void + GenericTubeMaker::placeVolTwoSide(GeoFullPhysVol* fullparentPos, GeoFullPhysVol* fullparentNeg, GeoVPhysVol* child, + double zParent) { + placeVolTwoSide(0, 0, fullparentPos, fullparentNeg, child, zParent); + } + + void + GenericTubeMaker::placeVolume(GeoPhysVol* parent, GeoFullPhysVol* fullparent, GeoVPhysVol* child, double zParent) { + for (int iRepeat = 0; iRepeat < m_volData.nRepeat(); iRepeat++) { + double phi = m_volData.phiStep() * iRepeat; + + GeoTransform* xform = 0; + double zOffset = m_volData.zMid() - zParent; + if (zOffset != 0 || iRepeat > 0) { + xform = new GeoTransform(GeoTrf::TranslateZ3D(zOffset) * GeoTrf::RotateZ3D(phi)); + } + + if (parent) { + if (xform) parent->add(xform); + parent->add(child); + } else { + if (xform) fullparent->add(xform); + fullparent->add(child); + } + + // Place in negative z as well. + if (m_volData.bothZ()) { + GeoTransform* xformNeg = new GeoTransform(GeoTrf::RotateY3D(180 * Gaudi::Units::deg) * GeoTrf::TranslateZ3D( + zOffset) * GeoTrf::RotateZ3D(phi)); + if (parent) { + parent->add(xformNeg); + parent->add(child); + } else { + fullparent->add(xformNeg); + fullparent->add(child); + } + } + } // iRepeat loop + } + + void + GenericTubeMaker::placeVolTwoSide(GeoPhysVol* parentPos, GeoPhysVol* parentNeg, + GeoFullPhysVol* fullparentPos, GeoFullPhysVol* fullparentNeg, + GeoVPhysVol* child, double zParent) { + for (int iRepeat = 0; iRepeat < m_volData.nRepeat(); iRepeat++) { + double phi = m_volData.phiStep() * iRepeat; + double zOffset = m_volData.zMid() - zParent; + const bool newXform((zOffset != 0)or(iRepeat > 0)); + + if (parentPos) { + if (newXform) { + parentPos->add(new GeoTransform(GeoTrf::TranslateZ3D(zOffset) * GeoTrf::RotateZ3D(phi))); + } + parentPos->add(child); + } else if (fullparentPos) { + if (newXform) { + fullparentPos->add(new GeoTransform(GeoTrf::TranslateZ3D(zOffset) * GeoTrf::RotateZ3D(phi))); + } + fullparentPos->add(child); + } + + // Place in negative z as well. + if (m_volData.bothZ()) { + GeoTransform* xformNeg = new GeoTransform(GeoTrf::RotateY3D(180 * Gaudi::Units::deg) * GeoTrf::TranslateZ3D( + zOffset) * GeoTrf::RotateZ3D(phi)); + if (parentNeg) { + parentNeg->add(xformNeg); + parentNeg->add(child); + } else { + fullparentNeg->add(xformNeg); + fullparentNeg->add(child); + } + } + } // iRepeat loop + } +}// end namespace diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/PairIndexMap.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/PairIndexMap.cxx new file mode 100755 index 000000000..a407755c3 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/PairIndexMap.cxx @@ -0,0 +1,20 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + +#include "TrackerGeoModelUtils/PairIndexMap.h" + +namespace TrackerDD { + void + PairIndexMap::add(int first, int second, int value) { + m_map[std::make_pair(first, second)] = value; + } + + int + PairIndexMap::find(int first, int second) const { + MapType::const_iterator iter = m_map.find(std::make_pair(first, second)); + if (iter == m_map.end()) return -1; + + return iter->second; + } +} diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/ServiceVolume.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/ServiceVolume.cxx new file mode 100755 index 000000000..6bf9974c3 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/ServiceVolume.cxx @@ -0,0 +1,383 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + +// +// This class to hold general services +// +// The services support several different shapes. The meaning of the parameters +// depends on the particular shape: +// +// +// TUBE or empty +// Ignored: RIN2,ROUT2,PHI,WIDTH,REPEAT +// TUBS +// Ignored: RIN2,ROUT2 +// PHI: phi start location of tube sector +// WIDTH (CLHEP::deg): phi width of sector +// REPEAT: Repeat the tube sector this many times in phi with equal distance between them. +// CONS, CONE +// WIDTH,REPEAT ignored if CONE +// RIN2,ROUT2: rmin, rmx at zmax. Same as RIN, ROUT if <=0. +// PHI, WIDTH, REPEAT same as TUBS +// PGON +// Ignored: WIDTH +// RIN,ROUT,RIN2,ROUT2 defined at corner of polygon. +// PHI: phi start location of a corner +// REPEAT: Sides of polygon +// PGON2 +// Ignored: WIDTH +// RIN,ROUT,RIN2,ROUT2 defined at side of polygon. +// PHI: phi start location of center of side. +// REPEAT: Sides of polygon +// PGON3 (pgon at outer edge, circular inner edge) +// Ignored: WIDTH +// RIN,RIN2 radius of inner edge (tube or cone) +// ROUT,ROUT2 defined at corner of polygon. +// PHI: phi start location of a corner +// REPEAT: Sides of polygon +// PGON31 (pgon at inner edge, circular outer edge) +// Ignored: WIDTH +// RIN,RIN2 radius of inner edge (tube or cone) +// ROUT,ROUT2 defined at corner of polygon. +// PHI: phi start location of a corner +// REPEAT: Sides of polygon +// PGON4 (pgon at outer edge, circular inner edge) +// Ignored: WIDTH +// RIN,RIN2 radius of inner edge (tube or cone) +// ROUTROUT2 defined at side of polygon. +// PHI: phi start location of center of side. +// REPEAT: Sides of polygon +// ROD +// Ignored: ROUT, RIN2, ROUT2 +// RIN: Radial position of center of tube +// PHI: phi position of center +// WIDTH (mm): diameter +// REPEAT: Repeat this many times in phi with equal distance between them. +// ROD2 (hollow tube not centered around Z axis) +// Ignored: ROUT, ROUT2 +// RIN: Radial position of center of tube +// RIN2: inner radius +// PHI: phi position of center +// WIDTH (mm): diameter +// REPEAT: Repeat this many times in phi with equal distance between them. +// BOX +// Ignored: RIN2, ROUT2 +// ROUT-RIN = thickness of box (radially) +// (RIN+ROUT)/2 = radial poistion of center of box +// PHI: phi position of center +// WIDTH (mm) = width of box +// REPEAT: Repeat this many times in phi with equal distance between them. +// TRAP +// Ignored: RIN2, ROUT2 +// ROUT-RIN = thickness of trapezoid (radially) +// (RIN+ROUT)/2 = radial poistion of center of trapzoid +// PHI: phi position of center +// WIDTH (mm) = width of trapezoid at center +// REPEAT: Repeat this many times in phi with equal distance between them. +// +// **IMPORTANT NOTE** WIDTH can be in degrees or mm. See OraclePixGeoManager + +#include "TrackerGeoModelUtils/ServiceVolume.h" +#include "GeoModelKernel/GeoTube.h" +#include "GeoModelKernel/GeoTubs.h" +#include "GeoModelKernel/GeoCons.h" +#include "GeoModelKernel/GeoPgon.h" +#include "GeoModelKernel/GeoBox.h" +#include "GeoModelKernel/GeoTrap.h" +#include "GeoModelKernel/GeoShapeSubtraction.h" +#include "GaudiKernel/SystemOfUnits.h" + +#include <string> +#include <iostream> +#include <sstream> +#include <iomanip> + +namespace TrackerDD { + ServiceVolume::ServiceVolume() + : m_rmin(0), + m_rmax(0), + m_rmin2(0), + m_rmax2(0), + m_zmin(0), + m_zmax(0), + //m_volId(0), + m_zsymm(false), + m_geoShape(0), + m_material(0), + m_phiLoc(0), + m_phiWidth(0), + m_needsRotation(false), + m_sides(0), + m_nCopies(1), + //m_origLength(0), + m_origVolume(0), + m_volume(0), + m_safety(0), + m_lockGeoShape(0), + m_splittableR(true), + m_splittableZ(true), + m_envNum(0), + m_envParentNum(0), + m_zShift(0.) + {} + + + void + ServiceVolume::reduceSize(double safety) { + // Don't do anything if its a very thin volume. + if (length() > 4. * safety) { + if (m_zmax < m_zmin) std::swap(m_zmin, m_zmax); + m_safety = safety; + } + m_geoShape = 0; + } + + void + ServiceVolume::setLabel(const std::string& name, int volId) { + std::ostringstream o; + o.fill('0'); + o << name << std::setw(2) << volId; + m_label = o.str(); + } + + std::string + ServiceVolume::fullLabel() const { + if (m_volName.empty()) return m_label; + + return m_label + "_" + m_volName; + } + + void + ServiceVolume::print() const { + std::cout << m_rmin << " " + << m_rmax << " " + << m_zmin << " " + << m_zmax << " " + << m_region << " " + << fullLabel() + << std::endl; + } + + const GeoShape* + ServiceVolume::getShape() const { + // If prebuilt then return + if (m_geoShape.get()) return m_geoShape.get(); + + // + // Dimensions + // + //double rmin = rmin(); + //double rmax = rmax(); + //double rmin2 = rmin2(); + //double rmax2 = rmax2(); + //double phiLoc = phiLoc(); + //double phiWidth = phiWidth(); + //int sides = sides(); + //const std::string & shapeType = shapeType(); + + double halflength = 0.5 * length(); + + //std::cout << "Building service volume " << logName << ": " + // << rmin << ", " + // << rmax << ", " + // << halflength << ", " + // << materialName << std::endl; + + const GeoShape* serviceShape = 0; + double volume = 0; + + // Check if service needs to be shifted + // if(fabs(m_zShift)>0.001) + // std::cout<<"SHIFTED SERVICE : "<<m_volName<<" "<<m_shapeType<<std::endl; + + if (m_shapeType.empty() || m_shapeType == "TUBE") { + serviceShape = new GeoTube(m_rmin, m_rmax, halflength); + } else if (m_shapeType == "TUBS") { + serviceShape = new GeoTubs(m_rmin, m_rmax, halflength, m_phiLoc, m_phiWidth); + } else if (m_shapeType == "CONS" || m_shapeType == "CONE") { + double phiWidthTmp = m_phiWidth; + if (m_shapeType == "CONE" || phiWidthTmp == 0) { + phiWidthTmp = 2 * M_PI; + } + serviceShape = new GeoCons(m_rmin, m_rmin2, m_rmax, m_rmax2, halflength, m_phiLoc, phiWidthTmp); + } else if (m_shapeType == "PGON") { + GeoPgon* shapeTmp = new GeoPgon(m_phiLoc, 2 * M_PI, m_sides); + shapeTmp->addPlane(-halflength, m_rmin, m_rmax); + shapeTmp->addPlane(halflength, m_rmin2, m_rmax2); + serviceShape = shapeTmp; + } else if (m_shapeType == "PGON2") { + // Radius defined at the side, not the corner + double alpha = M_PI / m_sides; + double cosalpha = cos(alpha); + double rminB = m_rmin / cosalpha; + double rmaxB = m_rmax / cosalpha; + double rmin2B = m_rmin2 / cosalpha; + double rmax2B = m_rmax2 / cosalpha; + GeoPgon* shapeTmp = new GeoPgon(m_phiLoc - alpha, 2 * M_PI, m_sides); + shapeTmp->addPlane(-halflength, rminB, rmaxB); + shapeTmp->addPlane(halflength, rmin2B, rmax2B); + serviceShape = shapeTmp; + } else if (m_shapeType == "PGON3" || m_shapeType == "PGON4") { + // Outer edge + GeoPgon* shapeTmp1 = 0; + if (m_shapeType == "PGON3") { + shapeTmp1 = new GeoPgon(m_phiLoc, 2 * M_PI, m_sides); + shapeTmp1->addPlane(-halflength, 0, m_rmax); + shapeTmp1->addPlane(halflength, 0, m_rmax2); + } else { //PGON4 + double alpha = M_PI / m_sides; + double cosalpha = cos(alpha); + double rmaxB = m_rmax / cosalpha; + double rmax2B = m_rmax2 / cosalpha; + shapeTmp1 = new GeoPgon(m_phiLoc - alpha, 2 * M_PI, m_sides); + shapeTmp1->addPlane(-halflength, 0, rmaxB); + shapeTmp1->addPlane(halflength, 0, rmax2B); + } + // Don't trust boolean volume calculation. + volume = shapeTmp1->volume(); + // Inner edge + GeoShape* shapeTmp2 = 0; + if (m_rmin == m_rmin2) { + shapeTmp2 = new GeoTube(0, m_rmin, halflength + 0.1 * Gaudi::Units::mm); + volume -= 2 * M_PI * m_rmin * m_rmin * halflength; + } else { + shapeTmp2 = new GeoCons(0, 0, m_rmin, m_rmin2, halflength + 0.1 * Gaudi::Units::mm, 0, 2 * M_PI); + volume -= 2 * M_PI * pow(0.5 * (m_rmin + m_rmin2), 2) * halflength; + } + serviceShape = &(shapeTmp1->subtract(*shapeTmp2)); + } +// else if (m_shapeType == "PGON31"){ +// // Outer edge +// GeoTube *shapeTmp1 = new GeoTube(0,m_rmax,halflength); +// halflength+=0.1*CLHEP::mm; +// double alpha = M_PI/m_sides; +// double cosalpha = cos(alpha); +// double rmaxB = m_rmin/cosalpha; +// double rmax2B = m_rmin2/cosalpha; +// GeoPgon* shapeTmp2 = new GeoPgon(m_phiLoc-alpha,2*M_PI,m_sides); +// shapeTmp2->addPlane(-halflength,0.,rmaxB); +// shapeTmp2->addPlane(halflength,0.,rmax2B); +// // Don't trust boolean volume calculation. +// volume = shapeTmp1->volume() - shapeTmp2->volume(); +// serviceShape = &(shapeTmp1->subtract(*shapeTmp2)); +// } + else if (m_shapeType == "ROD") { + serviceShape = new GeoTube(0, 0.5 * m_phiWidth, halflength); + } else if (m_shapeType == "ROD2") { + // std::cout<<"ROD2 : "<<m_rmin<<" "<<m_rmin2<<" "<<0.5*m_phiWidth<<" "<<halflength<<std::endl; + serviceShape = new GeoTube(m_rmin2 - m_rmin, 0.5 * m_phiWidth, halflength); + } else if (m_shapeType == "BOX") { + serviceShape = new GeoBox(0.5 * (m_rmax - m_rmin), 0.5 * m_phiWidth, halflength); + } else if (m_shapeType == "TRAP") { + double thickness = 0.5 * (m_rmax - m_rmin); + double averad = 0.5 * (m_rmin + m_rmax); + double w1 = 0.5 * m_phiWidth * m_rmin / averad; + double w2 = 0.5 * m_phiWidth * m_rmax / averad; + serviceShape = new GeoTrap(halflength, 0, 0, thickness, w1, w2, 0, thickness, w1, w2, 0); + } else { + // msg(MSG::ERROR) << "Unrecognized shape for services" << m_shapeType << endmsg; + std::cout << "ServiceVolume: ERROR: Unrecognized shape for services" << m_shapeType << std::endl; + } + + if (!volume && serviceShape != 0) volume = serviceShape->volume(); + + m_volume = volume; + m_geoShape.set(serviceShape); + return serviceShape; + } + + double + ServiceVolume::volume() const { + // Make sure shape is already built. + getShape(); + return m_volume; + } + + void + ServiceVolume::setGeoShape(const GeoShape* geoShape, double volume) { + m_geoShape.reset(); + if (geoShape) { + m_volume = volume; + // We allow a volume to specified as the volume calculation for some shapes (ie boolean volumes) are unreliable. + // If volume is not supplied, get it from the shape itself. + if (!m_volume) m_volume = geoShape->volume(); + m_geoShape.set(geoShape); + m_lockGeoShape = true; // This disables resetGeoShape(). + setShapeType("CUSTOM"); + } else { + // If pass null pointer we unlock the shape. + m_lockGeoShape = false; + } + } + + double + ServiceVolume::origVolume() const { + if (m_origVolume) return m_origVolume; + + return volume(); + } + + void + ServiceVolume::setSplittable() { + m_splittableR = m_splittableZ = true; + if (m_shapeType == "CUSTOM") { + m_splittableR = m_splittableZ = false; + } else if (!(m_shapeType == "" || m_shapeType == "TUBE" || m_shapeType == "TUBS")) { + m_splittableR = false; + } + } + + GeoShapeHolder::GeoShapeHolder() + : m_geoShape(0) + {} + + GeoShapeHolder::GeoShapeHolder(const GeoShape* geoShape) + : m_geoShape(geoShape) { + if (m_geoShape) m_geoShape->ref(); + } + + GeoShapeHolder::~GeoShapeHolder() { + reset(); + } + + GeoShapeHolder::GeoShapeHolder(const GeoShapeHolder& rhs) { + m_geoShape = rhs.m_geoShape; + if (m_geoShape) m_geoShape->ref(); + } + + GeoShapeHolder& + GeoShapeHolder::operator = (const GeoShapeHolder& rhs) { + if (&rhs != this) { + reset(); + m_geoShape = rhs.m_geoShape; + if (m_geoShape) m_geoShape->ref(); + } + return *this; + } + + GeoShapeHolder& + GeoShapeHolder::operator = (GeoShapeHolder&& rhs) { + if (&rhs != this) { + if (m_geoShape) m_geoShape->unref();//this geoshape will be overwritten, so decrement its reference + m_geoShape = rhs.m_geoShape; //simply equate the pointers + rhs.m_geoShape=nullptr; //render the original unusable for safety + //if (m_geoShape) m_geoShape->ref(); << no need to increment the reference; the original is moved here + // with its original refcount intact. + } + return *this; + } + + void + GeoShapeHolder::set(const GeoShape* geoShape) { + reset(); + m_geoShape = geoShape; + if (m_geoShape) m_geoShape->ref(); + } + + void + GeoShapeHolder::reset() { + if (m_geoShape) m_geoShape->unref(); + m_geoShape = 0; + } +} // end namespace diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/ServiceVolumeMaker.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/ServiceVolumeMaker.cxx new file mode 100755 index 000000000..f3e409f4d --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/ServiceVolumeMaker.cxx @@ -0,0 +1,375 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + +#include "TrackerGeoModelUtils/ServiceVolumeMaker.h" +#include "TrackerGeoModelUtils/ServiceVolume.h" +#include "TrackerGeoModelUtils/TrackerDDAthenaComps.h" + +#include "GeoModelUtilities/DecodeVersionKey.h" + +#include "RDBAccessSvc/IRDBRecordset.h" +#include "GeometryDBSvc/IGeometryDBSvc.h" +#include "GaudiKernel/SystemOfUnits.h" + +namespace TrackerDD { + ServiceVolumeSchema::ServiceVolumeSchema() { + setSimpleSchema(); + } + + void + ServiceVolumeSchema::setPixelSchema() { + m_rmin = "RIN"; + m_rmax = "ROUT"; + m_rmin2 = "RIN2"; + m_rmax2 = "ROUT2"; + m_zmin = "ZIN"; + m_zmax = "ZOUT"; + m_zsymm = "ZSYMM"; + m_materialName = "MATERIALNAME"; + m_repeat = "REPEAT"; + m_phiStart = "PHI"; + m_phiDelta = "WIDTH"; + m_width = "WIDTH"; + m_shapeType = "SHAPE"; + m_volName = "VOLNAME"; + m_radialDiv = ""; + m_phiStep = ""; + m_volId = "FRAMENUM"; + m_shiftFlag = "SHIFT"; + } + + void + ServiceVolumeSchema::setDefaultSchema() { + m_rmin = "RMIN"; + m_rmax = "RMAX"; + m_rmin2 = "RMIN2"; + m_rmax2 = "RMAX2"; + m_zmin = "ZMIN"; + m_zmax = "ZMAX"; + m_zsymm = "ZSYMM"; + m_materialName = "MATERIAL"; + m_repeat = "NREPEAT"; + m_phiStart = "PHISTART"; + m_phiDelta = "PHIDELTA"; + m_width = ""; + m_shapeType = ""; + m_volName = "NAME"; + m_radialDiv = "RADIAL"; + m_phiStep = "PHISTEP"; + m_volId = ""; + m_shiftFlag = "SHIFT"; + } + + void + ServiceVolumeSchema::setSimpleSchema() { + m_rmin = "RMIN"; + m_rmax = "RMAX"; + m_rmin2 = ""; + m_rmax2 = ""; + m_zmin = "ZMIN"; + m_zmax = "ZMAX"; + m_zsymm = "ZSYMM"; + m_materialName = "MATERIAL"; + m_repeat = ""; + m_phiStart = ""; + m_phiDelta = ""; + m_width = ""; + m_shapeType = ""; + m_volName = "NAME"; + m_radialDiv = ""; + m_phiStep = ""; + m_volId = ""; + m_shiftFlag = "SHIFT"; + } + + ServiceVolumeMakerMgr::ServiceVolumeMakerMgr(IRDBRecordset_ptr table, const ServiceVolumeSchema& schema, + const TrackerDD::AthenaComps* athenaComps) + : m_table(table), + m_schema(schema), + m_athenaComps(athenaComps) + {} + + const IGeometryDBSvc* + ServiceVolumeMakerMgr::db() const { + return m_athenaComps->geomDB(); + } + + double + ServiceVolumeMakerMgr::rmin(int index) const { + return db()->getDouble(m_table, m_schema.rmin(), index) * Gaudi::Units::mm; + } + + double + ServiceVolumeMakerMgr::rmax(int index) const { + return db()->getDouble(m_table, m_schema.rmax(), index) * Gaudi::Units::mm; + } + + double + ServiceVolumeMakerMgr::rmin2(int index) const { + return db()->getDouble(m_table, m_schema.rmin2(), index) * Gaudi::Units::mm; + } + + double + ServiceVolumeMakerMgr::rmax2(int index) const { + return db()->getDouble(m_table, m_schema.rmax2(), index) * Gaudi::Units::mm; + } + + double + ServiceVolumeMakerMgr::zmin(int index) const { + return db()->getDouble(m_table, m_schema.zmin(), index) * Gaudi::Units::mm; + } + + double + ServiceVolumeMakerMgr::zmax(int index) const { + return db()->getDouble(m_table, m_schema.zmax(), index) * Gaudi::Units::mm; + } + + double + ServiceVolumeMakerMgr::phiDelta(int index) const { + return db()->getDouble(m_table, m_schema.phiDelta(), index) * Gaudi::Units::deg; + } + + double + ServiceVolumeMakerMgr::width(int index) const { + if (m_schema.has_width()) { + return db()->getDouble(m_table, m_schema.width(), index) * Gaudi::Units::mm; + } + return 0; + } + + double + ServiceVolumeMakerMgr::phiStart(int index) const { + return db()->getDouble(m_table, m_schema.phiStart(), index) * Gaudi::Units::deg; + } + + double + ServiceVolumeMakerMgr::phiStep(int index) const { + if (m_schema.has_phiStep()) { + return db()->getDouble(m_table, m_schema.phiStep(), index) * Gaudi::Units::deg; + } + return 0; + } + + bool + ServiceVolumeMakerMgr::zsymm(int index) const { + return db()->getInt(m_table, m_schema.zsymm(), index); + } + + int + ServiceVolumeMakerMgr::repeat(int index) const { + return db()->getInt(m_table, m_schema.repeat(), index); + } + + int + ServiceVolumeMakerMgr::radialDiv(int index) const { + if (m_schema.has_radial()) { + return db()->getInt(m_table, m_schema.radialDiv(), index); + } else { + return 0; + } + } + + std::string + ServiceVolumeMakerMgr::shapeType(int index) const { + if (m_schema.has_shapeType()) { + if (db()->testField(m_table, m_schema.shapeType(), index)) { + return db()->getString(m_table, m_schema.shapeType(), index); + } else { + return "TUBE"; + } + } + return "UNKNOWN"; + } + + std::string + ServiceVolumeMakerMgr::volName(int index) const { + if (db()->testField(m_table, m_schema.volName(), index)) { + return db()->getString(m_table, m_schema.volName(), index); + } + return ""; + } + + std::string + ServiceVolumeMakerMgr::materialName(int index) const { + return db()->getString(m_table, m_schema.materialName(), index); + } + + unsigned int + ServiceVolumeMakerMgr::numElements() const { + return db()->getTableSize(m_table); + } + + int + ServiceVolumeMakerMgr::volId(int index) const { + if (m_schema.has_volId()) { + return db()->getInt(m_table, m_schema.volId(), index); + } + return 0; + } + + int + ServiceVolumeMakerMgr::shiftFlag(int index) const { + if (m_schema.has_shiftFlag()) { + if (db()->testField(m_table, m_schema.shiftFlag(), index)) return db()->getInt(m_table, + m_schema.shiftFlag(), index); + } + return 0; + } + + ServiceVolumeMaker::ServiceVolumeMaker(const std::string& label, + IRDBRecordset_ptr table, const ServiceVolumeSchema& schema, + const TrackerDD::AthenaComps* athenaComps) + : m_label(label) { + m_mgr = new ServiceVolumeMakerMgr(table, schema, athenaComps); + } + + ServiceVolumeMaker::~ServiceVolumeMaker() { + for (unsigned int i = 0; i < m_services.size(); i++) { + delete m_services[i]; + } + delete m_mgr; + } + + const std::vector<const ServiceVolume*>& + ServiceVolumeMaker::makeAll() { + for (unsigned int ii = 0; ii < numElements(); ++ii) { + m_services.push_back(make(ii)); + } + return m_services; + } + + unsigned int + ServiceVolumeMaker::numElements() const { + return m_mgr->numElements(); + } + + ServiceVolume* + ServiceVolumeMaker::make(int ii) { + // + // Retrieve/calculate the parameters for the volume. + // + ServiceVolume* param = new ServiceVolume; + + param->setMaterial(m_mgr->materialName(ii)); + param->setRmin(m_mgr->rmin(ii)); + param->setRmax(m_mgr->rmax(ii)); + param->setZmin(m_mgr->zmin(ii)); + param->setZmax(m_mgr->zmax(ii)); + param->setZsymm(m_mgr->zsymm(ii)); + param->setVolName(m_mgr->volName(ii)); + + double zShift = 0.; // the famous IBL Z shift + param->setZShift(zShift); + + int volId = m_mgr->volId(ii); + if (volId == 0) volId = ii + 1; + + bool needsRotation = false; + + // For TUBE there is no need to read the rest + std::string shapeType = m_mgr->shapeType(ii); + if (!m_mgr->schema().simple() && !shapeType.empty() && shapeType != "TUBE") { + double rmin2 = m_mgr->rmin2(ii); + double rmax2 = m_mgr->rmax2(ii); + + if (rmin2 <= 0) rmin2 = param->rmin(); + if (rmax2 <= 0) rmax2 = param->rmax(); + + int radialDiv = m_mgr->radialDiv(ii); + + double phiDelta = m_mgr->phiDelta(ii); + + bool fullPhiSector = false; + if (phiDelta == 0 || phiDelta >= 359.9 * Gaudi::Units::degree) { + phiDelta = 360 * Gaudi::Units::degree; + fullPhiSector = true; + } + //else { + //phiDelta -= 2*phiepsilon; + //phiStart += phiepsilon; + // } + + if (shapeType == "UNKNOWN") { + if (radialDiv > 0) { + shapeType = "RADIAL"; + } else if (param->rmin() == rmin2 && param->rmax() == rmax2) { + if (fullPhiSector) { + shapeType = "TUBE"; + } else { + shapeType = "TUBS"; + } + } else { + shapeType = "CONS"; + } + } + + + int repeat = m_mgr->repeat(ii); + if (repeat == 0) repeat = 1; + + double phiStart = m_mgr->phiStart(ii); + double phiWidth = phiDelta; + + if (shapeType == "CONS" || shapeType == "TUBS") { + const double phiepsilon = 0.001 * Gaudi::Units::degree; + phiWidth -= 2 * phiepsilon; + phiStart += phiepsilon; + } + + // Can be in degree or mm. Usually it is deg expect for BOX, TRAP and ROD shape + // Geometry manager makes no assumptions about units. So we must interpret here. + if (shapeType == "BOX" || shapeType == "ROD" || shapeType == "ROD2" || shapeType == "TRAP") { + phiWidth = m_mgr->width(ii); // in mm + } + + if (shapeType == "PGON" || shapeType == "PGON2" || + shapeType == "CONE" || shapeType == "CONS" || + shapeType == "PGON3" || shapeType == "PGON4") { + if ((rmin2 != param->rmin()) || (rmax2 != param->rmax())) { + needsRotation = true; + } + } + + int sides = 0; + int nCopies = 1; + if (shapeType == "PGON" || shapeType == "PGON2" || + shapeType == "PGON3" || shapeType == "PGON4") { + sides = repeat; + } else { + nCopies = repeat; + } + + // Force nCopies to 1 for TUBE and CONE + if (shapeType.empty() || shapeType == "TUBE" || shapeType == "CONE") { + nCopies = 1; + } + + param->setShapeType(shapeType); + param->setRmin2(rmin2); + param->setRmax2(rmax2); + param->setPhiLoc(phiStart); + param->setPhiWidth(phiWidth); + param->setSides(sides); + param->setNCopies(nCopies); + //param->setRadialDiv(radialDiv); + //param->setPhiStep(phiStep); + } + + param->setNeedsRotation(needsRotation); + + + // + // If zin is 0... (within 10^-5) this is a volume symmetric around + // the origin + // + if (std::abs(param->zmin()) < 0.000001) { + param->setZmin(-param->zmax()); + param->setZsymm(false); + } + + param->setLabel(m_label, volId); + + return param; + } +} // end namespace diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TopLevelPlacements.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TopLevelPlacements.cxx new file mode 100755 index 000000000..f7261834b --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TopLevelPlacements.cxx @@ -0,0 +1,123 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + +#include "TrackerGeoModelUtils/TopLevelPlacements.h" +#include "GaudiKernel/SystemOfUnits.h" +#include "RDBAccessSvc/IRDBRecordset.h" +#include "RDBAccessSvc/IRDBRecord.h" +#include <iostream> + +GeoTrf::Transform3D TopLevelPlacements::s_identityTransform = GeoTrf::Transform3D::Identity(); + +TopLevelPlacements::TopLevelPlacements(IRDBRecordset_ptr topLevelTable) + : m_noTopLevelTable(true) { + fillPlacements(topLevelTable); +} + +TopLevelPlacements::~TopLevelPlacements() { + std::map<std::string, Part*>::const_iterator iter; + for (iter = m_parts.begin(); iter != m_parts.end(); ++iter) delete iter->second; +} + +const GeoTrf::Transform3D& +TopLevelPlacements::transform(const std::string& partName) const { + Part* part = getPart(partName); + + if (part) return part->transform; + + return s_identityTransform; +} + +bool +TopLevelPlacements::present(const std::string& partName) const { + // If no table present assume everything is present. + if (m_noTopLevelTable) return true; + + return(getPart(partName) != 0); +} + +void +TopLevelPlacements::fillPlacements(IRDBRecordset_ptr topLevelTable) { + if (topLevelTable.get() == 0) { + m_noTopLevelTable = true; + return; + } + m_noTopLevelTable = false; + int numParts = topLevelTable->size(); + for (int i = 0; i < numParts; i++) { + const IRDBRecord* record = (*topLevelTable)[i]; + std::string label = record->getString("LABEL"); + + Part* part = new Part; + part->label = label; + part->transform = partTransform(record); + + m_parts[label] = part; + } +} + +GeoTrf::Transform3D +TopLevelPlacements::partTransform(const IRDBRecord* record) const { + double posX = record->getDouble("POSX") * Gaudi::Units::mm; + double posY = record->getDouble("POSY") * Gaudi::Units::mm; + double posZ = record->getDouble("POSZ") * Gaudi::Units::mm; + double rotX = record->getDouble("ROTX") * Gaudi::Units::degree; + double rotY = record->getDouble("ROTY") * Gaudi::Units::degree; + double rotZ = record->getDouble("ROTZ") * Gaudi::Units::degree; + int rotOrder = record->getInt("ROTORDER"); + + // Translation part + GeoTrf::Translate3D transform(posX, posY, posZ); + + // If rotation is zero return translation + if (rotX == 0 && rotY == 0 && rotZ == 0) { + return transform; + } + + // For rotation have to look at order. + // 123 means rotate around X, then Y , then Z. + // 312 means rotate around Z, then X , then Y. + // etc + + int ixyz1 = rotOrder / 100 - 1; + int ixyz2 = (rotOrder % 100) / 10 - 1; + int ixyz3 = (rotOrder % 10) - 1; + + if (ixyz1 < 0 || ixyz1 > 2 || + ixyz2 < 0 || ixyz2 > 2 || + ixyz3 < 0 || ixyz3 > 2) { + std::cout << "ERROR: Invalid rotation order:" << rotOrder << std::endl; + ixyz1 = 0; + ixyz2 = 1; + ixyz3 = 2; + } + + // List of the three transforms + GeoTrf::Transform3D* xformList[3] = { + 0, 0, 0 + }; + if (rotX != 0) xformList[0] = new GeoTrf::RotateX3D(rotX); + if (rotY != 0) xformList[1] = new GeoTrf::RotateY3D(rotY); + if (rotZ != 0) xformList[2] = new GeoTrf::RotateZ3D(rotZ); + + GeoTrf::Transform3D rotation(GeoTrf::Transform3D::Identity()); + if (xformList[ixyz1]) rotation = *(xformList[ixyz1]) * rotation; + if (xformList[ixyz2]) rotation = *(xformList[ixyz2]) * rotation; + if (xformList[ixyz3]) rotation = *(xformList[ixyz3]) * rotation; + + delete xformList[0]; + delete xformList[1]; + delete xformList[2]; + + return transform * rotation; +} + +TopLevelPlacements::Part* +TopLevelPlacements::getPart(const std::string& partName) const { + std::map<std::string, Part*>::const_iterator iter; + iter = m_parts.find(partName); + if (iter == m_parts.end()) return 0; + + return iter->second; +} diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TrackerDDAthenaComps.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TrackerDDAthenaComps.cxx new file mode 100755 index 000000000..254399ef2 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TrackerDDAthenaComps.cxx @@ -0,0 +1,35 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + +#include "TrackerGeoModelUtils/TrackerDDAthenaComps.h" + +namespace TrackerDD { + AthenaComps::AthenaComps(const std::string& msgStreamName) + : m_msg(msgStreamName), + m_detStore(0), + m_geoDbTagSvc(0), + m_rdbAccessSvc(0), + m_geometryDBSvc(0) + {} + + void + AthenaComps::setDetStore(StoreGateSvc* detStore) { + m_detStore = detStore; + } + + void + AthenaComps::setGeoDbTagSvc(IGeoDbTagSvc* geoDbTagSvc) { + m_geoDbTagSvc = geoDbTagSvc; + } + + void + AthenaComps::setRDBAccessSvc(IRDBAccessSvc* rdbAccessSvc) { + m_rdbAccessSvc = rdbAccessSvc; + } + + void + AthenaComps::setGeometryDBSvc(IGeometryDBSvc* geometryDBSvc) { + m_geometryDBSvc = geometryDBSvc; + } +} diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TrackerMaterialManager.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TrackerMaterialManager.cxx new file mode 100755 index 000000000..b67d834bb --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TrackerMaterialManager.cxx @@ -0,0 +1,1042 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + +#include "TrackerGeoModelUtils/TrackerMaterialManager.h" +#include "TrackerGeoModelUtils/TrackerDDAthenaComps.h" +#include "GeoModelInterfaces/AbsMaterialManager.h" +#include "GeoModelInterfaces/StoredMaterialManager.h" +#include "GeoModelKernel/GeoMaterial.h" +#include "GeoModelKernel/GeoElement.h" +#include "GeoModelKernel/Units.h" +#include "GaudiKernel/SystemOfUnits.h" +#include "RDBAccessSvc/IRDBRecordset.h" +#include "RDBAccessSvc/IRDBRecord.h" +#include "GeometryDBSvc/IGeometryDBSvc.h" +#include "StoreGate/StoreGateSvc.h" + +#include <iostream> +#include <iomanip> +#include <cmath> +#include <stdexcept> + +// Constructor +TrackerMaterialManager::TrackerMaterialManager(const std::string& managerName, + StoreGateSvc* detStore) + : m_managerName(managerName), + m_msg(managerName), + m_extraFunctionality(false), + m_athenaComps(0) { + m_materialManager = retrieveManager(detStore); +} + +// Constructor +TrackerMaterialManager::TrackerMaterialManager(const std::string& managerName, + StoreGateSvc* detStore, + IRDBRecordset_ptr weightTable, + const std::string& space, + bool extraFunctionality) + : m_managerName(managerName), + m_msg(managerName), + m_extraFunctionality(extraFunctionality), + m_athenaComps(0) { + m_materialManager = retrieveManager(detStore); + + if (weightTable) addWeightTable(weightTable, space); + + // For testing we add a few materials. + //m_weightMap["sct::CoolingBlock"] = MaterialByWeight(2.418*CLHEP::gram); + //m_weightMap["sct::CoolingBlock"] = MaterialByWeight(2*CLHEP::gram); + //m_weightMap["sct::BrlHybrid"] = MaterialByWeight("sct::Hybrid", 8*CLHEP::gram); + //m_weightMap["sct::FwdHybrid"] = MaterialByWeight("std::Carbon", 7.662*CLHEP::gram); +} + +TrackerMaterialManager::TrackerMaterialManager(const std::string& managerName, StoreGateSvc* detStore, + IRDBRecordset_ptr weightTable, + IRDBRecordset_ptr compositionTable, + const std::string& space) + : m_managerName(managerName), + m_msg(managerName), + m_extraFunctionality(true), + m_athenaComps(0) { + m_materialManager = retrieveManager(detStore); + + if (weightTable) addWeightTable(weightTable, space); + if (compositionTable) addCompositionTable(compositionTable, space); +} + +TrackerMaterialManager::TrackerMaterialManager(const std::string& managerName, + const TrackerDD::AthenaComps* athenaComps) + : m_managerName(managerName), + m_msg(managerName), + m_extraFunctionality(true), + m_athenaComps(athenaComps) { + m_materialManager = retrieveManager(athenaComps->detStore()); + addTextFileMaterials(); +} + +TrackerMaterialManager::~TrackerMaterialManager() { + // Dereference the materials. + MaterialStore::const_iterator iter; + for (iter = m_store.begin(); iter != m_store.end(); ++iter) { + iter->second->unref(); + } +} + +const AbsMaterialManager* +TrackerMaterialManager::retrieveManager(StoreGateSvc* detStore) { + const StoredMaterialManager* theGeoMaterialManager = nullptr; + + if (StatusCode::SUCCESS != detStore->retrieve(theGeoMaterialManager, "MATERIALS")) { + msg(MSG::FATAL) << "Cannot locate Materials"; + } + + return theGeoMaterialManager; +} + +const GeoElement* +TrackerMaterialManager::getElement(const std::string& elementName) const { + return m_materialManager->getElement(elementName); +} + +const GeoMaterial* +TrackerMaterialManager::getMaterial(const std::string& materialName) { + return extraScaledMaterial(materialName, getMaterialInternal(materialName)); +} + +bool +TrackerMaterialManager::hasMaterial(const std::string& materialName) const { + return m_store.find(materialName) != m_store.end(); +} + +const GeoMaterial* +TrackerMaterialManager::getMaterialInternal(const std::string& materialName) const { + // First check local store of materials. If not found then get it from the GeoModel + // manager. + const GeoMaterial* material = getAdditionalMaterial(materialName); + + if (!material) { + // This prints error message if not found. + material = m_materialManager->getMaterial(materialName); + } + return material; +} + +const GeoMaterial* +TrackerMaterialManager::getAdditionalMaterial(const std::string& materialName) const { + MaterialStore::const_iterator iter; + if ((iter = m_store.find(materialName)) != m_store.end()) { + return iter->second; + } else { + return 0; + } +} + +const GeoMaterial* +TrackerMaterialManager::getCompositeMaterialForVolume(const std::string& newMatName, + const double volumeTot, + const double volume1, const std::string& matName1, + const double volume2, const std::string& matName2 + ) { + std::vector<std::string> baseMaterials; + std::vector<double> fracWeight; + baseMaterials.reserve(2); + fracWeight.reserve(2); + + msg(MSG::DEBUG) << "Composite material : " << volumeTot / Gaudi::Units::cm3 << " = " << volume1 / Gaudi::Units::cm3 << " + " << + volume2 / Gaudi::Units::cm3 << endmsg; + msg(MSG::DEBUG) << "Composite material : " << matName1 << " " << matName2 << endmsg; + + double density1, density2; + + MaterialWeightMap::const_iterator iter; + if ((iter = m_weightMap.find(matName1)) != m_weightMap.end()) { + const GeoMaterial* mat1 = getMaterialForVolume(matName1, volume1); + density1 = mat1->getDensity(); + msg(MSG::DEBUG) << "Composite material 1 - weight : " << density1 / (GeoModelKernelUnits::gram / Gaudi::Units::cm3) << endmsg; + } else { + const GeoMaterial* mat1 = getMaterial(matName1); + density1 = mat1->getDensity(); + msg(MSG::DEBUG) << "Composite material 1 - standard : " << density1 / (GeoModelKernelUnits::gram / Gaudi::Units::cm3) << endmsg; + } + + if ((iter = m_weightMap.find(matName2)) != m_weightMap.end()) { + const GeoMaterial* mat2 = getMaterialForVolume(matName2, volume2); + density2 = mat2->getDensity(); + msg(MSG::DEBUG) << "Composite material 2 - weight : " << density2 / (GeoModelKernelUnits::gram / Gaudi::Units::cm3) << endmsg; + } else { + const GeoMaterial* mat2 = getMaterial(matName2); + density2 = mat2->getDensity(); + msg(MSG::DEBUG) << "Composite material 2 - standard : " << density2 / (GeoModelKernelUnits::gram / Gaudi::Units::cm3) << endmsg; + } + + double weight1 = density1 * volume1; + double weight2 = density2 * volume2; + double invWeightTot = 1.0 / (weight1 + weight2); + + double density = (weight1 + weight2) / volumeTot; + + double frac1 = weight1 / (weight1 + weight2); + double frac2 = weight2 / (weight1 + weight2); + double density_2 = 1.0 / (frac1 / density1 + frac2 / density2); + double density_3 = (weight1 + weight2) / (volume1 + volume2); + msg(MSG::DEBUG) << "-> weights : " << weight1 / (GeoModelKernelUnits::gram) << " " << weight2 / (GeoModelKernelUnits::gram) << endmsg; + msg(MSG::DEBUG) << "-> density : " << density / (GeoModelKernelUnits::gram / Gaudi::Units::cm3) << " " << density_2 / + (GeoModelKernelUnits::gram / Gaudi::Units::cm3) << " " << density_3 / (GeoModelKernelUnits::gram / Gaudi::Units::cm3) << endmsg; + + + baseMaterials.push_back(matName1); + baseMaterials.push_back(matName2); + fracWeight.push_back(weight1 * invWeightTot); + fracWeight.push_back(weight2 * invWeightTot); + + return getMaterial(newMatName, baseMaterials, fracWeight, density); +} + +// This creates a new material with specified density. + +// If a newName is supplied it creates the new material even if the orginal material +// has the same density. It however first checks if the material with NewName exists. + +// If no new name is supplied then it checks the density of +// the existing material. If it is consistent it returns the material. +// If it is different it creates a material with the string "Modified" added to the +// name. + + +const GeoMaterial* +TrackerMaterialManager::getMaterial(const std::string& origMaterialName, + double density, + const std::string& newName) { + return extraScaledMaterial(origMaterialName, newName, + getMaterialInternal(origMaterialName, density, newName)); +} + +const GeoMaterial* +TrackerMaterialManager::getMaterialInternal(const std::string& origMaterialName, + double density, + const std::string& newName) { + std::string newName2 = newName; + bool newNameProvided = !newName2.empty(); + if (!newNameProvided) { + newName2 = origMaterialName + "Modified"; + } + + const GeoMaterial* newMaterial = 0; + + // First see if we already have the modified material + const GeoMaterial* material = getAdditionalMaterial(newName2); + if (material) { + if (!compareDensity(material->getDensity(), density)) { + msg(MSG::WARNING) << "Density is not consistent for material " << newName2 + << " " << material->getDensity() / (GeoModelKernelUnits::gram / Gaudi::Units::cm3) + << " / " << density / (GeoModelKernelUnits::gram / Gaudi::Units::cm3) << endmsg; + } + newMaterial = material; + } else { + const GeoMaterial* origMaterial = getMaterialInternal(origMaterialName); + newMaterial = origMaterial; + if (origMaterial) { + // If no new name was provided we check if the density is compatible + // and if so we return the original material. + if (newNameProvided || !compareDensity(origMaterial->getDensity(), density)) { + // create new material + GeoMaterial* newMaterialTmp = new GeoMaterial(newName2, density); + newMaterialTmp->add(const_cast<GeoMaterial*>(origMaterial), 1.); + addMaterial(newMaterialTmp); + newMaterial = newMaterialTmp; + } + } + } + return newMaterial; +} + +const GeoMaterial* +TrackerMaterialManager::getMaterialScaled(const std::string& origMaterialName, + double scaleFactor, + const std::string& newName) { + return extraScaledMaterial(origMaterialName, newName, + getMaterialScaledInternal(origMaterialName, scaleFactor, newName)); +} + +const GeoMaterial* +TrackerMaterialManager::getMaterialScaledInternal(const std::string& origMaterialName, + double scaleFactor, + const std::string& newName) { + // Don't allow large scale factors + if (scaleFactor > 1000 || scaleFactor < 0.001) { + msg(MSG::ERROR) << "Scale factor must be between 0.001 and 1000." << endmsg; + return 0; + } + + const GeoMaterial* origMaterial = getMaterialInternal(origMaterialName); + + // If scalefactor is 1 and no new name is requested + // then just return the orginal material + if (newName.empty() && scaleFactor == 1.) return origMaterial; + + const GeoMaterial* newMaterial = 0; + + if (origMaterial) { + double density = origMaterial->getDensity() * scaleFactor; + std::string newName2 = newName; + if (newName2.empty()) { + // Create name using the scale factor. + int scaleInt = static_cast<int>(scaleFactor * 10000); + int scale1 = scaleInt / 10000; + int scale2 = scaleInt % 10000; + + std::ostringstream os; + os << origMaterialName << scale1 << "_" << std::setw(4) << std::setfill('0') << scale2; + newName2 = os.str(); + } + + newMaterial = getMaterialInternal(origMaterialName, density, newName2); + } + + return newMaterial; +} + +void +TrackerMaterialManager::addMaterial(GeoMaterial* material) { + std::string name(material->getName()); + if (m_store.find(name) != m_store.end()) { + msg(MSG::WARNING) << "Ignoring attempt to redefine an existing material: " << name << endmsg; + // Delete the material if it is not already ref counted. + material->ref(); + material->unref(); + //std::cout << m_store[name] << std::endl; + } else { + material->lock(); + material->ref(); + m_store[name] = material; + + if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Created new material: " << name << ", " << material->getDensity() / + (Gaudi::Units::g / Gaudi::Units::cm3) << " g/cm3" << endmsg; + } +} + +bool +TrackerMaterialManager::compareDensity(double d1, double d2) const { + return(std::abs(d1 / d2 - 1.) < 1e-5); +} + +void +TrackerMaterialManager::addWeightTable(IRDBRecordset_ptr weightTable, const std::string& space) { + if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Reading in weight table: " << weightTable->nodeName() << endmsg; + // If not using geometryDBSvc revert to old version + if (!db()) { + if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "GeometryDBSvc not available. Using old version." << endmsg; + addWeightTableOld(weightTable, space); + return; + } + for (unsigned int i = 0; i < db()->getTableSize(weightTable); i++) { + std::string materialName = db()->getString(weightTable, "MATERIAL", i); + if (!space.empty()) { + materialName = space + "::" + materialName; + } + std::string materialBase; + if (db()->testField(weightTable, "BASEMATERIAL", i)) { + materialBase = db()->getString(weightTable, "BASEMATERIAL", i); + } + double weight = db()->getDouble(weightTable, "WEIGHT", i) * GeoModelKernelUnits::gram; + //std::cout << materialName << " " << materialBase << " " << weight/CLHEP::g << std::endl; + + bool linearWeightFlag = false; + if (m_extraFunctionality && db()->testField(weightTable, "LINWEIGHTFLAG", i)) { + linearWeightFlag = db()->getInt(weightTable, "LINWEIGHTFLAG", i); + } + + if (m_weightMap.find(materialName) != m_weightMap.end()) { + msg(MSG::WARNING) << "Material: " << materialName << " already exists in weight table" << endmsg; + } else { + msg(MSG::DEBUG) << "Adding " << materialName + << " weight " << weight + << " linearWeightFlag " << linearWeightFlag + << " raw weight " << db()->getDouble(weightTable, "WEIGHT", i) + << " m_extraFunctionality " << m_extraFunctionality + << " to weight table" << endmsg; + m_weightMap[materialName] = MaterialByWeight(materialBase, weight, linearWeightFlag); + } + } +} + +void +TrackerMaterialManager::addWeightMaterial(std::string materialName, std::string materialBase, double weight, + int linearWeightFlag) { + // Weight in gr + weight = weight * GeoModelKernelUnits::gram; + + if (m_weightMap.find(materialName) != m_weightMap.end()) { + msg(MSG::WARNING) << "Material: " << materialName << " already exists in weight table" << endmsg; + } else { + msg(MSG::DEBUG) << "Adding " << materialName + << " weight " << weight + << " linearWeightFlag " << linearWeightFlag + << " to weight table" << endmsg; + m_weightMap[materialName] = MaterialByWeight(materialBase, weight, linearWeightFlag); + } +} + +void +TrackerMaterialManager::addWeightTableOld(IRDBRecordset_ptr weightTable, const std::string& space) { + for (unsigned int i = 0; i < weightTable->size(); i++) { + const IRDBRecord* record = (*weightTable)[i]; + std::string materialName = record->getString("MATERIAL"); + if (!space.empty()) { + materialName = space + "::" + materialName; + } + std::string materialBase; + if (!record->isFieldNull("BASEMATERIAL")) { + materialBase = record->getString("BASEMATERIAL"); + } + double weight = record->getDouble("WEIGHT") * GeoModelKernelUnits::gram; + //std::cout << materialName << " " << materialBase << " " << weight/CLHEP::g << std::endl; + + bool linearWeightFlag = false; + if (m_extraFunctionality) { + linearWeightFlag = record->getInt("LINWEIGHTFLAG"); + } + + if (m_weightMap.find(materialName) != m_weightMap.end()) { + msg(MSG::WARNING) << "Material: " << materialName << " already exists in weight table" << endmsg; + } else { + m_weightMap[materialName] = MaterialByWeight(materialBase, weight, linearWeightFlag); + } + } +} + +void +TrackerMaterialManager::addCompositionTable(IRDBRecordset_ptr compositionTable, const std::string& space) { + if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Reading in composition table: " << compositionTable->nodeName() << endmsg; + + if (!db()) { + msg(MSG::ERROR) << "GeometryDBSvc not available. Unable to read in composition table." << endmsg; + } + for (unsigned int i = 0; i < db()->getTableSize(compositionTable); i++) { + std::string materialName = db()->getString(compositionTable, "MATERIAL", i); + if (!space.empty()) { + materialName = space + "::" + materialName; + } + + std::string componentName = db()->getString(compositionTable, "COMPONENT", i); + int count = db()->getInt(compositionTable, "COUNT", i); + double factor = db()->getDouble(compositionTable, "FACTOR", i); + double actualLength = db()->getDouble(compositionTable, "ACTUALLENGTH", i); + + m_matCompositionMap.insert(std::pair<std::string, MaterialComponent>(materialName, + MaterialComponent(componentName, + count * factor, + actualLength))); + } +} + +void +TrackerMaterialManager::addScalingTable(IRDBRecordset_ptr scalingTable) { + if (!scalingTable) return; + + if (db()->getTableSize(scalingTable) == 0) return; + + if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Reading in extra material scaling table: " << scalingTable->nodeName() << + endmsg; + if (!db()) { + msg(MSG::ERROR) << "GeometryDBSvc not available. Unable to read in scaling table." << endmsg; + } + for (unsigned int i = 0; i < db()->getTableSize(scalingTable); i++) { + std::string materialName = db()->getString(scalingTable, "MATERIAL", i); + double scalingFactor = db()->getDouble(scalingTable, "FACTOR", i); + + if (msgLvl(MSG::DEBUG)) { + if (scalingFactor >= 0 || scalingFactor == 1) { + msg(MSG::DEBUG) << "Material " << materialName << " will be scaled by: " << scalingFactor << endmsg; + } else { + // -ve or scalefactor = 1 means will not be scaled. + msg(MSG::DEBUG) << "Material " << materialName << " will be NOT be scaled." << endmsg; + } + } + if (m_scalingMap.find(materialName) != m_scalingMap.end()) { + msg(MSG::WARNING) << "Overriding material: " << materialName << " which already exists in scaling table" << + endmsg; + } + m_scalingMap[materialName] = scalingFactor; + } +} + +const GeoMaterial* +TrackerMaterialManager::getMaterialForVolume(const std::string& materialName, double volume, const std::string& newName) { + // Make sure we have a valid volume size. + if (volume <= 0) { + msg(MSG::ERROR) << "Invalid volume : " << volume << endmsg; + return 0; + } + + // Find if material is in the weight table. + // If so we use the information to create a material with the + // density calculated from the volume and weight. If a base material + // is specified in the weight table, then a new material is made + // which is the same as the base material but with the new + // density. If no base material is specified then there should be a + // material already existing with that name. If the existing material already has the + // correct density it is used, otherwise a new material is created + // with the string "Modified" added to the material name. + + MaterialWeightMap::const_iterator iter; + if ((iter = m_weightMap.find(materialName)) != m_weightMap.end()) { + const std::string& materialBase = iter->second.name; + double weight = iter->second.weight; + double density = weight / volume; + if (iter->second.linearWeightFlag) { + msg(MSG::ERROR) << "Material defined by linear weight cannot be created with getMaterialForVolume method: " << + materialName << endmsg; + } + + if (msgLvl(MSG::VERBOSE)) { + msg(MSG::VERBOSE) + << + "Found material in weight table - name, base, weight(g), volume(cm3), density(g/cm3): " + << materialName << ", " + << materialBase << ", " + << weight / GeoModelKernelUnits::gram << ", " + << volume / Gaudi::Units::cm3 << ", " + << density / (Gaudi::Units::g / Gaudi::Units::cm3) << endmsg; + } + + if (materialBase.empty()) { + return getMaterial(materialName, density, newName); + } else { + if (newName.empty()) { + return getMaterial(materialBase, density, materialName); + } else { + return getMaterial(materialBase, density, newName); + } + } + } else { + // If not in the weight table we just return the material. + // This is not an error. + if (msgLvl(MSG::VERBOSE)) + msg(MSG::VERBOSE) + << "Material not in weight table, using standard material: " + << materialName + << ", volume(cm3) = " << volume / Gaudi::Units::cm3 + << endmsg; + return getMaterial(materialName); + } +} + +const GeoMaterial* +TrackerMaterialManager::getMaterialForVolumeLength(const std::string& materialName, double volume, double length, + const std::string& newName) { + // In the case there is no material composition table (MaterialCompositionMap) and no linear weights are used this + // will + // behave the same way as getMaterialForVolume. + // If the material is in the MaterialCompositionMap it will build a material using the components + // from that table. If any components are defined as a linear weight the length is used to calculate the + // weight (ie linear weight * length). + + + std::string name; + if (newName.empty()) { + name = materialName; + } else { + name = newName; + } + + // Make sure we have a valid volume size. + if (volume <= 0 || length <= 0) { + msg(MSG::ERROR) << "Invalid volume or length : " << volume << ", " << length << endmsg; + return 0; + } + + // First look in the predefinded collections + std::pair<MaterialCompositionMap::const_iterator, MaterialCompositionMap::const_iterator> iterRange; + iterRange = m_matCompositionMap.equal_range(materialName); + if (iterRange.first != m_matCompositionMap.end()) { + if (msgLvl(MSG::VERBOSE)) { + msg(MSG::VERBOSE) + << "Found material in material composition table:" << materialName << endmsg; + } + + std::vector<double> factors; + std::vector<std::string> components; + for (MaterialCompositionMap::const_iterator iter = iterRange.first; iter != iterRange.second; iter++) { + double factorTmp = iter->second.factor; + if (iter->second.actualLength > 0) factorTmp *= iter->second.actualLength / length; + factors.push_back(factorTmp); + components.push_back(iter->second.name); + } + return getMaterialForVolumeLength(name, components, factors, volume, length); + } + + // Next look in weight table + MaterialWeightMap::const_iterator iter; + if ((iter = m_weightMap.find(materialName)) != m_weightMap.end()) { + const std::string& materialBase = iter->second.name; + double weight = iter->second.weight; + double density = weight / volume; + if (iter->second.linearWeightFlag) weight *= length; + + if (materialBase.empty()) { + return getMaterial(materialName, density, newName); + } else { + return getMaterial(materialBase, density, name); + } + } else { + // Otherwise we just return the material. + // This is not an error. + if (msgLvl(MSG::VERBOSE)) + msg(MSG::VERBOSE) + << "Material not in weight table, using standard material: " + << materialName + << ", volume(cm3) = " << volume / Gaudi::Units::cm3 + << endmsg; + return getMaterial(materialName); + } +} + +const GeoMaterial* +TrackerMaterialManager::getMaterialForVolumeLength(const std::string& name, + const std::string& materialComponent, + double factor, + double volume, + double length) { + std::vector<std::string> tmpMaterialComponents(1, materialComponent); + std::vector<double> tmpFactors(1, factor); + return getMaterialForVolumeLength(name, tmpMaterialComponents, tmpFactors, volume, length); +} + +const GeoMaterial* +TrackerMaterialManager::getMaterialForVolumeLength(const std::string& name, + const std::vector<std::string>& materialComponents, + const std::vector<double> factors, + double volume, + double length) { + // Make sure we have a valid volume size. + if (volume <= 0 || length <= 0) { + msg(MSG::ERROR) << "Invalid volume or length : " << volume << ", " << length << endmsg; + return 0; + } + + if (!factors.empty() && factors.size() < materialComponents.size()) { + msg(MSG::WARNING) << "getMaterialForVolumeLength: factor vector size too small. Setting remaining factors to 1." << + endmsg; + } + + std::vector<std::string> baseMaterials; + std::vector<double> fracWeight; + baseMaterials.reserve(materialComponents.size()); + fracWeight.reserve(materialComponents.size()); + + double totWeight = 0; + for (unsigned int iComp = 0; iComp < materialComponents.size(); ++iComp) { + const std::string& materialName = materialComponents[iComp]; + + // First search in MaterialWeightMap + MaterialWeightMap::const_iterator iter; + if ((iter = m_weightMap.find(materialName)) != m_weightMap.end()) { + const std::string& materialBase = iter->second.name; + double weight = iter->second.weight; + + if (iComp < factors.size()) { + weight *= factors[iComp]; + } + msg(MSG::DEBUG) << "Material " << materialName + << " found in weight table, weight " << iter->second.weight / GeoModelKernelUnits::gram + << " factor " << factors[iComp] + << " w*fac*len " << weight * length / GeoModelKernelUnits::gram + << " basMat " << materialBase + << " linear? " << iter->second.linearWeightFlag << endmsg; + + if (iter->second.linearWeightFlag) weight *= length; + if (materialBase.empty()) { + // If no base material then name should refer to an already defined material + baseMaterials.push_back(materialName); + } else { + baseMaterials.push_back(materialBase); + } + fracWeight.push_back(weight); // Will be normalized later. + totWeight += weight; + } else { + // If not in the weight table we look for a regular material. + // I don't think this would normally be intentional so we give a warning message. + /* + if (msgLvl(MSG::WARNING)) + msg(MSG::WARNING) + << "Component material not in weight table, using standard material: " + << materialName << " with weight= " + << factors.at(iComp) * length + << endmsg; + const GeoMaterial * material = getMaterialInternal(materialName); + */ + + // In this case the factor should correspond to the linear weight + double weight = factors.at(iComp) * length * GeoModelKernelUnits::gram; + + // If material not found, will get error message when attempting to make the material. So carry on here. + baseMaterials.push_back(materialName); + fracWeight.push_back(weight); + totWeight += weight; + } + } + + if (msgLvl(MSG::VERBOSE)) { + msg(MSG::VERBOSE) << "Creating material from multiple components: " << name << endmsg; + for (unsigned int i = 0; i < materialComponents.size(); ++i) { + msg(MSG::VERBOSE) << " Component " << i << ": Name = " << baseMaterials[i] + << " Weight(g) = " << fracWeight[i] / Gaudi::Units::g << endmsg; + } + } + + for (unsigned int i = 0; i < fracWeight.size(); ++i) { + fracWeight[i] /= totWeight; + } + double density = totWeight / volume; + + return getMaterial(name, baseMaterials, fracWeight, density); +} + +// Add materials assuming they simply occupy the same volume. +/* + const GeoMaterial* + TrackerMaterialManager::getMaterial(const std::vector<const GeoMaterial *> & materialComponents, + const std::string & newName) + { + const GeoMaterial * newMaterial = 0; + std::vector<double> fracWeight; + fracWeight.reserve(materialComponents.size()); + + for (unsigned int i = 0; i < materialComponents.size(); i++) { + const GeoMaterial * origMaterial = materialComponents[i]; + double weight = origMaterial->getDensity(); + fracWeight.push_back(weight); + totWeight += weight; + } + for (unsigned int i = 0; i < fracWeight.size(); ++i) { + fracWeight[i] /= totWeight; + } + return getMaterial(materialComponents, fracWeight, totWeight, newName); + } + + const GeoMaterial* + TrackerMaterialManager::getMaterial(const std::vector<std::string> & materialComponents, + const std::string & newName) + { + const GeoMaterial * newMaterial = 0; + + // First see if we already have the modified material + const GeoMaterial* material = getAdditionalMaterial(newName); + + for (unsigned int i = 0; i < materialComponents.size(); i++) { + const GeoMaterial * origMaterial = getMaterial(materialComponents[i]); + components.push_back(origMaterial); + } + return getMaterial(components, newName); + } + */ + + +const GeoMaterial* +TrackerMaterialManager::getMaterial(const std::string& name, + const std::vector<std::string>& materialComponents, + const std::vector<double>& fracWeight, + double density) { + return extraScaledMaterial(name, getMaterialInternal(name, materialComponents, fracWeight, density)); +} + +const GeoMaterial* +TrackerMaterialManager::getMaterialInternal(const std::string& name, + const std::vector<std::string>& materialComponents, + const std::vector<double>& fracWeight, + double density) { + const GeoMaterial* newMaterial = 0; + + // First see if we already have the material + const GeoMaterial* material = getAdditionalMaterial(name); + + if (material) { + if (!compareDensity(material->getDensity(), density)) { + msg(MSG::WARNING) << "Density is not consistent for material " << name << endmsg; + } + newMaterial = material; + } else { + GeoMaterial* newMaterialTmp = new GeoMaterial(name, density); + for (unsigned int i = 0; i < materialComponents.size(); i++) { + const GeoMaterial* origMaterial = getMaterialInternal(materialComponents[i]); + if (origMaterial) { + newMaterialTmp->add(const_cast<GeoMaterial*>(origMaterial), fracWeight[i]); + } else { + msg(MSG::ERROR) << "Material component missing " << materialComponents[i] << endmsg; + } + } + addMaterial(newMaterialTmp); + newMaterial = newMaterialTmp; + } + return newMaterial; +} + +const IGeometryDBSvc* +TrackerMaterialManager::db() { + if (m_athenaComps) return m_athenaComps->geomDB(); + + return 0; +} + +void +TrackerMaterialManager::addTextFileMaterials() { + const std::string materialTable = "ExtraMaterials"; + const std::string componentsTable = "ExtraMatComponents"; + + // Look for tables ExtraMaterials and ExtraMatComponents. + // These are text file only tables where extra materials are desired or + // one wants to override some database ones. + if (!db() || !db()->testField("", "TableSize:" + materialTable) || !db()->getTableSize(materialTable) + || !db()->testField("", "TableSize:" + componentsTable) || !db()->getTableSize(componentsTable)) return; + + + msg(MSG::INFO) << "Extra materials being read in from text file." << endmsg; + + typedef std::map<std::string, MaterialDef> MatMap; + MatMap materials; + + // read in material table + for (unsigned int iMat = 0; iMat < db()->getTableSize(materialTable); iMat++) { + std::string materialName = db()->getString(materialTable, "NAME", iMat); + double density = db()->getDouble(materialTable, "DENSITY", iMat) * Gaudi::Units::g / Gaudi::Units::cm3; + materials[materialName] = MaterialDef(materialName, density); + } + + // read in material component table + for (unsigned int iComp = 0; iComp < db()->getTableSize(componentsTable); iComp++) { + std::string materialName = db()->getString(componentsTable, "NAME", iComp); + std::string compName = db()->getString(componentsTable, "COMPNAME", iComp); + double fracWeight = db()->getDouble(componentsTable, "FRACTION", iComp); + MatMap::iterator iter = materials.find(materialName); + if (iter != materials.end()) { + iter->second.addComponent(compName, fracWeight); + } else { + msg(MSG::ERROR) << "Attemp to add material component, " << compName << ", to non-existing material: " << + materialName << endmsg; + } + } + + //Now create the materials + int matCount = 0; + int matCountLast = -1; + bool someUndefined = true; + // While there are still undefined materials keep creating materials. + // Check also that the matCount had change to avoid endless loop due to cyclicly + // defined materials. + while (someUndefined && matCount != matCountLast) { + matCountLast = matCount; + someUndefined = false; + for (MatMap::iterator iter = materials.begin(); iter != materials.end(); ++iter) { + MaterialDef& tmpMat = iter->second; + if (!tmpMat.isCreated()) { + // Check if any components are materials in this table and if they are defined. + // If not flag that there are undefined materials and go to next material + bool compsDefined = true; + for (unsigned int iComp = 0; iComp < tmpMat.numComponents(); ++iComp) { + std::string compName = tmpMat.compName(iComp); + MatMap::iterator iter2 = materials.find(compName); + if (iter2 != materials.end()) { + if (!iter2->second.isCreated()) { + compsDefined = false; + break; + } + } + } + if (compsDefined) { + createMaterial(tmpMat); + tmpMat.setCreated(); + matCount++; + } else { + someUndefined = true; + } + } + } + } + + + if (someUndefined) { + msg(MSG::ERROR) << "Not all materials could be defined due to cyclic definitions" << endmsg; + } +} + +void +TrackerMaterialManager::createMaterial(const MaterialDef& material) { + if (material.numComponents() == 0) { + msg(MSG::ERROR) << "Material has no components: " << material.name() << endmsg; + return; + } + + // If total of fractions is greater than 1.1 then assume material is define by ratio of atoms. + double totWeight = material.totalFraction(); + bool byAtomicRatio = false; + if (totWeight > 1.1) { + byAtomicRatio = true; + for (unsigned int i = 0; i < material.numComponents(); i++) { + if (material.compName(i).find("::") != std::string::npos) { + // If component name has "::" in it then its not an element. + msg(MSG::ERROR) << "Material, " << material.name() + << + ", is assumed to be defined by atomic ratio (due to total fraction > 1) but component is not an element: " + << material.compName(i) << endmsg; + return; + } + const GeoElement* element = getElement(material.compName(i)); + if (!element) { + msg(MSG::ERROR) << "Error making material " << material.name() << ". Element not found: " << + material.compName(i) << endmsg; + return; + } + totWeight += material.fraction(i) * element->getA(); + } + } else { + // Check if total fraction is close to 1. + if (std::abs(totWeight - 1) > 0.01) { + msg(MSG::WARNING) << "Total fractional weight does not sum to 1. Will renormalize. Total = " << totWeight << + endmsg; + } + } + // Now build the material + GeoMaterial* newMaterial = new GeoMaterial(material.name(), material.density()); + if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Creating material: " << material.name() + << " with density: " << material.density() / (Gaudi::Units::g / Gaudi::Units::cm3) << + endmsg; + for (unsigned int i = 0; i < material.numComponents(); i++) { + double fracWeight = material.fraction(i) / totWeight; + if (material.compName(i).find("::") == std::string::npos) { + const GeoElement* element = getElement(material.compName(i)); + if (!element) { + msg(MSG::ERROR) << "Error making material " << material.name() << ". Element not found: " << + material.compName(i) << endmsg; + // delete the partially created material + newMaterial->ref(); + newMaterial->unref(); + return; + } + if (byAtomicRatio) { + fracWeight = material.fraction(i) * element->getA() / totWeight; + } + newMaterial->add(const_cast<GeoElement*>(element), fracWeight); + if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " Component: " << material.compName(i) << " " << fracWeight << endmsg; + } else { + const GeoMaterial* materialTmp = getMaterialInternal(material.compName(i)); + if (!materialTmp) { + msg(MSG::ERROR) << "Error making material " << material.name() << ". Component not found: " << + material.compName(i) << endmsg; + // delete the partially created material + newMaterial->ref(); + newMaterial->unref(); + return; + } + if (byAtomicRatio) { + // Should not happen as already checked that all components were elements. + msg(MSG::ERROR) << "Unexpected Error" << endmsg; + } + newMaterial->add(const_cast<GeoMaterial*>(materialTmp), fracWeight); + if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " Component: " << material.compName(i) << " " << fracWeight << endmsg; + } + } + newMaterial->lock(); + addMaterial(newMaterial); +} + +TrackerMaterialManager::MaterialDef::MaterialDef() + : m_density(0), + m_created(false) +{} + +TrackerMaterialManager::MaterialDef::MaterialDef(const std::string& name, double density) + : m_name(name), + m_density(density), + m_created(false) +{} + +void +TrackerMaterialManager::MaterialDef::addComponent(const std::string& compName, double fraction) { + m_components.push_back(compName); + m_fractions.push_back(fraction); +} + +double +TrackerMaterialManager::MaterialDef::totalFraction() const { + double sum = 0; + + for (unsigned int i = 0; i < m_fractions.size(); i++) { + sum += m_fractions[i]; + } + return sum; +} + +// We need the original name as the GeoMaterial from the standard +// material manager has its namespace dropped. We have two versions +// of extraScaledMaterial. One where two names are provided. In this +// version if newName is not empty that is used, otherwise +// materialName is used. The other just has one name and that is the +// one that is used. + +const GeoMaterial* +TrackerMaterialManager::extraScaledMaterial(const std::string& materialName, + const std::string& newName, + const GeoMaterial* origMaterial) { + if (newName.empty()) { + return extraScaledMaterial(materialName, origMaterial); + } else { + return extraScaledMaterial(newName, origMaterial); + } +} + +const GeoMaterial* +TrackerMaterialManager::extraScaledMaterial(const std::string& materialName, const GeoMaterial* origMaterial) { + if (!origMaterial) throw std::runtime_error(std::string("Invalid material: ") + materialName); + + double scaleFactor = getExtraScaleFactor(materialName); + // -1 (or any -ve number) indicates material is not scaled. And if the scale factor + // is 1 then there is no need to create a new material. + if (scaleFactor < 0 || scaleFactor == 1 || materialName.find("Ether") != std::string::npos) return origMaterial; + + if (scaleFactor == 0) return getMaterialInternal("std::Vacuum"); + + std::string newName = materialName + "_ExtraScaling"; + + // Check if it is already made. + const GeoMaterial* newMaterial = getAdditionalMaterial(newName); + + // Already made so we return it. + if (newMaterial) return newMaterial; + + // Otherwise we need to make it. + double density = origMaterial->getDensity() * scaleFactor; + + // create new material + GeoMaterial* newMaterialTmp = new GeoMaterial(newName, density); + newMaterialTmp->add(const_cast<GeoMaterial*>(origMaterial), 1.); + addMaterial(newMaterialTmp); + newMaterial = newMaterialTmp; + + return newMaterial; +} + +double +TrackerMaterialManager::getExtraScaleFactor(const std::string& materialName) { + // If name is found in map we return the corresponding scale factor. + // The special name "ALL" indicates all materials are scaled. + // Individual materials can be excluded from scaling by giving either + // a -ve scaling factor or just specifying a scaling factor of 1. + // A scaling factor of 0 means the material will be replaced by vacuum. + + ExtraScaleFactorMap::const_iterator iter = m_scalingMap.find(materialName); + if (iter != m_scalingMap.end()) { + return iter->second; + } else { + // Check for special names + // ALL means everything scaled. Do not scale air or vacuum (unless explicity requested) + iter = m_scalingMap.find("ALL"); + if (iter != m_scalingMap.end() && materialName != "std::Air" && materialName != "std::Vacuum") { + return iter->second; + } + } + + // If not found then return -1 to indicate material is not to be scaled. + return -1; +} diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TubeVolData.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TubeVolData.cxx new file mode 100755 index 000000000..958532bb6 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/TubeVolData.cxx @@ -0,0 +1,101 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + +#include "TrackerGeoModelUtils/TubeVolData.h" +#include "RDBAccessSvc/IRDBRecord.h" +#include "GaudiKernel/SystemOfUnits.h" + +#include <cmath> +#include <string> +#include <iostream> + +namespace TrackerDD { + std::string + TubeVolData::material() const { + return m_record->getString("MATERIAL"); + } + + double + TubeVolData::maxRadius() const { + return std::max(m_rmax1, m_rmax2); + } + + TubeVolData::TubeVolData(const IRDBRecord* record) + : m_record(record), + m_bothZ(false), + m_nRepeat(0), + m_radialDiv(0), + m_phiStart(0.), + m_phiDelta(0.), + m_phiStep(0.), + m_rmin1(0.), + m_rmin2(0.), + m_rmax1(0.), + m_rmax2(0.), + m_length(0.), + m_zMid(0.) { + // add an 2*epsilon gap between phi sectors. + const double phiepsilon = 0.001 * Gaudi::Units::degree; + + bool fullPhiSector = false; + + + // Get the parameters which we need to do some preprocessing with. + // The rest are obtained directly from RDB. + + if (m_record) { + m_phiStart = m_record->getDouble("PHISTART") * Gaudi::Units::degree; + m_phiDelta = m_record->getDouble("PHIDELTA") * Gaudi::Units::degree; + m_phiStep = m_record->getDouble("PHISTEP") * Gaudi::Units::degree; + m_nRepeat = m_record->getInt("NREPEAT"); + m_rmin1 = m_record->getDouble("RMIN") * Gaudi::Units::mm; + m_rmax1 = m_record->getDouble("RMAX") * Gaudi::Units::mm; + m_rmin2 = m_record->getDouble("RMIN2") * Gaudi::Units::mm; + m_rmax2 = m_record->getDouble("RMAX2") * Gaudi::Units::mm; + m_radialDiv = 0; + if (!m_record->isFieldNull("RADIAL")) { + m_radialDiv = m_record->getInt("RADIAL"); + } + m_bothZ = 0; + if (!m_record->isFieldNull("ZSYMM")) { + m_bothZ = m_record->getInt("ZSYMM"); + } + + double zmin = m_record->getDouble("ZMIN") * Gaudi::Units::mm; + double zmax = m_record->getDouble("ZMAX") * Gaudi::Units::mm; + m_length = std::abs(zmax - zmin); + m_zMid = 0.5 * (zmin + zmax); + + if (m_phiDelta == 0 || m_phiDelta >= 359.9 * Gaudi::Units::degree) { + m_phiDelta = 360 * Gaudi::Units::degree; + fullPhiSector = true; + } else { + m_phiDelta -= 2 * phiepsilon; + m_phiStart += phiepsilon; + } + + // Force nRepeat to be >= 1; + if (m_nRepeat <= 0) m_nRepeat = 1; + // if PHISTEP==0 then set it to be equi-distant steps filling up phi. + if (m_phiStep == 0) { + m_phiStep = 360 * Gaudi::Units::degree / m_nRepeat; + } + + if (m_rmin2 <= 0) m_rmin2 = m_rmin1; + if (m_rmax2 <= 0) m_rmax2 = m_rmax1; + + if (m_radialDiv > 0) { + m_shape = TubeVolData::RADIAL; + } else if (m_rmin1 == m_rmin2 && m_rmax1 == m_rmax2) { + if (fullPhiSector) { + m_shape = TubeVolData::TUBE; + } else { + m_shape = TubeVolData::TUBS; + } + } else { + m_shape = TubeVolData::CONS; + } + } else std::cout << "Unexpected ERROR in ExtraMaterial!" << std::endl; + } +} // end namespace diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/VolumeBuilder.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/VolumeBuilder.cxx new file mode 100755 index 000000000..61b0460fc --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/VolumeBuilder.cxx @@ -0,0 +1,393 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + +#include "TrackerGeoModelUtils/VolumeBuilder.h" +#include "TrackerGeoModelUtils/ServiceVolume.h" +#include "TrackerGeoModelUtils/TrackerMaterialManager.h" +#include "GeoPrimitives/GeoPrimitives.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoFullPhysVol.h" +#include "GeoModelKernel/GeoMaterial.h" +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoDefinitions.h" +#include "GaudiKernel/SystemOfUnits.h" + +namespace TrackerDD { + VolumeBuilder::VolumeBuilder(const Zone& zone, const std::vector<const ServiceVolume* >& services) + : m_msg("TrackerDDVolumeBuilder"), + m_region("None"), // Empty refers to a valid region. Set some default so we can check it is actually set. + m_zcenter(0), + m_services(0), + m_servEnvelope(0), + m_servChild(0), + m_matManager(0) { + m_splitter.splitAll(zone, services); + } + + VolumeBuilder::VolumeBuilder(const std::vector<const ServiceVolume* >& services) + : m_msg("TrackerDDVolumeBuilder"), + m_region("None"), // Empty refers to a valid region. Set some default so we can check it is actually set. + m_zcenter(0), + m_services(&services), + m_servEnvelope(0), + m_servChild(0), + m_matManager(0) + {} + + VolumeBuilder::VolumeBuilder(const Zone& zone, const std::vector<const ServiceVolume* >& services, + const std::vector<const ServiceVolume* >& servEnvelope, + const std::vector<const ServiceVolume* >& servChild) + : m_msg("TrackerDDVolumeBuilder"), + m_region("None"), // Empty refers to a valid region. Set some default so we can check it is actually set. + m_zcenter(0), + m_services(0), + m_servEnvelope(&servEnvelope), + m_servChild(&servChild), + m_matManager(0) { + m_splitter.splitAll(zone, services); + } + + void + VolumeBuilder::addServices(const Zone& zone, const std::vector<const ServiceVolume* >& services) { + m_splitter.splitAll(zone, services); + } + + void + VolumeBuilder::setRegion(const std::string& region, double zcenter) { + m_region = region; + m_zcenter = zcenter; + } + + const std::vector<const ServiceVolume* >& + VolumeBuilder::services() { + // Return volumes defined in VolumeSplitter + if (m_services) return *m_services; + return m_splitter.getVolumes(); + } + + const std::vector<const ServiceVolume* >& + VolumeBuilder::servicesEnv() { + return *m_servEnvelope; + } + + const std::vector<const ServiceVolume* >& + VolumeBuilder::servicesChild() { + return *m_servChild; + } + + void + VolumeBuilder::buildAndPlace(const std::string& region, GeoPhysVol* parent, double zcenter) { + // Get volumes defined by Volume splitter and add them on top GeoPhysVol + setRegion(region, zcenter); + for (unsigned int iElement = 0; iElement < services().size(); ++iElement) + if (!isEnvelopeOrChild(iElement)) { + GeoVPhysVol* physVol = build(iElement); + if (physVol) { + physVol->ref(); + for (int iCopy = 0; iCopy < numCopies(iElement); ++iCopy) { + parent->add(getPlacement(iElement, iCopy)); + parent->add(physVol); + } + physVol->unref();//should delete if never added + } + } + } + + void + VolumeBuilder::buildAndPlace(const std::string& region, GeoFullPhysVol* parent, double zcenter) { + // Get volumes defined by Volume splitter and add them on top GeoPhysVol + setRegion(region, zcenter); + for (unsigned int iElement = 0; iElement < services().size(); ++iElement) { + if (!isEnvelopeOrChild(iElement)) { + // GeoVPhysVol* physVol = build(iElement); + GeoVPhysVol* physVol = build(iElement); + if (physVol) { + physVol->ref(); + for (int iCopy = 0; iCopy < numCopies(iElement); ++iCopy) { + parent->add(getPlacement(iElement, iCopy)); + parent->add(physVol); + } + physVol->unref();//should delete if never used + } + } + } + // if region is not Pixel -> stop here + if (region.compare("Pixel") != 0) return; + + for (unsigned int iElement = 0; iElement < services().size(); ++iElement) { + if (getEnvelopeNum(iElement) > 0 && services()[iElement]->envelopeParent() == 0) { + buildAndPlaceEnvelope(region, parent, -1, iElement, zcenter); + } + } + } + + void + VolumeBuilder::buildAndPlaceEnvelope(const std::string& region, GeoFullPhysVol* parent, int iParent, int iElement, + double zcenter) { + GeoPhysVol* physVol = dynamic_cast<GeoPhysVol*>(build(iElement)); + if (physVol) { + physVol->ref(); + for (unsigned int iChild = 0; iChild < services().size(); ++iChild) { + if (isChildService(iElement, iChild) && services()[iChild]->envelopeNum() > 0) { + // if volume is a child volume : build and place it + buildAndPlaceEnvelope(region, physVol, iElement, iChild, zcenter); + } + } + for (unsigned int iChild = 0; iChild < services().size(); ++iChild) { + if (isChildService(iElement, iChild) && services()[iChild]->envelopeNum() == 0) { + // if volume is not a child volume + GeoVPhysVol* physVol_child = build(iChild); + if (physVol_child) { + physVol_child->ref(); + for (int iCopy2 = 0; iCopy2 < numCopies(iChild); ++iCopy2) { + physVol->add(getPlacementEnvelope(iChild, iCopy2, iElement)); + physVol->add(physVol_child); + } + physVol_child->unref();//should delete if was never added + } + } + } + for (int iCopy = 0; iCopy < numCopies(iElement); ++iCopy) { + // add all the copies + if (iParent < 0) parent->add(getPlacement(iElement, iCopy)); + else parent->add(getPlacementEnvelope(iElement, iCopy, iParent)); + parent->add(physVol); + } + physVol->unref(); ///should delete even if it was never added + } + } + + void + VolumeBuilder::buildAndPlaceEnvelope(const std::string& region, GeoPhysVol* parent, int iParent, int iElement, + double zcenter) { + GeoPhysVol* physVol = dynamic_cast<GeoPhysVol*>(build(iElement)); + if (physVol) { + physVol->ref(); + for (unsigned int iChild = 0; iChild < services().size(); ++iChild) { + if (isChildService(iElement, iChild) && services()[iChild]->envelopeNum() > 0) { + // if volume is a child volume : build and place it + buildAndPlaceEnvelope(region, physVol, iElement, iChild, zcenter); + } + } + for (unsigned int iChild = 0; iChild < services().size(); ++iChild) { + if (isChildService(iElement, iChild) && services()[iChild]->envelopeNum() == 0) { + // if volume is not a child volume + GeoVPhysVol* physVol_child = build(iChild); + if (physVol_child) { + physVol_child->ref(); + for (int iCopy2 = 0; iCopy2 < numCopies(iChild); ++iCopy2) { + physVol->add(getPlacementEnvelope(iChild, iCopy2, iElement)); + physVol->add(physVol_child); + } + physVol_child->unref(); //will delete physVol_child if never used + } + } + } + for (int iCopy = 0; iCopy < numCopies(iElement); ++iCopy) { + // add all the copies + if (iParent < 0) parent->add(getPlacement(iElement, iCopy)); + else parent->add(getPlacementEnvelope(iElement, iCopy, iParent)); + parent->add(physVol); + } + physVol->unref();//will delete physvol if it was never used + } + } + + GeoVPhysVol* + VolumeBuilder::build(int iElement) { + if (m_region == "None") { + msg(MSG::ERROR) << "No region set. Cannot build services" << endmsg; + return nullptr; + } + const ServiceVolume& param = *(services()[iElement]); + // If the subelement does not belong to the current region return 0. + if (param.region() != m_region) return 0; + + const GeoShape* serviceShape = param.getShape(); + double volume = param.origVolume(); + std::string logName = param.fullLabel(); + const GeoMaterial* serviceMat = param.material(); + std::string materialName; + if (!serviceMat) { + materialName = param.materialName(); + if (m_matManager) { + //serviceMat = m_matManager->getMaterialForVolume(materialName,volume/param.fractionInRegion()); + // FIXME + serviceMat = m_matManager->getMaterialForVolume(materialName, volume); + } else { + msg(MSG::ERROR) << "Material manager not available. Cannot build material." << endmsg; + return nullptr; + } + } else { + materialName = serviceMat->getName(); + } + if (msgLvl(MSG::DEBUG)) { + msg(MSG::DEBUG) << "Volume/material: " << logName << "/" << materialName << endmsg; + if (!param.shapeType().empty()) msg(MSG::DEBUG) << " shape: " << param.shapeType() << endmsg; + msg(MSG::DEBUG) << " volume (cm3): " << volume / Gaudi::Units::cm3 << endmsg; + msg(MSG::DEBUG) << " rmin,rmax,zmin,zmax: " + << param.rmin() << ", " + << param.rmax() << ", " + << param.zmin() << ", " + << param.zmax() << endmsg; + } + // Or use volume of original volume in param. + //const GeoMaterial* serviceMat = mat_mgr->getMaterialForVolume(param.material(),param.origVolume()); + GeoLogVol* serviceLog = new GeoLogVol(logName, serviceShape, serviceMat); + GeoPhysVol* servicePhys = new GeoPhysVol(serviceLog); + return servicePhys; + } + + bool + VolumeBuilder::isEnvelopeOrChild(int iElement) { + const ServiceVolume& param = *(services()[iElement]); + if (param.envelopeNum() == 0 && param.envelopeParent() == 0) return false; + return true; + } + + int + VolumeBuilder::getEnvelopeNum(int iElement) { + const ServiceVolume& param = *(services()[iElement]); + return param.envelopeNum(); + } + + int + VolumeBuilder::getParentNum(int iElement) { + const ServiceVolume& param = *(services()[iElement]); + return param.envelopeParent(); + } + + double + VolumeBuilder::getZcenter(int iElement) { + const ServiceVolume& param = *(services()[iElement]); + return (param.zmin() + param.zmax()) * 0.5; + } + + bool + VolumeBuilder::isChildService(int iElt, int iChld) { + const ServiceVolume& param1 = *(services()[iElt]); + const ServiceVolume& param2 = *(services()[iChld]); + if (iElt == iChld || param1.envelopeNum() != param2.envelopeParent()) return false; + if (param1.zsymm() == 1) { + double zmin = (param1.zmin() * param2.zmin()); + double zmax = (param1.zmax() * param2.zmax()); + if (zmin > 0 && zmax > 0) return true; + return false; + } + return true; + } + + int + VolumeBuilder::numCopies(int iElement) { + return services()[iElement]->nCopies(); + } + + GeoTransform* + VolumeBuilder::getPlacement(int iElement, int iCopy) { + const ServiceVolume& param = *(services()[iElement]); + // NB. Corrected for placement in endcaps + double zpos = param.zposition() - m_zcenter; + // Shift along Z axis ( IBL shift ) + double zshift = param.zShift(); + zpos += zshift; + // Check if we need to rotate around Y axis. + bool rotateAroundY = false; + if (param.needsRotation()) { // zpos will always be negative in this case + zpos = -zpos; + rotateAroundY = true; + } + // Most are just translated in z + GeoTrf::Transform3D xform = GeoTrf::TranslateZ3D(zpos); + double phiStart = 0; + // BOX, ROD and TRAP need special treatment. + const std::string& shapeType = param.shapeType(); + if (shapeType == "TRAP" || shapeType == "TRAP2") { + // Need to rotate by -90 deg. + xform = GeoTrf::RotateZ3D(-90. * Gaudi::Units::deg) * xform; + } + if (shapeType == "TRAP2") { + xform = GeoTrf::RotateZ3D(-90. * Gaudi::Units::deg) * xform; // * GeoTrf::RotateX3D(-90.*Gaudi::Units::deg); + } + if (shapeType == "BOX" || shapeType == "TRAP" || shapeType == "TRAP2") { + double radius = 0.5 * (param.rmin() + param.rmax()); + xform = GeoTrf::TranslateX3D(radius) * xform; + phiStart = param.phiLoc(); + } else if (shapeType == "ROD" || shapeType == "ROD2") { + double radius = param.rmin(); + xform = GeoTrf::TranslateX3D(radius) * xform; + phiStart = param.phiLoc(); + } + // For volumes that are placed more than once. + double deltaPhi = 0; + if (iCopy > 0) { + deltaPhi = 2. * M_PI / param.nCopies(); + } + double phi = phiStart + deltaPhi * iCopy; + if (phi) { + xform = GeoTrf::RotateZ3D(phi) * xform; + } + // For shapes that are not symmetric about a rotation around Y axis. We need to rotate. + if (rotateAroundY) { + xform = GeoTrf::RotateY3D(180. * Gaudi::Units::degree) * xform; + } + return new GeoTransform(xform); + } + + GeoTransform* + VolumeBuilder::getPlacementEnvelope(int iElement, int iCopy, int iEnvElement) { + const ServiceVolume& param = *(services()[iElement]); + const ServiceVolume& paramEnv = *(services()[iEnvElement]); + double zCenter = (paramEnv.zmin() + paramEnv.zmax()) * 0.5; + double rCenter = 0.; + bool bMoveToCenter = false; + if (paramEnv.shapeType() == "BOX") bMoveToCenter = true; + if (paramEnv.shapeType() == "TUBE" && paramEnv.zsymm() == 1 && fabs(paramEnv.zmin()) > 0.01) bMoveToCenter = true; + if (bMoveToCenter) rCenter = (paramEnv.rmin() + paramEnv.rmax()) * 0.5; + // NB. Corrected for placement in endcaps + double zpos = param.zposition() - zCenter; + // Check if we need to rotate around Y axis. + bool rotateAroundY = false; + if (param.needsRotation()) { // zpos will always be negative in this case + zpos = -zpos; + rotateAroundY = true; + } + // Most are just translated in z + GeoTrf::Transform3D xform = GeoTrf::TranslateZ3D(zpos); + const std::string& shapeType = param.shapeType(); + double phiStart = 0; + // BOX, ROD and TRAP need special treatment. + if (shapeType == "TRAP") { + // Need to rotate by -90 deg. + xform = GeoTrf::RotateZ3D(-90. * Gaudi::Units::deg) * xform; + } + if (shapeType == "TRAP2") { + // Need to rotate by -90 deg. + xform = GeoTrf::RotateX3D(-90. * Gaudi::Units::deg) * xform; + } + if (shapeType == "BOX" || shapeType == "TRAP" || shapeType == "TRAP2") { + double radius = 0.5 * (param.rmin() + param.rmax()) - rCenter; + xform = GeoTrf::TranslateX3D(radius) * xform; + phiStart = param.phiLoc(); + } else if (shapeType == "ROD" || shapeType == "ROD2") { + double radius = param.rmin(); + xform = GeoTrf::TranslateX3D(radius) * xform; + phiStart = param.phiLoc(); + } + // For volumes that are placed more than once. + double deltaPhi = 0; + if (iCopy > 0) { + deltaPhi = 2. * M_PI / param.nCopies(); + } + double phi = phiStart + deltaPhi * iCopy; + if (phi) { + xform = GeoTrf::RotateZ3D(phi) * xform; + } + // For shapes that are not symmetric about a rotation around Y axis. We need to rotate. + if (rotateAroundY) { + xform = GeoTrf::RotateY3D(180. * Gaudi::Units::degree) * xform; + } + return new GeoTransform(xform); + } +} // end namespace diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/VolumeSplitter.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/VolumeSplitter.cxx new file mode 100755 index 000000000..20581b005 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/VolumeSplitter.cxx @@ -0,0 +1,191 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + +#include "TrackerGeoModelUtils/VolumeSplitter.h" +#include "TrackerGeoModelUtils/VolumeSplitterUtils.h" +#include "TrackerGeoModelUtils/ServiceVolume.h" +#include "GaudiKernel/SystemOfUnits.h" + +#include <sstream> +#include <algorithm> + +namespace TrackerDD { + VolumeSplitter::VolumeSplitter() + : m_ownVolumes(true), + m_epsilon(0.0001 * Gaudi::Units::mm) + {} + + VolumeSplitter::~VolumeSplitter() { + if (m_ownVolumes) { + for (std::vector<const ServiceVolume*>::iterator iter = m_volumes.begin(); iter != m_volumes.end(); ++iter) { + delete *iter; + } + } + } + + const std::vector<const ServiceVolume*>& + VolumeSplitter::splitAll(const Zone& zone, const std::vector<const ServiceVolume*> origVolumeList) { + for (unsigned int i = 0; i < origVolumeList.size(); ++i) { + split(zone, *(origVolumeList[i])); + } + return m_volumes; + } + + void + VolumeSplitter::split(const Zone& zone, const ServiceVolume& origVolume) { + makeVolumes(&zone, origVolume); + } + + Ray + VolumeSplitter::makeRay(const ServiceVolume& origVolume) { + double zmin = origVolume.zmin(); + double zmax = origVolume.zmax(); + double rmin = origVolume.rmin(); + double rmax = origVolume.rmax(); + + if (zmax < zmin) std::swap(zmin, zmax); + if (rmax < rmin) std::swap(rmin, rmax); + + bool horizontal = (std::abs(zmax - zmin) > std::abs(rmax - rmin)); + if (horizontal) { + double rmid = 0.5 * (rmin + rmax); + return Ray(Point(zmin, rmid), Point(zmax, rmid)); + } else { + double zmid = 0.5 * (zmin + zmax); + return Ray(Point(zmid, rmin), Point(zmid, rmax)); + } + } + + void + VolumeSplitter::makeVolumes(const Zone* zone, const ServiceVolume& origVolume) { + // See if its a symmetric volume + if (origVolume.zsymm()) { + ServiceVolume param1(origVolume); + ServiceVolume param2(origVolume); + param1.addLabel("A"); + param1.setNeedsRotation(false); + param2.addLabel("C"); + param2.setZmin(-origVolume.zmax()); + param2.setZmax(-origVolume.zmin()); + param2.setNeedsRotation(origVolume.needsRotation()); + splitVolume(zone, param1); + splitVolume(zone, param2); + } else { + ServiceVolume param1(origVolume); + param1.setNeedsRotation(false); + splitVolume(zone, param1); + } + } + + void + VolumeSplitter::splitVolume(const Zone* zone, const ServiceVolume& param) { + Ray ray = makeRay(param); + SegmentSplitter splitter; + const SegmentList& segments = splitter.split(zone, ray); + + //std::cout << "Segments: " << std::endl; + //segments.print(); + + double volumeTotal = 0; + + std::vector<ServiceVolume* > tmpServiceVec; + tmpServiceVec.reserve(segments.size()); + for (unsigned int i = 0; i < segments.size(); ++i) { + const Segment& seg = segments.getSegment(i); + ServiceVolume* paramNew = new ServiceVolume(param); + + if (segments.horizontal()) { + if (param.splittableInZ()) { + paramNew->setZmin(seg.zmin()); + paramNew->setZmax(seg.zmax()); + // If z changed adjust r in cone like volumes + adjustR(param, paramNew); + } else if (i == 1) { + std::cout << "Volume " << param.fullLabel() << " cannot be split in Z" << std::endl; + } + } else { + // vertical + if (param.splittableInR()) { + paramNew->setRmin(seg.rmin()); + paramNew->setRmax(seg.rmax()); + } else if (i == 1) { + std::cout << "Volume " << param.fullLabel() << " cannot be split in R" << std::endl; + } + } + + if (seg.rotated()) { + // Often the -ve endcap region is created as the +ve endcap and then rotated. Therefore we have to reflect the z + // coords. + // Also have to turn off the needsRotation flag in case it was set. + //std::cout << "Segment " << i << " rotated " << paramNew->zmin() << " " << paramNew->zmax() <<std::endl; + double zminTmp = paramNew->zmin(); + paramNew->setZmin(-paramNew->zmax()); + paramNew->setZmax(-zminTmp); + paramNew->setNeedsRotation(false); + //std::cout << "After adjusted " << paramNew->zmin() << " " << paramNew->zmax() <<std::endl; + } + + if (param.splittableInZ()) { + paramNew->reduceSize(m_epsilon); // safety gap between volumes + } + + paramNew->setRegion(seg.label()); + tmpServiceVec.push_back(paramNew); + + paramNew->getShape(); + volumeTotal += paramNew->volume(); + //std::cout << i << ": volume: " << paramNew->volume() << std::endl; + } + //std::cout << "Total volume: " << volumeTotal << std::endl; + for (unsigned int i = 0; i < segments.size(); ++i) { + ServiceVolume* paramNew = tmpServiceVec[i]; + if (segments.size() > 1) { + std::ostringstream ostr; + ostr << "_" << i + 1; + paramNew->addLabel(ostr.str()); + } + paramNew->setOrigVolume(volumeTotal); + m_volumes.push_back(paramNew); + } + } + +// This takes care of cone like volumes and adjust the radius according to the adjusted z. + void + VolumeSplitter::adjustR(const ServiceVolume& param, ServiceVolume* paramNew) { + double z1 = param.zmin(); + double z2 = param.zmax(); + double z1New = paramNew->zmin(); + double z2New = paramNew->zmax(); + double rmin1 = param.rmin(); + double rmin2 = param.rmin2(); + double rmax1 = param.rmax(); + double rmax2 = param.rmax2(); + + // Make sure z1 < z2 + // as r1, r2 order assumes this + if (z1 > z2) std::swap(z1, z2); + if (z1New > z2New) std::swap(z1New, z2New); + + // Avoid divide by zero. + if (z1 == z2) return; + + if (z1 != z1New || z2 != z2New) { + if (rmin2 > 0 && rmax2 > 0 && (rmin1 != rmin2 || rmax1 != rmax2)) { + double slopeMin = (rmin2 - rmin1) / (z2 - z1); + double slopeMax = (rmax2 - rmax1) / (z2 - z1); + + double rmin1New = (z1New - z1) * slopeMin + rmin1; + double rmin2New = (z2New - z1) * slopeMin + rmin1; + + double rmax1New = (z1New - z1) * slopeMax + rmax1; + double rmax2New = (z2New - z1) * slopeMax + rmax1; + + paramNew->setRmin(rmin1New); + paramNew->setRmax(rmax1New); + paramNew->setRmin2(rmin2New); + paramNew->setRmax2(rmax2New); + } + } + } +} // end namespace diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/VolumeSplitterUtils.cxx b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/VolumeSplitterUtils.cxx new file mode 100755 index 000000000..e06e2a4b4 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/src/VolumeSplitterUtils.cxx @@ -0,0 +1,432 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + */ + + +#include "TrackerGeoModelUtils/VolumeSplitterUtils.h" +#include "GeoModelKernel/GeoTube.h" +#include "GeoModelKernel/GeoPcon.h" +#include <iostream> + +namespace TrackerDD { + const SegmentList& + SegmentSplitter::split(const Zone* zone, const Ray& ray) { + addChildSegment(zone, ray); + return m_segments; + } + + Ray + SegmentSplitter::addChildSegment(const Zone* zone, const Ray& ray) { + //std::cout << "addChildSegment: " << zone->label() << " " << ray << std::endl; + // Point startPoint = ray.start(); + // If start point is not yet know to be in current zone. We need to search children. + // If not in children searchPoint will return a copy of ray. Otherwise it will + // add segments of the child and return a ray that starts from the exit of the child. + Ray nextRay = ray; + + if (!ray.foundStart()) { + nextRay = searchPoint(zone, ray); + } + bool exit = false; + while (nextRay.valid() && !exit) { + Point nextPoint = getNextBoundary(zone, nextRay); + addSegment(zone, nextRay.start(), nextPoint); + + //std::cout << "Next boundary: " << nextPoint; + //if (nextPoint.last()) std::cout << " Last "; + //if (nextPoint.exit()) std::cout << " Exit "; + //if (nextPoint.child()) std::cout << " Child: " << nextPoint.child()->label(); + //std::cout << std::endl; + + if (nextPoint.last()) { // last indicates end of ray. ie ray ended before exit or child entry. + nextRay.setInvalid(); + } else { + nextRay.set(nextPoint, nextRay.end()); + } + exit = nextPoint.exit(); + if (nextPoint.child()) { + nextRay = addChildSegment(nextPoint.child(), nextRay); + } + } + return nextRay; + } + + void + SegmentSplitter::addSegment(const Zone* zone, const Point& start, const Point& end) { + m_segments.add(zone->label(), start, end, zone->rotated()); + } + + Point + SegmentSplitter::getNextBoundary(const Zone* zone, const Ray& ray) { + Point nextPoint; //invalid + + // Search children + for (Zone::ChildIterator iter = zone->begin(); iter != zone->end(); ++iter) { + const Zone* child = *iter; + // return invalid if not crossed. + Point newPoint = child->findEntry(ray); + nextPoint = nearestPoint(newPoint, nextPoint); + } + //search exit + nextPoint = nearestPoint(zone->findExit(ray), nextPoint); + if (!nextPoint.valid()) { + // Return endpoint + return ray.end(); + } + return nextPoint; + } + + Point + SegmentSplitter::nearestPoint(const Point& point1, const Point& point2) { + if (!point2.valid()) return point1; + + if (!point1.valid()) return point2; + + if ((point2.r() == point1.r() && point2.z() < point1.z()) || + (point2.z() == point1.z() && point2.r() < point1.r())) { + return point2; + } + return point1; + //return first point. If either invalid return the other. + // If both invalid return invalid + } + + Ray + SegmentSplitter::searchPoint(const Zone* zone, const Ray& ray) { + // If not found in children return original ray. + //std::cout << "Searching for point " << ray.start() << std::endl; + Ray nextRay = ray; + + for (Zone::ChildIterator iter = zone->begin(); iter != zone->end(); ++iter) { + const Zone* child = *iter; + if (child->inSide(ray.start())) { + //std::cout << "Point " << ray.start() << " found in zone " << child->label() << std::endl; + nextRay = addChildSegment(child, ray); + break; + } + } + nextRay.setFound(); + return nextRay; + } + + Zone::Zone(const std::string& label, bool rotated) + : m_label(label), + m_rotated(rotated) + {} + + Zone::~Zone() { + for (ChildIterator iter = begin(); iter != end(); ++iter) { + delete *iter; + } + } + + void + Zone::add(const Zone* zone) { + m_children.push_back(zone); + } + + UnboundedZone::UnboundedZone(const std::string& label) + : Zone(label) + {} + + bool + UnboundedZone::inSide(const Point&) const { + return true; + } + + Point + UnboundedZone::findEntry(const Ray&) const { + // Will never be called. + return Point(); + } + + Point + UnboundedZone::findExit(const Ray&) const { + // Invalid means no exit point. + return Point(); + } + + TubeZone::TubeZone(const std::string& label, double zmin, double zmax, double rmin, double rmax, bool rotated) + : Zone(label, rotated), + m_zmin(zmin), + m_zmax(zmax), + m_rmin(rmin), + m_rmax(rmax) + {} + + TubeZone::TubeZone(const std::string& label, const GeoTube* shape, double zOffset, bool rotated) + : Zone(label, rotated), + m_zmin(zOffset - shape->getZHalfLength()), + m_zmax(zOffset + shape->getZHalfLength()), + m_rmin(shape->getRMin()), + m_rmax(shape->getRMax()) + {} + + + bool + TubeZone::inSide(const Point& point) const { + return(inZ(point.z()) && inR(point.r())); + } + + bool + TubeZone::inZ(double z) const { + return(z >= m_zmin && z < m_zmax); + } + + bool + TubeZone::inR(double r) const { + return(r >= m_rmin && r < m_rmax); + } + +// Assume either vertical or horizontal. + Point + TubeZone::findEntry(const Ray& ray) const { + if (ray.horizontal()) { + if (inR(ray.start().r()) && ray.start().z() < m_zmin && ray.end().z() > m_zmin) { + Point p(m_zmin, ray.start().r()); + p.setChild(this); + return p; + } + } else if (ray.vertical()) { + if (inZ(ray.start().z()) && ray.start().r() < m_rmin && ray.end().r() > m_rmin) { + Point p(ray.start().z(), m_rmin); + p.setChild(this); + return p; + } + } else { + std::cout << "Unexpected case" << std::endl; + } + // Return invalid point since doesn't intersect. + return Point(); // invalid point + } + +// Assume already inside. + Point + TubeZone::findExit(const Ray& ray) const { + if (ray.horizontal()) { + if (ray.end().z() > m_zmax) { + Point p(m_zmax, ray.start().r()); + p.setExit(); + return p; + } + } else if (ray.vertical()) { + if (ray.end().r() > m_rmax) { + Point p(ray.start().z(), m_rmax); + p.setExit(); + return p; + } + } else { + std::cout << "Unexpected case" << std::endl; + } + // ends with. Return invalid point. + return Point(); + } + + PconZone::PconZone(const std::string& label, bool rotated) + : Zone(label, rotated) + {} + + PconZone::PconZone(const std::string& label, const GeoPcon* shape, bool rotated) + : Zone(label, rotated) { + for (unsigned int i = 0; i < shape->getNPlanes(); ++i) { + addPlane(shape->getZPlane(i), shape->getRMinPlane(i), shape->getRMaxPlane(i)); + } + } + + void + PconZone::addPlane(double z, double rmin, double rmax) { + m_z.push_back(z); + m_rmin.push_back(rmin); + m_rmax.push_back(rmax); + } + + bool + PconZone::inSide(const Point& point) const { + // Assume comes in pairs with same CLHEP::radii. + for (unsigned int i = 0; i + 1 < m_z.size(); i += 2) { + if (inZ(i, point.z()) && inR(i, point.r())) return true; + } + return false; + } + + bool + PconZone::inZ(unsigned int i, double z) const { + return(z >= m_z[i] && z < m_z[i + 1]); + } + + bool + PconZone::inR(unsigned int i, double r) const { + if (i >= m_z.size()) return false; + + return(r >= m_rmin[i] && r < m_rmax[i]); + } + +// Assume either vertical or horizontal. + Point + PconZone::findEntry(const Ray& ray) const { + if (ray.horizontal()) { + for (unsigned int i = 0; i + 1 < m_z.size(); i += 2) { + if (inR(i, ray.start().r()) && ray.start().z() < m_z[i] && ray.end().z() > m_z[i]) { + Point p(m_z[i], ray.start().r()); + p.setChild(this); + return p; + } + } + } else if (ray.vertical()) { + for (unsigned int i = 0; i + 1 < m_z.size(); i += 2) { + if (inZ(i, ray.start().z()) && ray.start().r() < m_rmin[i] && ray.end().r() > m_rmin[i]) { + Point p(ray.start().z(), m_rmin[i]); + p.setChild(this); + return p; + } + } + } else { + std::cout << "Unexpected case" << std::endl; + } + // Return invalid point since doesn't intersect. + return Point(); // invalid point + } + +// Assume already inside. + Point + PconZone::findExit(const Ray& ray) const { + if (ray.horizontal()) { + for (unsigned int i = 0; i + 1 < m_z.size(); i += 2) { + if (inZ(i, ray.start().z()) && ray.end().z() > m_z[i + 1] && !inR(i + 2, ray.start().r())) { + Point p(m_z[i + 1], ray.start().r()); + p.setExit(); + return p; + } + } + } else if (ray.vertical()) { + for (unsigned int i = 0; i + 1 < m_z.size(); i += 2) { + if (inZ(i, ray.start().z()) && ray.end().r() > m_rmax[i]) { + Point p(ray.start().z(), m_rmax[i]); + p.setExit(); + return p; + } + } + } else { + std::cout << "Unexpected case" << std::endl; + } + // ends with. Return invalid point. + return Point(); + } + + Ray::Ray() + : m_valid(false), + m_found(false), + m_horizontal(false), + m_vertical(false) + {} + + Ray::Ray(const Point& start, const Point& end) + : m_valid(true), + m_found(false), + m_start(start), + m_end(end) { + m_end.setLast(); + setDirection(); + } + + void + Ray::set(const Point& start, const Point& end) { + m_start = start; + m_end = end; + setDirection(); + } + + void + Ray::setDirection() { + m_vertical = (m_start.z() == m_end.z()); + m_horizontal = (m_start.r() == m_end.r()); + if (m_vertical && m_horizontal) { + m_vertical = false; + m_horizontal = false; + } + } + + Point::Point() + : m_valid(false), + m_exit(false), + m_last(false), + m_z(0), + m_r(0), + m_child(0) + {} + + Point::Point(double z, double r) + : m_valid(true), + m_exit(false), + m_last(false), + m_z(z), + m_r(r), + m_child(0) + {} + + Segment::Segment(const std::string& label, const Point& start, const Point& end, bool rotated) + : m_label(label), + m_rotated(rotated), + m_zmin(start.z()), + m_zmax(end.z()), + m_rmin(start.r()), + m_rmax(end.r()) + {} + + void + SegmentList::add(const std::string& label, const Point& start, const Point& end, bool rotated) { + m_segments.push_back(Segment(label, start, end, rotated)); + } + + void + SegmentList::add(const Segment& segment) { + m_segments.push_back(segment); + } + + bool + SegmentList::horizontal() const { + if (size() > 0) { + const Segment& seg = m_segments[0]; + return(seg.rmin() == seg.rmax()); + } + // Not relevant if array empty. + return true; + } + + void + SegmentList::print() const { + for (std::vector<Segment>::const_iterator iter = m_segments.begin(); iter != m_segments.end(); ++iter) { + iter->print(); + } + } + + void + Segment::print() const { + std::cout << m_label << " " + << m_zmin << " " + << m_zmax << " " + << m_rmin << " " + << m_rmax + << std::endl; + } + + std::ostream& + operator << (std::ostream& os, const TrackerDD::Ray& ray) { + if (!ray.valid()) { + os << "INVALID"; + } else { + os << ray.start() << " --> " << ray.end(); + } + return os; + } + + std::ostream& + operator << (std::ostream& os, const TrackerDD::Point& point) { + if (!point.valid()) { + os << "INVALID"; + } else { + os << "(" << point.z() << ", " << point.r() << ")"; + } + return os; + } +} diff --git a/Tracker/TrackerDetDescr/TrackerIdDictFiles/data/IdDictTracker.xml b/Tracker/TrackerDetDescr/TrackerIdDictFiles/data/IdDictTracker.xml index 6f2758240..3e3b41ea2 100644 --- a/Tracker/TrackerDetDescr/TrackerIdDictFiles/data/IdDictTracker.xml +++ b/Tracker/TrackerDetDescr/TrackerIdDictFiles/data/IdDictTracker.xml @@ -5,30 +5,31 @@ </field> <field name="station" > - <label name="Upstream" value="0" /> - <label name="Central" value="1" /> - <label name="Downstream" value="2" /> + <label name="Upstream" value="-1" /> + <label name="Central" value="0" /> + <label name="Downstream" value="1" /> </field> - <field name="plane" > + <field name="layer" > <label name="Upstream" value="0" /> <label name="Central" value="1" /> <label name="Downstream" value="2" /> </field> - <field name="row"> - <label name="Bottom" value="0" /> - <label name="Top" value="1" /> + <field name="phi_module"> + <label name="Bottom" value="0" /> + <label name="LowerMiddle" value="1" /> + <label name="UpperMiddle" value="2" /> + <label name="Top" value="3" /> </field> - <field name="module"> - <!-- facing downstream + <field name="eta_module"> + <!-- facing downstream (hence "starboard" and "port") x must increase right to left for a right-handed coordinate system --> - <label name="FarRight" value="0" /> - <label name="CenterRight" value="1" /> - <label name="CenterLeft" value="2" /> - <label name="FarLeft" value="3" /> + <!-- numbers straddle zero for consistency with ATLAS --> + <label name="Starboard" value="-1" /> + <label name="Port" value="+1" /> </field> <field name="side"> @@ -37,13 +38,13 @@ </field> <region> - <range field="part" value="SCT" /> - <range field="station" values="Upstream Central Downstream" /> - <range field="plane" values="Upstream Central Downstream" /> - <range field="row" values="Bottom Top" /> - <range field="module" values="FarRight CenterRight CenterLeft FarLeft" /> - <range field="side" values="Upstream Downstream" /> - <range field="strip" minvalue="0" maxvalue="767" /> + <range field="part" value="SCT" /> + <range field="station" values="Upstream Central Downstream" /> + <range field="layer" values="Upstream Central Downstream" /> + <range field="phi_module" values="Bottom LowerMiddle UpperMiddle Top" wraparound="FALSE" /> + <range field="eta_module" values="Starboard Port" wraparound="FALSE" /> + <range field="side" values="Upstream Downstream" /> + <range field="strip" minvalue="0" maxvalue="767" /> </region> </IdDictionary> \ No newline at end of file diff --git a/Tracker/TrackerDetDescr/TrackerIdentifier/CMakeLists.txt b/Tracker/TrackerDetDescr/TrackerIdentifier/CMakeLists.txt new file mode 100644 index 000000000..0e9efc6b6 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerIdentifier/CMakeLists.txt @@ -0,0 +1,39 @@ +################################################################################ +# Package: TrackerIdentifier +################################################################################ + +# Declare the package name: +atlas_subdir( TrackerIdentifier ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PUBLIC + Control/AthenaKernel + DetectorDescription/FaserDetDescr + DetectorDescription/IdDict + DetectorDescription/Identifier + PRIVATE + DetectorDescription/IdDictParser + GaudiKernel ) + +# External dependencies: +find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread ) + +# Component(s) in the package: +atlas_add_library( TrackerIdentifier + src/FaserSCT_ID.cxx + PUBLIC_HEADERS TrackerIdentifier + PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES AthenaKernel FaserDetDescr IdDict Identifier + PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} IdDictParser GaudiKernel ) + +atlas_add_dictionary( TrackerIdentifierDict + TrackerIdentifier/TrackerIdentifierDict.h + TrackerIdentifier/selection.xml + INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES ${ROOT_LIBRARIES} FaserDetDescr IdDict Identifier IdDictParser GaudiKernel TrackerIdentifier ) + +atlas_add_executable( test_tracker_id + test/test_tracker_id.cxx + INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES ${ROOT_LIBRARIES} FaserDetDescr IdDict Identifier IdDictParser GaudiKernel TrackerIdentifier ) + diff --git a/Tracker/TrackerDetDescr/TrackerIdentifier/TrackerIdentifier/FaserSCT_ID.h b/Tracker/TrackerDetDescr/TrackerIdentifier/TrackerIdentifier/FaserSCT_ID.h new file mode 100644 index 000000000..10d31628b --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerIdentifier/TrackerIdentifier/FaserSCT_ID.h @@ -0,0 +1,808 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRACKERIDENTIFIER_FASERSCT_ID_H +#define TRACKERIDENTIFIER_FASERSCT_ID_H +/** + * @file FaserSCT_ID.h + * + * @brief This is an Identifier helper class for the SCT + * subdetector. This class is a factory for creating compact + * Identifier objects and IdentifierHash or hash ids. And it also + * allows decoding of these ids. + * + * @author RD Schaffer <R.D.Schaffer@cern.ch> + * + * $Id: SCT_ID.h,v 1.30 2008-12-13 07:11:00 dquarrie Exp $ + */ + +//<<<<<< INCLUDES >>>>>> + +#include "FaserDetDescr/FaserDetectorID.h" +#include "Identifier/Identifier.h" +#include "Identifier/IdentifierHash.h" +#include "Identifier/Range.h" +#include "Identifier/IdHelper.h" +#include "IdDict/IdDictFieldImplementation.h" +#include "AthenaKernel/CLASS_DEF.h" + +#include <string> +#include <assert.h> +#include <algorithm> + +//<<<<<< PUBLIC DEFINES >>>>>> +//<<<<<< PUBLIC CONSTANTS >>>>>> +//<<<<<< PUBLIC TYPES >>>>>> + +class IdDictDictionary; + +//<<<<<< PUBLIC VARIABLES >>>>>> +//<<<<<< PUBLIC FUNCTIONS >>>>>> +//<<<<<< CLASS DECLARATIONS >>>>>> + +/** + ** @class FaserSCT_ID + ** + ** @brief This is an Identifier helper class for the SCT + ** subdetector. This class is a factory for creating compact + ** Identifier objects and IdentifierHash or hash ids. And it also + ** allows decoding of these ids. + ** + ** Definition and the range of values for the levels of the + ** identifier are: + ** + ** @verbatim + ** element range meaning + ** ------- ----- ------- + ** + ** station -1 to +1 upstream to downstream + ** layer 0 to 2 three layers per station + ** phi_module 0 to 3 precision/vertical direction + ** eta_module non-precision/horizontal direction + ** -1 starboard = right, facing beam direction + ** +1 port = left, facing beam direction) + ** side 0 to 1 upstream/downstream of pairs of Si crystals + ** strip 0 to 767 strip number + ** @endverbatim + ** + */ +class FaserSCT_ID : public FaserDetectorID +{ +public: + + /// @name public typedefs + //@{ + typedef Identifier::size_type size_type; + typedef std::vector<Identifier>::const_iterator const_id_iterator; + typedef MultiRange::const_identifier_factory const_expanded_id_iterator; + //@} + + /// @name strutors + //@{ + FaserSCT_ID(void); + virtual ~FaserSCT_ID(void) = default; + //@} + + /// @name Creators for wafer ids and pixel ids + //@{ + /// For a single crystal + Identifier module_id ( int station, + int layer, + int phi_module, + int eta_module ) const; + Identifier module_id ( int station, + int layer, + int phi_module, + int eta_module, + bool checks) const; + + /// For a module from a wafer id + Identifier module_id ( const Identifier& wafer_id ) const; + + /// For a single crystal + Identifier wafer_id ( int station, + int layer, + int phi_module, + int eta_module, + int side ) const; + Identifier wafer_id ( int station, + int layer, + int phi_module, + int eta_module, + int side, + bool checks) const; + + /// For a single crystal from a strip id + Identifier wafer_id ( const Identifier& strip_id ) const; + + /// From hash - optimized + Identifier wafer_id ( IdentifierHash wafer_hash ) const; + + /// For an individual strip + Identifier strip_id ( int station, + int layer, + int phi_module, + int eta_module, + int side, + int strip) const; + Identifier strip_id ( int station, + int layer, + int phi_module, + int eta_module, + int side, + int strip, + bool check) const; + + Identifier strip_id ( int station, + int layer, + int phi_module, + int eta_module, + int side, + int row, + int strip) const; + Identifier strip_id ( int station, + int layer, + int phi_module, + int eta_module, + int side, + int row, + int strip, + bool checks) const; + + + + Identifier strip_id ( const Identifier& wafer_id, + int strip ) const; + + Identifier strip_id ( const Identifier& wafer_id, + int row, int strip ) const; + + + //@} + + + /// @name Hash table maximum sizes + //@{ + size_type wafer_hash_max (void) const; + size_type strip_hash_max (void) const; + //@} + + /// @name Access to all ids + //@{ + /// Iterators over full set of ids. Wafer iterator is sorted + const_id_iterator wafer_begin (void) const; + const_id_iterator wafer_end (void) const; + /// For strip ids, only expanded id iterators are available. Use + /// following "strip_id" method to obtain a compact identifier + const_expanded_id_iterator strip_begin (void) const; + const_expanded_id_iterator strip_end (void) const; + //@} + + + /// @name Optimized accessors - ASSUMES id IS a sct id, i.e. NOT pixel or other + //@{ + /// wafer hash from id - optimized + IdentifierHash wafer_hash (Identifier wafer_id) const; + + /// Test for barrel - WARNING: id MUST be sct id, otherwise answer is not accurate. + // bool is_barrel (const Identifier& id) const; + + /// Values of different levels (failure returns 0) + int station (const Identifier& id) const; + int layer (const Identifier& id) const; + int phi_module (const Identifier& id) const; + int eta_module (const Identifier& id) const; + int side (const Identifier& id) const; + int row (const Identifier& id) const; + int strip (const Identifier& id) const; + + /// Max/Min values for each field (-999 == failure) + int layer_max (const Identifier& id) const; + int phi_module_max (const Identifier& id) const; + int eta_module_max (const Identifier& id) const; + int eta_module_min (const Identifier& id) const; + int strip_max (const Identifier& id) const; + //@} + + /// @name module eta/phi navigation + //@{ + /// Previous wafer hash in phi (return == 0 for neighbor found) + int get_prev_in_phi (const IdentifierHash& id, IdentifierHash& prev) const; + /// Next wafer hash in phi (return == 0 for neighbor found) + int get_next_in_phi (const IdentifierHash& id, IdentifierHash& next) const; + /// Previous wafer hash in eta (return == 0 for neighbor found) + int get_prev_in_eta (const IdentifierHash& id, IdentifierHash& prev) const; + /// Next wafer hash in eta (return == 0 for neighbor found) + int get_next_in_eta (const IdentifierHash& id, IdentifierHash& next) const; + /// Wafer hash on other side + int get_other_side (const IdentifierHash& id, IdentifierHash& other) const; + + // To check for when phi wrap around may be needed, use + bool is_phi_module_max(const Identifier& id) const; + /// For the barrel + bool is_eta_module_min(const Identifier& id) const; + /// For the barrel + bool is_eta_module_max(const Identifier& id) const; + //@} + + /// @name contexts to distinguish wafer id from pixel id + //@{ + IdContext wafer_context (void) const; + IdContext strip_context (void) const; + //@} + + /// @name methods from abstract interface - slower than opt version + //@{ + /// Create compact id from hash id (return == 0 for OK) + virtual int get_id (const IdentifierHash& hash_id, + Identifier& id, + const IdContext* context = 0) const; + + /// Create hash id from compact id (return == 0 for OK) + virtual int get_hash (const Identifier& id, + IdentifierHash& hash_id, + const IdContext* context = 0) const; + //@} + + /// Return the lowest bit position used in the channel id + int base_bit (void) const; + + /// Calculate a channel offset between the two identifiers. + Identifier::diff_type calc_offset(const Identifier& base, + const Identifier& target) const; + + /// Create an identifier with a given base and channel offset + Identifier strip_id_offset(const Identifier& base, + Identifier::diff_type offset) const; + + /// @name interaction with id dictionary + //@{ + /// Create strip Identifier from expanded id, which is returned by the + /// id_iterators + Identifier strip_id (const ExpandedIdentifier& strip_id) const; + + /// Create expanded id from compact id (return == 0 for OK) + void get_expanded_id (const Identifier& id, + ExpandedIdentifier& exp_id, + const IdContext* context = 0) const; + + /// Initialization from the identifier dictionary + virtual int initialize_from_dictionary(const IdDictMgr& dict_mgr); + + /// Tests of packing + void test_wafer_packing (void) const; + //@} + +private: + + enum {NOT_VALID_HASH = 64000}; + + typedef std::vector<Identifier> id_vec; + typedef id_vec::const_iterator id_vec_it; + typedef std::vector<unsigned short> hash_vec; + typedef hash_vec::const_iterator hash_vec_it; + + void wafer_id_checks ( int station, + int layer, + int phi_module, + int eta_module, + int side ) const; + + void strip_id_checks ( int station, + int layer, + int phi_module, + int eta_module, + int side, + int strip) const; + + void strip_id_checks ( int station, + int layer, + int phi_module, + int eta_module, + int side, + int row, + int strip) const; + + + + int initLevelsFromDict(void); + + int init_hashes(void); + + int init_neighbors(void); + + // Temporary method for adapting an identifier for the MultiRange + // check - MR is missing the InnerDetector level + Identifier idForCheck (const Identifier& id) const; + + size_type m_sct_region_index; + size_type m_TRACKER_INDEX; + size_type m_SCT_INDEX; + size_type m_STATION_INDEX; + size_type m_LAYER_INDEX; + size_type m_PHI_MODULE_INDEX; + size_type m_ETA_MODULE_INDEX; + size_type m_SIDE_INDEX; + size_type m_STRIP_INDEX; + + size_type m_ROW_INDEX; + + const IdDictDictionary* m_dict; + MultiRange m_full_wafer_range; + MultiRange m_full_strip_range; + size_type m_wafer_hash_max; + size_type m_strip_hash_max; + // Range::field m_station_field; + id_vec m_wafer_vec; + hash_vec m_prev_phi_wafer_vec; + hash_vec m_next_phi_wafer_vec; + hash_vec m_prev_eta_wafer_vec; + hash_vec m_next_eta_wafer_vec; + bool m_hasRows ; + + IdDictFieldImplementation m_tracker_impl ; + IdDictFieldImplementation m_sct_impl ; + IdDictFieldImplementation m_station_impl ; + IdDictFieldImplementation m_layer_impl ; + IdDictFieldImplementation m_phi_mod_impl ; + IdDictFieldImplementation m_eta_mod_impl ; + IdDictFieldImplementation m_side_impl ; + IdDictFieldImplementation m_row_impl ; + IdDictFieldImplementation m_strip_impl ; +}; + + +//<<<<<< INLINE PUBLIC FUNCTIONS >>>>>> + +///////////////////////////////////////////////////////////////////////////// +//<<<<<< INLINE MEMBER FUNCTIONS >>>>>> +///////////////////////////////////////////////////////////////////////////// + +//using the macros below we can assign an identifier (and a version) +//This is required and checked at compile time when you try to record/retrieve +CLASS_DEF(FaserSCT_ID, 205618430, 1) + +//---------------------------------------------------------------------------- +inline Identifier +FaserSCT_ID::module_id ( int station, + int layer, + int phi_module, + int eta_module, + bool checks) const +{ + + // Build identifier + Identifier result((Identifier::value_type)0); + + // Pack fields independently + m_tracker_impl.pack (tracker_field_value(), result); + m_sct_impl.pack (sct_field_value(), result); + m_station_impl.pack (station, result); + m_layer_impl.pack (layer, result); + m_phi_mod_impl.pack (phi_module, result); + m_eta_mod_impl.pack (eta_module, result); + + // Do checks + if(checks) { + wafer_id_checks ( station, layer, phi_module, eta_module, 0 ); + } + + return result; +} + +inline Identifier +FaserSCT_ID::module_id ( int station, + int layer, + int phi_module, + int eta_module ) const +{ + return module_id (station, layer, phi_module, eta_module, do_checks()); +} + +//---------------------------------------------------------------------------- +inline Identifier +FaserSCT_ID::module_id ( const Identifier& wafer_id ) const +{ + Identifier result(wafer_id); + // Reset the side and strip fields + m_side_impl.reset(result); + m_strip_impl.reset(result); + return (result); +} + +//---------------------------------------------------------------------------- +inline Identifier +FaserSCT_ID::wafer_id ( int station, + int layer, + int phi_module, + int eta_module, + int side, + bool checks) const +{ + + // Build identifier + Identifier result((Identifier::value_type)0); + + // Pack fields independently + m_tracker_impl.pack (tracker_field_value(), result); + m_sct_impl.pack (sct_field_value(), result); + m_station_impl.pack (station, result); + m_layer_impl.pack (layer, result); + m_phi_mod_impl.pack (phi_module, result); + m_eta_mod_impl.pack (eta_module, result); + m_side_impl.pack (side, result); + + // Do checks + if(checks) { + wafer_id_checks ( station, layer, phi_module, eta_module, side ); + } + + return result; +} + +inline Identifier +FaserSCT_ID::wafer_id ( int station, + int layer, + int phi_module, + int eta_module, + int side ) const +{ + return wafer_id (station, layer, phi_module, eta_module, side, + do_checks()); +} + + + +//---------------------------------------------------------------------------- +inline Identifier +FaserSCT_ID::wafer_id ( const Identifier& strip_id ) const +{ + Identifier result(strip_id); + // reset the strip field + m_strip_impl.reset(result); + return (result); +} + +//---------------------------------------------------------------------------- +inline Identifier FaserSCT_ID::wafer_id ( IdentifierHash wafer_hash ) const +{ + return (m_wafer_vec[wafer_hash]); +} + +//---------------------------------------------------------------------------- +inline IdentifierHash FaserSCT_ID::wafer_hash (Identifier wafer_id) const +{ + id_vec_it it = std::lower_bound(m_wafer_vec.begin(), + m_wafer_vec.end(), + wafer_id); + // Require that wafer_id matches the one in vector + if (it != m_wafer_vec.end() && wafer_id == (*it)) { + return (it - m_wafer_vec.begin()); + } + IdentifierHash result; + return (result); // return hash in invalid state +} + +//---------------------------------------------------------------------------- +inline Identifier +FaserSCT_ID::strip_id ( int station, + int layer, + int phi_module, + int eta_module, + int side, + int strip, + bool checks) const +{ + // Build identifier + Identifier result((Identifier::value_type)0); + + // Pack fields independently + m_tracker_impl.pack (tracker_field_value(), result); + m_sct_impl.pack (sct_field_value(), result); + m_station_impl.pack (station, result); + m_layer_impl.pack (layer, result); + m_phi_mod_impl.pack (phi_module, result); + m_eta_mod_impl.pack (eta_module, result); + m_side_impl.pack (side, result); + m_strip_impl.pack (strip, result); + + // Do checks + if(checks) { + strip_id_checks ( station, layer, phi_module, eta_module, side, strip ); + } + return result; +} + +inline Identifier +FaserSCT_ID::strip_id ( int station, + int layer, + int phi_module, + int eta_module, + int side, + int strip) const +{ + return strip_id (station, layer, phi_module, eta_module, side, strip, + do_checks()); +} + + + +//---------------------------------------------------------------------------- + +inline Identifier +FaserSCT_ID::strip_id ( int station, + int layer, + int phi_module, + int eta_module, + int side, + int row, + int strip, + bool checks) const +{ + + // Build identifier + Identifier result((Identifier::value_type)0); + + + // Pack fields independently + m_tracker_impl.pack (tracker_field_value(), result); + m_sct_impl.pack (sct_field_value(), result); + m_station_impl.pack (station, result); + m_layer_impl.pack (layer, result); + m_phi_mod_impl.pack (phi_module, result); + m_eta_mod_impl.pack (eta_module, result); + m_side_impl.pack (side, result); + if ( m_hasRows ){ + m_row_impl.pack (row, result); + } + m_strip_impl.pack (strip, result); + + + // Do checks + if(checks) { + if ( m_hasRows ) strip_id_checks ( station, layer, phi_module, eta_module, side, row, strip ); + else strip_id_checks ( station, layer, phi_module, eta_module, side, strip ); + } + + return result; + +} + +inline Identifier +FaserSCT_ID::strip_id ( int station, + int layer, + int phi_module, + int eta_module, + int side, + int row, + int strip) const +{ + return strip_id (station, layer, phi_module, eta_module, + side, row, strip, do_checks()); +} + + + + + + + + + + +//---------------------------------------------------------------------------- +inline Identifier +FaserSCT_ID::strip_id (const ExpandedIdentifier& id) const +{ + // Build identifier + Identifier result((Identifier::value_type)0); + + // Pack fields independently + m_tracker_impl.pack (tracker_field_value(), result); + m_sct_impl.pack (sct_field_value(), result); + m_station_impl.pack (id[m_STATION_INDEX], result); + m_layer_impl.pack (id[m_LAYER_INDEX], result); + m_phi_mod_impl.pack (id[m_PHI_MODULE_INDEX], result); + m_eta_mod_impl.pack (id[m_ETA_MODULE_INDEX], result); + m_side_impl.pack (id[m_SIDE_INDEX], result); + if ( m_hasRows ){ + m_row_impl.pack (id[m_ROW_INDEX], result); + } + m_strip_impl.pack (id[m_STRIP_INDEX], result); + + // Do checks + if(m_do_checks) { + if ( m_hasRows ){ + + strip_id_checks ( id[m_STATION_INDEX], + id[m_LAYER_INDEX], + id[m_PHI_MODULE_INDEX], + id[m_ETA_MODULE_INDEX], + id[m_SIDE_INDEX], + id[m_ROW_INDEX], + id[m_STRIP_INDEX]); + + } + + else { + strip_id_checks ( id[m_STATION_INDEX], + id[m_LAYER_INDEX], + id[m_PHI_MODULE_INDEX], + id[m_ETA_MODULE_INDEX], + id[m_SIDE_INDEX], + id[m_STRIP_INDEX]); + } + } + return result; +} + +//---------------------------------------------------------------------------- +inline Identifier +FaserSCT_ID::strip_id ( const Identifier& wafer_id, int strip ) const +{ + // Build identifier + Identifier result(wafer_id); + + // Reset strip and then add in value + m_strip_impl.reset (result); + m_strip_impl.pack (strip, result); + + if(m_do_checks) { + + strip_id_checks ( station(result), + layer(result), + phi_module(result), + eta_module(result), + side(result), + strip ); + } + return result; + +} + +//---------------------------------------------------------------------------- +inline Identifier +FaserSCT_ID::strip_id ( const Identifier& wafer_id, int row, int strip ) const +{ + // Build identifier + Identifier result(wafer_id); + + // Reset strip and then add in value + if ( m_hasRows ) { + m_row_impl.reset (result); + m_row_impl.pack (row, result); + } + m_strip_impl.reset (result); + m_strip_impl.pack (strip, result); + + if(m_do_checks) { + if (m_hasRows){ + + strip_id_checks ( station(result), + layer(result), + phi_module(result), + eta_module(result), + side(result), + row, + strip ); + + + } + else + { + strip_id_checks ( station(result), + layer(result), + phi_module(result), + eta_module(result), + side(result), + strip ); + } + } + return result; +} + +//---------------------------------------------------------------------------- +inline Identifier::diff_type +FaserSCT_ID::calc_offset(const Identifier& base, const Identifier& target) const +{ + Identifier::diff_type tval = static_cast<Identifier::diff_type>(target.get_compact() >> base_bit()); + Identifier::diff_type bval = static_cast<Identifier::diff_type>(base.get_compact() >> base_bit()); + return (tval - bval); +} + +//---------------------------------------------------------------------------- +inline Identifier +FaserSCT_ID::strip_id_offset(const Identifier& base, + Identifier::diff_type offset) const +{ + Identifier::value_type bval = base.get_compact() >> base_bit(); + return Identifier((bval + offset) << base_bit()); +} + +//---------------------------------------------------------------------------- +inline int +FaserSCT_ID::base_bit ( void ) const +{ + int base = static_cast<int>(m_strip_impl.shift()); // lowest field base + return (base > 32) ? 32 : base; + // max base is 32 so we can still read old strip id's and differences + // from non-SLHC releases. +} + +//---------------------------------------------------------------------------- +inline IdContext +FaserSCT_ID::wafer_context (void) const +{ + ExpandedIdentifier id; + return (IdContext(id, 0, m_SIDE_INDEX)); +} + +//---------------------------------------------------------------------------- +inline IdContext +FaserSCT_ID::strip_context (void) const +{ + ExpandedIdentifier id; + return (IdContext(id, 0, m_STRIP_INDEX)); +} + +// //---------------------------------------------------------------------------- +// inline bool +// FaserSCT_ID::is_barrel (const Identifier& id) const +// { +// // match bec field +// return (m_barrel_field.match(m_bec_impl.unpack(id))); +// } + +//---------------------------------------------------------------------------- +inline int +FaserSCT_ID::station (const Identifier& id) const +{ + return (m_station_impl.unpack(id)); +} + +//---------------------------------------------------------------------------- +inline int +FaserSCT_ID::layer (const Identifier& id) const +{ + return (m_layer_impl.unpack(id)); +} + +//---------------------------------------------------------------------------- +inline int +FaserSCT_ID::phi_module (const Identifier& id) const +{ + return (m_phi_mod_impl.unpack(id)); +} + +//---------------------------------------------------------------------------- +inline int +FaserSCT_ID::eta_module (const Identifier& id) const +{ + return (m_eta_mod_impl.unpack(id)); +} + +//---------------------------------------------------------------------------- +inline int +FaserSCT_ID::side (const Identifier& id) const +{ + return (m_side_impl.unpack(id)); +} + +//---------------------------------------------------------------------------- +inline int +FaserSCT_ID::row (const Identifier& id) const +{ + return (m_row_impl.unpack(id)); +} + + +//---------------------------------------------------------------------------- +inline int +FaserSCT_ID::strip (const Identifier& id) const +{ + return (m_strip_impl.unpack(id)); +} + + +#endif // TRACKERIDENTIFIER_SCT_ID_H diff --git a/Tracker/TrackerDetDescr/TrackerIdentifier/TrackerIdentifier/TrackerIdentifierDict.h b/Tracker/TrackerDetDescr/TrackerIdentifier/TrackerIdentifier/TrackerIdentifierDict.h new file mode 100644 index 000000000..4a297467d --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerIdentifier/TrackerIdentifier/TrackerIdentifierDict.h @@ -0,0 +1,19 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/** + * @file TrackerIdentifierDict.h + * + * @brief This file includes the class for dictionary definitions + * + * @author RD Schaffer <R.D.Schaffer@cern.ch> + * + * $Id: $ + */ +#ifndef TRACKERIDENTIFIER_TRACKERIDENTIFIERDICT_H +#define TRACKERIDENTIFIER_TRACKERIDENTIFIERDICT_H + +#include "TrackerIdentifier/FaserSCT_ID.h" + +#endif // TRACKERIDENTIFIER_TRACKERIDENTIFIERDICT_H diff --git a/Tracker/TrackerDetDescr/TrackerIdentifier/TrackerIdentifier/selection.xml b/Tracker/TrackerDetDescr/TrackerIdentifier/TrackerIdentifier/selection.xml new file mode 100644 index 000000000..80ea1847c --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerIdentifier/TrackerIdentifier/selection.xml @@ -0,0 +1,3 @@ +<lcgdict> + <class name="FaserSCT_ID" /> +</lcgdict> diff --git a/Tracker/TrackerDetDescr/TrackerIdentifier/src/FaserSCT_ID.cxx b/Tracker/TrackerDetDescr/TrackerIdentifier/src/FaserSCT_ID.cxx new file mode 100644 index 000000000..b2db2f5e8 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerIdentifier/src/FaserSCT_ID.cxx @@ -0,0 +1,1203 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +/*************************************************************************** + Tracker identifier package + ------------------------------------------- +***************************************************************************/ + +//<doc><file> $Id: FaserSCT_ID.cxx,v 1.43.2.1 2009-03-26 21:54:31 jtseng Exp $ +//<version> $Name: not supported by cvs2svn $ + +//<<<<<< INCLUDES >>>>>> +#include "GaudiKernel/MsgStream.h" + +#include "TrackerIdentifier/FaserSCT_ID.h" +#include "Identifier/IdentifierHash.h" +#include "IdDict/IdDictDefs.h" +#include <set> +#include <algorithm> +#include <iostream> + +//<<<<<< PRIVATE DEFINES >>>>>> +//<<<<<< PRIVATE CONSTANTS >>>>>> +//<<<<<< PRIVATE TYPES >>>>>> +//<<<<<< PRIVATE VARIABLE DEFINITIONS >>>>>> +//<<<<<< PUBLIC VARIABLE DEFINITIONS >>>>>> +//<<<<<< CLASS STRUCTURE INITIALIZATION >>>>>> +//<<<<<< PRIVATE FUNCTION DEFINITIONS >>>>>> +//<<<<<< PUBLIC FUNCTION DEFINITIONS >>>>>> +//<<<<<< MEMBER FUNCTION DEFINITIONS >>>>>> + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + + +FaserSCT_ID::FaserSCT_ID(void) + : + m_sct_region_index(0), + m_TRACKER_INDEX(0), + m_SCT_INDEX(1), + m_STATION_INDEX(2), + m_LAYER_INDEX(3), + m_PHI_MODULE_INDEX(4), + m_ETA_MODULE_INDEX(5), + m_SIDE_INDEX(6), + m_STRIP_INDEX(7), + m_ROW_INDEX(999), + m_dict(0), + m_wafer_hash_max(0), + m_strip_hash_max(0), + // m_station_field(0), + m_hasRows(false) +{ +} + +void +FaserSCT_ID::wafer_id_checks ( int station, + int layer, + int phi_module, + int eta_module, + int side ) const +{ + + // Check that id is within allowed range + + // Fill expanded id + ExpandedIdentifier id; + id << tracker_field_value() << sct_field_value() + << station << layer << phi_module << eta_module << side; + + if (!m_full_wafer_range.match(id)) { // module range check is sufficient + MsgStream log(m_msgSvc, "SCT_ID"); + log << MSG::ERROR << " FaserSCT_ID::wafer_id result is NOT ok. ID, range " + << (std::string)id << " " << (std::string)m_full_wafer_range << endmsg; + } +} + +void +FaserSCT_ID::strip_id_checks ( int station, + int layer, + int phi_module, + int eta_module, + int side, + int strip) const +{ + + // Check that id is within allowed range + + // Fill expanded id + ExpandedIdentifier id; + id << tracker_field_value() << sct_field_value() + << station << layer << phi_module << eta_module << side << strip; + + if (!m_full_strip_range.match(id)) { + MsgStream log(m_msgSvc, "SCT_ID"); + log << MSG::ERROR << " FaserSCT_ID::strip_id result is NOT ok. ID, range " + << (std::string)id << " " << (std::string)m_full_strip_range << std::endl; + } +} + + +void +FaserSCT_ID::strip_id_checks ( int station, + int layer, + int phi_module, + int eta_module, + int side, + int row, + int strip) const +{ + + // Check that id is within allowed range + + // Fill expanded id + ExpandedIdentifier id; + id << tracker_field_value() << sct_field_value() + << station << layer << phi_module << eta_module << side << row << strip; + + + if (!m_full_strip_range.match(id)) { + MsgStream log(m_msgSvc, "SCT_ID"); + log << MSG::ERROR << " FaserSCT_ID::strip_id result is NOT ok. ID, range " + << (std::string)id << " " << (std::string)m_full_strip_range << std::endl; + } +} + + + + +int +FaserSCT_ID::layer_max(const Identifier& id) const +{ + // get max from dictionary + ExpandedIdentifier expId; + IdContext wafer_context1 = wafer_context(); + get_expanded_id(id, expId, &wafer_context1); + for (unsigned int i = 0; i < m_full_wafer_range.size(); ++i) { + const Range& range = m_full_wafer_range[i]; + if (range.match(expId)) { + const Range::field& layer_field = range[m_LAYER_INDEX]; + if (layer_field.has_maximum()) { + return (layer_field.get_maximum()); + } + } + } + return (-999); // default +} + +int +FaserSCT_ID::eta_module_min(const Identifier& id) const +{ + // get min from dictionary - note that eta modules skip 0 for + // sct, so we must search for absolute min + ExpandedIdentifier expId; + IdContext layer_context(expId, 0, m_LAYER_INDEX); + get_expanded_id(id, expId, &layer_context); + int result = -999; + for (unsigned int i = 0; i < m_full_wafer_range.size(); ++i) { + const Range& range = m_full_wafer_range[i]; + if (range.match(expId)) { + const Range::field& eta_field = range[m_ETA_MODULE_INDEX]; + if (eta_field.has_minimum()) { + int etamin = eta_field.get_minimum(); + if (-999 == result) { + result = etamin; + } + else { + if (etamin < result) result = etamin; + } + } + } + } + return (result); +} + +int +FaserSCT_ID::eta_module_max(const Identifier& id) const +{ + // get max from dictionary - note that eta modules skip 0 for + // sct, so we must search for absolute max + ExpandedIdentifier expId; + IdContext layer_context(expId, 0, m_LAYER_INDEX); + get_expanded_id(id, expId, &layer_context); + int result = -999; + for (unsigned int i = 0; i < m_full_wafer_range.size(); ++i) { + const Range& range = m_full_wafer_range[i]; + if (range.match(expId)) { + const Range::field& eta_field = range[m_ETA_MODULE_INDEX]; + if (eta_field.has_maximum()) { + int etamax = eta_field.get_maximum(); + if (result < etamax) result = etamax; + } + } + } + return (result); +} + +int +FaserSCT_ID::strip_max (const Identifier& id) const +{ + // get max from dictionary - note that eta modules skip 0 for + // sct, so we must search for absolute max + ExpandedIdentifier expId; + IdContext layer_context(expId, 0, m_LAYER_INDEX); + get_expanded_id(id, expId, &layer_context); + int result = -999; + for (unsigned int i = 0; i < m_full_strip_range.size(); ++i) { + const Range& range = m_full_strip_range[i]; + if (range.match(expId)) { + const Range::field& strip_field = range[m_STRIP_INDEX]; + if (strip_field.has_maximum()) { + int strip = strip_field.get_maximum(); + if (result < strip) result = strip; + } + } + } + return (result); +} + + +bool +FaserSCT_ID::is_eta_module_min (const Identifier& id) const +{ + // get min from dictionary + return (eta_module(id) == eta_module_min(id)); +} + +bool +FaserSCT_ID::is_eta_module_max (const Identifier& id) const +{ + // get max from dictionary + return (eta_module(id) == eta_module_max(id)); +} + +int +FaserSCT_ID::phi_module_max(const Identifier& id) const +{ + // get max from dictionary + ExpandedIdentifier expId; + IdContext wafer_context1 = wafer_context(); + get_expanded_id(id, expId, &wafer_context1); + for (unsigned int i = 0; i < m_full_wafer_range.size(); ++i) { + const Range& range = m_full_wafer_range[i]; + if (range.match(expId)) { + const Range::field& phi_field = range[m_PHI_MODULE_INDEX]; + if (phi_field.has_maximum()) { + return (phi_field.get_maximum()); + } + } + } + return -1; +} + +bool +FaserSCT_ID::is_phi_module_max(const Identifier& id) const +{ + // get max from dictionary + return (phi_module(id) == phi_module_max(id)); +} + +int +FaserSCT_ID::initialize_from_dictionary(const IdDictMgr& dict_mgr) +{ + MsgStream log(m_msgSvc, "SCT_ID"); + log << MSG::INFO << "Initialize from dictionary" << endmsg; + + // Check whether this helper should be reinitialized + if (!reinitialize(dict_mgr)) { + log << MSG::INFO << "Request to reinitialize not satisfied - tags have not changed" << endmsg; + return (0); + } + else { + if (m_msgSvc) { + log << MSG::DEBUG << "(Re)initialize" << endmsg; + } + else { + std::cout << " DEBUG (Re)initialize" << std::endl; + } + } + + // init base object + if(FaserDetectorID::initialize_from_dictionary(dict_mgr)) + { + if (m_msgSvc) { + log << MSG::ERROR << " FaserSCT_ID::initialize_from_dict - cannot initialize base objec dictionary " << endmsg; + } + else + { + std::cout <<" ERROR FaserSCT_ID::initialize_from_dict - cannot initialize base object" << std::endl; + } + return (1); + } + + // Register version of Tracker dictionary + if (register_dict_tag(dict_mgr, "Tracker")) return(1); + + m_dict = dict_mgr.find_dictionary ("Tracker"); + if(!m_dict) { + if (m_msgSvc) { + log << MSG::ERROR << " FaserSCT_ID::initialize_from_dict - cannot access Tracker dictionary " << endmsg; + } + else + { + std::cout <<" ERROR FaserSCT_ID::initialize_from_dict - cannot access Tracker dictionary" << std::endl; + } + + return 1; + } + + // Initialize the field indices + if(initLevelsFromDict()) return (1); + + // + // Set barrel field for testing is_barrel + // + // int barrel_value; + // if (m_dict->get_label_value("barrel_endcap", "barrel", barrel_value)) { + // log << MSG::ERROR << "Could not get value for label 'barrel' of field 'barrel_endcap' in dictionary " + // << m_dict->m_name + // << endmsg; + // return (1); + // } + // m_barrel_field.clear(); + // m_barrel_field.add_value(barrel_value); + // if (m_msgSvc) { + // log << MSG::DEBUG << " FaserSCT_ID::initialize_from_dict " + // << "Set barrel field values: " + // << (std::string)m_barrel_field + // << endmsg; + // } + // else { + // std::cout << " DEBUG FaserSCT_ID::initialize_from_dict " + // << "Set barrel field values: " + // << (std::string)m_barrel_field + // << std::endl; + // } + + + // + // Build multirange for the valid set of identifiers + // + + + // Find value for the field Tracker + const IdDictDictionary* faserDict = dict_mgr.find_dictionary ("FASER"); + int trackerField = -1; + if (faserDict->get_label_value("subdet", "Tracker", trackerField)) { + log << MSG::ERROR << "Could not get value for label 'Tracker' of field 'subdet' in dictionary " + << faserDict->m_name + << endmsg; + return (1); + } + + // Find value for the field SCT + int sctField = -1; + if (m_dict->get_label_value("part", "SCT", sctField)) { + log << MSG::ERROR << "Could not get value for label 'SCT' of field 'part' in dictionary " + << m_dict->m_name + << endmsg; + return (1); + } + if (m_msgSvc) { + log << MSG::DEBUG << " FaserSCT_ID::initialize_from_dict " + << "Found field values: SCT " + << sctField + << std::endl; + } + else { + std::cout << " DEBUG FaserSCT_ID::initialize_from_dict " + << "Found field values: SCT " + << sctField + << std::endl; + } + + // Set up id for region and range prefix + ExpandedIdentifier region_id; + region_id.add(trackerField); + region_id.add(sctField); + Range prefix; + m_full_wafer_range = m_dict->build_multirange(region_id, prefix, "side"); + m_full_strip_range = m_dict->build_multirange(region_id, prefix); + + // Setup the hash tables + if(init_hashes()) return (1); + + // Setup hash tables for finding neighbors + if(init_neighbors()) return (1); + + if (m_msgSvc) { + log << MSG::INFO << " FaserSCT_ID::initialize_from_dict " << endmsg; + log << MSG::DEBUG + << "Wafer range -> " << (std::string)m_full_wafer_range + << endmsg; + log << MSG::DEBUG + << "Strip range -> " << (std::string)m_full_strip_range + << endmsg; + } + else { + std::cout << " INFO FaserSCT_ID::initialize_from_dict " << std::endl; + std::cout << " DEBUG Wafer range -> " << (std::string)m_full_wafer_range + << std::endl; + std::cout << " DEBUG Strip range -> " << (std::string)m_full_strip_range + << std::endl; + } + + return 0; +} + +int +FaserSCT_ID::init_hashes(void) +{ + + // + // create a vector(s) to retrieve the hashes for compact ids. For + // the moment, we implement a hash for wafers but NOT for strips + // (too many) + // + MsgStream log(m_msgSvc, "SCT_ID"); + // wafer hash + m_wafer_hash_max = m_full_wafer_range.cardinality(); + m_wafer_vec.resize(m_wafer_hash_max); + unsigned int nids = 0; + std::set<Identifier> ids; + for (unsigned int i = 0; i < m_full_wafer_range.size(); ++i) { + const Range& range = m_full_wafer_range[i]; + Range::const_identifier_factory first = range.factory_begin(); + Range::const_identifier_factory last = range.factory_end(); + for (; first != last; ++first) { + const ExpandedIdentifier& exp_id = (*first); + Identifier id = wafer_id(exp_id[m_STATION_INDEX], + exp_id[m_LAYER_INDEX], + exp_id[m_PHI_MODULE_INDEX], + exp_id[m_ETA_MODULE_INDEX], + exp_id[m_SIDE_INDEX]); + if(!(ids.insert(id)).second) { + log << MSG::ERROR << " FaserSCT_ID::init_hashes " + << " Error: duplicated id for wafer id. nid " << nids + << " compact id " << id.getString() + << " id " << (std::string)exp_id << endmsg; + return (1); + } + nids++; + } + } + if(ids.size() != m_wafer_hash_max) { + log << MSG::ERROR << " FaserSCT_ID::init_hashes " + << " Error: set size NOT EQUAL to hash max. size " << ids.size() + << " hash max " << m_wafer_hash_max + << endmsg; + return (1); + } + + nids = 0; + std::set<Identifier>::const_iterator first = ids.begin(); + std::set<Identifier>::const_iterator last = ids.end(); + for (; first != last && nids < m_wafer_vec.size(); ++first) { + m_wafer_vec[nids] = (*first); + nids++; + } + + // strip hash - we do not keep a vec for the strips - too large + m_strip_hash_max = m_full_strip_range.cardinality(); + + return (0); +} + +int +FaserSCT_ID::get_prev_in_phi(const IdentifierHash& id, IdentifierHash& prev) const +{ + unsigned short index = id; + if (index < m_prev_phi_wafer_vec.size()) { + if (m_prev_phi_wafer_vec[index] == NOT_VALID_HASH) return (1); + prev = m_prev_phi_wafer_vec[index]; + return (0); + } + return (1); +} + +int +FaserSCT_ID::get_next_in_phi(const IdentifierHash& id, IdentifierHash& next) const +{ + unsigned short index = id; + if (index < m_next_phi_wafer_vec.size()) { + if (m_next_phi_wafer_vec[index] == NOT_VALID_HASH) return (1); + next = m_next_phi_wafer_vec[index]; + return (0); + } + return (1); +} + +int +FaserSCT_ID::get_prev_in_eta(const IdentifierHash& id, IdentifierHash& prev) const +{ + unsigned short index = id; + if (index < m_prev_eta_wafer_vec.size()) { + if (m_prev_eta_wafer_vec[index] == NOT_VALID_HASH) return (1); + prev = m_prev_eta_wafer_vec[index]; + return (0); + } + return (1); +} + +int +FaserSCT_ID::get_next_in_eta(const IdentifierHash& id, IdentifierHash& next) const +{ + unsigned short index = id; + if (index < m_next_eta_wafer_vec.size()) { + if (m_next_eta_wafer_vec[index] == NOT_VALID_HASH) return (1); + next = m_next_eta_wafer_vec[index]; + return (0); + } + return (1); +} + +int +FaserSCT_ID::get_other_side (const IdentifierHash& hashId, IdentifierHash& other) const +{ + if (m_dict) { + // get max from dictionary + Identifier id; + IdContext wafer_context1 = wafer_context(); + if(!get_id(hashId, id, &wafer_context1)) { + other = side(id) ? hashId - 1 : hashId + 1; + return (0); + } + } + return (1); +} + +int +FaserSCT_ID::init_neighbors(void) +{ + // + // create a vector(s) to retrieve the hashes for compact ids for + // wafer neighbors. + // + + MsgStream log(m_msgSvc, "SCT_ID"); + if (m_msgSvc) { + log << MSG::DEBUG << "FaserSCT_ID::init_neighbors " << endmsg; + } + else { + std::cout << " DEBUG FaserSCT_ID::init_neighbors " << std::endl; + } + + + m_prev_phi_wafer_vec.resize(m_wafer_hash_max, NOT_VALID_HASH); + m_next_phi_wafer_vec.resize(m_wafer_hash_max, NOT_VALID_HASH); + m_prev_eta_wafer_vec.resize(m_wafer_hash_max, NOT_VALID_HASH); + m_next_eta_wafer_vec.resize(m_wafer_hash_max, NOT_VALID_HASH); + + for (unsigned int i = 0; i < m_full_wafer_range.size(); ++i) { + const Range& range = m_full_wafer_range[i]; + const Range::field& phi_field = range[m_PHI_MODULE_INDEX]; + const Range::field& eta_field = range[m_ETA_MODULE_INDEX]; + Range::const_identifier_factory first = range.factory_begin(); + Range::const_identifier_factory last = range.factory_end(); + for (; first != last; ++first) { + const ExpandedIdentifier& exp_id = (*first); + ExpandedIdentifier::element_type previous_phi; + ExpandedIdentifier::element_type next_phi; + ExpandedIdentifier::element_type previous_eta; + ExpandedIdentifier::element_type next_eta; + bool pphi = phi_field.get_previous(exp_id[m_PHI_MODULE_INDEX], previous_phi); + bool nphi = phi_field.get_next (exp_id[m_PHI_MODULE_INDEX], next_phi); + bool peta = eta_field.get_previous(exp_id[m_ETA_MODULE_INDEX], previous_eta); + bool neta = eta_field.get_next (exp_id[m_ETA_MODULE_INDEX], next_eta); + + IdContext wcontext = wafer_context(); + + // First get primary hash id + IdentifierHash hash_id; + Identifier id = wafer_id(exp_id[m_STATION_INDEX], + exp_id[m_LAYER_INDEX], + exp_id[m_PHI_MODULE_INDEX], + exp_id[m_ETA_MODULE_INDEX], + exp_id[m_SIDE_INDEX]); + if (get_hash(id, hash_id, &wcontext)) { + log << MSG::ERROR << " FaserSCT_ID::init_neighbors - unable to get hash, exp/compact " + << show_to_string(id, &wcontext) + << " " << (std::string)m_full_wafer_range << endmsg; + return (1); + } + + // index for the subsequent arrays + unsigned short index = hash_id; + assert (hash_id < m_prev_phi_wafer_vec.size()); + assert (hash_id < m_next_phi_wafer_vec.size()); + assert (hash_id < m_prev_eta_wafer_vec.size()); + assert (hash_id < m_next_eta_wafer_vec.size()); + + if (pphi) { + // Get previous phi hash id + ExpandedIdentifier expId = exp_id; + expId[m_PHI_MODULE_INDEX] = previous_phi; + Identifier id = wafer_id(expId[m_STATION_INDEX], + expId[m_LAYER_INDEX], + expId[m_PHI_MODULE_INDEX], + expId[m_ETA_MODULE_INDEX], + expId[m_SIDE_INDEX]); + if (get_hash(id, hash_id, &wcontext)) { + log << MSG::ERROR << " FaserSCT_ID::init_neighbors - unable to get previous phi hash, exp/compact " << id.getString() << " " + << endmsg; + return (1); + } + m_prev_phi_wafer_vec[index] = hash_id; + } + + if (nphi) { + // Get next phi hash id + ExpandedIdentifier expId = exp_id; + expId[m_PHI_MODULE_INDEX] = next_phi; + Identifier id = wafer_id(expId[m_STATION_INDEX], + expId[m_LAYER_INDEX], + expId[m_PHI_MODULE_INDEX], + expId[m_ETA_MODULE_INDEX], + expId[m_SIDE_INDEX]); + if (get_hash(id, hash_id, &wcontext)) { + log << MSG::ERROR << " FaserSCT_ID::init_neighbors - unable to get next phi hash, exp/compact " << id.getString() << + " " << MSG::hex << id.getString() << MSG::dec << endmsg; + return (1); + } + m_next_phi_wafer_vec[index] = hash_id; + } + + if (peta) { + // Get previous eta hash id + ExpandedIdentifier expId = exp_id; + expId[m_ETA_MODULE_INDEX] = previous_eta; + Identifier id = wafer_id(expId[m_STATION_INDEX], + expId[m_LAYER_INDEX], + expId[m_PHI_MODULE_INDEX], + expId[m_ETA_MODULE_INDEX], + expId[m_SIDE_INDEX]); + if (get_hash(id, hash_id, &wcontext)) { + log << MSG::ERROR << " FaserSCT_ID::init_neighbors - unable to get previous eta hash, exp/compact " << id.getString() + << " " << std::endl; + return (1); + } + m_prev_eta_wafer_vec[index] = hash_id; + } + + if (neta) { + // Get next eta hash id + ExpandedIdentifier expId = exp_id; + expId[m_ETA_MODULE_INDEX] = next_eta; + Identifier id = wafer_id(expId[m_STATION_INDEX], + expId[m_LAYER_INDEX], + expId[m_PHI_MODULE_INDEX], + expId[m_ETA_MODULE_INDEX], + expId[m_SIDE_INDEX]); + if (get_hash(id, hash_id, &wcontext)) { + log << MSG::ERROR << " FaserSCT_ID::init_neighbors - unable to get next eta hash, exp/compact " << id.getString() + << " " << endmsg; + return (1); + } + m_next_eta_wafer_vec[index] = hash_id; + } + + +// std::cout << " FaserSCT_ID::init_neighbors " +// << " phi, previous, next " << id[m_PHI_MODULE_INDEX] +// << " " << pphi +// << " " << previous_phi +// << " " << nphi +// << " " << next_phi +// << " eta, previous, next " << id[m_ETA_MODULE_INDEX] +// << " " << peta +// << " " << previous_eta +// << " " << neta +// << " " << next_eta +// << " id " << (std::string)(*first) +// << std::endl; + } + } + return (0); +} + + + +int +FaserSCT_ID::initLevelsFromDict() +{ + + + MsgStream log(m_msgSvc, "SCT_ID"); + if(!m_dict) { + log << MSG::ERROR << " FaserSCT_ID::initLevelsFromDict - dictionary NOT initialized " << endmsg; + return (1); + } + + // Find out which identifier field corresponds to each level. Use + // names to find each field/leve. + + m_TRACKER_INDEX = 999; + m_SCT_INDEX = 999; + m_STATION_INDEX = 999; + m_LAYER_INDEX = 999; + m_PHI_MODULE_INDEX = 999; + m_ETA_MODULE_INDEX = 999; + m_SIDE_INDEX = 999; + m_ROW_INDEX = 999; + m_STRIP_INDEX = 999; + m_hasRows = false; + + + // Save index to a SCT region for unpacking + ExpandedIdentifier id; + id << tracker_field_value() << sct_field_value(); + if (m_dict->find_region(id, m_sct_region_index)) { + log << MSG::ERROR << "FaserSCT_ID::initLevelsFromDict - unable to find sct region index: id, reg " + << (std::string)id << " " << m_sct_region_index + << endmsg; + return (1); + } + + // Find a SCT region + IdDictField* field = m_dict->find_field("subdet"); + if (field) { + m_TRACKER_INDEX = field->m_index; + } + else { + log << MSG::ERROR << "FaserSCT_ID::initLevelsFromDict - unable to find 'subdet' field " << endmsg; + return (1); + } + field = m_dict->find_field("part"); + if (field) { + m_SCT_INDEX = field->m_index; + } + else { + log << MSG::ERROR << "FaserSCT_ID::initLevelsFromDict - unable to find 'part' field " << endmsg; + return (1); + } + field = m_dict->find_field("station"); + if (field) { + m_STATION_INDEX = field->m_index; + } + else { + log << MSG::ERROR << "FaserSCT_ID::initLevelsFromDict - unable to find 'station' field " << endmsg; + return (1); + } + field = m_dict->find_field("layer"); + if (field) { + m_LAYER_INDEX = field->m_index; + } + else { + log << MSG::ERROR << "FaserSCT_ID::initLevelsFromDict - unable to find 'layer' field " << endmsg; + return (1); + } + field = m_dict->find_field("phi_module"); + if (field) { + m_PHI_MODULE_INDEX = field->m_index; + } + else { + log << MSG::ERROR<< "FaserSCT_ID::initLevelsFromDict - unable to find 'phi_module' field " << endmsg; + return (1); + } + field = m_dict->find_field("eta_module"); + if (field) { + m_ETA_MODULE_INDEX = field->m_index; + } + else { + log << MSG::ERROR << "FaserSCT_ID::initLevelsFromDict - unable to find 'eta_module' field " << endmsg; + return (1); + } + field = m_dict->find_field("side"); + if (field) { + m_SIDE_INDEX = field->m_index; + } + else { + log << MSG::ERROR << "FaserSCT_ID::initLevelsFromDict - unable to find 'side' field " << endmsg; + return (1); + } + + + field = m_dict->find_field("row"); + if (field) { + m_ROW_INDEX = field->m_index; + m_hasRows = true ; + } + + else { + + //log << MSG::ERROR << "FaserSCT_ID::initLevelsFromDict - unable to find 'row' field " << endmsg; + //return (1); + } + + + field = m_dict->find_field("strip"); + if (field) { + m_STRIP_INDEX = field->m_index; + } + else { + log << MSG::ERROR << "FaserSCT_ID::initLevelsFromDict - unable to find 'strip' field " << endmsg; + return (1); + } + + // Set the field implementations: for station, layer, eta/phi mod + + const IdDictRegion& region = *m_dict->m_regions[m_sct_region_index]; + + m_tracker_impl = region.m_implementation[m_TRACKER_INDEX]; + m_sct_impl = region.m_implementation[m_SCT_INDEX]; + m_station_impl = region.m_implementation[m_STATION_INDEX]; + m_layer_impl = region.m_implementation[m_LAYER_INDEX]; + m_phi_mod_impl = region.m_implementation[m_PHI_MODULE_INDEX]; + m_eta_mod_impl = region.m_implementation[m_ETA_MODULE_INDEX]; + m_side_impl = region.m_implementation[m_SIDE_INDEX]; + if (m_hasRows){ + m_row_impl = region.m_implementation[m_ROW_INDEX]; + } + m_strip_impl = region.m_implementation[m_STRIP_INDEX]; + + if (m_msgSvc) { + log << MSG::DEBUG << "decode index and bit fields for each level: " << endmsg; + log << MSG::DEBUG << "tracker " << m_tracker_impl.show_to_string() << endmsg; + log << MSG::DEBUG << "sct " << m_sct_impl.show_to_string() << endmsg; + log << MSG::DEBUG << "station " << m_station_impl.show_to_string() << endmsg; + log << MSG::DEBUG << "layer " << m_layer_impl.show_to_string() << endmsg; + log << MSG::DEBUG << "phi_mod " << m_phi_mod_impl.show_to_string() << endmsg; + log << MSG::DEBUG << "eta_mod " << m_eta_mod_impl.show_to_string() << endmsg; + log << MSG::DEBUG << "side " << m_side_impl.show_to_string() << endmsg; + if (m_hasRows){ + log << MSG::DEBUG << "row " << m_row_impl.show_to_string() << endmsg; + } + log << MSG::DEBUG << "strip " << m_strip_impl.show_to_string() << endmsg; + } + else { + std::cout << " DEBUG decode index and bit fields for each level: " << std::endl; + std::cout << " DEBUG tracker " << m_tracker_impl.show_to_string() << std::endl; + std::cout << " DEBUG sct " << m_sct_impl.show_to_string() << std::endl; + std::cout << " DEBUG station " << m_station_impl.show_to_string() << std::endl; + std::cout << " DEBUG layer " << m_layer_impl.show_to_string() << std::endl; + std::cout << " DEBUG phi_mod " << m_phi_mod_impl.show_to_string() << std::endl; + std::cout << " DEBUG eta_mod " << m_eta_mod_impl.show_to_string() << std::endl; + std::cout << " DEBUG side " << m_side_impl.show_to_string() << std::endl; + if ( m_hasRows ){ + log <<" DEBUG row " << m_row_impl.show_to_string() << std::endl; + } + std::cout << " DEBUG strip " << m_strip_impl.show_to_string() << std::endl; + } + +// std::cout << "FaserSCT_ID::initLevelsFromDict - found levels " << std::endl; +// std::cout << "subdet " << m_TRACKER_INDEX << std::endl; +// std::cout << "part " << m_SCT_INDEX << std::endl; +// std::cout << "barrel_endcap " << m_STATION_INDEX << std::endl; +// std::cout << "layer " << m_LAYER_INDEX << std::endl; +// std::cout << "phi_module " << m_PHI_MODULE_INDEX << std::endl; +// std::cout << "eta_module " << m_ETA_MODULE_INDEX << std::endl; +// std::cout << "side " << m_SIDE_INDEX << std::endl; +// std::cout << "strip " << m_STRIP_INDEX << std::endl; + + std::cout << "tracker " << m_tracker_impl.decode_index() << " " + << (std::string)m_tracker_impl.ored_field() << " " + << std::hex << m_tracker_impl.mask() << " " + << m_tracker_impl.zeroing_mask() << " " + << std::dec << m_tracker_impl.shift() << " " + << m_tracker_impl.bits() << " " + << m_tracker_impl.bits_offset() + << std::endl; + std::cout << "sct" << m_sct_impl.decode_index() << " " + << (std::string)m_sct_impl.ored_field() << " " + << std::hex << m_sct_impl.mask() << " " + << m_sct_impl.zeroing_mask() << " " + << std::dec << m_sct_impl.shift() << " " + << m_sct_impl.bits() << " " + << m_sct_impl.bits_offset() + << std::endl; + std::cout << "station" << m_station_impl.decode_index() << " " + << (std::string)m_station_impl.ored_field() << " " + << std::hex << m_station_impl.mask() << " " + << m_station_impl.zeroing_mask() << " " + << std::dec << m_station_impl.shift() << " " + << m_station_impl.bits() << " " + << m_station_impl.bits_offset() + << std::endl; + std::cout << "layer"<< m_layer_impl.decode_index() << " " + << (std::string)m_layer_impl.ored_field() << " " + << std::hex << m_layer_impl.mask() << " " + << m_layer_impl.zeroing_mask() << " " + << std::dec << m_layer_impl.shift() << " " + << m_layer_impl.bits() << " " + << m_layer_impl.bits_offset() + << std::endl; + std::cout << "phi_mod" << m_phi_mod_impl.decode_index() << " " + << (std::string)m_phi_mod_impl.ored_field() << " " + << std::hex << m_phi_mod_impl.mask() << " " + << m_phi_mod_impl.zeroing_mask() << " " + << std::dec << m_phi_mod_impl.shift() << " " + << m_phi_mod_impl.bits() << " " + << m_phi_mod_impl.bits_offset() + << std::endl; + std::cout << "eta_mod" << m_eta_mod_impl.decode_index() << " " + << (std::string)m_eta_mod_impl.ored_field() << " " + << std::hex << m_eta_mod_impl.mask() << " " + << m_eta_mod_impl.zeroing_mask() << " " + << std::dec << m_eta_mod_impl.shift() << " " + << m_eta_mod_impl.bits() << " " + << m_eta_mod_impl.bits_offset() + << std::endl; + std::cout << "side" << m_side_impl.decode_index() << " " + << (std::string)m_side_impl.ored_field() << " " + << std::hex << m_side_impl.mask() << " " + << m_side_impl.zeroing_mask() << " " + << std::dec << m_side_impl.shift() << " " + << m_side_impl.bits() << " " + << m_side_impl.bits_offset() + << std::endl; + + if ( m_hasRows ){ + std::cout << "row" << m_row_impl.decode_index() << " " + << (std::string)m_row_impl.ored_field() << " " + << std::hex << m_row_impl.mask() << " " + << m_row_impl.zeroing_mask() << " " + << std::dec << m_row_impl.shift() << " " + << m_row_impl.bits() << " " + << m_row_impl.bits_offset() + << std::endl; + } + + + std::cout << "strip" << m_strip_impl.decode_index() << " " + << (std::string)m_strip_impl.ored_field() << " " + << std::hex << m_strip_impl.mask() << " " + << m_strip_impl.zeroing_mask() << " " + << std::dec << m_strip_impl.shift() << " " + << m_strip_impl.bits() << " " + << m_strip_impl.bits_offset() + << std::endl; + + return (0); +} + +FaserSCT_ID::size_type +FaserSCT_ID::wafer_hash_max (void) const +{ + return m_wafer_hash_max; +} + +FaserSCT_ID::size_type +FaserSCT_ID::strip_hash_max (void) const +{ + return m_strip_hash_max; +} + +FaserSCT_ID::const_id_iterator FaserSCT_ID::wafer_begin (void) const +{ + return (m_wafer_vec.begin()); +} + +FaserSCT_ID::const_id_iterator FaserSCT_ID::wafer_end (void) const +{ + return (m_wafer_vec.end()); +} + +FaserSCT_ID::const_expanded_id_iterator FaserSCT_ID::strip_begin (void) const +{ + return (m_full_strip_range.factory_begin()); +} + +FaserSCT_ID::const_expanded_id_iterator FaserSCT_ID::strip_end (void) const +{ + return (m_full_strip_range.factory_end()); +} + +// From hash get Identifier +int +FaserSCT_ID::get_id (const IdentifierHash& hash_id, + Identifier& id, + const IdContext* context) const +{ + + int result = 1; + id.clear(); + + size_t begin = (context) ? context->begin_index(): 0; + // cannot get hash if end is 0: + size_t end = (context) ? context->end_index() : 0; + if (0 == begin) { + // No hashes yet for ids with prefixes + if (m_SIDE_INDEX == end) { + if (hash_id < (unsigned int)(m_wafer_vec.end() - m_wafer_vec.begin())) { + id = m_wafer_vec[hash_id]; + result = 0; + } + } + else if (m_STRIP_INDEX == end) { + // Do not know how to calculate strip id from hash yet!! + std::cout << "Do not know how to calculate strip id from hash yet!!" << std::endl; + } + } + return (result); +} + +void +FaserSCT_ID::get_expanded_id (const Identifier& id, + ExpandedIdentifier& exp_id, + const IdContext* context) const +{ + exp_id.clear(); + exp_id << tracker_field_value() + << sct_field_value() + << station(id) + << layer(id) + << phi_module(id) + << eta_module(id) + << side(id); + if(!context || context->end_index() == m_STRIP_INDEX) { + if ( m_hasRows) { + exp_id << row(id) << strip(id); + } + else { + exp_id << strip(id); + } + } +} + +int +FaserSCT_ID::get_hash (const Identifier& id, + IdentifierHash& hash_id, + const IdContext* context) const +{ + + // Get the hash code from either a vec (for wafers) or calculate + // it (strips). For the former, we convert to compact and call + // get_hash again. For the latter, we calculate the hash from the + // Identifier. + + int result = 1; + hash_id = 0; + size_t begin = (context) ? context->begin_index(): 0; + size_t end = (context) ? context->end_index() : 0; + if (0 == begin) { + // No hashes yet for ids with prefixes + if (m_SIDE_INDEX == end) { + hash_id = wafer_hash(id); + if (hash_id.is_valid()) result = 0; + } + else if (context && context->end_index() == m_STRIP_INDEX) { + // Must calculate for strip hash + ExpandedIdentifier new_id; + get_expanded_id(id, new_id); + hash_id = m_full_strip_range.cardinalityUpTo(new_id); + result = 0; + } + } + return (result); +} + + +void +FaserSCT_ID::test_wafer_packing (void) const +{ + MsgStream log(m_msgSvc, "SCT_ID"); + + if (m_dict) { + + int nids = 0; + int nerr = 0; + IdContext context = wafer_context(); + const_id_iterator first = m_wafer_vec.begin(); + const_id_iterator last = m_wafer_vec.end(); + for (; first != last; ++first, ++nids) { + Identifier id = (*first); + ExpandedIdentifier exp_id; + get_expanded_id(id, exp_id, &context); + Identifier new_id = wafer_id(exp_id[m_STATION_INDEX], + exp_id[m_LAYER_INDEX], + exp_id[m_PHI_MODULE_INDEX], + exp_id[m_ETA_MODULE_INDEX], + exp_id[m_SIDE_INDEX]); + if (id != new_id) { + log << MSG::ERROR << "FaserSCT_ID::test_wafer_packing: new and old compacts not equal. New/old/expanded ids " + << MSG::hex << show_to_string(id) << " " << show_to_string(new_id) << " " << MSG::dec + << (std::string)exp_id << endmsg; + nerr++; + continue; + } + // check wafer id + if (!exp_id[m_SIDE_INDEX]) { + + Identifier new_id1 = module_id(exp_id[m_STATION_INDEX], + exp_id[m_LAYER_INDEX], + exp_id[m_PHI_MODULE_INDEX], + exp_id[m_ETA_MODULE_INDEX]); + if (id != new_id1) { + log << MSG::ERROR << "FaserSCT_ID::test_wafer_packing: new and old module idsnot equal. New/old/expanded ids " + << MSG::hex << show_to_string(id) << " " << show_to_string(new_id1) << " " << MSG::dec + << (std::string)exp_id << endmsg; + nerr++; + continue; + } + } + } + + if (m_msgSvc) { + log << MSG::DEBUG << "FaserSCT_ID::test_wafer_packing: tested wafer and module ids. nids, errors " + << nids << " " << nerr << endmsg; + } + else { + std::cout << " DEBUG FaserSCT_ID::test_wafer_packing: tested wafer and module ids. nids, errors " + << nids << " " << nerr << std::endl; + } + + nids = 0; + context = strip_context(); + const_expanded_id_iterator first_sct = strip_begin(); + const_expanded_id_iterator last_sct = strip_end(); + for (; first_sct != last_sct; ++first_sct, ++nids) { + if (nids%10000 != 1) continue; + const ExpandedIdentifier& exp_id = *first_sct; + ExpandedIdentifier new_exp_id; + + Identifier id = wafer_id(exp_id[m_STATION_INDEX], + exp_id[m_LAYER_INDEX], + exp_id[m_PHI_MODULE_INDEX], + exp_id[m_ETA_MODULE_INDEX], + exp_id[m_SIDE_INDEX]); + get_expanded_id(id, new_exp_id, &context); + if (exp_id[0] != new_exp_id[0] || + exp_id[1] != new_exp_id[1] || + exp_id[2] != new_exp_id[2] || + exp_id[3] != new_exp_id[3] || + exp_id[4] != new_exp_id[4] || + exp_id[5] != new_exp_id[5] || + exp_id[6] != new_exp_id[6]) { + log << MSG::ERROR << "FaserSCT_ID::test_wafer_packing: new and old ids not equal. New/old/compact ids " + << (std::string)new_exp_id << " " << (std::string)exp_id + << " " << show_to_string(id) << endmsg; + continue; + } + + Identifier stripid ; + Identifier stripid1 ; + if ( m_hasRows ) { + + stripid = strip_id ( exp_id[m_STATION_INDEX], + exp_id[m_LAYER_INDEX], + exp_id[m_PHI_MODULE_INDEX], + exp_id[m_ETA_MODULE_INDEX], + exp_id[m_SIDE_INDEX], + exp_id[m_ROW_INDEX], + exp_id[m_STRIP_INDEX]); + + stripid1 = strip_id ( station(stripid), + layer(stripid), + phi_module(stripid), + eta_module(stripid), + side(stripid), + row(stripid), + strip(stripid)); + + } + + else { + + stripid = strip_id ( exp_id[m_STATION_INDEX], + exp_id[m_LAYER_INDEX], + exp_id[m_PHI_MODULE_INDEX], + exp_id[m_ETA_MODULE_INDEX], + exp_id[m_SIDE_INDEX], + exp_id[m_STRIP_INDEX]); + + + stripid1 = strip_id ( station(stripid), + layer(stripid), + phi_module(stripid), + eta_module(stripid), + side(stripid), + strip(stripid)); + + } + + + if (stripid != stripid1) { + log << MSG::ERROR << "FaserSCT_ID::test_wafer_packing: new and old pixel ids not equal. New/old ids " + << " " << show_to_string(stripid1) << " " + << show_to_string(stripid) << endmsg; + } + } + + + + if (m_msgSvc) { + log << MSG::DEBUG << "FaserSCT_ID::test_wafer_packing: Successful tested " + << nids << " ids. " + << endmsg; + } + else { + std::cout << " DEBUG FaserSCT_ID::test_wafer_packing: Successful tested " + << nids << " ids. " + << std::endl; + } + } + else { + log << MSG::ERROR << "FaserSCT_ID::test_wafer_packing: Unable to test wafer is packing - no dictionary has been defined. " + << endmsg; + } +} + diff --git a/Tracker/TrackerDetDescr/TrackerIdentifier/test/test_tracker_id.cxx b/Tracker/TrackerDetDescr/TrackerIdentifier/test/test_tracker_id.cxx new file mode 100644 index 000000000..f2ece9c3f --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerIdentifier/test/test_tracker_id.cxx @@ -0,0 +1,935 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// $Header: /build/atlas/cvs/atlas/offline/InnerDetector/InDetDetDescr/InDetIdentifier/test/test_indet_id.cxx,v 1.11.2.1 2009-03-26 21:54:32 jtseng Exp $ + +#include "IdDictParser/IdDictParser.h" +#include "Identifier/Range.h" +#include "Identifier/IdentifierHash.h" +#include "TrackerIdentifier/FaserSCT_ID.h" +#include "GaudiKernel/System.h" +#include <iostream> + +typedef Identifier::size_type size_type ; + +// static void tab (size_t level) +// { +// for (size_t i = 0; i < level; ++i) std::cout << " "; +// } + +// static ExpandedIdentifier +// pixel_id ( int barrel_ec, +// int layer_disk, +// int phi_module, +// int eta_module, +// int phi_index, +// int eta_index) +// { +// // Build identifier +// ExpandedIdentifier result; +// result << 1 << barrel_ec << layer_disk << phi_module << eta_module; +// result << phi_index << eta_index; + +// assert (result.last_error () == ExpandedIdentifier::none); + +// return result; +//} + +static void +check_sct_timing(IdDictMgr& idd) +{ + + std::cout << "=========> Begin check_sct_timing " << std::endl; + std::cout << "=========> Begin check_sct_timing " << std::endl; + + // Check the timing for sct + + FaserSCT_ID sct_id; + + longlong startOfUserTime = System::userTime( System::microSec ); + longlong startOfKernelTime = System::kernelTime ( System::microSec ); + longlong startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + if(sct_id.initialize_from_dictionary (idd)) { + std::cout << "check_lar_neighbour_timing - cannot init from dict" << std::endl; + } + + std::cout << "Timing for init from dictionary " << std::endl; + + /// following lines could be platform dependent! + longlong deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + longlong deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + longlong deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "tries, user, kernel, elapsed " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << std::endl; + + + /// Loop over all channel hashes + size_type hash_max = sct_id.wafer_hash_max (); + + std::cout << "Number of channels " << hash_max + << std::endl; + + int nloops = 10000; + float num = hash_max*nloops; + Identifier::value_type n = 0; + + + /// Empty loop + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<hash_max; ++i) { + ++n; + n += i; + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Empty loop " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + float user = (float)deltaUser/num; + float kernel = (float)deltaKernel/num; + float elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + + /// Wafer Identifier access + + /// Store in object the measured times + Identifier wafer_id; + IdContext channelContext = sct_id.wafer_context(); + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + +// const std::vector<Identifier>* em_vec = sct_id.em_vec(); +// std::vector<Identifier>::const_iterator em_vec_begin = sct_id.em_vec()->begin(); + + n = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<hash_max; ++i) { + ++n; + n += sct_id.wafer_id(i).get_compact(); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get ID from hash " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + + /// Identifier and barrel_ec field access + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<hash_max; ++i) { + ++n; + wafer_id = sct_id.wafer_id(i); + n += sct_id.station(wafer_id); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get ID from hash and access barrel_ec field " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + + /// Identifier and layer_disk field access + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<hash_max; ++i) { + ++n; +// sct_id.get_id(i, wafer_id, &channelContext); + wafer_id = sct_id.wafer_id(i); + n += sct_id.layer(wafer_id); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get ID from hash and access layer_disk field " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + + /// Identifier and phi_module field access + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<hash_max; ++i) { + ++n; +// sct_id.get_id(i, wafer_id, &channelContext); + wafer_id = sct_id.wafer_id(i); + n += sct_id.phi_module(wafer_id); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get ID from hash and access phi_module field " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + + /// Identifier and eta_module field access + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<hash_max; ++i) { + ++n; + wafer_id = sct_id.wafer_id(i); + n += sct_id.eta_module(wafer_id); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get ID from hash and access eta_module field " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + + /// Identifier and side field access + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<hash_max; ++i) { + ++n; + wafer_id = sct_id.wafer_id(i); + n += sct_id.side(wafer_id); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get ID from hash and access side field " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + nloops = 1000; + num = hash_max*nloops; + + /// Identifier access and hash access again + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<hash_max; ++i) { + ++n; +// sct_id.get_id(i, wafer_id, &channelContext); + wafer_id = sct_id.wafer_id(i); + n += sct_id.wafer_hash(wafer_id); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get ID from hash and get hash back again " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + + nloops = 3000; + num = hash_max*nloops; + + /// Identifier and wafer fields access + + /// Store in object the measured times + int barrel_ec; + int layer_disk; + int phi_module; + int eta_module; + int side; + + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<hash_max; ++i) { + ++n; + wafer_id = sct_id.wafer_id(i); + barrel_ec = sct_id.station(wafer_id); + layer_disk = sct_id.layer(wafer_id); + phi_module = sct_id.phi_module(wafer_id); + eta_module = sct_id.eta_module(wafer_id); + side = sct_id.side(wafer_id); + n += barrel_ec + layer_disk + eta_module + phi_module + side; + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get ID and wafer fields " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + + nloops = 1000; + num = hash_max*nloops; + + + /// Identifier and wafer fields access and wafer ID again + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<hash_max; ++i) { + ++n; +// sct_id.get_id(i, wafer_id, &channelContext); + wafer_id = sct_id.wafer_id(i); + barrel_ec = sct_id.station(wafer_id); + layer_disk = sct_id.layer(wafer_id); + phi_module = sct_id.phi_module(wafer_id); + eta_module = sct_id.eta_module(wafer_id); + side = sct_id.side(wafer_id); + n += barrel_ec + layer_disk + eta_module + phi_module + side + + sct_id.wafer_id(barrel_ec, layer_disk, phi_module, eta_module, side).get_compact(); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get ID and wafer fields and wafer ID again " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + nloops = 100000; + + // Save sct ids + + unsigned int nstripids = 20000; + num = nstripids*nloops; + Identifier stripid; + std::vector<Identifier> stripids(nstripids); + + FaserSCT_ID::const_expanded_id_iterator first_sct = sct_id.strip_begin(); + FaserSCT_ID::const_expanded_id_iterator last_sct = sct_id.strip_end(); + unsigned int nids = 0; + for (; first_sct != last_sct && nids < nstripids; ++first_sct, ++nids) { + const ExpandedIdentifier& exp_id = *first_sct; + stripids[nids] = sct_id.strip_id (exp_id[2], + exp_id[3], + exp_id[4], + exp_id[5], + exp_id[6], + exp_id[7]); + } + + /// sct Identifier access - empty loop + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + +// const std::vector<Identifier>* em_vec = sct_id.em_vec(); +// std::vector<Identifier>::const_iterator em_vec_begin = sct_id.em_vec()->begin(); + + n = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<nstripids; ++i) { + ++n; + n += i; + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get sct ID empty loop " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + nloops = 10000; + num = nstripids*nloops; + + /// Get sct id + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + +// const std::vector<Identifier>* em_vec = sct_id.em_vec(); +// std::vector<Identifier>::const_iterator em_vec_begin = sct_id.em_vec()->begin(); + + n = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<nstripids; ++i) { + ++n; + stripid = stripids[i]; + n += stripid.get_compact(); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get sct ID from vector " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + nloops = 1000; + num = nstripids*nloops; + + int strip; + + /// sct Identifier field access + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + nids = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<nstripids; ++i) { + ++n; + stripid = stripids[i]; + barrel_ec = sct_id.station(stripid); + layer_disk = sct_id.layer(stripid); + phi_module = sct_id.phi_module(stripid); + eta_module = sct_id.eta_module(stripid); + side = sct_id.side(stripid); + strip = sct_id.strip(stripid); + n += barrel_ec + layer_disk + eta_module + phi_module + + side + strip + stripid.get_compact(); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get sct ID fields " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + nloops = 300; + num = nstripids*nloops; + + /// sct Identifier field access and id back + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + nids = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<nstripids; ++i) { + ++n; + stripid = stripids[i]; + barrel_ec = sct_id.station(stripid); + layer_disk = sct_id.layer(stripid); + phi_module = sct_id.phi_module(stripid); + eta_module = sct_id.eta_module(stripid); + side = sct_id.side(stripid); + strip = sct_id.strip(stripid); + n += barrel_ec + layer_disk + eta_module + phi_module + + side + strip + stripid .get_compact()+ + sct_id.strip_id(barrel_ec, + layer_disk, + phi_module, + eta_module, + side, + strip).get_compact(); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get sct ID fields and sct id back " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + + + /// sct Identifier get wafer id + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + nids = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<nstripids; ++i) { + ++n; + stripid = stripids[i]; + n += stripid.get_compact() + sct_id.wafer_id(stripid).get_compact(); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get sct ID then wafer id " << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + + + /// sct Identifier get wafer id and eta/phi index + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + nids = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<nstripids; ++i) { + ++n; + stripid = stripids[i]; + strip = sct_id.strip(stripid); + n += strip + stripid.get_compact() + + sct_id.wafer_id(stripid).get_compact(); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get sct, wafer id and and eta/phi index" << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + + + /// sct Identifier get wafer id and eta/phi index and strip id again + + /// Store in object the measured times + startOfUserTime = System::userTime( System::microSec ); + startOfKernelTime = System::kernelTime ( System::microSec ); + startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + n = 0; + nids = 0; + for (int j = 0; j < nloops; ++j) { + for (size_type i=0; i<nstripids; ++i) { + ++n; + stripid = stripids[i]; + strip = sct_id.strip(stripid); + wafer_id = sct_id.wafer_id(stripid); + n += strip + stripid.get_compact() + wafer_id.get_compact() + + sct_id.strip_id(wafer_id, strip).get_compact(); + } + } + + /// following lines could be platform dependent! + deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "Get sct, wafer id and and eta/phi index and stripid again" << std::endl; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << n << " " + << std::endl; + user = (float)deltaUser/num; + kernel = (float)deltaKernel/num; + elapsed = (float)deltaElapsed/num; + std::cout << "tries, user, kernel, elapsed " + << num << " " + << user << " " + << kernel << " " + << elapsed << " " + << std::endl; + + +} + +static void +check_sct_decoding(IdDictMgr& idd) +{ + + std::cout << "=========> check_sct_decoding" << std::endl; + std::cout << "=========> check_sct_decoding" << std::endl; + + FaserSCT_ID sct_id; + + if(sct_id.initialize_from_dictionary (idd)) { + std::cout << "check_sct_decoding - cannot init from dict" << std::endl; + } + + sct_id.set_do_checks(true); + + sct_id.test_wafer_packing (); + +} + +int main (int argc, char* argv[]) +{ + if (argc < 2) return (1); + + + longlong startOfUserTime = System::userTime( System::microSec ); + longlong startOfKernelTime = System::kernelTime ( System::microSec ); + longlong startOfElapsedTime = System::ellapsedTime ( System::microSec ); + + + + IdDictParser parser; + + +// parser.register_external_entity("InnerDetector", "InDetIdDictFiles/IdDictInnerDetector_IBL-01.xml"); +// parser.register_external_entity("LArCalorimeter", "IdDictLArCalorimeter_H8_2004.xml"); +// parser.register_external_entity("InnerDetector", "IdDictInnerDetector_slhc.xml"); +// parser.register_external_entity("InnerDetector", "IdDictInnerDetector_Cosmic.xml"); +// parser.register_external_entity("InnerDetector", "IdDictInnerDetector_CTB2004.xml"); + + IdDictMgr& idd = parser.parse (argv[1]); +// IdDictMgr& idd = parser.parse (argv[1], "initial_layout"); + + + std::cout << "Timing for parsing dictionaries " << std::endl; + + /// following lines could be platform dependent! + longlong deltaUser = System::userTime ( System::microSec ) - startOfUserTime ; + /// + longlong deltaKernel = System::kernelTime ( System::microSec ) - startOfKernelTime ; + /// + longlong deltaElapsed = System::ellapsedTime( System::microSec ) - startOfElapsedTime ; + + std::cout << "tries, user, kernel, elapsed " + << deltaUser << " " + << deltaKernel << " " + << deltaElapsed << " " + << std::endl; + + + + + std::cout << "got dict mgr " << std::endl; +// std::cout << "regenerate for tag = initial_layout " << std::endl; +// idd.generate_implementation ("initial_layout"); + + + check_sct_decoding(idd); + check_sct_timing(idd); + + return 0; +} diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/CMakeLists.txt b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/CMakeLists.txt new file mode 100644 index 000000000..13dbf391a --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/CMakeLists.txt @@ -0,0 +1,44 @@ +################################################################################ +# Package: TrackerReadoutGeometry +################################################################################ + +# Declare the package name: +atlas_subdir( TrackerReadoutGeometry ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PUBLIC + Control/AthenaBaseComps + Control/AthenaKernel + Control/CxxUtils + Control/StoreGate + DetectorDescription/FaserDetDescr + DetectorDescription/GeoModel/GeoModelUtilities + DetectorDescription/GeoModel/GeoModelFaserUtilities + DetectorDescription/GeoPrimitives + DetectorDescription/Identifier + GaudiKernel + InnerDetector/InDetConditions/InDetCondTools + Tracker/TrackerDetDescr/TrackerIdentifier + Tracking/TrkDetDescr/TrkDetElementBase + Tracking/TrkDetDescr/TrkSurfaces + Tracking/TrkEvent/TrkEventPrimitives + DetectorDescription/DetDescrCond/DetDescrConditions + PRIVATE + Database/AthenaPOOL/AthenaPoolUtilities + DetectorDescription/IdDictDetDescr + ) + +# External dependencies: +find_package( CLHEP ) +find_package( Eigen ) +find_package( GeoModel ) + +# Component(s) in the package: +atlas_add_library( TrackerReadoutGeometry + src/*.cxx + PUBLIC_HEADERS TrackerReadoutGeometry + INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} + DEFINITIONS ${CLHEP_DEFINITIONS} + LINK_LIBRARIES ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel CxxUtils FaserDetDescr GeoModelUtilities GeoModelFaserUtilities GeoPrimitives Identifier GaudiKernel TrackerIdentifier TrkDetElementBase TrkSurfaces TrkEventPrimitives StoreGateLib SGtests AthenaBaseComps DetDescrConditions + PRIVATE_LINK_LIBRARIES AthenaPoolUtilities IdDictDetDescr ) + diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/ATLAS_CHECK_THREAD_SAFETY b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/ATLAS_CHECK_THREAD_SAFETY new file mode 100644 index 000000000..e7b2f6455 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/ATLAS_CHECK_THREAD_SAFETY @@ -0,0 +1 @@ +InnerDetector/InDetDetDescr/InDetReadoutGeometry diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/ExtendedAlignableTransform.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/ExtendedAlignableTransform.h new file mode 100755 index 000000000..c6f73b51e --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/ExtendedAlignableTransform.h @@ -0,0 +1,57 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// ExtendedAlignableTransform.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_EXTENDEDALIGNABLETRANSFORM_H +#define TRACKERREADOUTGEOMETRY_EXTENDEDALIGNABLETRANSFORM_H + +#include "GeoPrimitives/GeoPrimitives.h" +#include "GeoModelKernel/GeoAlignableTransform.h" +#include "GeoModelKernel/GeoVFullPhysVol.h" + +namespace TrackerDD { + + /** @class ExtendedAlignableTransform + + Class to hold alignable transform plus a pointer to the child volume and + optionally a frame volume. + + @author: Grant Gorfine + - modified & maintained: Nick Styles & Andreas Salzburger + */ + + class ExtendedAlignableTransform + { + + public: + + ExtendedAlignableTransform(GeoAlignableTransform * alignableTransform, + const GeoVFullPhysVol * child, + const GeoVFullPhysVol * frame = 0) + : m_alignableTransform(alignableTransform), + m_child(child), + m_frame(frame) + {}; + + GeoAlignableTransform * alignableTransform() {return m_alignableTransform;} + const GeoVFullPhysVol * child() {return m_child;} + const GeoVFullPhysVol * frame() {return m_frame;} + + private: + + GeoAlignableTransform * m_alignableTransform; + const GeoVFullPhysVol * m_child; + const GeoVFullPhysVol * m_frame; + + }; + + +} // end namespace + +#endif // TRACKERREADOUTGEOMETRY_EXTENDEDALIGNABLETRANSFORM_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_BarrelModuleSideDesign.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_BarrelModuleSideDesign.h new file mode 100755 index 000000000..ba35ab2bf --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_BarrelModuleSideDesign.h @@ -0,0 +1,224 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SCT_BarrelModuleSideDesign.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_SCT_BARRELMODULESIDEDESIGN_H +#define TRACKERREADOUTGEOMETRY_SCT_BARRELMODULESIDEDESIGN_H + +// Base class +#include "TrackerReadoutGeometry/SCT_ModuleSideDesign.h" + +namespace Trk{ + class RectangleBounds; + class SurfaceBounds; +} + +namespace TrackerDD { + + class SiDiodesParameters; + + /** @class SCT_BarrelModuleSideDesign + + Barrel module design description for the SCT. + + @author Szymon Gadomski, Alessandro Fornaini + - modified: Grant Gorfine, Andreas Salzburger + */ + + class SCT_BarrelModuleSideDesign : public SCT_ModuleSideDesign { + + /////////////////////////////////////////////////////////////////// + // Public methods: + /////////////////////////////////////////////////////////////////// + public: + + /** Copy constructor:*/ + SCT_BarrelModuleSideDesign(const SCT_BarrelModuleSideDesign &design); + + /** Constructor with parameters: + strip pitch, 80 um in barrel SCT + strip length + geom position on G4 volume, care needed + geom position on G4 volume, care needed + includes detector edge and gap between decetors*/ + SCT_BarrelModuleSideDesign(const double thickness, + const int crystals, + const int diodes, + const int cells, + const int shift, + const bool swapStripReadout, + TrackerDD::CarrierType carrierType, + const double stripPitch, + const double stripLength, + const double xEtaStripPatternCentre, + const double xPhiStripPatternCentre, + const double totalDeadLength, + int readoutSide = -1); + + /** Destructor: */ + virtual ~SCT_BarrelModuleSideDesign(); + + /** Assignment operator: */ + SCT_BarrelModuleSideDesign &operator=(const SCT_BarrelModuleSideDesign &design); + + /////////////////////////////////////////////////////////////////// + // Const methods: + /////////////////////////////////////////////////////////////////// + + /** strip pitch */ + virtual double stripPitch() const; + + /** strip length */ + double stripLength() const; + + /** centre of the strip pattern in eta */ + double etaStripPatternCentre() const; + + /** centre of the strip pattern in phi*/ + double phiStripPatternCentre() const; + + /** Returns distance to nearest detector active edge + +ve = inside + -ve = outside */ + virtual void distanceToDetectorEdge(const SiLocalPosition & localPosition, double & etaDist, double & phiDist) const; + + /** Test if near bond gap within tolerances */ + virtual bool nearBondGap(const SiLocalPosition & localPosition, double etaTol) const; + + /** check if the position is in active area */ + virtual bool inActiveArea(const SiLocalPosition &chargePos, bool checkBondGap = true) const; + + /** distance to the nearest diode in units of pitch, from 0.0 to 0.5, + this method should be fast as it is called for every surface charge + in the SCT_SurfaceChargesGenerator + an active area check, done in the Generator anyway, is removed here*/ + virtual double scaledDistanceToNearestDiode(const SiLocalPosition &chargePos) const; + + /** give the strip pitch (dependence on position needed for forward) */ + virtual double stripPitch(const SiLocalPosition & chargePos) const; + + /** readout or diode id -> position, size */ + virtual SiDiodesParameters parameters(const SiCellId & cellId) const; + virtual SiLocalPosition localPositionOfCell(const SiCellId & cellId) const; + virtual SiLocalPosition localPositionOfCluster(const SiCellId & cellId, int clusterSize) const; + + /** position -> id */ + virtual SiCellId cellIdOfPosition(const SiLocalPosition & localPos) const; + + /** this method returns the ends of the strip */ + virtual std::pair<SiLocalPosition,SiLocalPosition> endsOfStrip(const SiLocalPosition &position) const; + + /** method for stereo angle computation - returns a vector parallel to the strip being hit */ + virtual HepGeom::Vector3D<double> phiMeasureSegment(const SiLocalPosition & ) const; + + /** Method to calculate length of a module*/ + virtual double length() const; + + /** Method to calculate average width of a module */ + virtual double width() const; + + /** Method to calculate minimum width of a module */ + virtual double minWidth() const; + + /** Method to calculate maximum width of a module */ + virtual double maxWidth() const; + + /** give length of dead area */ + virtual double deadAreaLength() const; + + /** give upper boundary of dead area */ + virtual double deadAreaUpperBoundary() const; + + /** give lower boundary of dead area */ + virtual double deadAreaLowerBoundary() const; + + /** Pitch in phi direction */ + virtual double phiPitch() const; + + /* Pitch in phi direction */ + virtual double phiPitch(const SiLocalPosition & localPosition) const; + + /** Pitch in eta direction */ + virtual double etaPitch() const; + + /** Return the surface bounds */ + virtual const Trk::SurfaceBounds & bounds() const; + + private: + + SCT_BarrelModuleSideDesign(); + + /////////////////////////////////////////////////////////////////// + // Private data: + /////////////////////////////////////////////////////////////////// + + private: + double m_stripPitch; //!< strip pitch, 80 um in barrel SCT + double m_stripLength; //!< strip length + double m_xEtaStripPatternCentre; //!< geom position on G4 volume, care needed + double m_xPhiStripPatternCentre; //!< geom position on G4 volume, care needed + double m_totalDeadLength; //!< includes detector edge and gap between decetors + double m_xPhiAbsSize; //!< size in xPhi/2 for active area + double m_xEtaAbsSizeLow, m_xEtaAbsSizeHigh; //!< active area in xEta + Trk::RectangleBounds * m_bounds; //!< surface bound description + }; + + /////////////////////////////////////////////////////////////////// + // Inline methods: + /////////////////////////////////////////////////////////////////// + inline double SCT_BarrelModuleSideDesign::stripPitch() const + { + return m_stripPitch; + } + + // this method is non trivial in forward, but in barrel it can + // be an inline function + inline double SCT_BarrelModuleSideDesign::stripPitch(const SiLocalPosition &) const + { + return m_stripPitch; + } + + + inline double SCT_BarrelModuleSideDesign::stripLength() const + { + return m_stripLength; + } + + inline double SCT_BarrelModuleSideDesign::etaStripPatternCentre() const + { + return m_xEtaStripPatternCentre; + } + + inline double SCT_BarrelModuleSideDesign::phiStripPatternCentre() const + { + return m_xPhiStripPatternCentre; + } + + // Same as stripPitch + inline double SCT_BarrelModuleSideDesign::phiPitch(const SiLocalPosition &) const + { + return m_stripPitch; + } + + // Same as stripPitch + inline double SCT_BarrelModuleSideDesign::phiPitch() const + { + return m_stripPitch; + } + + // Same as active length + inline double SCT_BarrelModuleSideDesign::etaPitch() const + { + return length(); + } + +} // namespace TrackerDD + +#endif // TRACKERREADOUTGEOMETRY_SCT_BARRELMODULESIDEDESIGN_H + diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_DetectorManager.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_DetectorManager.h new file mode 100755 index 000000000..27058fe74 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_DetectorManager.h @@ -0,0 +1,166 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SCT_DetectorManager.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_SCT_DETECTORMANAGER_H +#define TRACKERREADOUTGEOMETRY_SCT_DETECTORMANAGER_H + +#include "GeoPrimitives/GeoPrimitives.h" + +#include "GeoModelKernel/GeoVPhysVol.h" + +#include "TrackerReadoutGeometry/SiDetectorManager.h" +#include "TrackerReadoutGeometry/SiDetectorElementCollection.h" +#include "TrackerReadoutGeometry/TrackerDD_Defs.h" + +#include "TrackerIdentifier/FaserSCT_ID.h" + +class StoreGateSvc; +class Identifier; +class IdentifierHash; +class GeoAlignableTransform; +class GeoVFullPhysVol; +class GeoVPhysVol; +class GeoVAlignmentStore; +class CondAttrListCollection; + +namespace TrackerDD { + + class SiDetectorElement; + class ExtendedAlignableTransform; + class SCT_ModuleSideDesign; + + /** @class SCT_DetectorManager + + Dedicated detector manager extending the functionality of the SiDetectorManager + with dedicated SCT information, access. + + @author: Grant Gorfine + - modified and maintained by Nick Styles & Andreas Salzburger + */ + + class SCT_DetectorManager : public SiDetectorManager { + + public: + + // Constructor + SCT_DetectorManager( StoreGateSvc* detStore ); + + // Destructor + virtual ~SCT_DetectorManager(); + + /** Access Raw Geometry */ + virtual unsigned int getNumTreeTops() const override; + virtual PVConstLink getTreeTop(unsigned int i) const override; + /** Add tree top */ + void addTreeTop(PVLink); + + + // + // Access Readout Elements + // + + /** access to individual elements via Identifier */ + virtual SiDetectorElement * getDetectorElement(const Identifier &id) const override; + + /** access to individual elements via IdentifierHash */ + virtual SiDetectorElement * getDetectorElement(const IdentifierHash &idHash) const override; + + /** access to individual elements via module numbering schema */ + SiDetectorElement * getDetectorElement(int barrel_endcap, int layer_wheel, int phi_module, int eta_module, int side) const; + + /** access to whole collectiom via iterators */ + virtual const SiDetectorElementCollection * getDetectorElementCollection() const override; + virtual SiDetectorElementCollection::const_iterator getDetectorElementBegin() const override; + virtual SiDetectorElementCollection::const_iterator getDetectorElementEnd() const override; + + /** Add elememts during construction */ + virtual void addDetectorElement(SiDetectorElement * element) override; + + /** Add alignable transforms. No access to these, they will be changed by manager: */ + virtual void addAlignableTransform (int level, + const Identifier &id, + GeoAlignableTransform *xf, + const GeoVFullPhysVol * child); + + /** As above but does a dynamic_cast to GeoVFullPhysVol */ + virtual void addAlignableTransform (int level, + const Identifier &id, + GeoAlignableTransform *xf, + const GeoVPhysVol * child); + + // DEPRECATED + virtual void addAlignableTransform (int, const Identifier &, GeoAlignableTransform *) override {}; // For backward compatibility + + /** Initialize the neighbours. This can only be done when all elements are built. */ + virtual void initNeighbours() override; + + /** Check identifier is for this detector */ + virtual bool identifierBelongs(const Identifier & id) const override; + + /** Access to module design, casts to SCT_ModuleSideDesign */ + const SCT_ModuleSideDesign * getSCT_Design(int i) const; + + /** Process new global DB folders for L1 and L2 **/ + virtual + bool processGlobalAlignment(const std::string &, int level, FrameType frame, + const CondAttrListCollection* obj, + GeoVAlignmentStore* alignStore) const override; + + // comply with InDetDetectorManager interface + bool processSpecialAlignment(const std::string & key, + TrackerDD::AlignFolderType alignfolder) const override; + + bool processSpecialAlignment(const std::string& key, + const CondAttrListCollection* obj=nullptr, + GeoVAlignmentStore* alignStore=nullptr) const override; + + + private: + /** implements the main alignment update for delta transforms in different frames, + it translates into the LocalDelta or GlobalDelta function of SiDetectorManager + */ + virtual bool setAlignableTransformDelta(int level, + const Identifier & id, + const Amg::Transform3D & delta, + FrameType frame, + GeoVAlignmentStore* alignStore) const override; + + /** Prevent copy and assignment */ + const SCT_DetectorManager & operator=(const SCT_DetectorManager &right); + SCT_DetectorManager(const SCT_DetectorManager &right); + + virtual const FaserSCT_ID * getIdHelper() const override; + + // Private member data + std::vector<PVLink> m_volume; + SiDetectorElementCollection m_elementCollection; + typedef std::map<Identifier, ExtendedAlignableTransform *> AlignableTransformMap; + std::vector< AlignableTransformMap > m_higherAlignableTransforms; + std::vector< ExtendedAlignableTransform *> m_alignableTransforms; + std::vector< ExtendedAlignableTransform *> m_moduleAlignableTransforms; + const FaserSCT_ID* m_idHelper; + + /** This variable switches the how the local alignment corrections are applied + If true they will be calcualted on top of all of other corrections but in the default reference frame + If false they will be calcualted on top of all of other corrections but in the globally aligned reference frame + */ + bool m_isLogical; + + + }; + +} // namespace TrackerDD + +#ifndef GAUDI_NEUTRAL +#include "AthenaKernel/CLASS_DEF.h" +CLASS_DEF(TrackerDD::SCT_DetectorManager, 56285158, 1) +#endif + +#endif // TRACKERREADOUTGEOMETRY_SCT_DETECTORMANAGER_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_ModuleSideDesign.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_ModuleSideDesign.h new file mode 100755 index 000000000..7fa3eaf9f --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_ModuleSideDesign.h @@ -0,0 +1,259 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SCT_ModuleSideDesign.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + + +#ifndef TRACKERREADOUTGEOMETRY_SCT_MODULESIDEDESIGN_H +#define TRACKERREADOUTGEOMETRY_SCT_MODULESIDEDESIGN_H + +// Base class +#include "TrackerReadoutGeometry/SiDetectorDesign.h" + +// Data member class +#include "TrackerReadoutGeometry/SCT_ReadoutScheme.h" + +// Other includes +#include "TrackerIdentifier/FaserSCT_ID.h" + +namespace TrackerDD { +/** @class SCT_ModuleSideDesign + + Base class for the SCT module side design, + extended by the Forward and Barrel module design + + @author Alessandro Fornaini, Grant Gorfine + */ + +class SCT_ModuleSideDesign: public SiDetectorDesign { +public: + /** Constructor with parameters: + local axis corresponding to eta direction + local axis corresponding to phi direction + local axis corresponding to depth direction + thickness of silicon sensor + number of crystals within module side + number of diodes within crystal + number of cells within module side + index of diode connected to cell with index 0 */ + SCT_ModuleSideDesign(const double thickness, + const bool phiSymmetric, + const bool etaSymmetric, + const bool depthSymmetric, + const int crystals, + const int diodes, + const int cells, + const int shift, + const bool swapStripReadout, + TrackerDD::CarrierType carrierType, + int readoutSide); + + /** Constructor with parameters with access to enum Axis: + local axis corresponding to eta direction + local axis corresponding to phi direction + local axis corresponding to depth direction + thickness of silicon sensor + number of crystals within module side + number of diodes within crystal + number of cells within module side + index of diode connected to cell with index 0 */ + SCT_ModuleSideDesign(const double thickness, + const bool phiSymmetric, + const bool etaSymmetric, + const bool depthSymmetric, + const int crystals, + const int diodes, + const int cells, + const int shift, + const bool swapStripReadout, + TrackerDD::CarrierType carrierType, + int readoutSide, + const SiDetectorDesign::Axis stripDirection, + const SiDetectorDesign::Axis thicknessDirection); + + /** Destructor: */ + virtual ~SCT_ModuleSideDesign() = default; + + /** readout id -> id of connected diodes + Not particularly useful for the SCT but implemented to keep a uniform interface. + */ + virtual int numberOfConnectedCells(const SiReadoutCellId &readoutId) const; + virtual SiCellId connectedCell(const SiReadoutCellId &readoutId, int number) const; + + /** If cell is ganged return the other cell, otherwise return an invalid id. + Not particularly useful for the SCT but implemented to keep a uniform interface. + For SCT always returns an invalid id. */ + virtual SiCellId gangedCell(const SiCellId &cellId) const; + + /** diode id -> readout id */ + virtual SiReadoutCellId readoutIdOfCell(const SiCellId &cellId) const; + + /** position -> id */ + virtual SiReadoutCellId readoutIdOfPosition(const SiLocalPosition &localPos) const; + + /** id -> position */ + virtual SiLocalPosition localPositionOfCell(const SiCellId &cellId) const = 0; + virtual SiLocalPosition localPositionOfCluster(const SiCellId &cellId, + int cluserSize) const = 0; + + /** Check if cell is in range. Returns the original cellId if it is in range, + otherwise it returns an invalid id. */ + virtual SiCellId cellIdInRange(const SiCellId &cellId) const; + + /** Get the neighbouring diodes of a given diode: + Cell for which the neighbours must be found + List of cells which are neighbours of the given one */ + virtual void neighboursOfCell(const SiCellId &cellId, + std::vector<SiCellId> &neighbours) const; + + /** check if the position is in active area */ + virtual bool inActiveArea(const SiLocalPosition &chargePos, bool checkBondGap = + true) const = 0; + + /** give distance to the nearest diode in units of pitch, from 0.0 to 0.5, + this method should be fast as it is called for every surface charge + in the SCT_SurfaceChargesGenerator */ + virtual double scaledDistanceToNearestDiode(const SiLocalPosition &chargePos) const = + 0; + + /** give the strip pitch (dependence on position needed for forward) */ + virtual double stripPitch(const SiLocalPosition &chargePos) const = 0; + + /** give the strip pitch (For Forward returns pitch at center) */ + virtual double stripPitch() const = 0; + + /** give the ends of strips */ + virtual std::pair<SiLocalPosition, SiLocalPosition> + endsOfStrip(const SiLocalPosition &position) const = 0; + + /** gives position of strip center + ALTERNATIVE/PREFERED way is to use localPositionOfCell(const SiCellId & cellId) or + rawLocalPositionOfCell method in SiDetectorElement. + DEPRECATED */ + virtual SiLocalPosition positionFromStrip(const int stripNumber) const; + + /** give length of dead area */ + virtual double deadAreaLength() const = 0; + + /** give upper boundary of dead area */ + virtual double deadAreaUpperBoundary() const = 0; + + /** give lower boundary of dead area */ + virtual double deadAreaLowerBoundary() const = 0; + + /** number of crystals within module side: */ + int crystals() const; + + /** number of strips within crystal: */ + int diodes() const; + virtual int diodesInRow(const int row) const; // Introduced for upgrade sensors which have several rows + + /** number of readout stips within module side: */ + int cells() const; + + /** number of edge strips before first readout strip. */ + int shift() const; + + /** Return true if hit local direction is the same as readout direction. */ + virtual bool swapHitPhiReadoutDirection() const; + virtual bool swapHitEtaReadoutDirection() const; + + virtual int row(int stripId1Dim) const; // For SCT, is 0; otherwise takes a 1-dim strip ID and returns its row + virtual int strip(int stripId1Dim) const; // For SCT, returns stripId1Dim; otherwise returns strip within row. + virtual int strip1Dim(int strip, int row) const; // For SCT, returns strip. Else inverse of above two. +private: + SCT_ModuleSideDesign(); + + // Copy constructor: + SCT_ModuleSideDesign(const SCT_ModuleSideDesign &design); + + // Assignment operator: + SCT_ModuleSideDesign &operator = (const SCT_ModuleSideDesign &design); + +protected: + SCT_ReadoutScheme m_scheme; // !< connection between diodes and readout cells + + /////////////////////////////////////////////////////////////////// + // Private data: + /////////////////////////////////////////////////////////////////// +private: + bool m_swapStripReadout; // !< Flag to indicate if readout direction is opposite + // !< to hit local phi direction +}; + +/////////////////////////////////////////////////////////////////// +// Inline methods: +/////////////////////////////////////////////////////////////////// +inline int SCT_ModuleSideDesign::crystals() const { + return m_scheme.crystals(); +} + +inline int SCT_ModuleSideDesign::diodes() const { + return m_scheme.diodes(); +} + +inline int SCT_ModuleSideDesign::diodesInRow(const int /* row */) const { + return m_scheme.diodes(); +} + +inline int SCT_ModuleSideDesign::cells() const { + return m_scheme.cells(); +} + +inline int SCT_ModuleSideDesign::shift() const { + return m_scheme.shift(); +} + +inline int SCT_ModuleSideDesign::numberOfConnectedCells(const SiReadoutCellId &readoutId) +const { + return m_scheme.numberOfConnectedCells(readoutId); +} + +inline SiCellId SCT_ModuleSideDesign::connectedCell(const SiReadoutCellId &readoutId, + int number) const { + return m_scheme.connectedCell(readoutId, number); +} + +inline SiCellId SCT_ModuleSideDesign::gangedCell(const SiCellId &) const { + // No ganged cells in SCT so always return invalid id. + return SiCellId(); +} + +inline SiReadoutCellId SCT_ModuleSideDesign::readoutIdOfCell(const SiCellId &cellId) const +{ + return m_scheme.readoutIdOfCell(cellId); +} + +inline SiReadoutCellId SCT_ModuleSideDesign::readoutIdOfPosition( + const SiLocalPosition &localPos) const { + // Get the cellId then convert it to a readoutId. + // NEED to think about active area and bond gap check + return readoutIdOfCell(cellIdOfPosition(localPos)); +} + +inline bool SCT_ModuleSideDesign::swapHitPhiReadoutDirection() const { + return m_swapStripReadout; +} + +inline bool SCT_ModuleSideDesign::swapHitEtaReadoutDirection() const { + return false; +} + +inline int SCT_ModuleSideDesign::row(int /*stripId1Dim not used */) const { + return -1; // Use -1 to realise this is an SCT module without rows +} + +inline int SCT_ModuleSideDesign::strip(int stripId1Dim) const { + return stripId1Dim; +} + +inline int SCT_ModuleSideDesign::strip1Dim(int strip, int /*row not used */) const { + return strip; +} +} // namespace TrackerDD +#endif // TRACKERREADOUTGEOMETRY_SCT_MODULESIDEDESIGN_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_ReadoutScheme.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_ReadoutScheme.h new file mode 100755 index 000000000..f48b82e61 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SCT_ReadoutScheme.h @@ -0,0 +1,150 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SCT_ReadoutScheme.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_SCT_READOUTSCHEME_H +#define TRACKERREADOUTGEOMETRY_SCT_READOUTSCHEME_H + +#include "TrackerReadoutGeometry/SiCellId.h" +#include "TrackerReadoutGeometry/SiReadoutCellId.h" + +#include <list> + +namespace TrackerDD { + + /** @class SCT_ReadoutScheme + + Definition of the readout scheme in the SCT detector describing, + number of sides, cells, crystals per module. + + @author Alessandro Fornaini, Grant Gorfine + */ + + class SCT_ReadoutScheme { + + /////////////////////////////////////////////////////////////////// + // Public methods: + /////////////////////////////////////////////////////////////////// + public: + + // Copy constructor: + SCT_ReadoutScheme(const SCT_ReadoutScheme &scheme); + + // Constructor with parameters: + // number of crystals within module side + // number of diodes within crystal + // number of cells within module side + // index of diode connected to cell with index 0 + SCT_ReadoutScheme(const int crystals,const int diodes, + const int cells,const int shift); + + // Destructor: + virtual ~SCT_ReadoutScheme() = default; + + // Assignment operator: + SCT_ReadoutScheme &operator=(const SCT_ReadoutScheme &scheme); + + void setDiodes(int numDiodes); + void setCells(int numReadoutCells); + + /////////////////////////////////////////////////////////////////// + // Const methods: + /////////////////////////////////////////////////////////////////// + + // number of crystals within module side: + int crystals() const; + + // number of diodes within crystal: + int diodes() const; + + // number of cells within module side: + int cells() const; + + // index of diode connected to cell with index 0: + int shift() const; + + // readout id -> id of connected diodes + int numberOfConnectedCells(const SiReadoutCellId & readoutId) const; + SiCellId connectedCell(const SiReadoutCellId & readoutId, int number) const; + + // diode id -> readout id + SiReadoutCellId readoutIdOfCell(const SiCellId & cellId) const; + + + + /////////////////////////////////////////////////////////////////// + // Non-const methods: + /////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////// + // Private methods: + /////////////////////////////////////////////////////////////////// + private: + + SCT_ReadoutScheme(); + + /////////////////////////////////////////////////////////////////// + // Private data: + /////////////////////////////////////////////////////////////////// + private: + int m_crystals; // number of crystals within module side + int m_diodes; // number of diodes within crystal + int m_cells; // number of cells within module side + int m_shift; // index of diode connected to cell with index 0 +}; + +/////////////////////////////////////////////////////////////////// +// Inline methods: +/////////////////////////////////////////////////////////////////// +inline void SCT_ReadoutScheme::setDiodes(int numDiodes) { + m_diodes = numDiodes; +} + +inline void SCT_ReadoutScheme::setCells(int numReadoutCells) { + m_cells = numReadoutCells; +} + +inline int SCT_ReadoutScheme::crystals() const +{ + return m_crystals; +} + +inline int SCT_ReadoutScheme::diodes() const +{ + return m_diodes; +} + +inline int SCT_ReadoutScheme::cells() const +{ + return m_cells; +} + +inline int SCT_ReadoutScheme::shift() const +{ + return m_shift; +} + +inline int SCT_ReadoutScheme::numberOfConnectedCells(const SiReadoutCellId & readoutId) const +{ + // Assume an in range readout id is used. No checks are made. + // Always 1 to 1 correspondence in SCT + return (readoutId.isValid()) ? 1 : 0; +} + + +inline SiCellId SCT_ReadoutScheme::connectedCell(const SiReadoutCellId & readoutId, int) const +{ + // Assume a valid readout id is used. + // Always 1 to 1 correspondence in SCT + return readoutId; // Allowed to convert a SiReadoutCellId to a SiCellId. +} + +} // namespace InDetDD + +#endif // TRACKERREADOUTGEOMETRY_SCT_READOUTSCHEME_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiCellId.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiCellId.h new file mode 100755 index 000000000..240cc3826 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiCellId.h @@ -0,0 +1,160 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiCellId.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_SICELLID_H +#define TRACKERREADOUTGEOMETRY_SICELLID_H + +#include <iostream> + +namespace TrackerDD { + + /** @class SiCellId + + Identifier for the strip or pixel cell. + Just the strip number for SCT or phi_index, eta_index for pixel. + Packs the numbers in an int. + Supports negative indices and is initialized in an invalid state + when using the default constructor. + + @author Grant Gorfine + */ + + class SiCellId { + + /////////////////////////////////////////////////////////////////// + // Public methods: + /////////////////////////////////////////////////////////////////// + public: + + /// Constructor. Set in invalid state. + SiCellId(); + /// Construct with strip number. + SiCellId(int strip); + /// Construct with phi, eta index. + SiCellId(int phiIndex, int etaIndex); + + /////////////////////////////////////////////////////////////////// + // Const methods: + /////////////////////////////////////////////////////////////////// + + // Get the indices + // NB. phiIndex() and strip() are equivalent. + /// Get eta index. + int etaIndex() const; + /// Get phi index. Equivalent to strip(). + int phiIndex() const; + /// Get strip number. Equivalent to phiIndex(). + int strip() const; + + /// Test if its in a valid state + bool isValid() const; + + /// Test equality. + bool operator==(const SiCellId & other) const; + /// Test inequality. + bool operator!=(const SiCellId & other) const; + + /// Operator for sorting + bool operator<(const SiCellId & other) const; + + unsigned int word() const { return m_word; } + +private: + unsigned int m_word; + + // Masks and shift values. + // bits 0 - 15 : phi_index + // bits 16 - 30 : eta_index + // bit 31 : valid flag + enum MaskAndShiftConstants { + PHI_MASK = 0x0000ffff, + PHI_NEG = 0x00008000, // (PHI_MASK >> 1 + 1) + ETA_MASK = 0x00007fff, + ETA_SHIFT = 16, + ETA_NEG = 0x40000000, // ((ETA_MASK >> 1 + 1) << ETA_SHIFT) + VALID = 0x80000000 + }; + +}; + +std::ostream & operator << (std::ostream & os, const SiCellId & cellId); + +/////////////////////////////////////////////////////////////////// +// Inline methods: +/////////////////////////////////////////////////////////////////// +inline SiCellId::SiCellId() +{ + // set in invalid state + // This sets the invalid bit plus set phi and eta index to there most negative value + m_word = VALID | ETA_NEG | PHI_NEG ; +} + +inline SiCellId::SiCellId(int phiIndex, int etaIndex) +{ + // The negative check is not really necessary if negative numbers are represented as twos complement but + // I don't think that assumption is guaranteed to be portable. + if (phiIndex < 0) phiIndex = PHI_MASK + phiIndex + 1; // For negative number store as two's complement + if (etaIndex < 0) etaIndex = ETA_MASK + etaIndex + 1; + m_word = (phiIndex & PHI_MASK) | ((etaIndex & ETA_MASK) << ETA_SHIFT); +} + +inline SiCellId::SiCellId(int strip) +{ + if (strip < 0) strip = PHI_MASK + strip + 1; + m_word = strip & PHI_MASK; +} + +inline int SiCellId::etaIndex() const +{ + if (m_word & ETA_NEG) { // Negative index + return ((m_word >> ETA_SHIFT) & ETA_MASK) - ETA_MASK - 1; + } + return (m_word >> ETA_SHIFT) & ETA_MASK; +} + +inline int SiCellId::phiIndex() const +{ + if (m_word & PHI_NEG) { // Negative index + return (m_word & PHI_MASK) - PHI_MASK - 1; + } + return (m_word & PHI_MASK); + +} + +inline int SiCellId::strip() const +{ + return phiIndex(); +} + +inline bool SiCellId::isValid() const +{ + return !(m_word & VALID); +} + +inline bool SiCellId::operator==(const SiCellId & other) const +{ + return (m_word == other.m_word); +} + +inline bool SiCellId::operator!=(const SiCellId & other) const +{ + return (m_word != other.m_word); +} + +inline bool SiCellId::operator<(const SiCellId & other) const +{ + return (m_word < other.m_word); +} + + +} // namespace TrackerDD + + +#endif // TRACKERREADOUTGEOMETRY_SICELLID_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiCommonItems.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiCommonItems.h new file mode 100755 index 000000000..6f03083b3 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiCommonItems.h @@ -0,0 +1,95 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiCommonItems.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_SICOMMONITEMS_H +#define TRACKERREADOUTGEOMETRY_SICOMMONITEMS_H + +class FaserDetectorID; + +// Message Stream Member +#include "AthenaKernel/MsgStreamMember.h" +#include "CxxUtils/checker_macros.h" +#include "InDetCondTools/ISiLorentzAngleTool.h" +#include "GeoPrimitives/GeoPrimitives.h" +#include "GeoModelKernel/RCBase.h" + + +#include "GaudiKernel/ServiceHandle.h" +#include "CLHEP/Geometry/Transform3D.h" + +#include <mutex> + +// mutable Athena::MsgStreamMember issues warnings. +ATLAS_NO_CHECK_FILE_THREAD_SAFETY; + +namespace TrackerDD { + + /** @class SiCommonItems + + Helper class to concentrate common items, such as the pointer to the IdHelper, + the lorentzAngle service or the information about the solenoidal frame. + + To be used for SCT. + + @author: Grant Gorfine + mondified & maintained: Nick Styles, Andreas Salzburger + */ + + class SiCommonItems: public RCBase + { + + public: + + SiCommonItems(const FaserDetectorID* const idHelper); + + const FaserDetectorID* getIdHelper() const; + const HepGeom::Transform3D & solenoidFrame() const; + void setSolenoidFrame(const HepGeom::Transform3D & transform) const; + void setLorentzAngleTool(const ISiLorentzAngleTool* lorentzAngleTool); + const ISiLorentzAngleTool * lorentzAngleTool() const; + + //Declaring the Message method for further use + MsgStream& msg (MSG::Level lvl) const { return m_msg.get() << lvl; } + + //Declaring the Method providing Verbosity Level + bool msgLvl (MSG::Level lvl) const { return m_msg.get().level() <= lvl; } + + private: + + //Declaring private message stream member. + mutable Athena::MsgStreamMember m_msg; + + const FaserDetectorID* m_idHelper; + mutable HepGeom::Transform3D m_solenoidFrame ATLAS_THREAD_SAFE; // Guarded by m_mutex + const ISiLorentzAngleTool *m_lorentzAngleTool; + + mutable std::mutex m_mutex; + }; + + + inline const FaserDetectorID* SiCommonItems::getIdHelper() const + { + return m_idHelper; + } + + + inline const HepGeom::Transform3D & SiCommonItems::solenoidFrame() const + { + std::lock_guard<std::mutex> lock{m_mutex}; + return m_solenoidFrame; + // This reference might be changed by setSolenoidFrame. + // However, it occurrs very rarely. + } + + + +} // End namespace InDetDD + +#endif // TRACKERREADOUTGEOMETRY_SICOMMONITEMSS_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorDesign.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorDesign.h new file mode 100755 index 000000000..b8a01fddc --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorDesign.h @@ -0,0 +1,305 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiDetectorDesign.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_SIDETECTORDESIGN_H +#define TRACKERREADOUTGEOMETRY_SIDETECTORDESIGN_H + +// Input/output classes +#include "TrackerReadoutGeometry/SiDiodesParameters.h" +#include "TrackerReadoutGeometry/TrackerDD_Defs.h" +#include "CLHEP/Geometry/Point3D.h" +#include "CLHEP/Geometry/Vector3D.h" +#include "FaserDetDescr/FaserDetectorID.h" +#include "GeoPrimitives/GeoPrimitives.h" +#include "GeoModelKernel/RCBase.h" +#include "TrackerDD_Defs.h" + +#include <list> +#include <vector> + + +class Identifier; + +namespace Trk { +class SurfaceBounds; +} + +namespace TrackerDD { +class SiReadoutCellId; +class SiCellId; +class SiDiode; +class SiReadoutCell; +class SiLocalPosition; +class SiIntersect; + +enum DetectorShape { + Box=0, Trapezoid, Annulus,Other +}; + +/** @class SiDetectorDesign + + Base class for the detector design classes for Pixel and SCT. + These hold the local description of the detector elements which are + shared by a number of detector elements. + + @author A. Calvet, Grant Gorfine + */ + +class SiDetectorDesign: public RCBase { +public: + enum Axis { + xAxis=0, yAxis, zAxis + }; + + + /////////////////////////////////////////////////////////////////// + // Public methods: + /////////////////////////////////////////////////////////////////// +public: + /** Constructor + @param thickness: Thickness of sensor + @param phiSymmetric, etaSymmetric, depthSymmetric: Flag to indicate if + element is symmetric about these axes. ie for rectangular sensor they + are all true, for trapezoidal sensor etaSymmetric + is false. They can also be used to force element not to swap directions. + @param carrierType: Carrier type that drifts to readout + (ie electrons for pixels and holes for SCT) + @param readoutSide: Readout side, +ve = positive Depth Side, -ve = negative + Depth Side */ + SiDetectorDesign(double thickness, + bool phiSymmetric, + bool etaSymmetric, + bool depthSymmetric, + TrackerDD::CarrierType carrierType, + int readoutSide); + + SiDetectorDesign(double thickness, + bool phiSymmetric, + bool etaSymmetric, + bool depthSymmetric, + TrackerDD::CarrierType carrierType, + int readoutSide, + SiDetectorDesign::Axis stripDirection, + SiDetectorDesign::Axis depthDirection); + + + /** Destructor: */ + virtual ~SiDetectorDesign(); + + /////////////////////////////////////////////////////////////////// + // Const methods: + /////////////////////////////////////////////////////////////////// + + /** Test if point is in the active part of the detector with specified tolerances */ + SiIntersect inDetector(const SiLocalPosition &localPosition, double phiTol, + double etaTol) const; + + /** Test if near bond gap within tolerances, only relevant for SCT. */ + virtual bool nearBondGap(const SiLocalPosition &localPosition, + double etaTol) const = 0; + + /** local axis corresponding to eta direction: */ + Axis etaAxis() const; + + /** local axis corresponding to phi direction: */ + Axis phiAxis() const; + + /** local axis corresponding to depth direction: */ + Axis depthAxis() const; + + bool phiSymmetric() const; + bool etaSymmetric() const; + bool depthSymmetric() const; + + /** ReadoutSide. +1 = postive depth side, -1 = negative depth side. */ + int readoutSide() const; + + /** Override default symmetries to prevent swapping of axes. + NB. Flags can be changed from true to false but not false to true. */ + void setSymmetry(bool phiSymmetric, bool etaSymmetric, bool depthSymmetric); + + + /////////////////////////////////////////////////////////////////// + // Pure virtual methods: + /////////////////////////////////////////////////////////////////// + + /** Returns distance to nearest detector active edge + +ve = inside + -ve = outside */ + virtual void distanceToDetectorEdge(const SiLocalPosition &localPosition, + double &etaDist, double &phiDist) const = 0; + + + + /** Helper method for stereo angle computation, DEPRECATED */ + virtual HepGeom::Vector3D<double> phiMeasureSegment(const SiLocalPosition &position) + const = 0; + + /** Special method for SCT to retrieve the two ends of a "strip" */ + virtual std::pair<SiLocalPosition, SiLocalPosition> endsOfStrip( + const SiLocalPosition &position) const = 0; + + /** Method to calculate length of a module */ + virtual double length() const = 0; + + /** Method to calculate average width of a module */ + virtual double width() const = 0; + + /** Method to calculate minimum width of a module */ + virtual double minWidth() const = 0; + + /** Method to calculate maximum width of a module */ + virtual double maxWidth() const = 0; + + /** Method which returns thickness of the silicon wafer */ + double thickness() const; + + /** Pitch in phi direction */ + virtual double phiPitch() const = 0; + + /** Pitch in phi direction */ + virtual double phiPitch(const SiLocalPosition &localPosition) const = 0; + + // ** Pitch in eta direction */ + virtual double etaPitch() const = 0; + + /** Return carrier type (ie electrons or holes) */ + TrackerDD::CarrierType carrierType() const; + + /** Return true if hit local direction is the same as readout direction. */ + virtual bool swapHitPhiReadoutDirection() const = 0; + virtual bool swapHitEtaReadoutDirection() const = 0; + + /** Shape of element */ + virtual DetectorShape shape() const; + + /** Element boundary */ + virtual const Trk::SurfaceBounds &bounds() const = 0; + + + /////////////////////////////////////////////////////////// + // + // The following will replace existing methods but are not all implemented yet + // + + /** readout or diode id -> position, size */ + virtual SiDiodesParameters parameters(const SiCellId &cellId) const = 0; + + /** readout or diode id -> position. */ + virtual SiLocalPosition localPositionOfCell(const SiCellId &cellId) const = 0; + + /** number of connected cells. Generally 1 except for ganged pixels which will be 2. + */ + virtual int numberOfConnectedCells(const SiReadoutCellId &readoutId) const = 0; + + /** readout id -> id of connected diodes. + parameter number = 0 will refer to the primary diode and in general the + cell number will be the same. + NB. SiCellId cellId = connectedCell(readoutId, 0) will in general be equivalent to + SiCellId cellId = readoutId */ + virtual SiCellId connectedCell(const SiReadoutCellId &readoutId, + int number) const = 0; + + /** If cell is ganged return the id of the other cell which shares the readout + for this cell, otherwise return an invalid id. */ + virtual SiCellId gangedCell(const SiCellId &cellId) const = 0; + + /** diode id -> readout id + NB assignment of a SiReadoutCellId to a SiCellId is allowed so you are can + pass SiReadoutCellId variables to functions expecting a SiCellId. */ + virtual SiReadoutCellId readoutIdOfCell(const SiCellId &cellId) const = 0; + + /** position -> id */ + virtual SiReadoutCellId readoutIdOfPosition(const SiLocalPosition &localPos) const = + 0; + + /** position -> id */ + virtual SiCellId cellIdOfPosition(const SiLocalPosition &localPos) const = 0; + + /** Get the neighbouring diodes of a given diode: + Cell for which the neighbours must be found + List of cells which are neighbours of the given one */ + virtual void neighboursOfCell(const SiCellId &cellId, + std::vector<SiCellId> &neighbours) const = 0; + + /** Check if cell is in range. Returns the original cellId if it is in range, + otherwise it returns an invalid id. */ + virtual SiCellId cellIdInRange(const SiCellId &cellId) const = 0; + + + /////////////////////////////////////////////////////////////////// + // Private methods: + /////////////////////////////////////////////////////////////////// +private: + SiDetectorDesign(); + + /////////////////////////////////////////////////////////////////// + // Private data: + /////////////////////////////////////////////////////////////////// +private: + Axis m_etaAxis; // !< local axis corresponding to eta direction + Axis m_phiAxis; // !< local axis corresponding to phi direction + Axis m_depthAxis; // !< local axis corresponding to depth direction + double m_thickness; // !< thickness of silicon sensor + TrackerDD::CarrierType m_carrierType; // !< carrier type that drifts towards readout + // !< (ie holes fro SCT and electrons for pixel) + bool m_phiSymmetric; + bool m_etaSymmetric; + bool m_depthSymmetric; + + bool m_readoutSidePosDepth; // !< Control which side readout is on. + // !< true = positive Depth Side, false = negative Depth + // Side + + // Disallow Copy and assignment; + SiDetectorDesign(const SiDetectorDesign &design); + SiDetectorDesign &operator = (const SiDetectorDesign &design); +}; + +/////////////////////////////////////////////////////////////////// +// Inline methods: +/////////////////////////////////////////////////////////////////// +inline SiDetectorDesign::Axis SiDetectorDesign::etaAxis() const { + return m_etaAxis; +} + +inline SiDetectorDesign::Axis SiDetectorDesign::phiAxis() const { + return m_phiAxis; +} + +inline SiDetectorDesign::Axis SiDetectorDesign::depthAxis() const { + return m_depthAxis; +} + +inline double SiDetectorDesign::thickness() const { + return m_thickness; +} + +inline TrackerDD::CarrierType SiDetectorDesign::carrierType() const { + return m_carrierType; +} + +inline bool SiDetectorDesign::phiSymmetric() const { + return m_phiSymmetric; +} + +inline bool SiDetectorDesign::etaSymmetric() const { + return m_etaSymmetric; +} + +inline bool SiDetectorDesign::depthSymmetric() const { + return m_depthSymmetric; +} + +inline int SiDetectorDesign::readoutSide() const { + return (m_readoutSidePosDepth) ? +1 : -1; +} +} // namespace TrackerDD +#endif // TRACKERREADOUTGEOMETRY_SIDETECTORDESIGN_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.h new file mode 100644 index 000000000..ebb1b3151 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.h @@ -0,0 +1,689 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +/** + * @file SiDetectorElement.h + **/ + +#ifndef TRACKERREADOUTGEOMETRY_SIDETECTORELEMENT_H +#define TRACKERREADOUTGEOMETRY_SIDETECTORELEMENT_H + +// Base class. +#include "TrkDetElementBase/TrkDetElementBase.h" + +// Data member classes +#include "CxxUtils/CachedUniquePtr.h" +#include "GeoModelKernel/GeoDefinitions.h" +#include "GeoPrimitives/CLHEPtoEigenConverter.h" +#include "GeoPrimitives/GeoPrimitives.h" +#include "Identifier/Identifier.h" +#include "Identifier/IdentifierHash.h" +#include "TrackerReadoutGeometry/TrackerDD_Defs.h" +#include "TrackerReadoutGeometry/SiCellId.h" +#include "TrackerReadoutGeometry/SiCommonItems.h" +#include "TrackerReadoutGeometry/SiDetectorDesign.h" +#include "TrackerReadoutGeometry/SiIntersect.h" +#include "TrackerReadoutGeometry/SiLocalPosition.h" +#include "TrkEventPrimitives/ParamDefs.h" + +#include "CLHEP/Geometry/Point3D.h" + +#include <atomic> +#include <mutex> + +class FaserDetectorID; +class GeoAlignmentStore; +class GeoVFullPhysVol; + +namespace Trk { + class Surface; + class SurfaceBounds; +} + +namespace TrackerDD { + + class SiReadoutCellId; + + /** + + @class SiDetectorElement + + Class to hold geometrical description of a silicon detector element. + A detector element is one side of a module in the SCT. + + @par Coordinate Frames. + + The following coordinate frames are used in these elements. + + - Global frame:\n + Currently global frame in G4/GeoModel. Probably eventually + will be global frame most suitable for reconstruction + (eg solenoid axis). + + - Local hit frame:\n + Local frame for hits. It is the same as local frame in G4 and GeoModel. + I also refer to this as the local simulation frame. + By convention elements are orientated such that: + - hitDepth = local x + - hitPhi = local y + - hitEta = local z + . + Directions of these correspond to the physical wafer. Consequently hitDepth and hitPhi axes go in + different directions depending on the orientation of the module. + The readout side is determined from design()->readoutSide(). + + - Local reconstruction frame:\n + - distPhi = local x + - distEta = local y + - distDepth = local z + . + The directions of the axes are defined as + - distPhi in direction of increasing phi + - distEta in direction of increasing z in barrel and increasing r in endcap. + - distDepth (normal) choosen to give right-handed coordinate. + => away from intersection point for barrel, decreasing z for endcap + + @par Overview of Methods + + Methods are grouped into the the following categories + + - Identification + - Navigation + - Transformation/Orientation + - Module Frame + - Element Extent + - Design methods + - Intersection Tests + - Lorentz Correction + - Readout cell id + - Miscellaneous + - Cache handling. + + + @author Grant Gorfine + - modified & maintained: Nick Styles, Andreas Salzburger + - modified Nigel Hessey: get directions from the design instead of hard-wiring them + + */ + + /** + * Some notes on Thread safety for AthenaMT + * The private methods of this class do not have locks + * + * The method updateCache of is of particular interest as + * it set all cache values and at the end sets the + * m_cacheValid atomic variable to true. + * + * The const methods call the updateCache() under a mutex lock + * when the need to perform lazy initialization + * std::lock_guard<std::mutex> lock(m_mutex); + * if (!m_cacheValid) updateCache(); + * + * So as concurrent const operations are valid + * and do not race with each other. + * + * The non-const methods do not use a mutex lock. They can set the state + * of the cache or the cache itself (invalidate/setCache methods etc) + * + * Note: Synchronisation of creating SiDetElements for different events + * and accessing for each events + * can be done via write/read handles or similar EventContext aware + * framework machinery. + */ + + + class SiDetectorElement : public Trk::TrkDetElementBase { + + /////////////////////////////////////////////////////////////////// + // Public methods: + /////////////////////////////////////////////////////////////////// + public: + + + /// Constructor: + SiDetectorElement(const Identifier& id, + const SiDetectorDesign* design, + const GeoVFullPhysVol* geophysvol, + const SiCommonItems* commonItems, + const GeoAlignmentStore* geoAlignStore=nullptr); + + /// Destructor: + virtual ~SiDetectorElement(); + + + /////////////////////////////////////////////////////////////////// + // + /// @name Identification + /// Methods to identify the element and identifier manipulation. + // + /////////////////////////////////////////////////////////////////// + + //@{ + + /// identifier of this detector element (inline) + Identifier identify() const; + + /// identifier hash (inline) + IdentifierHash identifyHash() const; + + /// Returns the id helper (inline) + const FaserDetectorID* getIdHelper() const; + + // Identifier <-> SiCellId (ie strip number or pixel eta_index,phi_index) + + /// Identifier from SiCellId (ie strip number or pixel eta_index,phi_index) + Identifier identifierFromCellId(const SiCellId &cellId) const; + + /// SiCellId from Identifier + SiCellId cellIdFromIdentifier(const Identifier& identifier) const; + + //@} + + + /////////////////////////////////////////////////////////////////// + // + /// @name Navigation + /// Methods to access neighbours. + // + /////////////////////////////////////////////////////////////////// + + //@{ + const SiDetectorElement* nextInEta() const; // inline + const SiDetectorElement* prevInEta() const; // inline + const SiDetectorElement* nextInPhi() const; // inline + const SiDetectorElement* prevInPhi() const; // inline + const SiDetectorElement* otherSide() const; // Useful for SCT only, inline + //@} + + /////////////////////////////////////////////////////////////////// + // + /// @name Transformation/Orientation + // + /////////////////////////////////////////////////////////////////// + + //@{ + // Position + /// Local (simulation/hit frame) to global transform + virtual const GeoTrf::Transform3D& transformHit() const; + /// Local (reconstruction frame) to global transform + const Amg::Transform3D& transform() const; + /// Default Local (reconstruction frame) to global transform + /// ie with no misalignment. + const HepGeom::Transform3D defTransformCLHEP() const; + const Amg::Transform3D defTransform() const; + /// Center in global coordinates + const Amg::Vector3D& center() const; + + const HepGeom::Transform3D& transformCLHEP() const; + + /// Simulation/Hit local frame to reconstruction local frame. 2D. + // TODO: Will change order of parameters at some point. + Amg::Vector2D hitLocalToLocal(double xEta, double xPhi) const; + /// Same as previuos method but 3D. + HepGeom::Point3D<double> hitLocalToLocal3D(const HepGeom::Point3D<double>& hitPosition) const; + + /// Transform to go from local reconstruction frame to local hit frame. + const HepGeom::Transform3D recoToHitTransform() const; + + /// Directions of hit depth,phi,eta axes relative to reconstruction local position + /// axes (LocalPosition). Returns +/-1. inline + double hitDepthDirection() const; + /// See previous method. inline + double hitPhiDirection() const; + /// See previous method. inline + double hitEtaDirection() const; + + // To determine if readout direction between online and offline needs swapping, see methods + // swapPhiReadoutDirection() and swapEtaReadoutDirection() below in "Readout Cell id" section + + + // Orientation. + // Directions. + // phiAxis - in same direction as increasing phi and identifier phi_index/strip. + // NB. This requires some flipping of axes with repsect to the hits. + // etaAxis - in direction of increasing z in the barrel and increasing r in the endcap. + // normal - choosen to give right-handed coordinate frame (x=normal,y=phiAxis,z=etaAxis) + // NB. This requires some flipping of axes with repsect to the hits. + + /// Get reconstruction local phi axes in global frame. + /// In same direction as increasing phi and identifier phi_index/strip. + const Amg::Vector3D& phiAxis() const; + const HepGeom::Vector3D<double>& phiAxisCLHEP() const; + /// Get reconstruction local eta axes in global frame. + /// In direction of increasing z in the barrel and increasing r in the endcap. + const Amg::Vector3D& etaAxis() const; + const HepGeom::Vector3D<double>& etaAxisCLHEP() const; + /// Get reconstruction local normal axes in global frame. Choosen to give right-handed coordinate frame. + const Amg::Vector3D& normal() const; + + /// transform a hit local position into a global position (inline): + HepGeom::Point3D<double> globalPositionHit(const HepGeom::Point3D<double>& simulationLocalPos) const; + Amg::Vector3D globalPositionHit(const Amg::Vector3D& simulationLocalPos) const; + + /// transform a reconstruction local position into a global position (inline): + HepGeom::Point3D<double> globalPosition(const HepGeom::Point3D<double>& localPos) const; + Amg::Vector3D globalPosition(const Amg::Vector3D& localPos) const; + + /// as in previous method but for 2D local position (inline) + HepGeom::Point3D<double> globalPositionCLHEP(const Amg::Vector2D& localPos) const; + Amg::Vector3D globalPosition(const Amg::Vector2D& localPos) const; + + /// transform a global position into a 2D local position (reconstruction frame) (inline) + Amg::Vector2D localPosition(const HepGeom::Point3D<double>& globalPosition) const; + Amg::Vector2D localPosition(const Amg::Vector3D& globalPosition) const; + + /// Compute sin(tilt angle) at a given position: + /// at center + double sinTilt() const; // At center + /// at given local position + double sinTilt(const Amg::Vector2D& localPos) const; + /// at given global position + double sinTilt(const HepGeom::Point3D<double>& globalPosition) const; + + /// Compute sin(stereo angle) at a given position: at center + double sinStereo() const; // At center + /// at given local position + double sinStereo(const Amg::Vector2D& localPos) const; + /// at given global position + double sinStereo(const HepGeom::Point3D<double>& globalPosition) const; + + /// Check if it is the stereo side (useful for SCT) + bool isStereo() const; + + /// Angle of strip in local frame with respect to the etaAxis. + /// Zero for all elements except trapezoidal detectors (ie SCT forward modules). + double sinStereoLocal(const Amg::Vector2D& localPos) const; + /// See previous method + double sinStereoLocal(const HepGeom::Point3D<double>& globalPos) const; + + /// Element Surface + virtual Trk::Surface& surface(); + virtual const Trk::Surface& surface() const; + + //@} + + /** Returns the full list of surfaces associated to this detector element */ + virtual const std::vector<const Trk::Surface*>& surfaces() const; + + /** + + @name Module Frame + Methods to help work with the module frame. + This is mainly of of use in the SCT where the module frame can + in general be different from the element frame. It is actully + defined as the frame of one of the sides (currently the axial + side), but using these methods one does not need to make any + assumptions about what the actual frame is. In the following + methods the local element frame is the local reconstruction + frame of this element. + */ + + //@{ + + /// Module to global frame transform. + /// Includes misalignment. The module frame is defined to be the + /// local reconstruction frame of the axial layer in the SCT. For + /// the pixel it is the same as the element. + //const HepGeom::Transform3D & moduleTransform() const; + const Amg::Transform3D& moduleTransform() const; + + /// Default module to global frame transform, ie with no misalignment. + /// The module frame is defined to be the + /// local reconstruction frame of the axial layer in the SCT. For + /// the pixel it is the same as the element. + Amg::Transform3D defModuleTransform() const; + + + /// Take a transform of the local element frame and return its equivalent in the module frame. + //HepGeom::Transform3D localToModuleFrame(const HepGeom::Transform3D & localTransform) const; + Amg::Transform3D localToModuleFrame(const Amg::Transform3D& localTransform) const; + + /// Transformation from local element to module frame. This can be + /// used to take a local position in the element frame and transform + /// it to a position in the module frame. If one is already in the + /// module frame it will return the Identity transform. + //HepGeom::Transform3D localToModuleTransform() const; + Amg::Transform3D localToModuleTransform() const; + + /// Check if the element and module frame are the same. + bool isModuleFrame() const; + + + //@} + + /////////////////////////////////////////////////////////////////// + // + /// @name Element Extent + /// Methods to get extent of element in r,phi and z. + /////////////////////////////////////////////////////////////////// + + //@{ + // Extent in r,z and phi (inline) + double rMin() const; + double rMax() const; + double zMin() const; + double zMax() const; + double phiMin() const; + double phiMax() const; + + /// Method for building up region of interest table. + /// Get eta/phi extent for the element. Returns min/max eta and phi + /// and r (for barrel) or z (for endcap) Takes as input the vertex + /// spread in z (-deltaZ to +deltaZ) + // void getEtaPhiRegion(double deltaZ, + // double& etaMin, double& etaMax, + // double& phiMin, double& phiMax, + // double& rz) const; + //@} + + /////////////////////////////////////////////////////////////////// + // + /// @name Design methods + // + /////////////////////////////////////////////////////////////////// + //@{ + + /// access to the local description (inline): + const SiDetectorDesign& design() const; + + // Methods from design (inline) + double width() const; // Width in phi direction. For the SCT endcap it returns the average width. + double minWidth() const; // Min, max width. Needed for the SCT endcap. + double maxWidth() const; + double length() const; // Length in eta direction (z - barrel, r - endcap) + double thickness() const; + TrackerDD::CarrierType carrierType() const; // carrier type for readout. ie holes for SCT + // and electrons for pixels. + + virtual const Trk::SurfaceBounds& bounds() const; + + // Pitch + // + // NOTE: phiPitch is ambiguous for the Forward SCT where it varies along the strip. + // etaPitch is ambiguous for the pixel which has long pixels between FE chips. + // + // For these cases: + // + // phiPitch: For SCT Forward returns pitch at center. + // etaPitch: For pixel returns average pitch. (Active_length/number_of_cells) + // + // All return pitch in distance units. + // + double etaPitch() const; // inline + double phiPitch() const; // inline + double phiPitch(const Amg::Vector2D& localPosition) const; // Useful for SCT Forward. inline + //@} + + /////////////////////////////////////////////////////////////////// + // + /// @name Intersection Tests + // + /////////////////////////////////////////////////////////////////// + + //@{ + // Test if near bond gap within tolerances + bool nearBondGap(const Amg::Vector2D& localPosition, double etaTol) const; + bool nearBondGap(const HepGeom::Point3D<double>& globalPosition, double etaTol) const; + + // Test that it is in the active region + // Intersect has 3 states + // bool SiIntersect::in() const // definitely in + // bool SiIntersect::out() const // definitely out + // bool SiIntersect::nearBoundary() const // near a boundary within the tolerances + // bool SiIntersect::mayIntersect() const // in() OR nearBoundary() + SiIntersect inDetector(const Amg::Vector2D& localPosition, double phiTol, double etaTol) const; + SiIntersect inDetector(const HepGeom::Point3D<double>& globalPosition, double phiTol, double etaTol) const; + //@} + + /////////////////////////////////////////////////////////////////// + // + /// @name Readout cell id + /// Cell id's are the strip number in SCT and phi_index,eta_index in the pixel + /// as defined in the offline identifier. Their direction runs in the distPhi, distEta + /// direction in the Reconstruction local frame. + /// + /// For methods taking a SiCellId (basically phi,eta index for pixel or strip for SCT) you + /// can do the following fro example: + /// - For pixel\n + /// localPositionOfCell(SiCellId(phi_index,eta_index));\n + /// - For SCT\n + /// localPositionOfCell(SiCellId(strip));\n + // + /////////////////////////////////////////////////////////////////// + //@{ + + /// Determine if readout direction between online and offline needs swapping. + /// Returns true if online and offline numbers run in opposite directions. + /// For strip/phi_index (inline) + bool swapPhiReadoutDirection() const; + /// For eta_index (only relevant for pixel) (inline) + bool swapEtaReadoutDirection() const; + + /// Full identifier of the cell for a given position: + /// assumes a raw local position (no Lorentz shift) + Identifier identifierOfPosition(const Amg::Vector2D& localPos) const; + /// As in previous method but returns SiCellId + SiCellId cellIdOfPosition(const Amg::Vector2D& localPos) const; + + /// Returns position (center) of cell. These are the raw positions *NOT* corrected for the Lorentz shift + Amg::Vector2D rawLocalPositionOfCell(const SiCellId & cellId) const; + /// As above + Amg::Vector2D rawLocalPositionOfCell(const Identifier& id) const; + + /// Test if readout cell has more than one diode associated with it. + /// Number of cells sharing the same readout as this cell. + /// ie generally 1 except for ganged pixels which will be 2. + int numberOfConnectedCells(const SiCellId cellId) const; + /// Get the cell ids sharing the readout for this cell. + /// number = 0 will return the primary readout cell id. + SiCellId connectedCell(const SiCellId cellId, int number) const; + + /// If cell is ganged return the id of the other cell which shares the readout + /// for this cell, otherwise return an invalid id. + /// This is a more convenient (and slightly faster) alternative than + /// using the above two methods. + /// Only relevant for pixel. For SCT always returns an invalid ID. (inline) + SiCellId gangedCell(const SiCellId& cellId) const; + + //@} + + /////////////////////////////////////////////////////////////////// + // + /// @name Miscellaneous + // + /////////////////////////////////////////////////////////////////// + //@{ + /// Special method for SCT to retrieve the two ends of a "strip" + /// Returned coordinates are in global frame. + std::pair<Amg::Vector3D,Amg::Vector3D> endsOfStrip(const Amg::Vector2D& position) const; + //@} + + /////////////////////////////////////////////////////////////////// + // + /// @name Cache handling. + // + /////////////////////////////////////////////////////////////////// + //@{. + // - Methods to handle invalidating and updating caches. The cached values include values that are affected by alignment + // Surface are only created on demand. The method updateAllCaches also creates the surfaces as well as calling updateCache. + // Conditions cache contains Lorentz angle related quantities. + + /// Signal that cached values are no longer valid. + /// Invalidate general cache (inline) + void invalidate(); + + ///Set/calculate cache values (inline) + void setCache(); + + ///Set/calculate all cache values including surfaces. (inline) + void setAllCaches(); + + //@} + + /////////////////////////////////////////////////////////////////// + // + /// @name Methods to satisfy TrkDetElementBase interface (inline) + // + /////////////////////////////////////////////////////////////////// + //{@ + virtual const Amg::Transform3D& transform(const Identifier&) const; + virtual const Trk::Surface& surface(const Identifier&) const; + virtual const Amg::Vector3D& center(const Identifier&) const; + virtual const Amg::Vector3D& normal(const Identifier&) const; + virtual const Trk::SurfaceBounds& bounds(const Identifier&) const; + //@} + + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////// + /// @name Non-const methods: + /// These are not needed by most clients. + /////////////////////////////////////////////////////////////////// + //@{ + // Set neighbours. (inline) + + void setNextInEta(const SiDetectorElement* element); + void setPrevInEta(const SiDetectorElement* element); + void setNextInPhi(const SiDetectorElement* element); + void setPrevInPhi(const SiDetectorElement* element); + void setOtherSide(const SiDetectorElement* element); // For SCT only + + //@} + + const SiCommonItems* getCommonItems() const; + + /////////////////////////////////////////////////////////////////// + // Private methods: + /////////////////////////////////////////////////////////////////// + + private: + /* + * Private Methods do not use locks + * the methods calling them especially if const + * do + */ + + /// Recalculate cached values. + void updateCache() const; + + /// Update all caches including surfaces. + void updateAllCaches() const; + + /// Determine m_isStereo variable and m_stereoCacheValid variable. + void determineStereo() const; + + // Common code for constructors. + void commonConstructor(); + + // Calculate extent in r,z and phi. The values are cached and there + // are rMin(), rMax etc methods. + // It is only used from updateCache + void getExtent(double& rMin, double& rMax, + double& zMin, double& zMax, + double& phiMin, double& phiMax) const; + + // Return the four corners of an element in local coordinates. + // Pass it an array of length 4. + // This function is used by getEtaPhiRegion() + void getCorners(HepGeom::Point3D<double>* corners) const; + + // Get eta and phi coresponding to a point in local coordinates. + // Requires as input the vertex spread. Returns etaMin, etaMax, and phi. + // This function is used by getEtaPhiRegion() + // void getEtaPhiPoint(const HepGeom::Point3D<double>& point, double deltaZ, + // double& etaMin, double& etaMax, double& phi) const; + + // Private recoToHitTransform Implementation method with no lock + const HepGeom::Transform3D recoToHitTransformImpl() const; + + // Private Implementation methods with no lock + double sinStereoImpl() const; // At center + // at given global position + double sinStereoImpl(const HepGeom::Point3D<double>& globalPosition) const; + + // Declaring the Message method for further use (inline) + MsgStream& msg(MSG::Level lvl) const; + + // Declaring the Method providing Verbosity Level (inline) + bool msgLvl(MSG::Level lvl) const; + + // Don't allow copying and moving. + SiDetectorElement() = delete; + SiDetectorElement(const SiDetectorElement&) = delete; + SiDetectorElement& operator=(const SiDetectorElement&) = delete; + SiDetectorElement(SiDetectorElement&&) = delete; + SiDetectorElement& operator=(SiDetectorElement&&) = delete; + + /////////////////////////////////////////////////////////////////// + // Protected data: + /////////////////////////////////////////////////////////////////// + protected: + Identifier m_id; // identifier of this detector element + IdentifierHash m_idHash; // hash id + const SiDetectorDesign* m_design; // local description of this detector element + //const AtlasDetectorID* m_idHelper; // id helper + const SiCommonItems* m_commonItems; + + const SiDetectorElement* m_nextInEta; + const SiDetectorElement* m_prevInEta; + const SiDetectorElement* m_nextInPhi; + const SiDetectorElement* m_prevInPhi; + const SiDetectorElement* m_otherSide; + + // + // Cached values. + // + // Axes + SiDetectorDesign::Axis m_hitEta; + SiDetectorDesign::Axis m_hitPhi; + SiDetectorDesign::Axis m_hitDepth; + + // Directions of axes. These are true if the hit/simulation and reconstruction local frames are + // in the same direction and false if they are opposite. + mutable bool m_depthDirection ATLAS_THREAD_SAFE; // Guarded by m_mutex // Direction of depth axis. + // Also direction of readout implant (n+ for pixel, p+ for SCT). + mutable bool m_phiDirection ATLAS_THREAD_SAFE; + mutable bool m_etaDirection ATLAS_THREAD_SAFE; + + mutable std::atomic_bool m_cacheValid; // Alignment associated quatities. + mutable std::atomic_bool m_firstTime; + // Since m_isStereo depends on m_otherSide->sinStereo(), a dedicated validity variable is needed. + mutable std::atomic_bool m_stereoCacheValid; + mutable bool m_isStereo ATLAS_THREAD_SAFE; + + mutable std::mutex m_mutex; + + mutable Amg::Transform3D m_transform ATLAS_THREAD_SAFE; // Guarded by m_mutex + mutable HepGeom::Transform3D m_transformCLHEP ATLAS_THREAD_SAFE; // Guarded by m_mutex + + mutable Amg::Vector3D m_normal ATLAS_THREAD_SAFE; // Guarded by m_mutex + mutable Amg::Vector3D m_etaAxis ATLAS_THREAD_SAFE; // Guarded by m_mutex + mutable HepGeom::Vector3D<double> m_etaAxisCLHEP ATLAS_THREAD_SAFE; // Guarded by m_mutex + mutable Amg::Vector3D m_phiAxis ATLAS_THREAD_SAFE; // Guarded by m_mutex + mutable HepGeom::Vector3D<double> m_phiAxisCLHEP ATLAS_THREAD_SAFE; // Guarded by m_mutex + mutable Amg::Vector3D m_center ATLAS_THREAD_SAFE; // Guarded by m_mutex + mutable HepGeom::Vector3D<double> m_centerCLHEP ATLAS_THREAD_SAFE; // Guarded by m_mutex + + mutable double m_minZ ATLAS_THREAD_SAFE;// Guarded by m_mutex + mutable double m_maxZ ATLAS_THREAD_SAFE;// Guarded by m_mutex + mutable double m_minR ATLAS_THREAD_SAFE;// Guarded by m_mutex + mutable double m_maxR ATLAS_THREAD_SAFE;// Guarded by m_mutex + mutable double m_minPhi ATLAS_THREAD_SAFE;// Guarded by m_mutex + mutable double m_maxPhi ATLAS_THREAD_SAFE;// Guarded by m_mutex + + CxxUtils::CachedUniquePtrT<Trk::Surface> m_surface; + mutable std::vector<const Trk::Surface*> m_surfaces ATLAS_THREAD_SAFE; // Guarded by m_mutex + + const GeoAlignmentStore* m_geoAlignStore{}; + }; + +} // namespace TrackerDD + +/////////////////////////////////////////////////////////////////// +// Inline methods: +/////////////////////////////////////////////////////////////////// +#include "TrackerReadoutGeometry/SiDetectorElement.icc" + +#endif // TRACKERREADOUTGEOMETRY_SIDETECTORELEMENT_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.icc b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.icc new file mode 100644 index 000000000..5936a08d4 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElement.icc @@ -0,0 +1,374 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +/** + * @file SiDetectorElement.icc + **/ + +namespace TrackerDD { + + /////////////////////////////////////////////////////////////////// + // Inline methods: + /////////////////////////////////////////////////////////////////// + + inline Identifier SiDetectorElement::identify() const + { + return m_id; + } + + inline IdentifierHash SiDetectorElement::identifyHash() const + { + return m_idHash; + } + + inline const FaserDetectorID* SiDetectorElement::getIdHelper() const + { + return m_commonItems->getIdHelper(); + } + + inline const SiDetectorElement * SiDetectorElement::nextInEta() const + { + return m_nextInEta; + } + + inline const SiDetectorElement * SiDetectorElement::prevInEta() const + { + return m_prevInEta; + } + + inline const SiDetectorElement * SiDetectorElement::nextInPhi() const + { + return m_nextInPhi; + } + + inline const SiDetectorElement * SiDetectorElement::prevInPhi() const + { + return m_prevInPhi; + } + + inline const SiDetectorElement * SiDetectorElement::otherSide() const + { + return m_otherSide; + } + + inline double SiDetectorElement::hitDepthDirection() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return (m_depthDirection) ? 1. : -1.; + } + + inline double SiDetectorElement::hitPhiDirection() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return (m_phiDirection) ? 1. : -1.; + } + + inline double SiDetectorElement::hitEtaDirection() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return (m_etaDirection) ? 1. : -1.; + } + + inline HepGeom::Point3D<double> SiDetectorElement::globalPositionHit(const HepGeom::Point3D<double>& simulationLocalPos) const + { + return Amg::EigenTransformToCLHEP(transformHit())*simulationLocalPos; + } + + inline Amg::Vector3D SiDetectorElement::globalPositionHit(const Amg::Vector3D& simulationLocalPos) const + { + return transformHit() * simulationLocalPos; + } + + inline HepGeom::Point3D<double> SiDetectorElement::globalPosition(const HepGeom::Point3D<double>& localPos) const + { + return transformCLHEP() * localPos; + } + + inline Amg::Vector3D SiDetectorElement::globalPosition(const Amg::Vector3D& localPos) const + { + return transform() * localPos; + } + + inline HepGeom::Point3D<double> SiDetectorElement::globalPositionCLHEP(const Amg::Vector2D& localPos) const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_centerCLHEP + localPos[Trk::distEta] * m_etaAxisCLHEP + localPos[Trk::distPhi] * m_phiAxisCLHEP; + } + + inline Amg::Vector3D SiDetectorElement::globalPosition(const Amg::Vector2D& localPos) const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_center + localPos[Trk::distEta] * m_etaAxis + localPos[Trk::distPhi] * m_phiAxis; + } + + inline Amg::Vector2D SiDetectorElement::localPosition(const HepGeom::Point3D<double>& globalPosition) const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + HepGeom::Vector3D<double> relativePos = globalPosition - m_centerCLHEP; + return Amg::Vector2D(relativePos.dot(m_phiAxisCLHEP), relativePos.dot(m_etaAxisCLHEP)); + } + + inline Amg::Vector2D SiDetectorElement::localPosition(const Amg::Vector3D& globalPosition) const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + Amg::Vector3D relativePos = globalPosition - m_center; + return Amg::Vector2D(relativePos.dot(m_phiAxis), relativePos.dot(m_etaAxis)); + } + + inline double SiDetectorElement::rMin() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_minR; + } + + inline double SiDetectorElement::rMax() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_maxR; + } + + inline double SiDetectorElement::zMin() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_minZ; + } + + inline double SiDetectorElement::zMax() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_maxZ; + } + + inline double SiDetectorElement::phiMin() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_minPhi; + } + + inline double SiDetectorElement::phiMax() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_maxPhi; + } + + inline const SiDetectorDesign& SiDetectorElement::design() const + { + return *m_design; + } + + inline double SiDetectorElement::width() const + { + return m_design->width(); + } + + inline double SiDetectorElement::minWidth() const + { + return m_design->minWidth(); + } + + inline double SiDetectorElement::maxWidth() const + { + return m_design->maxWidth(); + } + + inline double SiDetectorElement::length() const + { + return m_design->length(); + } + + inline double SiDetectorElement::thickness() const + { + return m_design->thickness(); + } + + inline TrackerDD::CarrierType SiDetectorElement::carrierType() const + { + return m_design->carrierType(); + } + + inline double SiDetectorElement::etaPitch() const + { + return m_design->etaPitch(); + } + + inline double SiDetectorElement::phiPitch() const + { + return m_design->phiPitch(); + } + + inline double SiDetectorElement::phiPitch(const Amg::Vector2D& localPosition) const + { + return m_design->phiPitch(localPosition); + } + + inline bool SiDetectorElement::swapPhiReadoutDirection() const + { + if (m_firstTime) { + std::lock_guard<std::mutex> lock(m_mutex); + if (m_firstTime) updateCache(); // In order to set m_phiDirection + } + // equivalent to (m_design->swapHitPhiReadoutDirection() xor !m_phiDirection) + return ((!m_design->swapHitPhiReadoutDirection() && !m_phiDirection) + || (m_design->swapHitPhiReadoutDirection() && m_phiDirection)); + } + + inline bool SiDetectorElement::swapEtaReadoutDirection() const + { + if (m_firstTime) { + std::lock_guard<std::mutex> lock(m_mutex); + if (m_firstTime) updateCache(); // In order to set m_etaDirection + } + // equivalent to (m_design->swapHitEtaReadoutDirection() xor !m_etaDirection) + return ((!m_design->swapHitEtaReadoutDirection() && !m_etaDirection) + || (m_design->swapHitEtaReadoutDirection() && m_etaDirection)); + } + + inline SiCellId SiDetectorElement::gangedCell(const SiCellId& cellId) const + { + return m_design->gangedCell(cellId); + } + + inline void SiDetectorElement::invalidate() + { + m_cacheValid = false; + } + + inline void SiDetectorElement::setCache() + { + updateCache(); + } + + inline void SiDetectorElement::setAllCaches() + { + updateAllCaches(); + } + + inline void SiDetectorElement::updateAllCaches() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + if (not m_surface) surface(); + } + + inline const Amg::Transform3D& SiDetectorElement::transform(const Identifier&) const + { + return transform(); + } + + inline const Trk::Surface& SiDetectorElement::surface(const Identifier&) const + { + return surface(); + } + + inline const Amg::Vector3D& SiDetectorElement::center(const Identifier&) const + { + return center(); + } + + inline const Amg::Vector3D& SiDetectorElement::normal(const Identifier&) const + { + return normal(); + } + + inline const Trk::SurfaceBounds& SiDetectorElement::bounds(const Identifier&) const + { + return bounds(); + } + + inline void SiDetectorElement::setNextInEta(const SiDetectorElement* element) + { + m_nextInEta = element; + } + + inline void SiDetectorElement::setPrevInEta(const SiDetectorElement* element) + { + m_prevInEta = element; + } + + inline void SiDetectorElement::setNextInPhi(const SiDetectorElement* element) + { + m_nextInPhi = element; + } + + inline void SiDetectorElement::setPrevInPhi(const SiDetectorElement* element) + { + m_prevInPhi = element; + } + + inline void SiDetectorElement::setOtherSide(const SiDetectorElement* element) // For SCT only + { + m_otherSide = element; + } + + inline const SiCommonItems* SiDetectorElement::getCommonItems() const + { + return m_commonItems; + } + + inline MsgStream& SiDetectorElement::msg(MSG::Level lvl) const + { + return m_commonItems->msg(lvl); + } + + inline bool SiDetectorElement::msgLvl(MSG::Level lvl) const + { + return m_commonItems->msgLvl(lvl); + } + +} // namespace TrackerDD diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElementCollection.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElementCollection.h new file mode 100755 index 000000000..f376eb742 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorElementCollection.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiDetectorElementCollection.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + + +#ifndef TRACKERREADOUTGEOMETRY_SIDETECTORELEMENTCOLLECTION_H +#define TRACKERREADOUTGEOMETRY_SIDETECTORELEMENTCOLLECTION_H + +#include <vector> + +class IdentifierHash; + +namespace TrackerDD { + + class SiDetectorElement; + + /** @class SiDetectorElementCollection + + Class to hold the SiDetectorElement objects to be put in the detector store + + @author Grant Gorfine + */ + + class SiDetectorElementCollection : public std::vector<SiDetectorElement *> { + public: + ~SiDetectorElementCollection(); + const SiDetectorElement* getDetectorElement(const IdentifierHash& hash) const; + }; + +} // namespace TrackerDD + +#include "AthenaKernel/CLASS_DEF.h" +CLASS_DEF( TrackerDD::SiDetectorElementCollection , 1278082324 , 1 ) +#include "AthenaKernel/CondCont.h" +CONDCONT_DEF( TrackerDD::SiDetectorElementCollection, 1336075348 ); + +#endif // TRACKERREADOUTGEOMETRY_SIDETECTORELEMENTCOLLECTION_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorManager.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorManager.h new file mode 100755 index 000000000..f9e0cff6c --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDetectorManager.h @@ -0,0 +1,152 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiDetectorManager.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_SIDETECTORMANAGER_H +#define TRACKERREADOUTGEOMETRY_SIDETECTORMANAGER_H + +#include "TrackerReadoutGeometry/TrackerDetectorManager.h" + +#include "TrackerReadoutGeometry/SiDetectorElementCollection.h" +#include "TrackerReadoutGeometry/TrackerDD_Defs.h" +#include "TrackerReadoutGeometry/SiNumerology.h" + +// Amg stuff +#include "GeoPrimitives/GeoPrimitives.h" + +#include "CLHEP/Geometry/Transform3D.h" + +#include <string> +#include <map> + +class StoreGateSvc; +class Identifier; +class IdentifierHash; +class AtlasDetectorID; +class GeoAlignableTransform; +class GeoVAlignmentStore; + +namespace TrackerDD { + +class SiDetectorElement; +class SiDetectorDesign; +class ExtendedAlignableTransform; +class SiNumerology; + + /** @class SiDetectorManager + + Base class for SCT Detector managers. + + The Detector manager has methods to retrieve the Identifier + helper and methods to retrieve the detector elements. It also + manages the alignment with methods to register the call backs + and infrastructure to associate the alignment transforms with + the appropriate alignable transform in GeoModel. + There is also access to the layout (Initial, Final, TestBeam) and + and version information. + + @author: Grant Gorfine + - modified and maintained by Nick Styles & Andreas Salzburger + */ + + class SiDetectorManager : public TrackerDetectorManager { + + + public: + + // Constructor + SiDetectorManager(StoreGateSvc * detStore, const std::string & name); + + // Destructor + virtual ~SiDetectorManager() {}; + + + // + // Access Readout Elements + // + + /** access to individual elements using Identifier or IdentiferHash */ + virtual SiDetectorElement * getDetectorElement(const Identifier &id) const = 0; + virtual SiDetectorElement * getDetectorElement(const IdentifierHash &idHash) const = 0; + + /** access to whole collectiom */ + virtual const SiDetectorElementCollection * getDetectorElementCollection() const = 0; + virtual SiDetectorElementCollection::const_iterator getDetectorElementBegin() const = 0; + virtual SiDetectorElementCollection::const_iterator getDetectorElementEnd() const = 0; + + + /** Add elememts */ + virtual void addDetectorElement(SiDetectorElement * element) = 0; + + /** Initialize the neighbours. This can only be done when all elements are built */ + virtual void initNeighbours() = 0; + + /** Get tag used in dictionary */ + const std::string & tag() const; + + /** Add alignable transforms. No access to these, they will be changed by manager: */ + virtual void addAlignableTransform (int level, const Identifier &id, GeoAlignableTransform *xf) = 0; + + /** Invalidate cache for all detector elements */ + virtual void invalidateAll() const; + + /** Update all caches */ + virtual void updateAll() const; + + + /** Helper method to set delta transform from a global delta - Amg interface*/ + bool setAlignableTransformGlobalDelta(ExtendedAlignableTransform * extXF, + const Amg::Transform3D & delta, + GeoVAlignmentStore* alignStore=nullptr) const; + + /** Helper method to set delta transform from a local delta - Amg interface */ + bool setAlignableTransformLocalDelta(ExtendedAlignableTransform * extXF, + const Amg::Transform3D & localToGlobalXF, + const Amg::Transform3D & delta, + GeoVAlignmentStore* alignStore=nullptr) const; + + /** Access to module design */ + void addDesign(const SiDetectorDesign *); + int numDesigns() const; + const SiDetectorDesign * getDesign(int i) const; + + /** Access Numerology */ + const SiNumerology & numerology() const {return m_numerology;} + SiNumerology & numerology() {return m_numerology;} + + private: + //** Prevent copy and assignment */ + const SiDetectorManager & operator=(const SiDetectorManager &right); + SiDetectorManager(const SiDetectorManager &right); + + /** This method is called by the InDetDetectorManager */ + virtual bool setAlignableTransformDelta(int level, + const Identifier & id, + const Amg::Transform3D & delta, + FrameType frame, + GeoVAlignmentStore* alignStore) const = 0; + + + + std::string m_tag; + SiNumerology m_numerology; + std::vector< const SiDetectorDesign *> m_designs; + + }; + + +} // namespace TrackerDD + +#ifndef GAUDI_NEUTRAL +#include "AthenaKernel/CLASS_DEF.h" + +CLASS_DEF(TrackerDD::SiDetectorManager, 226381739, 1) +#endif + +#endif // TRACKERREADOUTGEOMETRY_SIDETECTORMANAGER_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDiodesParameters.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDiodesParameters.h new file mode 100755 index 000000000..996e7f0d2 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiDiodesParameters.h @@ -0,0 +1,148 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiDiodesParameters.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_SIDIODESPARAMETERS_H +#define TRACKERREADOUTGEOMETRY_SIDIODESPARAMETERS_H + +// Data members classes +#include "TrackerReadoutGeometry/SiLocalPosition.h" + +namespace TrackerDD { + + /** @class SiDiodesParameters + Class to handle the position of the centre and the width of a + diode or a cluster of diodes + Version 1.1 15/08/2001 David Calvet + */ + + class SiDiodesParameters { + + /////////////////////////////////////////////////////////////////// + // Public methods: + /////////////////////////////////////////////////////////////////// + public: + + /** Implicit constructor: */ + SiDiodesParameters(); + + /** Copy constructor: */ + SiDiodesParameters(const SiDiodesParameters ¶meters); + + /** Constructor with parameters: + position of the diodes centre + width of the diodes */ + SiDiodesParameters(const SiLocalPosition ¢re, + const SiLocalPosition &width); + + /** Destructor: */ + ~SiDiodesParameters(); + + /** Assignment operator: */ + SiDiodesParameters &operator=(const SiDiodesParameters ¶meters); + + /////////////////////////////////////////////////////////////////// + // Const methods: + /////////////////////////////////////////////////////////////////// + + /** position of the diodes centre: */ + SiLocalPosition centre() const; + + /** width of the diodes: */ + SiLocalPosition width() const; + SiLocalPosition halfWidth() const; + + /** boundaries of the diodes: */ + double xEtaMin() const; + double xEtaMax() const; + double xPhiMin() const; + double xPhiMax() const; + double xDepthMin() const; + double xDepthMax() const; + + /////////////////////////////////////////////////////////////////// + // Non-const methods: + /////////////////////////////////////////////////////////////////// + + void centre(const SiLocalPosition ¢re); + + void width(const SiLocalPosition &width); + + /////////////////////////////////////////////////////////////////// + // Private data: + /////////////////////////////////////////////////////////////////// + private: + SiLocalPosition m_centre; //!< position of the diodes centre + SiLocalPosition m_width; //!< width of the diodes + }; + +/////////////////////////////////////////////////////////////////// +// Inline methods: +/////////////////////////////////////////////////////////////////// +inline SiDiodesParameters::~SiDiodesParameters() +{} + +inline SiLocalPosition SiDiodesParameters::centre() const +{ + return m_centre; +} + +inline SiLocalPosition SiDiodesParameters::width() const +{ + return m_width; +} + +inline SiLocalPosition SiDiodesParameters::halfWidth() const +{ + return m_width/2; +} + +inline double SiDiodesParameters::xEtaMin() const +{ + return m_centre.xEta()-m_width.xEta()/2; +} + +inline double SiDiodesParameters::xEtaMax() const +{ + return m_centre.xEta()+m_width.xEta()/2; +} + +inline double SiDiodesParameters::xPhiMin() const +{ + return m_centre.xPhi()-m_width.xPhi()/2; +} + +inline double SiDiodesParameters::xPhiMax() const +{ + return m_centre.xPhi()+m_width.xPhi()/2; +} + +inline double SiDiodesParameters::xDepthMin() const +{ + return m_centre.xDepth()-m_width.xDepth()/2; +} + +inline double SiDiodesParameters::xDepthMax() const +{ + return m_centre.xDepth()+m_width.xDepth()/2; +} + +inline void SiDiodesParameters::centre(const SiLocalPosition ¢re) +{ + m_centre=centre; +} + +inline void SiDiodesParameters::width(const SiLocalPosition &width) +{ + m_width=width; +} + +} // namespace TrackerDD + +#endif // TRACKERREADOUTGEOMETRY_SIDIODESPARAMETERS_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiIntersect.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiIntersect.h new file mode 100755 index 000000000..5b5d7e19f --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiIntersect.h @@ -0,0 +1,94 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiIntersect.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_SIINTERSECT_H +#define TRACKERREADOUTGEOMETRY_SIINTERSECT_H + +namespace TrackerDD { + + /** @class SiIntersect + + class to run intersection tests + + @author Grant Gorfine + */ + + class SiIntersect { + + public: + + enum IntersectState {OUT = 0, BOUNDARY = 1, IN = 2}; + + SiIntersect(IntersectState state = OUT); + + bool in() const; // Definitely in + bool out() const; // Definitely out + bool nearBoundary() const; // Near boundary within tolerences + bool mayIntersect() const; // in() || nearBoundary() + operator bool() const; // Equivalent to mayIntersect(). + + void setIn(); + void setOut(); + void setNearBoundary(); + + private: + IntersectState m_state; + + }; + +inline SiIntersect::SiIntersect(IntersectState state) + : m_state(state) +{} + +inline bool SiIntersect::in() const +{ + return (m_state == IN); +} + +inline bool SiIntersect::out() const +{ + return (m_state == OUT); +} + +inline bool SiIntersect::nearBoundary() const +{ + return (m_state == BOUNDARY); +} + + +inline bool SiIntersect::mayIntersect() const +{ + return (m_state == BOUNDARY || m_state == IN); +} + +inline SiIntersect::operator bool() const +{ + return mayIntersect(); +} + +inline void SiIntersect::setIn() +{ + m_state = IN; +} + +inline void SiIntersect::setOut() +{ + m_state = OUT; +} + +inline void SiIntersect::setNearBoundary() +{ + m_state = BOUNDARY; +} + +} // namespace TrackerDD + +#endif //TRACKERREADOUTGEOMETRY_SIINTERSECT_H + diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiLocalPosition.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiLocalPosition.h new file mode 100755 index 000000000..f6474b1bf --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiLocalPosition.h @@ -0,0 +1,204 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiLocalPosition.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_SILOCALPOSITION_H +#define TRACKERREADOUTGEOMETRY_SILOCALPOSITION_H + +#include "GeoPrimitives/GeoPrimitives.h" +#include "TrkEventPrimitives/ParamDefs.h" +#include <cmath> + +namespace Trk { + enum ExtraLocalPosParam {distDepth = 2}; // These will be defined in Trk soon. +} + +namespace TrackerDD { + + /** @class SiLocalPosition + Class to represent a position in the natural frame of a silicon sensor, for Pixel and SCT + For Pixel: eta=column, phi=row + + Version 2.1 01/08/2001 David Calvet + */ + + class SiLocalPosition { + + + /////////////////////////////////////////////////////////////////// + // Public methods: + /////////////////////////////////////////////////////////////////// + public: + + /** Default constructor: */ + SiLocalPosition(); + + /** Copy constructor: */ + SiLocalPosition(const SiLocalPosition &position) = default; + + /** This allows one to pass a Amg::Vector2D to a SiLocalPosition */ + SiLocalPosition(const Amg::Vector2D &position); + + /** Constructor with parameters: + position along eta direction + position along phi direction + position along depth direction (default is 0) */ + SiLocalPosition(const double xEta,const double xPhi, + const double xDepth=0); + + /** Destructor: */ + ~SiLocalPosition(); + + /** Assignment operator: */ + SiLocalPosition &operator=(const SiLocalPosition &) = default; + + /** Move assignment **/ + SiLocalPosition &operator=(SiLocalPosition &&) = default; + + /////////////////////////////////////////////////////////////////// + // Const methods: + /////////////////////////////////////////////////////////////////// + + /** position along eta direction:*/ + double xEta() const; + + /** position along phi direction:*/ + double xPhi() const; + + /** Cylindrical coordinate r:*/ + double r() const; + + /** Cylindrical coordinate phi:*/ + double phi() const; + + /** position along depth direction: */ + double xDepth() const; + + /** positions for Pixel: */ + double xColumn() const; + double xRow() const; + + /////////////////////////////////////////////////////////////////// + // Non-const methods: + /////////////////////////////////////////////////////////////////// + + void xEta(const double xEta); + + void xPhi(const double xPhi); + + void xDepth(const double xDepth); + + // for Pixel: + void xColumn(const double xColumn); + void xRow(const double xRow); + + // addition of positions: + SiLocalPosition &operator+=(const SiLocalPosition &position); + + // so we can go from SiLocalPosition to Trk::LocalPosition + operator Amg::Vector2D(void) const; + + // scaling: + SiLocalPosition &operator*=(const double factor); + SiLocalPosition &operator/=(const double factor); + + /////////////////////////////////////////////////////////////////// + // Private data: + /////////////////////////////////////////////////////////////////// + + private: + double m_xEta; //!< position along eta direction + double m_xPhi; //!< position along phi direction + double m_xDepth; //!< position along depth direction + }; + +/////////////////////////////////////////////////////////////////// +// Inline methods: +/////////////////////////////////////////////////////////////////// +inline SiLocalPosition::~SiLocalPosition() +{} + +inline double SiLocalPosition::xEta() const +{ + return m_xEta; +} + +inline double SiLocalPosition::xPhi() const +{ + return m_xPhi; +} + +inline double SiLocalPosition::xDepth() const +{ + return m_xDepth; +} + +inline double SiLocalPosition::r() const +{ + return std::sqrt(m_xEta * m_xEta + m_xPhi * m_xPhi); +} + +inline double SiLocalPosition::phi() const +{ + return std::atan2(m_xPhi, m_xEta); +} + +inline double SiLocalPosition::xColumn() const +{ + return m_xEta; +} + +inline double SiLocalPosition::xRow() const +{ + return m_xPhi; +} + +inline void SiLocalPosition::xEta(const double xEta) +{ + m_xEta=xEta; +} + +inline void SiLocalPosition::xPhi(const double xPhi) +{ + m_xPhi=xPhi; +} + +inline void SiLocalPosition::xDepth(const double xDepth) +{ + m_xDepth=xDepth; +} + +inline void SiLocalPosition::xColumn(const double xColumn) +{ + m_xEta=xColumn; +} + +inline void SiLocalPosition::xRow(const double xRow) +{ + m_xPhi=xRow; +} + +/////////////////////////////////////////////////////////////////// +// Binary operators: +/////////////////////////////////////////////////////////////////// +SiLocalPosition operator+(const SiLocalPosition &position1, + const SiLocalPosition &position2); + +SiLocalPosition operator*(const SiLocalPosition &position,const double factor); + +inline SiLocalPosition operator*(const double factor,const SiLocalPosition &position) +{ + return position*factor; +} + +SiLocalPosition operator/(const SiLocalPosition &position,const double factor); + +} // namespace TrackerDD + +#endif // TRACKERREADOUTGEOMETRY_SILOCALPOSITION_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.h new file mode 100755 index 000000000..eaa3dbba0 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.h @@ -0,0 +1,104 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiNumerology.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + + +#ifndef TRACKERREADOUTGEOMETRY_SINUMEROLOGY_H +#define TRACKERREADOUTGEOMETRY_SINUMEROLOGY_H + +#include <vector> + +namespace TrackerDD { + + /** @class SiNumerology + + Class to extract numerology for SCT. For example number of layers, disks, sectors, rings, etc. + See InnerDetector/InDetExample/InDetDetDescrExample/src/SiReadSiDetectorElements.cxx for example of usage. + + @author Grant Gorfine + */ + + class SiNumerology { + + + public: + + /** Constructor: */ + SiNumerology(); + + // Accessors: + + /** Number of barrels. Normally 3. */ + int numBarrels() const; + + // /** Barrel/endcap identifier for each barrel. Normally barrelId(0) = -1 */ + int barrelId(int index) const; + + /** Number of layers */ + int numLayers() const; + + /** Number of sectors in phi for a layer */ + int numPhiModulesForLayer(int layer) const; + + /** Number of sectors in phi for a ring in a disk */ + int numEtaModulesForLayer(int layer) const; + + /** First eta_module number for a layer */ + int beginEtaModuleForLayer(int layer) const; + + /** Last eta_module number + 1 */ + int endEtaModuleForLayer(int layer) const; + + /** Check if eta_module=0 exists */ + bool skipEtaZeroForLayer(int layer) const; + + // Check presence of layer/disk + /** Check if layer exists */ + bool useLayer(int layer) const; + + // Maximums + /** Maximum number of modules in a barrel stave */ + int maxNumBarrelEta() const; + + /** Maximum number of strips. Same as maxNumPhiCells() */ + int maxNumStrips() const; + + /** Maximum number of cells in phi direction. Same as maxNumStrips() */ + int maxNumPhiCells() const; + + // Modifiers: + void addBarrel(int id); + void setNumLayers(int nLayers); + void setNumPhiModulesForLayer(int layer, int nPhiModules); + void setNumEtaModulesForLayer(int layer, int nEtaModules); + void setMaxNumEtaCells(int cells); + void setMaxNumPhiCells(int cells); + + private: + + int m_numLayers; + int m_numDisks; + int m_maxPhiCells; + int m_maxEtaCells; + int m_maxNumBarrelEta; + int m_maxNumEndcapRings; + int m_maxNumBarrelPhiModules; + int m_maxNumEndcapPhiModules; + + std::vector<int> m_barrelIds; + std::vector<int> m_phiModulesForLayer; + std::vector<int> m_etaModulesForLayer; + + }; + +}// End namespace + +#include "SiNumerology.icc" + +#endif // TRACKERREADOUTGEOMETRY_SINUMEROLOGY_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.icc b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.icc new file mode 100644 index 000000000..360d98650 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.icc @@ -0,0 +1,70 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +namespace TrackerDD { + +inline int SiNumerology::numBarrels() const +{ + return m_barrelIds.size(); +} + +inline int SiNumerology::barrelId(int index) const +{ + return m_barrelIds[index]; +} + +inline int SiNumerology::numLayers() const +{ + return m_numLayers; +} + +inline int SiNumerology::numPhiModulesForLayer(int layer) const +{ + return m_phiModulesForLayer[layer]; +} + +inline int SiNumerology::numEtaModulesForLayer(int layer) const +{ + return m_etaModulesForLayer[layer]; +} + +inline int SiNumerology::beginEtaModuleForLayer(int layer) const +{ + // Assume symmetric about zero. + return -m_etaModulesForLayer[layer]/2; +} + +inline int SiNumerology::endEtaModuleForLayer(int layer) const +{ + // Assume symmetric about zero. + return m_etaModulesForLayer[layer]/2+1; +} + +inline bool SiNumerology::skipEtaZeroForLayer(int layer) const +{ + // If even then no module at eta = 0. + return !(m_etaModulesForLayer[layer]%2); +} + +inline int SiNumerology::maxNumBarrelEta() const +{ + return m_maxNumBarrelEta; +} + +inline int SiNumerology::maxNumStrips() const +{ + return m_maxPhiCells; +} + +inline int SiNumerology::maxNumPhiCells() const +{ + return m_maxPhiCells; +} + +inline bool SiNumerology::useLayer(int layer) const +{ + return (m_phiModulesForLayer[layer] != 0); +} + +} // End namespace diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiReadoutCellId.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiReadoutCellId.h new file mode 100755 index 000000000..924bb2b89 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiReadoutCellId.h @@ -0,0 +1,77 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiReadoutCellId.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_SIREADOUTCELLID_H +#define TRACKERREADOUTGEOMETRY_SIREADOUTCELLID_H + +// Base class +#include "TrackerReadoutGeometry/SiCellId.h" + +namespace TrackerDD { + + /** @class SiReadoutCellId + + Identifier for the strip or pixel readout cell. + + SiReadoutCellId behaves identically to its base class. Its only + introduced to provide some type safety and distiguish between + diodes (base class) and readout cells (this class). This is since + more than one diode can be connected to a readout cell. + + The following conversion is legal + + SiReadoutCellId -> SiCellId OK + + However the oppoisite is not allowed + + SiCellId -> SiReadoutCellId NOT ALLOWED + + since a SiCellId might not have direct readout out (eg for an + edge strip or ganged pixel). + + @author Grant Gorfine + */ + + class SiReadoutCellId : public SiCellId { + + /////////////////////////////////////////////////////////////////// + // Public methods: + /////////////////////////////////////////////////////////////////// + public: + + // Allow construction from base class + // explicit SiReadoutCellId(const SiCellIdentifier &); + + SiReadoutCellId(); // Set in invalid state. + SiReadoutCellId(int strip); + SiReadoutCellId(int phiIndex, int etaIndex); + +}; + +/////////////////////////////////////////////////////////////////// +// Inline methods: +/////////////////////////////////////////////////////////////////// + +inline SiReadoutCellId::SiReadoutCellId() + : SiCellId() +{} + +inline SiReadoutCellId::SiReadoutCellId(int phiIndex, int etaIndex) + : SiCellId(phiIndex, etaIndex) +{} + +inline SiReadoutCellId::SiReadoutCellId(int strip) + : SiCellId(strip) +{} + + +} // namespace TrackerDD + +#endif // TRACKERREADOUTGEOMETRY_SIREADOUTCELLID_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/TrackerDD_Defs.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/TrackerDD_Defs.h new file mode 100755 index 000000000..befdfc9b3 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/TrackerDD_Defs.h @@ -0,0 +1,22 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// TrackerDD_Defs.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_TRACKERDD_Defs_H +#define TRACKERREADOUTGEOMETRY_TRACKERDD_Defs_H + + +namespace TrackerDD { + enum FrameType {local, global, other}; + enum CarrierType {holes, electrons}; + // new enumerator to select given align-folder structure + enum AlignFolderType {none = -1, static_run1 = 0, timedependent_run2 = 1}; +} + +#endif // TRACKERREADOUTGEOMETRY_TRACKERDD_DEFS_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/TrackerDetectorManager.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/TrackerDetectorManager.h new file mode 100755 index 000000000..62c1b1500 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/TrackerDetectorManager.h @@ -0,0 +1,204 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// TrackerDectorManager.h +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_TRACKERDETECTORMANAGER_H +#define TRACKERREADOUTGEOMETRY_TRACKERDETECTORMANAGER_H + +// Amg +#include "GeoPrimitives/GeoPrimitives.h" +// GeoModel stuff +#include "GeoModelKernel/GeoVDetectorManager.h" +#include "TrackerReadoutGeometry/TrackerDD_Defs.h" +#include "TrackerReadoutGeometry/Version.h" +#include "CLHEP/Geometry/Transform3D.h" +// Message Stream Member +#include "AthenaKernel/MsgStreamMember.h" + +// IOV SVC for alignment: +#include "AthenaKernel/IIOVSvc.h" + +#include "DetDescrConditions/AlignableTransformContainer.h" + +#include "CxxUtils/checker_macros.h" + +#include <atomic> +#include <string> +#include <map> +#include <set> +#include <list> + +class StoreGateSvc; +class AlignableTransform; +class Identifier; +class FaserDetectorID; +class GeoVAlignmentStore; +class CondAttrListCollection; + +// mutable Athena::MsgStreamMember issues warnings. +ATLAS_NO_CHECK_FILE_THREAD_SAFETY; + +namespace TrackerDD { + + typedef std::map<std::string, const void*> RawAlignmentObjects; + + /** @class TrackerDetectorManager + + Virtual base class for all Tracker detector managers. + + It implements the processKey() method for alingment + which calls the setAlignableTransformDelta() method which + is specified in the extended classes. This method supports both, + local and global delta's in the frame and translates it to the + underlying GeoModel transform. As GeoModel (CLHEP) and tracking + (Amg) use different geo libraries, these are the methods that + act as the CLHEP <--> Amg interface + + @author: Grant Gorfine + - modified & maintained: Nick Styles & Andreas Salzburger + */ + class TrackerDetectorManager : public GeoVDetectorManager { + + public: + + // Constructor + TrackerDetectorManager(StoreGateSvc * detStore, const std::string & name); + + // Destructor + virtual ~TrackerDetectorManager(); + + + /** Get version information */ + const Version & getVersion() const; + const std::string & getLayout() const; // eg Initial, Final, TestBeam + void setVersion(const Version & version); + + /** Alignment access */ + void addChannel(const std::string & key, int level, FrameType frame); + void addFolder(const std::string & key); + void addSpecialFolder(const std::string & key); + void addGlobalFolder(const std::string & key); + void addAlignFolderType(const AlignFolderType alignfolder); + + StatusCode align( IOVSVC_CALLBACK_ARGS ) const; + + StatusCode align(const RawAlignmentObjects& alignObjects, GeoVAlignmentStore* alignStore) const; + + /** Invalidate cache for all detector elements */ + virtual void invalidateAll() const = 0; + + /** Update all caches */ + virtual void updateAll() const = 0; + + /** Check identifier is for this detector */ + virtual bool identifierBelongs(const Identifier & id) const = 0; + + /** Declaring the Message method for further use */ + MsgStream& msg (MSG::Level lvl) const { return m_msg.get() << lvl; } + + /** Declaring the Method providing Verbosity Level */ + bool msgLvl (MSG::Level lvl) const { return m_msg.get().level() <= lvl; } + + AlignFolderType m_alignfoldertype; + + protected: + StoreGateSvc * m_detStore; + + private: + /** @class LevelInfo + Private helper class definition. + */ + class LevelInfo { + + private: + int m_level; + FrameType m_type; + + public: + LevelInfo(): m_level(-1), m_type(TrackerDD::global) {}; + LevelInfo(int level, FrameType frame): m_level(level), m_type(frame) {}; + + int level() const {return m_level;} + FrameType frame() const {return m_type;} + bool isGlobalDelta() const {return m_type == TrackerDD::global;} + bool isLocalDelta() const {return m_type == TrackerDD::local;} + bool isValid() const {return (m_level >= 0);} + + }; + + class AlignInfo { + + private: + AlignFolderType m_aligntype; + + public: + AlignInfo(): m_aligntype(TrackerDD::none) {}; + AlignInfo(AlignFolderType alignfolder): m_aligntype(alignfolder) {}; + AlignFolderType AlignFolder() const {return m_aligntype;} + bool isValidAlign() const {return (m_aligntype != TrackerDD::none);} + + }; + + + /** Retrieve level information */ + const LevelInfo & getLevel(const std::string & key) const; + + /** return align folder string to use **/ + // TrackerDD::AlignFolderType getAlignInfo(); + + /** Process the alignment container, calls processKey */ + bool processAlignmentContainer(const std::string & key) const; + bool processAlignmentContainer(const AlignableTransformContainer* container, GeoVAlignmentStore* alignStore) const; + + /** Called by processAlignmentContainer, + applies only one key on the transform Collections */ + bool processKey(const std::string key, + const AlignableTransform* transformCollection, + GeoVAlignmentStore* alignStore=nullptr) const; + + /** Set method applying the delta transform (in global or local frame) + onto the geoModel transform : CLHEP <--> Amg interface */ + virtual bool setAlignableTransformDelta(int level, + const Identifier & id, + const Amg::Transform3D & delta, + FrameType frame, + GeoVAlignmentStore* alignStore=nullptr) const = 0; + + virtual bool processSpecialAlignment(const std::string & key, + TrackerDD::AlignFolderType alignfolder) const = 0; + + virtual bool processSpecialAlignment(const std::string& key, + const CondAttrListCollection* obj=nullptr, + GeoVAlignmentStore* alignStore=nullptr) const = 0; + + bool processGlobalAlignmentContainer(const std::string & key, + const CondAttrListCollection* obj=nullptr, + GeoVAlignmentStore* alignStore=nullptr) const; + + virtual bool processGlobalAlignment(const std::string & key, int level, FrameType frame, + const CondAttrListCollection* obj=nullptr, + GeoVAlignmentStore* alignStore=nullptr) const; + + virtual const FaserDetectorID* getIdHelper() const = 0; + + //Declaring private message stream member. + mutable Athena::MsgStreamMember m_msg; + + Version m_version; + std::map<std::string, LevelInfo> m_keys; + std::set<std::string> m_folders; + std::set<std::string> m_specialFolders; + std::set<std::string> m_globalFolders; // new time-dependent global folders + + static const LevelInfo s_invalidLevel; + }; + +} // namespace TrackerDD + +#endif // TRACKERREADOUTGEOMETRY_TRACKERDETECTORMANAGER_H diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/Version.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/Version.h new file mode 100755 index 000000000..3fe0d5852 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/Version.h @@ -0,0 +1,91 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +//////////////////////////////////////////////////////////// +// Version.h +//////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +//////////////////////////////////////////////////////////// + +#ifndef TRACKERREADOUTGEOMETRY_VERSION +#define TRACKERREADOUTGEOMETRY_VERSION + +#include <string> + +namespace TrackerDD { + + /** @class Version + + Class to hold version information consisting of tag, name layout and description as strings, + such as their integer regpresentation in the major-minor-tag scheme + */ + + class Version { + + public: + + /** Constructor. */ + Version(const std::string & tag, + const std::string & name, + const std::string & layout, + const std::string & description, + int major, + int minor, + int patch); + + /** Constructor. DEPRECATED */ + Version(const std::string & name, + const std::string & layout, + const std::string & description, + int major, + int minor, + int patch); + + /** Empty Constructor */ + Version(); + + /** Version tag */ + const std::string & tag() const; + + /** Version label */ + const std::string & name() const; + + /** Layout (eg Initial, Final, TestBeam) */ + const std::string & layout() const; + + /** Description or comment. */ + const std::string & description() const; + + /** Major version number */ + int majorNum() const; + + /** Minor version number */ + int minorNum() const; + + /** Patch version number */ + int patchNum() const; + + /** Print out version number (eg. 2.00.00) */ + std::string versionNumber() const; + + /** Full Description + For example, + Version: SCT-DC1-00, Name: DC1, Layout: Final, Code Version: 2.00.00, Description: DC1 Geometry */ + std::string fullDescription() const; + + + private: + + std::string m_tag; + std::string m_name; + std::string m_layout; + std::string m_description; + int m_major; + int m_minor; + int m_patch; + }; + +} // namespace TrackerDD + +#endif // TRACKERREADOUTGEOMETRY_VERSION diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_BarrelModuleSideDesign.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_BarrelModuleSideDesign.cxx new file mode 100755 index 000000000..d7fb3ec84 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_BarrelModuleSideDesign.cxx @@ -0,0 +1,279 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SCT_BarrelModuleSideDesign.cxx +// Implementation file for class SCT_BarrelModuleSideDesign +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////// +// Version 1.0a 31/5/2001 Class creator tool +// Version 1.0 9/6/2001 Szymon Gadomski +// Version 1.0.1 20/6/2001 Alessandro Fornaini +// 3/8/2001 Szymon Gadomski: restored correct calculation +// in the new diode e.t.c., inActiveArea made fast +// 15/08/2001 SG: works with new SiDiodesParameters, tested +// 28/08/2001 SG: endsOfStrip method added +// 29/10/2001 AF: phiMeasureSegment added +// Modified: Grant Gorfine +/////////////////////////////////////////////////////////////////// + +#include "TrackerReadoutGeometry/SCT_BarrelModuleSideDesign.h" +#include "TrackerReadoutGeometry/SiDiodesParameters.h" + +#include "CLHEP/Units/SystemOfUnits.h" +#include "CLHEP/Geometry/Vector3D.h" + +#include "TrkSurfaces/RectangleBounds.h" + +#include <cmath> + +namespace TrackerDD { + +using std::abs; + +// Constructor with parameters: +SCT_BarrelModuleSideDesign::SCT_BarrelModuleSideDesign(const double thickness, + const int crystals, + const int diodes, + const int cells, + const int shift, + const bool swapStripReadout, + TrackerDD::CarrierType carrierType, + const double stripPitch, + const double stripLength, + const double xEtaStripPatternCentre, + const double xPhiStripPatternCentre, + const double totalDeadLength, + int readoutSide) : + SCT_ModuleSideDesign(thickness, + true, true, true, // phi,eta,depth axes symmetric + crystals,diodes,cells,shift,swapStripReadout,carrierType,readoutSide), + m_stripPitch(stripPitch), + m_stripLength(stripLength), + m_xEtaStripPatternCentre(xEtaStripPatternCentre), + m_xPhiStripPatternCentre(xPhiStripPatternCentre), + m_totalDeadLength(totalDeadLength) +{ + m_xPhiAbsSize = 0.5*m_stripPitch*diodes; + if(crystals==1) { + m_xEtaAbsSizeLow = m_totalDeadLength/2; + if (m_xEtaAbsSizeLow == 0) m_xEtaAbsSizeLow = -1.0 * CLHEP::mm; // Anything negative will do + m_xEtaAbsSizeHigh = m_stripLength/2; + } + else if(crystals==2) { + m_xEtaAbsSizeLow = m_totalDeadLength/2; + m_xEtaAbsSizeHigh = m_stripLength + m_totalDeadLength/2; + } else { + std::cout << "wrong number of crystals!\n"; + m_xEtaAbsSizeLow = m_xEtaAbsSizeHigh = m_xPhiAbsSize = 0.0; + } + + m_bounds = new Trk::RectangleBounds(0.5*width(), 0.5*length()); +} + + +SCT_BarrelModuleSideDesign::~SCT_BarrelModuleSideDesign() +{ + delete m_bounds; +} + +// Returns distance to nearest detector edge +// +ve = inside +// -ve = outside +void +SCT_BarrelModuleSideDesign::distanceToDetectorEdge(const SiLocalPosition & localPosition, + double & etaDist, double & phiDist) const +{ + // As the calculation is symmetric around 0,0 we only have to test it for one side. + double xEta = abs(localPosition.xEta() - m_xEtaStripPatternCentre); + double xPhi = abs(localPosition.xPhi() - m_xPhiStripPatternCentre); + + double xEtaEdge = 0.5 * length(); + double xPhiEdge = 0.5 * width(); + + // Distance to top/bottom + etaDist = xEtaEdge - xEta; + + // Distance to right/left edge + phiDist = xPhiEdge - xPhi; + +} + + +bool SCT_BarrelModuleSideDesign::nearBondGap(const SiLocalPosition & localPosition, double etaTol) const +{ + // Symmetric around xEta = 0 so we can use absolute value. + if (m_totalDeadLength==0) return false; + return ( abs(localPosition.xEta()) < 0.5*m_totalDeadLength + etaTol); +} + +// check if the position is in active area +bool SCT_BarrelModuleSideDesign::inActiveArea(const SiLocalPosition &chargePos, + bool checkBondGap) const +{ + // in Phi + if (abs(chargePos.xPhi()-m_xPhiStripPatternCentre) > m_xPhiAbsSize) return false; + + // in Eta + double relEta = fabs(chargePos.xEta() - m_xEtaStripPatternCentre); + if (relEta > m_xEtaAbsSizeHigh) return false; + + // bond gap + return !(checkBondGap && (relEta < m_xEtaAbsSizeLow)); +} + + +// distance to the nearest diode in units of pitch, from 0.0 to 0.5, +// this method should be fast as it is called for every surface charge +// in the SCT_SurfaceChargesGenerator +// an active area check, done in the Generator anyway, is removed here +double SCT_BarrelModuleSideDesign::scaledDistanceToNearestDiode(const SiLocalPosition &chargePos) const +{ + double dstrip=fabs(chargePos.xPhi()-m_xPhiStripPatternCentre)/m_stripPitch; + dstrip=dstrip-static_cast<double>(int(dstrip))-0.5; + // the above -0.5 is because we have an even number of strips, centre of detector + // is in the middle of an interstrip gap + return fabs(dstrip); +} + +std::pair<SiLocalPosition,SiLocalPosition> SCT_BarrelModuleSideDesign::endsOfStrip(const SiLocalPosition &position) const +{ + // this method returns the ends of the strip + // assume input xPhi + + SiLocalPosition end1(m_xEtaStripPatternCentre+m_xEtaAbsSizeHigh,position.xPhi()); + SiLocalPosition end2(m_xEtaStripPatternCentre-m_xEtaAbsSizeHigh,position.xPhi()); + + std::pair<SiLocalPosition,SiLocalPosition> two_ends(end1,end2); + return two_ends; +} + + +double SCT_BarrelModuleSideDesign::length() const +{ + return crystals()*m_stripLength+m_totalDeadLength; +} + +double SCT_BarrelModuleSideDesign::width() const +{ + return m_stripPitch*diodes(); +} + +double SCT_BarrelModuleSideDesign::minWidth() const +{ + return width(); +} + +double SCT_BarrelModuleSideDesign::maxWidth() const +{ + return width(); +} + + +// method for stereo angle computation - returns a vector parallel to the +// strip being hit +HepGeom::Vector3D<double> SCT_BarrelModuleSideDesign::phiMeasureSegment(const SiLocalPosition& ) const +{ + HepGeom::Vector3D<double> segment; + segment[etaAxis()]=1; + return segment; +} + +// give length of dead area +double SCT_BarrelModuleSideDesign::deadAreaLength() const +{ + return m_totalDeadLength; +} + +// give upper boundary of dead area (origin in module centre) +double SCT_BarrelModuleSideDesign::deadAreaUpperBoundary() const +{ + return m_totalDeadLength/2; +} +// give lower boundary of dead area (origin in module centre) +double SCT_BarrelModuleSideDesign::deadAreaLowerBoundary() const +{ + return -m_totalDeadLength/2; +} + + + +SiLocalPosition +SCT_BarrelModuleSideDesign::localPositionOfCell(const SiCellId & cellId) const +{ + + // NB. No check is made that cellId is valid or in the correct range. + + int strip = cellId.strip(); + + // center of cluster (in units of number of strips) from detector center + double clusterCenter = strip - 0.5*cells() + 0.5; + + double xPhi=m_xPhiStripPatternCentre + m_stripPitch * clusterCenter; + + // Return the position. + // no matter how many crystals we have, xEta of the position is in the centre! + return SiLocalPosition(m_xEtaStripPatternCentre, xPhi); +} + +SiLocalPosition +SCT_BarrelModuleSideDesign::localPositionOfCluster(const SiCellId & cellId, int clusterSize) const +{ + // This method returns the position of the centre of the cluster starting at cellId.strip() + + // NB. No check is made that cellId is valid or in the correct range. + + if (clusterSize < 1) clusterSize = 1; + + int strip = cellId.strip(); + + // center of cluster (in units of number of strips) from detector center + double clusterCenter = strip - 0.5*cells() + 0.5; + if (clusterSize>1) clusterCenter += 0.5 * (clusterSize-1); + + double xPhi=m_xPhiStripPatternCentre + m_stripPitch * clusterCenter; + + // Return the position. + // no matter how many crystals we have, xEta of the position is in the centre! + return SiLocalPosition(m_xEtaStripPatternCentre, xPhi); +} + + +SiDiodesParameters +SCT_BarrelModuleSideDesign::parameters(const SiCellId & cellId) const +{ + // NB. We treat the two crytals as one. + SiLocalPosition center=localPositionOfCell(cellId); + double xPhiSize=m_stripPitch; + double xEtaSize=2*m_xEtaAbsSizeHigh; + SiLocalPosition width(xEtaSize,xPhiSize); + return SiDiodesParameters(center,width); +} + +SiCellId +SCT_BarrelModuleSideDesign::cellIdOfPosition(const SiLocalPosition & localPosition) const +{ + // NB We do not distinguish between the two crystals anymore. + // Check if we are in the active region. No bondgap check. + if (!inActiveArea(localPosition, false)) return SiCellId(); // return an invalid id + double xPhi=localPosition.xPhi(); + double dstrip=(xPhi-m_xPhiStripPatternCentre)/m_stripPitch+0.5*diodes(); + if (dstrip < 0) return SiCellId(); // return an invalid id + int strip = static_cast<int>(dstrip); + if (strip > diodes()) return SiCellId();// return an invalid id if strip # greater than number of diodes. + return SiCellId(strip-shift()); // strip numbering starts from first readout strip. + // Those to the left will have negative numbers. + +} + +const Trk::SurfaceBounds & +SCT_BarrelModuleSideDesign::bounds() const +{ + return *m_bounds; +} + +} // namespace TrackerDD diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_DetectorManager.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_DetectorManager.cxx new file mode 100755 index 000000000..47ed2b774 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_DetectorManager.cxx @@ -0,0 +1,408 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrackerReadoutGeometry/SCT_DetectorManager.h" + +#include "AthenaBaseComps/AthMsgStreamMacros.h" +#include "AthenaPoolUtilities/CondAttrListCollection.h" +#include "GeoPrimitives/CLHEPtoEigenConverter.h" +#include "Identifier/Identifier.h" +#include "Identifier/IdentifierHash.h" +#include "TrackerIdentifier/FaserSCT_ID.h" +#include "TrackerReadoutGeometry/SiDetectorElementCollection.h" +#include "TrackerReadoutGeometry/SiDetectorElement.h" +#include "TrackerReadoutGeometry/ExtendedAlignableTransform.h" +#include "TrackerReadoutGeometry/SCT_ModuleSideDesign.h" +#include "StoreGate/StoreGateSvc.h" + +#include <iostream> + +namespace TrackerDD { + + const int FIRST_HIGHER_LEVEL = 2; + + SCT_DetectorManager::SCT_DetectorManager( StoreGateSvc* detStore ) + : SiDetectorManager(detStore, "SCT"), + m_idHelper(0), + m_isLogical(false) // Change to true to change the definition of local module corrections + { + // + // Initialized the Identifier helper. + // + StatusCode sc = detStore->retrieve(m_idHelper, "FaserSCT_ID"); + if (sc.isFailure()) { + ATH_MSG_ERROR("Could not retrieve SCT id helper"); + } + // Initialize the collections. + if (m_idHelper) { + m_elementCollection.resize(m_idHelper->wafer_hash_max()); + m_alignableTransforms.resize(m_idHelper->wafer_hash_max()); + m_moduleAlignableTransforms.resize(m_idHelper->wafer_hash_max()/2); + } + } + + + + SCT_DetectorManager::~SCT_DetectorManager() + { + // Clean up + for (size_t i=0; i < m_volume.size(); i++) { + m_volume[i]->unref(); + } + + for (size_t j=0; j < m_higherAlignableTransforms.size(); j++){ + AlignableTransformMap::iterator iterMap; + for (iterMap = m_higherAlignableTransforms[j].begin(); + iterMap != m_higherAlignableTransforms[j].end(); + ++iterMap) { + delete iterMap->second; + } + } + + for (size_t k=0; k < m_alignableTransforms.size(); k++){ + delete m_alignableTransforms[k]; + } + + for (size_t l=0; l < m_moduleAlignableTransforms.size(); l++){ + delete m_moduleAlignableTransforms[l]; + } + } + + unsigned int SCT_DetectorManager::getNumTreeTops() const + { + return m_volume.size(); + } + + PVConstLink SCT_DetectorManager::getTreeTop(unsigned int i) const + { + return m_volume[i]; + } + + void SCT_DetectorManager::addTreeTop(PVLink vol){ + vol->ref(); + m_volume.push_back(vol); + } + + + SiDetectorElement* SCT_DetectorManager::getDetectorElement(const Identifier & id) const + { + // NB the id helpers implementation for getting a hash is not optimal. + // Essentially does a binary search. + // Make sure it is a wafer Id + Identifier waferId = m_idHelper->wafer_id(id); + IdentifierHash idHash = m_idHelper->wafer_hash(waferId); + if (idHash.is_valid()) { + return m_elementCollection[idHash]; + } else { + return 0; + } + } + + SiDetectorElement* SCT_DetectorManager::getDetectorElement(const IdentifierHash & idHash) const + { + return m_elementCollection[idHash]; + } + + SiDetectorElement* SCT_DetectorManager::getDetectorElement(int barrel_endcap, int layer_wheel, int phi_module, int eta_module, int side) const + { + return getDetectorElement(m_idHelper->wafer_id(barrel_endcap, layer_wheel, phi_module, eta_module, side)); + } + + const SiDetectorElementCollection* SCT_DetectorManager::getDetectorElementCollection() const + { + return &m_elementCollection; + } + + SiDetectorElementCollection::const_iterator SCT_DetectorManager::getDetectorElementBegin() const + { + return m_elementCollection.begin(); + } + + SiDetectorElementCollection::const_iterator SCT_DetectorManager::getDetectorElementEnd() const + { + return m_elementCollection.end(); + } + + + void SCT_DetectorManager::addDetectorElement(SiDetectorElement * element) + { + IdentifierHash idHash = element->identifyHash(); + if (idHash >= m_elementCollection.size()) + throw std::runtime_error("SCT_DetectorManager: Error adding detector element."); + m_elementCollection[idHash] = element; + } + + void SCT_DetectorManager::initNeighbours() + { + SiDetectorElementCollection::iterator iter; + + // Loop over all elements and set the neighbours + for (iter = m_elementCollection.begin(); iter != m_elementCollection.end(); ++iter){ + + SiDetectorElement * element = *iter; + if (element) { + + IdentifierHash idHash = element->identifyHash(); + IdentifierHash idHashOther; + + int result; + // If no neighbour, result != 0 in which case we leave neighbour as null + result = m_idHelper->get_next_in_eta(idHash, idHashOther); + if (result==0) element->setNextInEta(m_elementCollection[idHashOther]); + + result = m_idHelper->get_prev_in_eta(idHash, idHashOther); + if (result==0) element->setPrevInEta(m_elementCollection[idHashOther]); + + result = m_idHelper->get_next_in_phi(idHash, idHashOther); + if (result==0) element->setNextInPhi(m_elementCollection[idHashOther]); + + result = m_idHelper->get_prev_in_phi(idHash, idHashOther); + if (result==0) element->setPrevInPhi(m_elementCollection[idHashOther]); + + result = m_idHelper->get_other_side(idHash, idHashOther); + if (result==0) element->setOtherSide(m_elementCollection[idHashOther]); + } + } + } + + + const FaserSCT_ID* SCT_DetectorManager::getIdHelper() const + { + return m_idHelper; + } + + + bool SCT_DetectorManager::setAlignableTransformDelta(int level, + const Identifier & id, + const Amg::Transform3D & delta, + FrameType frame, + GeoVAlignmentStore* alignStore) const + { + + if (level == 0) { // 0 - At the element level + + // We retrieve it via a hashId. + IdentifierHash idHash = m_idHelper->wafer_hash(id); + if (!idHash.is_valid()) return false; + + if (frame == TrackerDD::global) { // global shift + // Its a global transform + return setAlignableTransformGlobalDelta(m_alignableTransforms[idHash], delta, alignStore); + + } else if (frame == TrackerDD::local) { // local shift + + SiDetectorElement * element = m_elementCollection[idHash]; + if (!element) return false; + + + // Its a local transform + //See header file for definition of m_isLogical + if( m_isLogical ){ + //Ensure cache is up to date and use the alignment corrected local to global transform + element->setCache(); + return setAlignableTransformLocalDelta(m_alignableTransforms[idHash], element->transform(), delta, alignStore); + } else + //Use default local to global transform + return setAlignableTransformLocalDelta(m_alignableTransforms[idHash], element->defTransform(), delta, alignStore); + + } else { + // other not supported + ATH_MSG_WARNING("Frames other than global or local are not supported."); + return false; + } + + } else if (level == 1) { // module level + + // We retrieve it via a hashId. + IdentifierHash idHash = m_idHelper->wafer_hash(id); + if (!idHash.is_valid()) return false; + + int idModuleHash = idHash / 2; + + if (idHash%2) { + ATH_MSG_WARNING("Side 1 wafer id used for module id"); + return false; + } + + if (frame == TrackerDD::global) { // global shift + // Its a global transform + return setAlignableTransformGlobalDelta(m_moduleAlignableTransforms[idModuleHash], delta, alignStore); + } else if (frame == TrackerDD::local) { // local shift + SiDetectorElement * element = m_elementCollection[idHash]; + if (!element) return false; + + // Its a local transform + //See header file for definition of m_isLogical + if( m_isLogical ){ + //Ensure cache is up to date and use the alignment corrected local to global transform + element->setCache(); + return setAlignableTransformLocalDelta(m_moduleAlignableTransforms[idModuleHash], element->moduleTransform(), delta, alignStore); + } else + //Use default local to global transform + return setAlignableTransformLocalDelta(m_moduleAlignableTransforms[idModuleHash],element->defModuleTransform(), delta, alignStore); + + } else { + // other not supported + ATH_MSG_WARNING("Frames other than global or local are not supported."); + return false; + } + + } else { // higher level + + if (frame != TrackerDD::global) { + ATH_MSG_WARNING("Non global shift at higher levels is not supported."); + return false; + } + + int index = level - FIRST_HIGHER_LEVEL; // level 0 and 1 is treated separately. + if (index >= static_cast<int>(m_higherAlignableTransforms.size())) return false; + + // We retrieve it from a map. + AlignableTransformMap::const_iterator iter; + iter = m_higherAlignableTransforms[index].find(id); + if (iter == m_higherAlignableTransforms[index].end()) return false; + + // Its a global transform + return setAlignableTransformGlobalDelta(iter->second, delta, alignStore); + } + + } + + void SCT_DetectorManager::addAlignableTransform (int level, + const Identifier & id, + GeoAlignableTransform *transform, + const GeoVPhysVol * child) + { + if (m_idHelper) { + + const GeoVFullPhysVol * childFPV = dynamic_cast<const GeoVFullPhysVol *>(child); + if (!childFPV) { + ATH_MSG_ERROR("Child of alignable transform is not a full physical volume"); + } else { + addAlignableTransform (level, id, transform, childFPV); + } + } + } + + void SCT_DetectorManager::addAlignableTransform (int level, + const Identifier & id, + GeoAlignableTransform *transform, + const GeoVFullPhysVol * child) + { + if (m_idHelper) { + if (level == 0) { + // Element + IdentifierHash idHash = m_idHelper->wafer_hash(id); + if (idHash.is_valid()) { + m_alignableTransforms[idHash]= new ExtendedAlignableTransform(transform, child); + } + } else if (level == 1) { + // Module + IdentifierHash idHash = m_idHelper->wafer_hash(id); + if (idHash.is_valid()) { + m_moduleAlignableTransforms[idHash/2]=new ExtendedAlignableTransform(transform, child); + } + + } else { + + // Higher levels are saved in a map. NB level=0,1 is treated above. + int index = level - FIRST_HIGHER_LEVEL; // level 0 and 1 is treated separately. + if (index >= static_cast<int>(m_higherAlignableTransforms.size())) m_higherAlignableTransforms.resize(index+1); + m_higherAlignableTransforms[index][id] = new ExtendedAlignableTransform(transform, child); + } + } + } + + bool + SCT_DetectorManager::identifierBelongs(const Identifier & id) const + { + return getIdHelper()->is_sct(id); + } + + + const SCT_ModuleSideDesign* SCT_DetectorManager::getSCT_Design(int i) const + { + return dynamic_cast<const SCT_ModuleSideDesign *>(getDesign(i)); + } + + // New global alignment folders + bool SCT_DetectorManager::processGlobalAlignment(const std::string & key, int level, FrameType frame, + const CondAttrListCollection* obj, GeoVAlignmentStore* alignStore) const + { + ATH_MSG_INFO("Processing new global alignment containers with key " << key << " in the " << frame << " frame at level "); + + const CondAttrListCollection* atrlistcol=obj; + if(atrlistcol==nullptr and m_detStore->retrieve(atrlistcol,key)!=StatusCode::SUCCESS) { + ATH_MSG_INFO("Cannot find new global align Container for key " + << key << " - no new global alignment "); + return false; + } + + bool alignmentChange = false; + Identifier ident=Identifier(); + + // loop over objects in collection + for (CondAttrListCollection::const_iterator citr=atrlistcol->begin(); citr!=atrlistcol->end();++citr) { + const coral::AttributeList& atrlist=citr->second; + // SCT manager, therefore ignore all that is not a SCT Identifier + if (atrlist["det"].data<int>()!=2) continue; + + ident = getIdHelper()->wafer_id(atrlist["bec"].data<int>(), + atrlist["layer"].data<int>(), + atrlist["ring"].data<int>(), + atrlist["sector"].data<int>(), + 0); // The last is the module side which is at this ident-level always the 0-side + + // construct new transform + // Order of rotations is defined as around z, then y, then x. + Amg::Translation3D newtranslation(atrlist["Tx"].data<float>(),atrlist["Ty"].data<float>(),atrlist["Tz"].data<float>()); + Amg::Transform3D newtrans = newtranslation * Amg::RotationMatrix3D::Identity(); + newtrans *= Amg::AngleAxis3D(atrlist["Rz"].data<float>()*CLHEP::mrad, Amg::Vector3D(0.,0.,1.)); + newtrans *= Amg::AngleAxis3D(atrlist["Ry"].data<float>()*CLHEP::mrad, Amg::Vector3D(0.,1.,0.)); + newtrans *= Amg::AngleAxis3D(atrlist["Rx"].data<float>()*CLHEP::mrad, Amg::Vector3D(1.,0.,0.)); + + ATH_MSG_DEBUG("New global DB -- channel: " << citr->first + << " ,det: " << atrlist["det"].data<int>() + << " ,bec: " << atrlist["bec"].data<int>() + << " ,layer: " << atrlist["layer"].data<int>() + << " ,ring: " << atrlist["ring"].data<int>() + << " ,sector: " << atrlist["sector"].data<int>() + << " ,Tx: " << atrlist["Tx"].data<float>() + << " ,Ty: " << atrlist["Ty"].data<float>() + << " ,Tz: " << atrlist["Tz"].data<float>() + << " ,Rx: " << atrlist["Rx"].data<float>() + << " ,Ry: " << atrlist["Ry"].data<float>() + << " ,Rz: " << atrlist["Rz"].data<float>()); + + // Set the new transform; Will replace existing one with updated transform + bool status = setAlignableTransformDelta(level, + ident, + newtrans, + frame, + alignStore); + + if (!status) { + ATH_MSG_DEBUG("Cannot set AlignableTransform for identifier." + << getIdHelper()->show_to_string(ident) + << " at level " << level << " for new global DB "); + } + + alignmentChange = (alignmentChange || status); + } + return alignmentChange; + } + +bool SCT_DetectorManager::processSpecialAlignment( + const std::string &, TrackerDD::AlignFolderType) const { + return false; +} + +bool SCT_DetectorManager::processSpecialAlignment(const std::string& /*key*/, + const CondAttrListCollection* /*obj*/, + GeoVAlignmentStore* /*alignStore*/) const { + return false; + +} + +} // namespace TrackerDD diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_ModuleSideDesign.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_ModuleSideDesign.cxx new file mode 100755 index 000000000..c8c0bdbd3 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_ModuleSideDesign.cxx @@ -0,0 +1,104 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SCT_ModuleSideDesign.cxx +// Implementation file for class SCT_ModuleSideDesign +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// +// Version 1.2 03/7/2001 Alessandro Fornaini +// Modified: Grant Gorfine +/////////////////////////////////////////////////////////////////// + +#include "TrackerReadoutGeometry/SCT_ModuleSideDesign.h" +#include "Identifier/Identifier.h" + +namespace TrackerDD { +// Constructor with parameters: +// local axis corresponding to eta direction +// local axis corresponding to phi direction +// local axis corresponding to depth direction +// thickness of silicon sensor +// number of crystals within module side +// number of diodes within crystal +// number of cells within module side +// index of diode connected to cell with index 0 + + +SCT_ModuleSideDesign::SCT_ModuleSideDesign(const double thickness, + const bool phiSymmetric, + const bool etaSymmetric, + const bool depthSymmetric, + const int crystals, + const int diodes, + const int cells, + const int shift, + const bool swapStripReadout, + TrackerDD::CarrierType carrierType, + int readoutSide): + SiDetectorDesign(thickness, phiSymmetric, etaSymmetric, depthSymmetric, carrierType, readoutSide), + m_scheme(crystals, diodes, cells, shift), + m_swapStripReadout(swapStripReadout) { +} + +SCT_ModuleSideDesign::SCT_ModuleSideDesign(const double thickness, + const bool phiSymmetric, + const bool etaSymmetric, + const bool depthSymmetric, + const int crystals, + const int diodes, + const int cells, + const int shift, + const bool swapStripReadout, + TrackerDD::CarrierType carrierType, + int readoutSide, + const TrackerDD::SiDetectorDesign::Axis stripDirection, + const TrackerDD::SiDetectorDesign::Axis thicknessDirection) + : + SiDetectorDesign(thickness, phiSymmetric, etaSymmetric, depthSymmetric, carrierType, readoutSide, + stripDirection, thicknessDirection), + m_scheme(crystals, diodes, cells, shift), + m_swapStripReadout(swapStripReadout) { +} + +void SCT_ModuleSideDesign::neighboursOfCell(const SiCellId &cellId, + std::vector<SiCellId> &neighbours) const { + neighbours.clear(); + neighbours.reserve(2); + + if (!cellId.isValid()) { + return; + } + + int strip = cellId.strip(); + int stripM = strip - 1; + int stripP = strip + 1; + + if (stripM >= m_scheme.shift()) { + neighbours.push_back(stripM); + } + if (stripP < m_scheme.diodes() + m_scheme.shift()) { + neighbours.push_back(stripP); + } +} + +// This method returns the position of the centre of a strip +// ALTERNATIVE/PREFERED way is to use localPositionOfCell(const SiCellId & cellId) or +// rawLocalPositionOfCell method in SiDetectorElement. +// DEPRECATED (but used in numerous places) +SiLocalPosition SCT_ModuleSideDesign::positionFromStrip(const int stripNumber) const { + return localPositionOfCell(SiCellId(stripNumber)); +} + +/// Check if cell is in range. Returns the original cellId if it is in range, otherwise it +// returns an invalid id. +SiCellId SCT_ModuleSideDesign::cellIdInRange(const SiCellId &cellId) const { + if (!cellId.isValid() || + cellId.strip() < 0 || cellId.strip() >= cells()) { + return SiCellId(); // Invalid + } + return cellId; +} +} // namespace TrackerDD diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_ReadoutScheme.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_ReadoutScheme.cxx new file mode 100755 index 000000000..5b2cdde3d --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SCT_ReadoutScheme.cxx @@ -0,0 +1,67 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SCT_ReadoutScheme.cxx +// Implementation file for class SCT_ReadoutScheme +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// +// Version 1.0 23/5/2001 Alessandro Fornaini +// Modified: Grant Gorfine +/////////////////////////////////////////////////////////////////// + +#include "TrackerReadoutGeometry/SCT_ReadoutScheme.h" + +namespace TrackerDD { + +// Copy constructor: +SCT_ReadoutScheme::SCT_ReadoutScheme(const SCT_ReadoutScheme &scheme) : + m_crystals(scheme.m_crystals), + m_diodes(scheme.m_diodes), + m_cells(scheme.m_cells), + m_shift(scheme.m_shift) +{} + +// Constructor with parameters: +SCT_ReadoutScheme::SCT_ReadoutScheme(const int crystals,const int diodes, + const int cells,const int shift) : + m_crystals(crystals), + m_diodes(diodes), + m_cells(cells), + m_shift(shift) +{ + //check if parameters are consistent + if (m_crystals<1) m_crystals=1; + if (m_diodes<0) m_diodes=0; + if (m_cells<0) m_cells=0; +} + +// Assignment operator: +SCT_ReadoutScheme &SCT_ReadoutScheme::operator=(const SCT_ReadoutScheme &scheme) +{ + if (this!=&scheme) { + m_crystals=scheme.m_crystals; + m_diodes=scheme.m_diodes; + m_cells=scheme.m_cells; + m_shift=scheme.m_shift; + } else {} + return *this; +} + + +// diode id -> readout id +SiReadoutCellId +SCT_ReadoutScheme::readoutIdOfCell(const SiCellId & cellId) const +{ + // readout cell and diode numbering are the same. + // The range can be different due to the unconnected edge strips (if m_shift != 0). + if (!cellId.isValid()) return SiReadoutCellId(); // return an invalid id. + int strip = cellId.strip(); + // I think this should be >= m_cells. But need to check if this has any implications. + if (strip < 0 || strip > m_cells) return SiReadoutCellId(); // return an invalid id. + return SiReadoutCellId(strip); +} + +} // namespace TrackerDD diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiCellId.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiCellId.cxx new file mode 100755 index 000000000..e02bb3ac7 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiCellId.cxx @@ -0,0 +1,17 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrackerReadoutGeometry/SiCellId.h" + +namespace TrackerDD{ + std::ostream & operator << (std::ostream & os, const SiCellId & cellId) + { + if (cellId.isValid()){ + return os << "[" << cellId.phiIndex() << "." << cellId.etaIndex() << "]"; + } else { + return os << "[INVALID]"; + } + } +}// namespace TrackerDD + diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiCommonItems.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiCommonItems.cxx new file mode 100755 index 000000000..7d2f086e1 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiCommonItems.cxx @@ -0,0 +1,31 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrackerReadoutGeometry/SiCommonItems.h" + +namespace TrackerDD { + +SiCommonItems::SiCommonItems(const FaserDetectorID* const idHelper) + : m_msg("SiDetectorElement"), + m_idHelper(idHelper), + m_lorentzAngleTool(nullptr), + m_mutex{} +{} + +void +SiCommonItems::setSolenoidFrame(const HepGeom::Transform3D & transform) const +{ + std::lock_guard<std::mutex> lock{m_mutex}; + m_solenoidFrame = transform; +} + +void SiCommonItems::setLorentzAngleTool(const ISiLorentzAngleTool* lorentzAngleTool) { + m_lorentzAngleTool = lorentzAngleTool; +} + +const ISiLorentzAngleTool* SiCommonItems::lorentzAngleTool() const { + return m_lorentzAngleTool; +} + +} // End namespace TrackerDD diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorDesign.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorDesign.cxx new file mode 100755 index 000000000..83a4c3c03 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorDesign.cxx @@ -0,0 +1,125 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiDetectorDesign.cxx +// Implementation file for class SiDetectorDesign +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// +// Version 3.0 05/05/2001 David Calvet +// Modified: Grant Gorfine +/////////////////////////////////////////////////////////////////// + +#include "TrackerReadoutGeometry/SiDetectorDesign.h" +#include "TrackerReadoutGeometry/SiIntersect.h" + +namespace TrackerDD { +// Constructor with parameters: +SiDetectorDesign::SiDetectorDesign(double thickness, + bool phiSymmetric, + bool etaSymmetric, + bool depthSymmetric, + TrackerDD::CarrierType carrierType, + int readoutSide): + m_etaAxis(zAxis), + m_phiAxis(yAxis), + m_depthAxis(xAxis), + m_thickness(thickness), + m_carrierType(carrierType), + m_phiSymmetric(phiSymmetric), + m_etaSymmetric(etaSymmetric), + m_depthSymmetric(depthSymmetric), + m_readoutSidePosDepth(readoutSide > 0) { +} + +// Constructor with axis parameters: +SiDetectorDesign::SiDetectorDesign(double thickness, + bool phiSymmetric, + bool etaSymmetric, + bool depthSymmetric, + TrackerDD::CarrierType carrierType, + int readoutSide, + Axis stripDirection, + Axis thicknessDirection): + m_etaAxis(stripDirection), + m_depthAxis(thicknessDirection), + m_thickness(thickness), + m_carrierType(carrierType), + m_phiSymmetric(phiSymmetric), + m_etaSymmetric(etaSymmetric), + m_depthSymmetric(depthSymmetric), + m_readoutSidePosDepth(readoutSide > 0) { + if (stripDirection == thicknessDirection) { + throw std::runtime_error( + "ERROR: SiDetectorDesign called with phi and thickness directions equal"); + } + // phiAxis is "the other one" + m_phiAxis = static_cast<Axis> ((xAxis + yAxis + zAxis) - (stripDirection + thicknessDirection)); +} + +// Destructor: +SiDetectorDesign::~SiDetectorDesign() { +} + +SiIntersect SiDetectorDesign::inDetector(const SiLocalPosition &localPosition, + double phiTol, double etaTol) const { + double etaDist = 0; + double phiDist = 0; + + distanceToDetectorEdge(localPosition, etaDist, phiDist); + + SiIntersect state; + + if (phiDist < -phiTol || etaDist < -etaTol) { + state.setOut(); + return state; + } + + if (phiDist > phiTol && etaDist > etaTol) { + state.setIn(); + return state; + } + + // Near boundary. + state.setNearBoundary(); + return state; +} + +void SiDetectorDesign::setSymmetry(bool phiSymmetric, bool etaSymmetric, + bool depthSymmetric) { + // Flags can be changed from true to false but not false to true. + if (m_phiSymmetric) { + m_phiSymmetric = phiSymmetric; + } + else if (phiSymmetric) { + std::cout << + "SiDetectorDesign: WARNING! Attempt to allow swapping of xPhi axis direction ignored." + << std::endl; + } + + if (m_etaSymmetric) { + m_etaSymmetric = etaSymmetric; + } + else if (etaSymmetric) { + std::cout << + "SiDetectorDesign: WARNING! Attempt to allow swapping of xEta axis direction ignored." + << std::endl; + } + + if (m_depthSymmetric) { + m_depthSymmetric = depthSymmetric; + } + else if (depthSymmetric) { + std::cout << + "SiDetectorDesign: WARNING! Attempt to allow swapping of xDepth axis direction ignored." + << std::endl; + } +} + +DetectorShape SiDetectorDesign::shape() const { + // Default is Box. + return TrackerDD::Box; +} +} // namespace TrackerDD diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorElement.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorElement.cxx new file mode 100644 index 000000000..893845c56 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorElement.cxx @@ -0,0 +1,1015 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +/** + * @file SiDetectorElement.cxx + * Implementation file for class SiDetectorElement + * @author Grant Gorfine + * Based on version developed by David Calvet. + **/ + +#include "TrackerReadoutGeometry/SiDetectorElement.h" + +#include "FaserDetDescr/FaserDetectorID.h" +#include "AthenaBaseComps/AthMsgStreamMacros.h" +#include "GeoModelKernel/GeoVFullPhysVol.h" +#include "GeoModelUtilities/GeoAlignmentStore.h" +#include "TrackerIdentifier/FaserSCT_ID.h" +#include "TrackerReadoutGeometry/SCT_ModuleSideDesign.h" +#include "TrackerReadoutGeometry/SiReadoutCellId.h" +#include "TrkSurfaces/PlaneSurface.h" +#include "TrkSurfaces/SurfaceBounds.h" + +#include "CLHEP/Geometry/Vector3D.h" +#include "CLHEP/Units/PhysicalConstants.h" // for M_PI +#include "CLHEP/Units/SystemOfUnits.h" +#include "CLHEP/Vector/ThreeVector.h" + +#include <cassert> +#include <cmath> +#include <limits> + +namespace TrackerDD { + using Trk::distPhi; + using Trk::distEta; + using Trk::distDepth; + + // Constructor with parameters: + SiDetectorElement::SiDetectorElement(const Identifier& id, + const SiDetectorDesign* design, + const GeoVFullPhysVol* geophysvol, + const SiCommonItems* commonItems, + const GeoAlignmentStore* geoAlignStore) : + TrkDetElementBase(geophysvol), + m_id(id), + m_design(design), + m_commonItems(commonItems), + m_nextInEta(nullptr), + m_prevInEta(nullptr), + m_nextInPhi(nullptr), + m_prevInPhi(nullptr), + m_otherSide(nullptr), + m_cacheValid(false), + m_firstTime(true), + m_stereoCacheValid(false), + m_isStereo(false), + m_mutex(), + m_surface{}, + m_surfaces{}, + m_geoAlignStore(geoAlignStore) + { + //The following are fixes for coverity bug 11955, uninitialized scalars: + const bool boolDefault(true); + m_depthDirection=boolDefault; + m_phiDirection=boolDefault; + m_etaDirection=boolDefault; + const double defaultMin(std::numeric_limits<double>::max()); + const double defaultMax(std::numeric_limits<double>::lowest()); + m_minZ=defaultMin; + m_maxZ=defaultMax; + m_minR=defaultMin; + m_maxR=defaultMax; + m_minPhi=defaultMin; + m_maxPhi=defaultMax; + + m_hitEta = m_design->etaAxis(); + m_hitPhi = m_design->phiAxis(); + m_hitDepth = m_design->depthAxis(); + /// + + commonConstructor(); + } + + void + SiDetectorElement::commonConstructor() + { + if (!m_id.is_valid()) throw std::runtime_error("SiDetectorElement: Invalid identifier"); + const FaserSCT_ID* sctId = dynamic_cast<const FaserSCT_ID*>(getIdHelper()); + m_idHash = sctId->wafer_hash(m_id); + if (!m_idHash.is_valid()) throw std::runtime_error("SiDetectorElement: Unable to set IdentifierHash"); + + // Increase the reference count of the SiDetectorDesign objects. + m_design->ref(); + + // Increase the reference count of the SiCommonItems objects. + m_commonItems->ref(); + + // Should we reference count the geophysvol as well? + + } + + + // Destructor: + SiDetectorElement::~SiDetectorElement() + { + // The design is reference counted so that it will not be deleted until the last element is deleted. + m_design->unref(); + + m_commonItems->unref(); + } + + /* + * update cache + * This is supposed to be called inside a block + * like + * std::lock_guard< ... > + * if (!cacheValid) { + * updateCache() + * } + */ + void + SiDetectorElement::updateCache() const + { + const GeoTrf::Transform3D& geoTransform = transformHit(); + + double radialShift = 0.; + + HepGeom::Point3D<double> centerGeoModel(radialShift, 0., 0.); + m_centerCLHEP = Amg::EigenTransformToCLHEP(geoTransform) * centerGeoModel; + m_center = Amg::Vector3D(m_centerCLHEP[0], m_centerCLHEP[1], m_centerCLHEP[2]); + + // + // Determine directions depth, eta and phi axis in reconstruction local frame + // ie depth away from interaction point + // phi in direction of increasing phi + // eta in direction of increasing z in barrel, and increasing r in endcap + // + + // depthAxis, phiAxis, and etaAxis are defined to be x,y,z respectively for all detectors for hit local frame. + // depthAxis, phiAxis, and etaAxis are defined to be z,x,y respectively for all detectors for reco local frame. + static const HepGeom::Vector3D<double> localAxes[3] = { + HepGeom::Vector3D<double>(1., 0., 0.), + HepGeom::Vector3D<double>(0., 1., 0.), + HepGeom::Vector3D<double>(0., 0., 1.) + }; + + static const HepGeom::Vector3D<double>& localRecoPhiAxis = localAxes[distPhi]; // Defined to be same as x axis + static const HepGeom::Vector3D<double>& localRecoEtaAxis = localAxes[distEta]; // Defined to be same as y axis + static const HepGeom::Vector3D<double>& localRecoDepthAxis = localAxes[distDepth]; // Defined to be same as z axis + + // We only need to calculate the rough orientation once. + //For it to change would require extreme unrealistic misalignment changes. + if (m_firstTime) { + // Determine the unit vectors in global frame + + const HepGeom::Vector3D<double>& geoModelPhiAxis = localAxes[m_hitPhi]; + const HepGeom::Vector3D<double>& geoModelEtaAxis = localAxes[m_hitEta]; + const HepGeom::Vector3D<double>& geoModelDepthAxis = localAxes[m_hitDepth]; + + HepGeom::Vector3D<double> globalDepthAxis(Amg::EigenTransformToCLHEP(geoTransform) * geoModelDepthAxis); + HepGeom::Vector3D<double> globalPhiAxis(Amg::EigenTransformToCLHEP(geoTransform) * geoModelPhiAxis); + HepGeom::Vector3D<double> globalEtaAxis(Amg::EigenTransformToCLHEP(geoTransform) * geoModelEtaAxis); + + HepGeom::Vector3D<double> nominalEta { 1.0, 0.0, 0.0 }; + HepGeom::Vector3D<double> nominalNormal { 0.0, 0.0, 1.0 }; + HepGeom::Vector3D<double> nominalPhi { 0.0, 1.0, 0.0 }; + + // In Faser, the etaAxis is along increasing x, and normal is in increasing z direction + + // Determine if axes are to have their directions swapped. + + // + // Depth axis. + // + double depthDir = globalDepthAxis.dot(nominalNormal); + m_depthDirection = true; + if (depthDir < 0.) { + m_depthDirection = false; + } + if (std::abs(depthDir) < 0.5) { // Check that it is in roughly the right direction. + ATH_MSG_ERROR("Orientation of local depth axis does not follow correct convention."); + // throw std::runtime_error("Orientation of local depth axis does not follow correct convention."); + m_depthDirection = true; // Don't swap. + } + + // + // Phi axis + // + double phiDir = globalPhiAxis.dot(nominalPhi); + m_phiDirection = true; + if (phiDir < 0.) { + m_phiDirection = false; + } + if (std::abs(phiDir) < 0.5) { // Check that it is in roughly the right direction. + ATH_MSG_ERROR("Orientation of local xPhi axis does not follow correct convention."); + // throw std::runtime_error("Orientation of local xPhi axis does not follow correct convention."); + m_phiDirection = true; // Don't swap. + } + + // + // Eta axis + // + double etaDir = globalEtaAxis.dot(nominalEta); + m_etaDirection = true; + if (etaDir < 0.) { + m_etaDirection = false; + } + if (std::abs(etaDir) < 0.5) { // Check that it is in roughly the right direction. + ATH_MSG_ERROR("Orientation of local xEta axis does not follow correct convention."); + // throw std::runtime_error("Orientation of local xEta axis does not follow correct convention."); + m_etaDirection = true; // Don't swap + } + } // end if (m_firstTime) + + m_transformCLHEP = Amg::EigenTransformToCLHEP(geoTransform) * recoToHitTransformImpl(); + m_transform = Amg::CLHEPTransformToEigen(m_transformCLHEP); + + // Check that local frame is right-handed. (ie transform has no reflection) + // This can be done by checking that the determinant is >0. + if (m_firstTime) { // Only need to check this once. + HepGeom::Transform3D& t = m_transformCLHEP; + double det = t(0,0) * (t(1,1)*t(2,2) - t(1,2)*t(2,1)) - + t(0,1) * (t(1,0)*t(2,2) - t(1,2)*t(2,0)) + + t(0,2) * (t(1,0)*t(2,1) - t(1,1)*t(2,0)); + if (det < 0.) { + ATH_MSG_DEBUG("Local frame is left-handed, Swapping depth axis to make it right handed."); + m_depthDirection = !m_depthDirection; + m_transformCLHEP = Amg::EigenTransformToCLHEP(geoTransform) * recoToHitTransformImpl(); + m_transform = Amg::CLHEPTransformToEigen(m_transformCLHEP); + } + } + + // Initialize various cached members + // The unit vectors + HepGeom::Vector3D<double> normalCLHEP = m_transformCLHEP * localRecoDepthAxis; + m_normal = Amg::Vector3D(normalCLHEP[0], normalCLHEP[1], normalCLHEP[2]); + + m_phiAxisCLHEP = m_transformCLHEP * localRecoPhiAxis; + m_etaAxisCLHEP = m_transformCLHEP * localRecoEtaAxis; + + m_phiAxis = Amg::Vector3D(m_phiAxisCLHEP[0], m_phiAxisCLHEP[1], m_phiAxisCLHEP[2]); + m_etaAxis = Amg::Vector3D(m_etaAxisCLHEP[0], m_etaAxisCLHEP[1], m_etaAxisCLHEP[2]); + + getExtent(m_minR, m_maxR, m_minZ, m_maxZ, m_minPhi, m_maxPhi); + + //Install the cache at the end + m_cacheValid.store(true); + if (m_firstTime) m_firstTime.store(false); + } + + void + SiDetectorElement::determineStereo() const + { + // Assume m_mutex is already locked. + + if (m_firstTime) updateCache(); + + if (m_otherSide) { + double sinStereoThis = std::abs(sinStereoImpl()); //Call the private impl method + double sinStereoOther = std::abs(m_otherSide->sinStereo()); + if (sinStereoThis == sinStereoOther) { + // If they happend to be equal then set side0 as axial and side1 as stereo. + const FaserSCT_ID* sctId = dynamic_cast<const FaserSCT_ID*>(getIdHelper()); + if (sctId) { + int side = sctId->side(m_id); + m_isStereo = (side == 1); + } + } else { + // set the stereo side as the one with largest absolute sinStereo. + m_isStereo = (sinStereoThis > sinStereoOther); + } + } else { + m_isStereo = false; + } + + m_stereoCacheValid.store(true); + } + + const GeoTrf::Transform3D& + SiDetectorElement::transformHit() const + { + if (m_geoAlignStore) { + const GeoTrf::Transform3D* ptrXf = m_geoAlignStore->getAbsPosition(getMaterialGeom()); + if (ptrXf) return *ptrXf; + } + return getMaterialGeom()->getAbsoluteTransform(); + } + + const Amg::Transform3D& + SiDetectorElement::transform() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_transform; + } + + const HepGeom::Transform3D& + SiDetectorElement::transformCLHEP() const + { + //stuff to get the CLHEP version of the local to global transform. + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_transformCLHEP; + } + + const HepGeom::Transform3D + SiDetectorElement::defTransformCLHEP() const + { + if (m_geoAlignStore) { + const GeoTrf::Transform3D* ptrXf = m_geoAlignStore->getDefAbsPosition(getMaterialGeom()); + if (ptrXf) return Amg::EigenTransformToCLHEP(*ptrXf) * recoToHitTransform(); + } + return Amg::EigenTransformToCLHEP(getMaterialGeom()->getDefAbsoluteTransform()) * recoToHitTransform(); + } + + const Amg::Transform3D + SiDetectorElement::defTransform() const + { + HepGeom::Transform3D tmpTransform = defTransformCLHEP(); + return Amg::CLHEPTransformToEigen(tmpTransform); + } + + const HepGeom::Transform3D + SiDetectorElement::recoToHitTransform() const + { + // Determine the reconstruction local (LocalPosition) to global transform. + if (m_firstTime) { + std::lock_guard<std::mutex> lock(m_mutex); + if (m_firstTime) updateCache(); + } + + return recoToHitTransformImpl(); + } + + const HepGeom::Transform3D + SiDetectorElement::recoToHitTransformImpl() const + { + // = transfromHit * hitLocal + // = transformHit * recoToHitTransform * recoLocal + // recoToHitTransform takes recoLocal to hitLocal + // x,y,z -> y,z,x + // equiv to a rotation around Y of 90 deg followed by a rotation around X of 90deg + // + // recoToHit is static as it needs to be calculated once only. + // We use the HepGeom::Transform3D constructor which takes one coordinates system to another where the + // coordinate system is defined by it center and two axes. + // distPhi, distEta are the reco local axes and hitPhi and hitEta are the hit local axes. + // It assume phi, eta, depth makes a right handed system which is the case. + static const HepGeom::Vector3D<double> localAxes[3] = { + HepGeom::Vector3D<double>(1., 0., 0.), + HepGeom::Vector3D<double>(0., 1., 0.), + HepGeom::Vector3D<double>(0., 0., 1.) + }; + //static + + const HepGeom::Transform3D recoToHit(HepGeom::Point3D<double>(0., 0., 0.), + localAxes[distPhi], + localAxes[distEta], + HepGeom::Point3D<double>(0., 0., 0.), + localAxes[m_hitPhi], + localAxes[m_hitEta]); + + // Swap direction of axis as appropriate + CLHEP::Hep3Vector scale(1., 1., 1.); + if (!m_phiDirection) scale[distPhi] = -1.; + if (!m_etaDirection) scale[distEta] = -1.; + if (!m_depthDirection) scale[distDepth] = -1.; + return recoToHit * HepGeom::Scale3D(scale[0], scale[1], scale[2]); + } + + const Amg::Transform3D& + SiDetectorElement::moduleTransform() const + { + return (isModuleFrame()) ? transform() : m_otherSide->transform(); + } + + Amg::Transform3D + SiDetectorElement::defModuleTransform() const + { + return (isModuleFrame()) ? defTransform() : m_otherSide->defTransform(); + } + + // Take a transform in the local reconstruction and return it in the module frame + // For a given transform l in frame A. The equivalent transform in frame B is + // B.inverse() * A * l * A.inverse() * B + // Here A is the local to global transform of the element and B is the local to global + // transform of the module. + // If we are already in the module frame then there is nothing to do, we just return the + // transform that is input. Otherwise we use the above formula. + Amg::Transform3D + SiDetectorElement::localToModuleFrame(const Amg::Transform3D& localTransform) const + { + if (isModuleFrame()) { + return localTransform; + } else { + return m_otherSide->transform().inverse() * transform() * localTransform * transform().inverse() * m_otherSide->transform(); + } + } + + Amg::Transform3D + SiDetectorElement::localToModuleTransform() const + { + if (isModuleFrame()) { + return Amg::Transform3D(); // Identity + } else { + return m_otherSide->transform().inverse() * transform(); + } + } + + bool + SiDetectorElement::isModuleFrame() const + { + // The module frame is the axial side. + // NB isStereo returns false for the pixel and so + // isModuleFrame is always true for the pixel. + + return !isStereo(); + } + + + const Amg::Vector3D& + SiDetectorElement::center() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_center; + } + + const Amg::Vector3D& + SiDetectorElement::normal() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_normal; + } + + const HepGeom::Vector3D<double>& + SiDetectorElement::etaAxisCLHEP() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_etaAxisCLHEP; + } + + const HepGeom::Vector3D<double>& + SiDetectorElement::phiAxisCLHEP() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_phiAxisCLHEP; + } + + const Amg::Vector3D& + SiDetectorElement::etaAxis() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_etaAxis; + } + + const Amg::Vector3D& + SiDetectorElement::phiAxis() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return m_phiAxis; + } + + Amg::Vector2D + SiDetectorElement::hitLocalToLocal(double xEta, double xPhi) const // Will change order to phi,eta + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + if (!m_etaDirection) xEta = -xEta; + if (!m_phiDirection) xPhi = -xPhi; + return Amg::Vector2D(xPhi, xEta); + } + + HepGeom::Point3D<double> + SiDetectorElement::hitLocalToLocal3D(const HepGeom::Point3D<double>& hitPosition) const + { + // Equiv to transform().inverse * transformHit() * hitPosition + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + double xDepth = hitPosition[m_hitDepth]; + double xPhi = hitPosition[m_hitPhi]; + double xEta = hitPosition[m_hitEta]; + if (!m_depthDirection) xDepth = -xDepth; + if (!m_phiDirection) xPhi = -xPhi; + if (!m_etaDirection) xEta = -xEta; + return HepGeom::Point3D<double>(xPhi, xEta, xDepth); + } + + // compute sin(tilt angle) at center: + double SiDetectorElement::sinTilt() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + // Tilt is defined as the angle between a refVector and the sensor normal. + // In barrel refVector = unit vector radial. + // in endcap it is assumed there is no tilt. + // sinTilt = (refVector cross normal) . z + + // Angle between normal and radial vector. + // HepGeom::Vector3D<double> refVector(m_center.x(), m_center.y(), 0); + // return (refVector.cross(m_normal)).z()/refVector.mag(); + // or the equivalent + return (m_center.x() * m_normal.y() - m_center.y() * m_normal.x()) / m_center.perp(); + } + + double SiDetectorElement::sinTilt(const Amg::Vector2D& localPos) const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + HepGeom::Point3D<double> point = globalPositionCLHEP(localPos); + return sinTilt(point); + } + + double SiDetectorElement::sinTilt(const HepGeom::Point3D<double>& globalPos) const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + // It is assumed that the global position is already in the plane of the element. + + // Angle between normal and radial vector. + //HepGeom::Vector3D<double> refVector(globalPos.x(), globalPos.y(), 0); + //return (refVector.cross(m_normal)).z()/refVector.mag(); + // or the equivalent + return (globalPos.x() * m_normal.y() - globalPos.y() * m_normal.x()) / globalPos.perp(); + } + + double SiDetectorElement::sinStereo() const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return sinStereoImpl(); + } + + double SiDetectorElement::sinStereoImpl() const + { + // Stereo is the angle between a refVector and a vector along the strip/pixel in eta direction. + // I'm not sure how the sign should be defined. I've defined it here + // with rotation sense respect to normal, + // where normal is away from IP in barrel and in -ve z direction in endcap + + // In Barrel refVector = unit vector along z axis, + // in endcap refVector = unit vector radial. + // + // sinStereo = (refVector cross stripAxis) . normal + // = (refVector cross etaAxis) . normal + // = refVector . (etaAxis cross normal) + // = refVector . phiAxis + // + // in Barrel we use + // sinStereo = refVector . phiAxis + // = phiAxis.z() + // + // in endcap we use + // sinStereo = (refVector cross etaAxis) . normal + // = -(center cross etaAxis) . zAxis + // = (etaAxis cross center). z() + double sinStereo = 0.; + sinStereo = m_phiAxis.z(); + return sinStereo; + } + + double SiDetectorElement::sinStereo(const Amg::Vector2D& localPos) const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + HepGeom::Point3D<double> point=globalPositionCLHEP(localPos); + return sinStereoImpl(point); + } + + double SiDetectorElement::sinStereo(const HepGeom::Point3D<double>& globalPos) const + { + if (!m_cacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_cacheValid) updateCache(); + } + + return sinStereoImpl(globalPos); + } + + double SiDetectorElement::sinStereoImpl(const HepGeom::Point3D<double>& globalPos) const + { + // + // sinStereo = (refVector cross stripAxis) . normal + // + double sinStereo = 0.; + if (m_design->shape() != TrackerDD::Trapezoid) { + sinStereo = m_phiAxis.z(); + } else { // trapezoid + assert (minWidth() != maxWidth()); + double radius = width() * length() / (maxWidth() - minWidth()); + HepGeom::Vector3D<double> stripAxis = radius * m_etaAxisCLHEP + globalPos - m_centerCLHEP; + sinStereo = (stripAxis.x() * m_normal.y() - stripAxis.y() * m_normal.x()) / stripAxis.mag(); + } + return sinStereo; + } + + bool + SiDetectorElement::isStereo() const + { + if (!m_stereoCacheValid) { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_stereoCacheValid) { + determineStereo(); + } + } + + return m_isStereo; + } + + + double + SiDetectorElement::sinStereoLocal(const Amg::Vector2D& localPos) const + { + // The equation below will work for rectangle detectors as well in which + // case it will return 0. But we return zero immediately as there is no point doing the calculation. + if (m_design->shape() == TrackerDD::Box) return 0.; + double oneOverRadius = (maxWidth() - minWidth()) / (width() * length()); + double x = localPos[distPhi]; + double y = localPos[distEta]; + return -x*oneOverRadius / sqrt( (1+y*oneOverRadius)*(1+y*oneOverRadius) + x*oneOverRadius*x*oneOverRadius ); + } + + double + SiDetectorElement::sinStereoLocal(const HepGeom::Point3D<double>& globalPos) const + { + return sinStereoLocal(localPosition(globalPos)); + } + + // Special method for SCT to retrieve the two ends of a "strip" + std::pair<Amg::Vector3D,Amg::Vector3D> SiDetectorElement::endsOfStrip(const Amg::Vector2D& position) const + { + const std::pair<Amg::Vector2D,Amg::Vector2D> localEnds= + m_design->endsOfStrip(position); + return std::pair<Amg::Vector3D,Amg::Vector3D >(globalPosition(localEnds.first), + globalPosition(localEnds.second)); + } + + Trk::Surface& + SiDetectorElement::surface() + { + if (not m_surface) m_surface.set(std::make_unique<Trk::PlaneSurface>(*this)); + return *m_surface; + } + + const Trk::Surface& + SiDetectorElement::surface() const + { + if (not m_surface) m_surface.set(std::make_unique<Trk::PlaneSurface>(*this)); + return *m_surface; + } + + const std::vector<const Trk::Surface*>& SiDetectorElement::surfaces() const + { + std::lock_guard<std::mutex> lock(m_mutex); + if (!m_surfaces.size()) { + // get this surface + m_surfaces.push_back(&surface()); + // get the other side surface + if (otherSide()) { + m_surfaces.push_back(&(otherSide()->surface())); + } + } + // return the surfaces + return m_surfaces; + } + + const Trk::SurfaceBounds& + SiDetectorElement::bounds() const + { + return m_design->bounds(); + } + + // Get min/max or r, z,and phi + // helper method only to be used for the cache construction + // i.e inside updateCache + void SiDetectorElement::getExtent(double& rMin, double& rMax, + double& zMin, double& zMax, + double& phiMin, double& phiMax) const + { + HepGeom::Point3D<double> corners[4]; + getCorners(corners); + + bool first = true; + + double phiOffset = 0.; + + double radialShift = 0.; + const HepGeom::Transform3D rShift = HepGeom::TranslateX3D(radialShift);//in local frame, radius is x + + for (int i = 0; i < 4; i++) { + + // m_tranform is already there as part of the cache construction + // This method seems to be used only as a helper for updateCache + HepGeom::Point3D<double> globalPoint = m_transformCLHEP * corners[i]; + + double rPoint = globalPoint.perp(); + double zPoint = globalPoint.z(); + double phiPoint = globalPoint.phi(); + + // Use first point to initializa min/max values. + if (first) { + + // Put phi in a range so that we are not near -180/+180 division. + // Do this by adding an offset if phi > 90 CLHEP::deg or < -90 CLHEP::deg. + // This offset is later removed. + if (phiPoint < -0.5 * M_PI) { + phiOffset = -0.5 * M_PI; + } else if (phiPoint > 0.5 * M_PI) { + phiOffset = 0.5 * M_PI; + } + phiMin = phiMax = phiPoint - phiOffset; + rMin = rMax = rPoint; + zMin = zMax = zPoint; + + } else { + phiPoint -= phiOffset; + // put phi back in -M_PI < phi < +M_PI range + if (phiPoint < -M_PI) phiPoint += 2. * M_PI; + if (phiPoint > M_PI) phiPoint -= 2. * M_PI; + phiMin = std::min(phiMin, phiPoint); + phiMax = std::max(phiMax, phiPoint); + rMin = std::min(rMin, rPoint); + rMax = std::max(rMax, rPoint); + zMin = std::min(zMin, zPoint); + zMax = std::max(zMax, zPoint); + } + first = false; + } + + // put phi back in -M_PI < phi < +M_PI range + phiMin += phiOffset; + phiMax += phiOffset; + if (phiMin < -M_PI) phiMin += 2. * M_PI; + if (phiMin > M_PI) phiMin -= 2. * M_PI; + if (phiMax < -M_PI) phiMax += 2. * M_PI; + if (phiMax > M_PI) phiMax -= 2. * M_PI; + + } + + // Get eta/phi extent. Returns min/max eta and phi and r (for barrel) + // or z (for endcap) Takes as input the vertex spread in z (+-deltaZ). + // Gets 4 corners of the sensor and calculates eta phi for each corner + // for both +/- vertex spread. The returned phi is between -M_PI and M_PI + // with the direction minPhi to maxPhi always in the positive sense, + // so if the element extends across the -180/180 boundary then minPhi will + // be greater than maxPhi. + // void SiDetectorElement::getEtaPhiRegion(double deltaZ, double& etaMin, double& etaMax, double& phiMin, + // double& phiMax, double& rz) const + // { + // if (!m_cacheValid) { + // std::lock_guard<std::mutex> lock(m_mutex); + // if (!m_cacheValid) updateCache(); + // } + + // HepGeom::Point3D<double> corners[4]; + // getCorners(corners); + + // bool first = true; + + // double phiOffset = 0.; + + // for (int i = 0; i < 4; i++) { + // double etaMinPoint = 0.; + // double etaMaxPoint = 0.; + // double phiPoint = 0.; + + // // Get the eta phi value for this corner. + // getEtaPhiPoint(corners[i], deltaZ, etaMinPoint, etaMaxPoint, phiPoint); + + // if (first) { // Use the first point to initialize the min/max values. + + // // Put phi in a range so that we are not near -180/+180 division. + // // Do this by adding an offset if phi > 90 CLHEP::deg or < -90 CLHEP::deg. + // // This offset is later removed. + // if (phiPoint < -0.5 * M_PI) { + // phiOffset = -0.5 * M_PI; + // } else if (phiPoint > 0.5 * M_PI) { + // phiOffset = 0.5 * M_PI; + // } + // phiMin = phiMax = phiPoint - phiOffset; + // etaMin = etaMinPoint; + // etaMax = etaMaxPoint; + // } else { + // phiPoint -= phiOffset; + // // put phi back in -M_PI < phi < +M_PI range + // if (phiPoint < -M_PI) phiPoint += 2. * M_PI; + // if (phiPoint > M_PI) phiPoint -= 2. * M_PI; + // phiMin = std::min(phiMin, phiPoint); + // phiMax = std::max(phiMax, phiPoint); + // etaMin = std::min(etaMin, etaMinPoint); + // etaMax = std::max(etaMax, etaMaxPoint); + // } + // first = false; + // } + + // // put phi back in -M_PI < phi < +M_PI range + // phiMin += phiOffset; + // phiMax += phiOffset; + // if (phiMin < -M_PI) phiMin += 2. * M_PI; + // if (phiMin > M_PI) phiMin -= 2. * M_PI; + // if (phiMax < -M_PI) phiMax += 2. * M_PI; + // if (phiMax > M_PI) phiMax -= 2. * M_PI; + + // // Calculate rz = r (barrel) or z (endcap) + // // Use center of sensor ((0,0,0) in local coordinates) for determining this. + // // HepGeom::Point3D<double> globalCenter = globalPosition(HepGeom::Point3D<double>(0,0,0)); + // rz = center().perp(); // r + // } + + // // Gets eta phi for a point given in local coordinates. deltaZ is specified to + // // account for the vertex spread. phi is independent of this vertex + // // spread. etaMax will correspond to zMin (-deltaZ) and etaMin will + // // correspond to zMax (+deltaZ). + // void SiDetectorElement::getEtaPhiPoint(const HepGeom::Point3D<double>& point, double deltaZ, + // double& etaMin, double& etaMax, double& phi) const + // { + // // Get the point in global coordinates. + // HepGeom::Point3D<double> globalPoint = globalPosition(point); + + // double r = globalPoint.perp(); + // double z = globalPoint.z(); + + // double thetaMin = atan2(r,(z + deltaZ)); + // etaMax = -log(tan(0.5 * thetaMin)); + // double thetaMax = atan2(r,(z - deltaZ)); + // etaMin = -log(tan(0.5 * thetaMax)); + + // phi = globalPoint.phi(); + // } + + void SiDetectorElement::getCorners(HepGeom::Point3D<double>* corners) const + { + // This makes the assumption that the forward SCT detectors are orientated such that + // the positive etaAxis corresponds to the top of the detector where the width is largest. + // This is currently always the case. + // For the SCT barrel and pixel detectors minWidth and maxWidth are the same and so should + // work for all orientations. + + double minWidth = m_design->minWidth(); + double maxWidth = m_design->maxWidth(); + double length = m_design->length(); + + // Lower left + corners[0][distPhi] = -0.5 * minWidth; + corners[0][distEta] = -0.5 * length; + corners[0][distDepth] = 0.; + + // Lower right + corners[1][distPhi] = 0.5 * minWidth; + corners[1][distEta] = -0.5 * length; + corners[1][distDepth] = 0.; + + // Upper Right + corners[2][distPhi] = 0.5 * maxWidth; + corners[2][distEta] = 0.5 * length; + corners[2][distDepth] = 0.; + + // Upper left + corners[3][distPhi] = -0.5 * maxWidth; + corners[3][distEta] = 0.5 * length; + corners[3][distDepth] = 0.; + } + + SiIntersect + SiDetectorElement::inDetector(const Amg::Vector2D& localPosition, + double phiTol, double etaTol) const + { + return m_design->inDetector(localPosition, phiTol, etaTol); + } + + + SiIntersect + SiDetectorElement::inDetector(const HepGeom::Point3D<double>& globalPosition, double phiTol, double etaTol) const + { + return m_design->inDetector(localPosition(globalPosition), phiTol, etaTol); + } + + bool + SiDetectorElement::nearBondGap(const Amg::Vector2D& localPosition, double etaTol) const + { + return m_design->nearBondGap(localPosition, etaTol); + } + + bool + SiDetectorElement::nearBondGap(const HepGeom::Point3D<double>& globalPosition, double etaTol) const + { + return m_design->nearBondGap(localPosition(globalPosition), etaTol); + } + + Amg::Vector2D + SiDetectorElement::rawLocalPositionOfCell(const SiCellId& cellId) const + { + return m_design->localPositionOfCell(cellId); + } + + Amg::Vector2D + SiDetectorElement::rawLocalPositionOfCell(const Identifier& id) const + { + SiCellId cellId = cellIdFromIdentifier(id); + return m_design->localPositionOfCell(cellId); + } + + int + SiDetectorElement::numberOfConnectedCells(const SiCellId cellId) const + { + SiReadoutCellId readoutId = m_design->readoutIdOfCell(cellId); + return m_design->numberOfConnectedCells(readoutId); + } + + SiCellId + SiDetectorElement::connectedCell(const SiCellId cellId, int number) const + { + SiReadoutCellId readoutId = m_design->readoutIdOfCell(cellId); + return m_design->connectedCell(readoutId, number); + } + + + SiCellId + SiDetectorElement::cellIdOfPosition(const Amg::Vector2D& localPosition) const + { + return m_design->cellIdOfPosition(localPosition); + } + + Identifier + SiDetectorElement::identifierOfPosition(const Amg::Vector2D& localPosition) const + { + SiCellId cellId = m_design->cellIdOfPosition(localPosition); + return identifierFromCellId(cellId); + } + + Identifier + SiDetectorElement::identifierFromCellId(const SiCellId& cellId) const + { + Identifier id; // Will be initialized in an invalid state. + + // If something fails it returns the id in an invalid state. + + if (cellId.isValid()) { + + const FaserSCT_ID* sctIdHelper = dynamic_cast<const FaserSCT_ID*>(getIdHelper()); + if (sctIdHelper) { + id = sctIdHelper->strip_id(m_id, cellId.strip()); + } + } + return id; + } + + SiCellId + SiDetectorElement::cellIdFromIdentifier(const Identifier& identifier) const + { + SiCellId cellId; // Initialized in invalid state. + + // If something fails it returns the cellId in an invalid state. + + if (identifier.is_valid()) { + + const FaserSCT_ID* sctIdHelper = dynamic_cast<const FaserSCT_ID*>(getIdHelper()); + if (sctIdHelper) { + cellId = SiCellId(sctIdHelper->strip(identifier)); + } + } + return cellId; + } + +} // namespace TrackerDD diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorElementCollection.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorElementCollection.cxx new file mode 100644 index 000000000..9f8d85b65 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorElementCollection.cxx @@ -0,0 +1,19 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrackerReadoutGeometry/SiDetectorElementCollection.h" + +#include "TrackerReadoutGeometry/SiDetectorElement.h" +#include "Identifier/IdentifierHash.h" + +TrackerDD::SiDetectorElementCollection::~SiDetectorElementCollection() { + for (TrackerDD::SiDetectorElement* ele: *this) delete ele; +} + +const TrackerDD::SiDetectorElement* +TrackerDD::SiDetectorElementCollection::getDetectorElement(const IdentifierHash& hash) const { + const unsigned int value{hash.value()}; + if (this->size()<=value) return nullptr; + return this->at(value); +} diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorManager.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorManager.cxx new file mode 100755 index 000000000..997b68754 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDetectorManager.cxx @@ -0,0 +1,149 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + + +#include "GeoPrimitives/CLHEPtoEigenConverter.h" + +#include "TrackerReadoutGeometry/SiDetectorManager.h" +#include "FaserDetDescr/FaserDetectorID.h" +#include "IdDictDetDescr/IdDictManager.h" +#include "StoreGate/StoreGateSvc.h" + +#include "GeoModelKernel/GeoXF.h" +#include "GeoGenericFunctions/Variable.h" +#include "GeoModelKernel/GeoAlignableTransform.h" +#include "DetDescrConditions/AlignableTransformContainer.h" +#include "TrackerReadoutGeometry/SiDetectorElementCollection.h" +#include "TrackerReadoutGeometry/SiDetectorElement.h" +#include "TrackerReadoutGeometry/ExtendedAlignableTransform.h" + +#include <iostream> + +namespace TrackerDD +{ + + SiDetectorManager::SiDetectorManager(StoreGateSvc * detStore, const std::string & name) + : TrackerDetectorManager(detStore, name) + { + // Add default folder + // addFolder("/Tracker/Align"); + } + + const std::string& SiDetectorManager::tag() const + { + return m_tag; + } + + void SiDetectorManager::invalidateAll() const + { + for (SiDetectorElementCollection::const_iterator element_iter = getDetectorElementBegin(); + element_iter != getDetectorElementEnd(); + ++element_iter) { + + if (*element_iter) { + (*element_iter)->invalidate(); + } + } + } + + void SiDetectorManager::updateAll() const + { + for (SiDetectorElementCollection::const_iterator element_iter = getDetectorElementBegin(); + element_iter != getDetectorElementEnd(); + ++element_iter) { + if (*element_iter) { + (*element_iter)->setAllCaches(); + } + } + } + + bool SiDetectorManager::setAlignableTransformLocalDelta(ExtendedAlignableTransform * extXF, + const Amg::Transform3D & localToGlobalXF, + const Amg::Transform3D & delta, + GeoVAlignmentStore* alignStore) const + { + // ATTENTION -------------------------------------------------------- (A.S.) + // CLHEP < -- > AMG interface method + + // Sets the alignable transform delta when the supplied delta is in the local + // reconstruction frame + + // If the default transform to the local recostruction frame is + // T = A*B*C*D*E + // and the alignable transform is C with delta c and the delat in the local frame is l, then + // A*B*C*c*D*E = A*B*C*D*E*l + // c = (D*E) * l * (D*E).inverse() + // c = (A*B*C).inverse * T * l * T.inverse() * (A*B*C) + + // To get default transform up and including the alignable transform, + // we assume the next volume down is a fullphys volume and so its + // transform is the transform we want (ie A*B*C in the above example). + + if (!extXF) return false; + + const GeoVFullPhysVol* child = extXF->child(); + if (child && extXF->alignableTransform()) { + // the definitiv absolut transform is in CLHEP -> do the calculation in CLHEP + const GeoTrf::Transform3D& transform = child->getDefAbsoluteTransform(alignStore); + // calucluate the corrected delta according to the formula above + GeoTrf::Transform3D correctedDelta = transform.inverse()*localToGlobalXF // (A*B*C).inverse() * T + * delta // l + * localToGlobalXF.inverse() * transform; // T.inverse() * (A*B*C) + extXF->alignableTransform()->setDelta(correctedDelta, alignStore); + return true; + } else { + return false; + } + } + + bool SiDetectorManager::setAlignableTransformGlobalDelta(ExtendedAlignableTransform * extXF, + const Amg::Transform3D& delta, + GeoVAlignmentStore* alignStore) const { + // ATTENTION -------------------------------------------------------- (A.S.) + // CLHEP < -- > AMG interface method + + // Sets the alignable transform delta when the supplied delta is in the global frame. + + // If the default transform down to the alignable transform is + // T = A*B*C + // and the alignable transform is C with delta c and the delta in the global frame is g, then + // A*B*C*c = g*A*B*C + // T*c = g*T + // c = T.inverse() * g * T + + // To get default transform up and including the alignable transform, + // we assume the next volume down is a fullphys volume and so its + // transform is the transform we want (ie T=A*B*C in the above example). + + + if (!extXF) return false; + + const GeoVFullPhysVol * child = extXF->child(); + if (child && extXF->alignableTransform()) { + // do the calculation in CLHEP + const GeoTrf::Transform3D& transform = child->getDefAbsoluteTransform(alignStore); + extXF->alignableTransform()->setDelta(transform.inverse() * delta * transform, alignStore); + return true; + } else { + return false; + } + } + + void SiDetectorManager::addDesign(const SiDetectorDesign * design) + { + m_designs.push_back(design); + } + + int SiDetectorManager::numDesigns() const + { + return m_designs.size(); + } + + + const SiDetectorDesign* SiDetectorManager::getDesign(int i) const + { + return m_designs[i]; + } + +}// namespace TrackerDD diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDiodesParameters.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDiodesParameters.cxx new file mode 100755 index 000000000..d8dd514a8 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiDiodesParameters.cxx @@ -0,0 +1,47 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiDiodesParameters.cxx +// Implementation file for class SiDiodesParameters +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// +// Version 1.0 14/08/2001 David Calvet +/////////////////////////////////////////////////////////////////// + +#include "TrackerReadoutGeometry/SiDiodesParameters.h" + +namespace TrackerDD { + +// Implicit constructor: +SiDiodesParameters::SiDiodesParameters() : + m_centre(), + m_width() +{} + +// Copy constructor: +SiDiodesParameters::SiDiodesParameters(const SiDiodesParameters ¶meters) : + m_centre(parameters.m_centre), + m_width(parameters.m_width) +{} + +// Constructor with parameters: +SiDiodesParameters::SiDiodesParameters(const SiLocalPosition ¢re, + const SiLocalPosition &width) : + m_centre(centre), + m_width(width) +{} + +// Assignment operator: +SiDiodesParameters &SiDiodesParameters::operator=(const SiDiodesParameters ¶meters) +{ + if (this!=¶meters) { + m_centre=parameters.m_centre; + m_width=parameters.m_width; + } else {} + return *this; +} + +} // namespace TrackerDD diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiLocalPosition.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiLocalPosition.cxx new file mode 100755 index 000000000..9ddee6dd0 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiLocalPosition.cxx @@ -0,0 +1,100 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// SiLocalPosition.cxx +// Implementation file for class SiLocalPosition +/////////////////////////////////////////////////////////////////// +// (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// +// Version 2.1 01/08/2001 David Calvet +/////////////////////////////////////////////////////////////////// + +#include "TrackerReadoutGeometry/SiLocalPosition.h" + +namespace TrackerDD { + +// Default constructor: +SiLocalPosition::SiLocalPosition() : + m_xEta(0), + m_xPhi(0), + m_xDepth(0) +{} + + + +// Constructor with parameters: +SiLocalPosition::SiLocalPosition(const double xEta,const double xPhi, + const double xDepth) : + m_xEta(xEta), + m_xPhi(xPhi), + m_xDepth(xDepth) +{} + +SiLocalPosition::SiLocalPosition(const Amg::Vector2D &position) + : m_xEta(position[Trk::distEta]), + m_xPhi(position[Trk::distPhi]), + m_xDepth(0) +{} + + +SiLocalPosition::operator Amg::Vector2D(void) const +{ + return Amg::Vector2D(m_xPhi, m_xEta); +} + + + +// addition of positions: +SiLocalPosition &SiLocalPosition::operator+=(const SiLocalPosition &position) +{ + m_xEta+=position.m_xEta; + m_xPhi+=position.m_xPhi; + m_xDepth+=position.m_xDepth; + return *this; +} + +// scaling: +SiLocalPosition &SiLocalPosition::operator*=(const double factor) +{ + m_xEta*=factor; + m_xPhi*=factor; + m_xDepth*=factor; + return *this; +} + +// scaling: +SiLocalPosition &SiLocalPosition::operator/=(const double factor) +{ + if (0!=factor) { + m_xEta/=factor; + m_xPhi/=factor; + m_xDepth/=factor; + } else {} + return *this; +} + +SiLocalPosition operator+(const SiLocalPosition &position1, + const SiLocalPosition &position2) +{ + SiLocalPosition result(position1); + result+=position2; + return result; +} + +SiLocalPosition operator*(const SiLocalPosition &position,const double factor) +{ + SiLocalPosition result(position); + result*=factor; + return result; +} + +SiLocalPosition operator/(const SiLocalPosition &position,const double factor) +{ + SiLocalPosition result(position); + result/=factor; + return result; +} + +} // namespace TrackerDD diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiNumerology.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiNumerology.cxx new file mode 100644 index 000000000..180f901c6 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/SiNumerology.cxx @@ -0,0 +1,47 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrackerReadoutGeometry/SiNumerology.h" + + +namespace TrackerDD { + +SiNumerology::SiNumerology() + : m_numLayers(0), + m_maxPhiCells(0), + m_maxNumBarrelEta(0), + m_maxNumBarrelPhiModules(0) +{} + + +void SiNumerology::setNumLayers(int nLayers) +{ + m_phiModulesForLayer.resize(nLayers); + m_etaModulesForLayer.resize(nLayers); + m_numLayers = nLayers; +} + +void SiNumerology::setNumPhiModulesForLayer(int layer, int nPhiModules) +{ + m_phiModulesForLayer[layer] = nPhiModules; + m_maxNumBarrelPhiModules = std::max(m_maxNumBarrelPhiModules, nPhiModules); +} + +void SiNumerology::setNumEtaModulesForLayer(int layer, int nEtaModules) +{ + m_etaModulesForLayer[layer] = nEtaModules; + m_maxNumBarrelEta = std::max(m_maxNumBarrelEta, nEtaModules); +} + +void SiNumerology::setMaxNumPhiCells(int cells) +{ + m_maxPhiCells = std::max(m_maxPhiCells,cells); +} + +void SiNumerology::addBarrel(int id) +{ + m_barrelIds.push_back(id); +} + +} // End namespace diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/TrackerDetectorManager.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/TrackerDetectorManager.cxx new file mode 100755 index 000000000..9395182dc --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/TrackerDetectorManager.cxx @@ -0,0 +1,423 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + + +#include "TrackerReadoutGeometry/TrackerDetectorManager.h" + +#include "StoreGate/StoreGateSvc.h" +#include "DetDescrConditions/AlignableTransform.h" +#include "FaserDetDescr/FaserDetectorID.h" +#include "GeoPrimitives/CLHEPtoEigenConverter.h" +#include "AthenaPoolUtilities/CondAttrListCollection.h" +#include "AthenaBaseComps/AthMsgStreamMacros.h" + +#include <map> + +namespace TrackerDD +{ + + TrackerDetectorManager::TrackerDetectorManager(StoreGateSvc * detStore, const std::string & name) + : m_alignfoldertype{none},m_detStore(detStore), + m_msg(name+"DetectorManager") + { + setName(name); + } + + // Destructor + TrackerDetectorManager::~TrackerDetectorManager() + {} + + + const Version& TrackerDetectorManager::getVersion() const + { + return m_version; + } + + const std::string& TrackerDetectorManager::getLayout() const + { + return m_version.layout(); + } + + void TrackerDetectorManager::setVersion(const Version & version) + { + m_version = version; + } + + void TrackerDetectorManager::addChannel(const std::string & key, int level, FrameType frame) + { + std::string frameStr = "other"; + if (frame == TrackerDD::global) frameStr = "global"; + if (frame == TrackerDD::local) frameStr = "local"; + ATH_MSG_INFO("Registering alignment channel with key " << key << ", level " << level + << ", with frame " << frameStr << "."); + m_keys[key] = LevelInfo(level, frame); + } + + void TrackerDetectorManager::addFolder(const std::string & key) + { + m_folders.insert(key); + } + + void TrackerDetectorManager::addSpecialFolder(const std::string & key) + { + m_specialFolders.insert(key); + } + + void TrackerDetectorManager::addGlobalFolder(const std::string & key) + { + m_globalFolders.insert(key); + } + + void TrackerDetectorManager::addAlignFolderType(const AlignFolderType alignfolder) + { + m_alignfoldertype = alignfolder; + } + + // Return the level in the hierarchy (user defined) corresponding to the key. + const TrackerDetectorManager::LevelInfo& TrackerDetectorManager::getLevel(const std::string & key) const + { + std::map<std::string, LevelInfo>::const_iterator iter; + iter = m_keys.find(key); + if (iter == m_keys.end()) return s_invalidLevel; + return iter->second; + } + + StatusCode TrackerDetectorManager::align( IOVSVC_CALLBACK_ARGS_P(I,keys) ) const + { + + (void) I; // avoid warning about unused parameter + + ATH_MSG_DEBUG("AlignmentCallback called "); + + if (!getIdHelper()) return StatusCode::SUCCESS; + + bool alignmentChange = false; + const AlignInfo &aligninfo = AlignInfo(m_alignfoldertype); + + // If dummy arguments + if (keys.empty()) { + + + // New global aligment folders should be processed first + for (std::set<std::string>::const_iterator iterFolders = m_globalFolders.begin(); + iterFolders != m_globalFolders.end(); + ++iterFolders) { + + try { + bool status = processGlobalAlignmentContainer(*iterFolders); + alignmentChange = (alignmentChange || status); + } catch(std::runtime_error& err) { + // keys are empty when running simualtion. It is normal for detector specific aligments not to exist. + ATH_MSG_FATAL(err.what()); + return StatusCode::FAILURE; + } + } + + // Regular alignments. Loop through folder keys. Normally only one. + for (std::set<std::string>::const_iterator iterFolders = m_folders.begin(); + iterFolders != m_folders.end(); + ++iterFolders) { + + try { + bool status = processAlignmentContainer(*iterFolders); + alignmentChange = (alignmentChange || status); + } + catch(std::runtime_error& err) { + // alignments should always exist so we return fatal if we could not process the alignment for this key + ATH_MSG_FATAL(err.what()); + return StatusCode::FAILURE; + } + } + // Detector specific aligments + for (std::set<std::string>::const_iterator iterFolders = m_specialFolders.begin(); + iterFolders != m_specialFolders.end(); + ++iterFolders) { + try { + bool status = processSpecialAlignment(*iterFolders, aligninfo.AlignFolder()); + alignmentChange = (alignmentChange || status); + } catch(std::runtime_error& err) { + // keys are empty when running simualtion. It is normal for detector specific aligments not to exist. + ATH_MSG_INFO(err.what()); + // We continue as detector specific aligments don't always exist. + } + } + + } else { + // Loop over all the keys. + for (std::list<std::string>::const_iterator itr=keys.begin(); itr!=keys.end(); ++itr) { + + const std::string & key = *itr; + + ATH_MSG_DEBUG(" Processing call back key " << key); + + if ( m_globalFolders.find(key) != m_globalFolders.end() ) { + + try { + // New global alignemnts + bool status = processGlobalAlignmentContainer(key); + alignmentChange = (alignmentChange || status); + } catch(std::runtime_error& err) { + // alignments should always exist so we return fatal if we could not process the alignment for this key + ATH_MSG_FATAL(err.what()); + return StatusCode::FAILURE; + } + + } else if ( m_folders.find(key) != m_folders.end() ) { + + try { + // Regular alignemnts + bool status = processAlignmentContainer(key); + alignmentChange = (alignmentChange || status); + } catch(std::runtime_error& err) { + // alignments should always exist so we return fatal if we could not process the alignment for this key + ATH_MSG_FATAL(err.what()); + return StatusCode::FAILURE; + } + + } else if ( m_specialFolders.find(key) != m_specialFolders.end() ) { + try { + // Detector specific alignments + bool status = processSpecialAlignment(key, aligninfo.AlignFolder()); + alignmentChange = (alignmentChange || status); + } + catch(std::runtime_error& err) { + // Should always exist if the folder was requested so we return fatal if we could not process the alignment for this key + ATH_MSG_FATAL(err.what()); + return StatusCode::FAILURE; + } + } else { + // Should not be any other keys specified in call back. + ATH_MSG_ERROR("Unrecognized key in call back."); + return StatusCode::RECOVERABLE; + } + } + } + + // We invalidate all the elements if at least one alignment changed. + if (alignmentChange) { + invalidateAll(); + } + + return StatusCode::SUCCESS; + } + + StatusCode TrackerDetectorManager::align(const RawAlignmentObjects& alignObjects, GeoVAlignmentStore* alignStore) const + { + + ATH_MSG_DEBUG("align() called from an alignment CondAlg"); + if (!getIdHelper()) return StatusCode::SUCCESS; // To Do: is it really a success? + + bool alignmentChange = false; + // const AlignInfo &aligninfo = AlignInfo(m_alignfoldertype); + + for(const auto& alignObj : alignObjects) { + const std::string& key = alignObj.first; + + ATH_MSG_DEBUG(" Processing folder " << key); + + if(m_globalFolders.find(key)!=m_globalFolders.end()) { + try { + // New global alignemnts + const CondAttrListCollection* obj = static_cast<const CondAttrListCollection*>(alignObj.second); + bool status = processGlobalAlignmentContainer(key,obj,alignStore); + alignmentChange = (alignmentChange || status); + } catch(std::runtime_error& err) { + // alignments should always exist so we return fatal if we could not process the alignment for this key + ATH_MSG_FATAL(err.what()); + return StatusCode::FAILURE; + } + } + else if(m_folders.find(key)!=m_folders.end()) { + try { + // Regular alignemnts + const AlignableTransformContainer* container = static_cast<const AlignableTransformContainer*>(alignObj.second); + bool status = processAlignmentContainer(container,alignStore); + alignmentChange = (alignmentChange || status); + } catch(std::runtime_error& err) { + // alignments should always exist so we return fatal if we could not process the alignment for this key + ATH_MSG_FATAL(err.what()); + return StatusCode::FAILURE; + } + } + else if(m_specialFolders.find(key)!=m_specialFolders.end()) { + try { + // Detector specific alignments + const CondAttrListCollection *obj = + static_cast<const CondAttrListCollection*>(alignObj.second); + bool status = processSpecialAlignment(key, obj, alignStore); + alignmentChange = (alignmentChange || status); + } + catch(std::runtime_error& err) { + // Should always exist if the folder was requested so we return fatal if + // we could not process the alignment for this key + ATH_MSG_FATAL(err.what()); + return StatusCode::FAILURE; + } + } + else { + // Should not be any other keys specified in raw alignment object. + ATH_MSG_ERROR("Unrecognized folder name."); + return StatusCode::RECOVERABLE; + } + } + // To Do: custom caching is not going to work in MT + /* + if(alignmentChange) invalidateAll(); + */ + + return StatusCode::SUCCESS; + } + + bool TrackerDetectorManager::processAlignmentContainer(const std::string & key) const + { + bool alignmentChange = false; + + ATH_MSG_DEBUG("Dealing with key as container"); + const AlignableTransformContainer* container; + if (StatusCode::SUCCESS!=m_detStore->retrieve(container, key)) { + ATH_MSG_ERROR("Cannot find AlignableTransformContainer for key " + << key << " - no misalignment"); + // This should not occur in normal situations so we force job to abort. + throw std::runtime_error("Unable to apply Tracker alignments"); + } + // Check if container is empty - this can occur if it is an invalid IOV. + if (container->empty()) { + ATH_MSG_ERROR("AlignableTransformContainer for key " + << key << " is empty. Probably due to out of range IOV"); + // This should not occur in normal situations so we force job to abort. + throw std::runtime_error("Unable to apply Tracker alignments."); + } + // loop over all the AlignableTransform objects in the collection + for (DataVector<AlignableTransform>::const_iterator pat=container->begin(); + pat!=container->end();++pat) { + + bool status = processKey((*pat)->tag(),*pat); + alignmentChange = (alignmentChange || status); + } + return alignmentChange; + } + + bool TrackerDetectorManager::processAlignmentContainer(const AlignableTransformContainer* container, GeoVAlignmentStore* alignStore) const + { + bool alignmentChange = false; + + // Check if container is empty - this can occur if it is an invalid IOV. + if (container->empty()) { + ATH_MSG_ERROR("AlignableTransformContainer " + << " is empty. Probably due to out of range IOV"); // To Do: add key to this printout for making it more informative + // This should not occur in normal situations so we force job to abort. + throw std::runtime_error("Unable to apply Tracker alignments."); + } + // loop over all the AlignableTransform objects in the collection + // use only the last ones. + std::map<const std::string, const AlignableTransform*> stringToTransform; + for (DataVector<AlignableTransform>::const_iterator pat=container->begin(); + pat!=container->end();++pat) { + stringToTransform[(*pat)->tag()] = *pat; + } + for (std::pair<const std::string, const AlignableTransform*> value: stringToTransform) { + bool status = processKey(value.first, value.second, alignStore); + alignmentChange = (alignmentChange || status); + } + return alignmentChange; + } + + bool TrackerDetectorManager::processKey(const std::string key, + const AlignableTransform* transformCollection, + GeoVAlignmentStore* alignStore) const + { + bool alignmentChange = false; + + // From the key determine what level in hierarchy we are dealing with. + // returns -1 if unrecognized. + const LevelInfo & levelInfo = getLevel(key); + if (levelInfo.isValid()) { + ATH_MSG_VERBOSE("Processing channel: " << key); + } else { + ATH_MSG_DEBUG("Channel " << key << " not registered in this manager"); + } + // return silently if unrecognised - this can happen in container mode + // when a single container holds transforms for both pixel and SCT + if (!levelInfo.isValid() ) return false; + + //Loop over the effected nodes. + for (AlignableTransform::AlignTransMem_citr trans_iter = transformCollection->begin(); + trans_iter != transformCollection->end(); + ++trans_iter) { + ATH_MSG_DEBUG( "Get alignment for identifier " + << getIdHelper()->show_to_string(trans_iter->identify()) + << " at level " << levelInfo.level()); + + // The delta in the conditions DB is not necessarily the same as what is needed in the + // alignable transform. At the moment we support global frame, local frame or an alternative frame + // The setAlignableTransformDelta method takes care of this correction - this is CLHEP <--> Amg interfaced + bool status = setAlignableTransformDelta(levelInfo.level(), + trans_iter->identify(), + Amg::CLHEPTransformToEigen(trans_iter->transform()), + levelInfo.frame(), + alignStore); + + alignmentChange = (alignmentChange || status); + + if (!status) { + if (!identifierBelongs(trans_iter->identify())) { + ATH_MSG_DEBUG("Cannot set AlignableTransform for identifier." + << getIdHelper()->show_to_string(trans_iter->identify()) + << " at level " << levelInfo.level()); + } else { + ATH_MSG_WARNING("Cannot set AlignableTransform for identifier " + << getIdHelper()->show_to_string(trans_iter->identify()) + << " at level " << levelInfo.level()); + } + } + } + return alignmentChange; + } + + // We provide a default implementation of any detector specific alignment. + bool TrackerDetectorManager::processGlobalAlignmentContainer(const std::string & key, + const CondAttrListCollection* obj, + GeoVAlignmentStore* alignStore) const + { + bool alignmentChange = false; + + ATH_MSG_DEBUG("processing GlobalAlignmentContainer with key: " << key); + // From the key determine what level in hierarchy we are dealing with. + // returns -1 if unrecognized. + const LevelInfo & levelInfo = getLevel(key); + if (levelInfo.isValid()) { + ATH_MSG_VERBOSE("Processing channel: " << key); + } else { + ATH_MSG_DEBUG("Channel " << key << " not registered in this manager"); + } + // return silently if unrecognised - this can happen in container mode + // when a single container holds transforms for both pixel and SCT + if (!levelInfo.isValid() ) return false; + + // Within detector specific code + bool status = processGlobalAlignment(key, levelInfo.level(), levelInfo.frame(), obj, alignStore); + + alignmentChange = (alignmentChange || status); + + return alignmentChange; + + } + + // We provide a default implementation of any detector specific alignment. + bool TrackerDetectorManager::processGlobalAlignment(const std::string &, int /*level*/, FrameType /*frame*/, + const CondAttrListCollection* /*obj*/, GeoVAlignmentStore* /*alignStore*/) const + { + return false; + } + + + // We provide a default implementation of any detector specific alignment. + bool TrackerDetectorManager::processSpecialAlignment(const std::string &, TrackerDD::AlignFolderType) const + { + return false; + } + + const TrackerDetectorManager::LevelInfo TrackerDetectorManager::s_invalidLevel; + +} // namespace TrackerDD diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/Version.cxx b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/Version.cxx new file mode 100755 index 000000000..6b155b383 --- /dev/null +++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/src/Version.cxx @@ -0,0 +1,121 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrackerReadoutGeometry/Version.h" + +#include <sstream> +#include <string> +#include <iomanip> + +namespace TrackerDD { + +Version::Version(const std::string & tag, + const std::string & name, + const std::string & layout, + const std::string & description, + int major, + int minor, + int patch) + : m_tag(tag), + m_name(name), + m_layout(layout), + m_description(description), + m_major(major), + m_minor(minor), + m_patch(patch) +{} + +// For backward compatibility +Version::Version(const std::string & name, + const std::string & layout, + const std::string & description, + int major, + int minor, + int patch) + : m_tag("-"), + m_name(name), + m_layout(layout), + m_description(description), + m_major(major), + m_minor(minor), + m_patch(patch) +{} + + + +Version::Version() + : m_major(0), + m_minor(0), + m_patch(0) +{} + +const std::string & +Version::tag() const +{ + return m_tag; +} + +const std::string & +Version::name() const +{ + return m_name; +} + +const std::string & +Version::layout() const +{ + return m_layout; +} + +const std::string & +Version::description() const +{ + return m_description; +} + +int +Version::majorNum() const +{ + return m_major; +} + +int +Version::minorNum() const +{ + return m_minor; +} + +int +Version::patchNum() const +{ + return m_patch; +} + +std::string +Version::versionNumber() const +{ + std::ostringstream ostr; + ostr << m_major + << "." << std::setfill('0') << std::setw(2) << m_minor + << "." << std::setfill('0') << std::setw(2) << m_patch; + return ostr.str(); +} + +std::string +Version::fullDescription() const +{ + + // Output of the form + // Version: SCT-DC1-00, Name: DC1, Layout: Final, Code Version: 02.01.01, Description: DC1 Geometry + + std::ostringstream ostr; + ostr << "Version: " << m_tag << ", Name: " << m_name << ", Layout: " << m_layout + << ", Code Version: " << versionNumber(); + if (!m_description.empty()) { + ostr << ", Description: " << m_description; + } + return ostr.str(); +} + +} // namespace TrackerDD diff --git a/Tracker/TrackerDetDescrCnv/TrackerIdCnv/CMakeLists.txt b/Tracker/TrackerDetDescrCnv/TrackerIdCnv/CMakeLists.txt new file mode 100644 index 000000000..fd6d2418f --- /dev/null +++ b/Tracker/TrackerDetDescrCnv/TrackerIdCnv/CMakeLists.txt @@ -0,0 +1,23 @@ +################################################################################ +# Package: TrackerIdCnv +################################################################################ + +# Declare the package name: +atlas_subdir( TrackerIdCnv ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PRIVATE + Control/StoreGate + DetectorDescription/DetDescrCnvSvc + DetectorDescription/TrackerDetDescr + GaudiKernel + Tracker/TrackerDetDescr/TrackerIdentifier ) + +# Component(s) in the package: +atlas_add_component( TrackerIdCnv + src/*.cxx + LINK_LIBRARIES StoreGateLib SGtests DetDescrCnvSvcLib IdDictDetDescr GaudiKernel TrackerIdentifier ) + +# Install files from the package: +atlas_install_joboptions( share/*.py ) + diff --git a/Tracker/TrackerDetDescrCnv/TrackerIdCnv/share/TrackerIdCnv_jobOptions.py b/Tracker/TrackerDetDescrCnv/TrackerIdCnv/share/TrackerIdCnv_jobOptions.py new file mode 100644 index 000000000..90e5ebcf0 --- /dev/null +++ b/Tracker/TrackerDetDescrCnv/TrackerIdCnv/share/TrackerIdCnv_jobOptions.py @@ -0,0 +1,6 @@ +# +# Joboptions for the loading of the of TrackerIdCnv +# + +# DLLs +theApp.Dlls += [ "TrackerIdCnv" ] diff --git a/Tracker/TrackerDetDescrCnv/TrackerIdCnv/src/FaserSCT_IDDetDescrCnv.cxx b/Tracker/TrackerDetDescrCnv/TrackerIdCnv/src/FaserSCT_IDDetDescrCnv.cxx new file mode 100644 index 000000000..192e8ce07 --- /dev/null +++ b/Tracker/TrackerDetDescrCnv/TrackerIdCnv/src/FaserSCT_IDDetDescrCnv.cxx @@ -0,0 +1,244 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/*************************************************************************** + Tracker DetDescrCnv package + ----------------------------------------- + ***************************************************************************/ + +//<doc><file> $Id: FaserSCT_IDDetDescrCnv.cxx,v 1.4 2007-01-16 17:06:15 dquarrie Exp $ +//<version> $Name: not supported by cvs2svn $ + +//<<<<<< INCLUDES >>>>>> + +#include "FaserSCT_IDDetDescrCnv.h" + +#include "DetDescrCnvSvc/DetDescrConverter.h" +#include "DetDescrCnvSvc/DetDescrAddress.h" +#include "GaudiKernel/MsgStream.h" +#include "StoreGate/StoreGate.h" + +#include "IdDictDetDescr/IdDictManager.h" +#include "TrackerIdentifier/FaserSCT_ID.h" + + +//<<<<<< PRIVATE DEFINES >>>>>> +//<<<<<< PRIVATE CONSTANTS >>>>>> +//<<<<<< PRIVATE TYPES >>>>>> +//<<<<<< PRIVATE VARIABLE DEFINITIONS >>>>>> +//<<<<<< PUBLIC VARIABLE DEFINITIONS >>>>>> +//<<<<<< CLASS STRUCTURE INITIALIZATION >>>>>> +//<<<<<< PRIVATE FUNCTION DEFINITIONS >>>>>> +//<<<<<< PUBLIC FUNCTION DEFINITIONS >>>>>> +//<<<<<< MEMBER FUNCTION DEFINITIONS >>>>>> + +//-------------------------------------------------------------------- + +long int +FaserSCT_IDDetDescrCnv::repSvcType() const +{ + return (storageType()); +} + +//-------------------------------------------------------------------- + +StatusCode +FaserSCT_IDDetDescrCnv::initialize() +{ + // First call parent init + StatusCode sc = DetDescrConverter::initialize(); + MsgStream log(msgSvc(), "FaserSCT_IDDetDescrCnv"); + log << MSG::DEBUG << "in initialize" << endmsg; + + if (sc.isFailure()) { + log << MSG::ERROR << "DetDescrConverter::initialize failed" << endmsg; + return sc; + } + + // The following is an attempt to "bootstrap" the loading of a + // proxy for FaserSCT_ID into the detector store. However, + // FaserSCT_IDDetDescrCnv::initialize is NOT called by the conversion + // service. So for the moment, this cannot be use. Instead the + // DetDescrCnvSvc must do the bootstrap from a parameter list. + + +// // Add Tracker_DetDescrManager proxy as entry point to the detector store +// // - this is ONLY needed for the manager of each system +// sc = addToDetStore(classID(), "PidelID"); +// if (sc.isFailure()) { +// log << MSG::FATAL << "Unable to add proxy for FaserSCT_ID to the Detector Store!" << endmsg; +// return StatusCode::FAILURE; +// } else {} + + return StatusCode::SUCCESS; +} + +//-------------------------------------------------------------------- + +StatusCode +FaserSCT_IDDetDescrCnv::finalize() +{ + MsgStream log(msgSvc(), "FaserSCT_IDDetDescrCnv"); + log << MSG::DEBUG << "in finalize" << endmsg; + + return StatusCode::SUCCESS; +} + +//-------------------------------------------------------------------- + +StatusCode +FaserSCT_IDDetDescrCnv::createObj(IOpaqueAddress* pAddr, DataObject*& pObj) +{ + //StatusCode sc = StatusCode::SUCCESS; + MsgStream log(msgSvc(), "FaserSCT_IDDetDescrCnv"); + log << MSG::INFO << "in createObj: creating a FaserSCT_ID helper object in the detector store" << endmsg; + + // Create a new FaserSCT_ID + + DetDescrAddress* ddAddr; + ddAddr = dynamic_cast<DetDescrAddress*> (pAddr); + if(!ddAddr) { + log << MSG::FATAL << "Could not cast to DetDescrAddress." << endmsg; + return StatusCode::FAILURE; + } + + // Get the StoreGate key of this container. + std::string helperKey = *( ddAddr->par() ); + if ("" == helperKey) { + log << MSG::DEBUG << "No Helper key " << endmsg; + } + else { + log << MSG::DEBUG << "Helper key is " << helperKey << endmsg; + } + + + // get DetectorStore service + StoreGateSvc * detStore; + StatusCode status = serviceLocator()->service("DetectorStore", detStore); + if (status.isFailure()) { + log << MSG::FATAL << "DetectorStore service not found !" << endmsg; + return StatusCode::FAILURE; + } else {} + + // Get the dictionary manager from the detector store + const DataHandle<IdDictManager> idDictMgr; + status = detStore->retrieve(idDictMgr, "IdDict"); + if (status.isFailure()) { + log << MSG::FATAL << "Could not get IdDictManager !" << endmsg; + return StatusCode::FAILURE; + } + else { + log << MSG::DEBUG << " Found the IdDictManager. " << endmsg; + } + + // Only create new helper if it is the first pass or if there is a + // change in the the file or tag + bool initHelper = false; + + const IdDictMgr* mgr = idDictMgr->manager(); + + // Internal Tracker id tag + std::string trackerIDTag = mgr->tag(); + + // DoChecks flag + bool doChecks = mgr->do_checks(); + + IdDictDictionary* dict = mgr->find_dictionary("Tracker"); + if (!dict) { + log << MSG::ERROR + << "unable to find idDict for Tracker" + << endmsg; + return StatusCode::FAILURE; + } + + // File to be read for Tracker ids + std::string trackerIDFileName = dict->file_name(); + + // Tag of RDB record for Tracker ids + std::string trackerIdDictTag = dict->dict_tag(); + + + if (m_sctId) { + + // SCT id helper already exists - second pass. Check for a + // change + if (trackerIDTag != m_trackerIDTag) { + // Internal Tracker id tag + initHelper = true; + log << MSG::DEBUG << " Changed internal Tracker id tag: " + << trackerIDTag << endmsg; + } + if (trackerIDFileName != m_trackerIDFileName) { + // File to be read for Tracker ids + initHelper = true; + log << MSG::DEBUG << " Changed TrackerFileName:" + << trackerIDFileName << endmsg; + } + if (trackerIdDictTag != m_trackerIdDictTag) { + // Tag of RDB record for Tracker ids + initHelper = true; + log << MSG::DEBUG << " Changed TrackerIdDictTag: " + << trackerIdDictTag + << endmsg; + } + if (doChecks != m_doChecks) { + // DoChecks flag + initHelper = true; + log << MSG::DEBUG << " Changed doChecks flag: " + << doChecks + << endmsg; + } + } + else { + // create the helper + m_sctId = new FaserSCT_ID; + initHelper = true; + // add in message service for printout + m_sctId->setMessageSvc(msgSvc()); + } + + if (initHelper) { + if (idDictMgr->initializeHelper(*m_sctId)) { + log << MSG::ERROR << "Unable to initialize FaserSCT_ID" << endmsg; + return StatusCode::FAILURE; + } + // Save state: + m_trackerIDTag = trackerIDTag; + m_trackerIDFileName = trackerIDFileName; + m_trackerIdDictTag = trackerIdDictTag; + m_doChecks = doChecks; + } + + // Pass a pointer to the container to the Persistency service by reference. + pObj = StoreGateSvc::asStorable(m_sctId); + + return StatusCode::SUCCESS; + +} + +//-------------------------------------------------------------------- + +long +FaserSCT_IDDetDescrCnv::storageType() +{ + return DetDescr_StorageType; +} + +//-------------------------------------------------------------------- +const CLID& +FaserSCT_IDDetDescrCnv::classID() { + return ClassID_traits<FaserSCT_ID>::ID(); +} + +//-------------------------------------------------------------------- +FaserSCT_IDDetDescrCnv::FaserSCT_IDDetDescrCnv(ISvcLocator* svcloc) + : + DetDescrConverter(ClassID_traits<FaserSCT_ID>::ID(), svcloc), + m_sctId(0), + m_doChecks(false) + +{} + + + diff --git a/Tracker/TrackerDetDescrCnv/TrackerIdCnv/src/FaserSCT_IDDetDescrCnv.h b/Tracker/TrackerDetDescrCnv/TrackerIdCnv/src/FaserSCT_IDDetDescrCnv.h new file mode 100644 index 000000000..cdc2eeb66 --- /dev/null +++ b/Tracker/TrackerDetDescrCnv/TrackerIdCnv/src/FaserSCT_IDDetDescrCnv.h @@ -0,0 +1,74 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/*************************************************************************** + Tracker DetDescrCnv package + ----------------------------------------- + ***************************************************************************/ + +//<doc><file> $Id: FaserSCT_IDDetDescrCnv.h,v 1.3 2007-01-01 10:47:18 dquarrie Exp $ +//<version> $Name: not supported by cvs2svn $ + +#ifndef TRACKERDETDESCRCNV_FASERSCT_IDDETDESCRCNV_H +#define TRACKERDETDESCRCNV_FASERSCT_IDDETDESCRCNV_H + +//<<<<<< INCLUDES >>>>>> + +#include "DetDescrCnvSvc/DetDescrConverter.h" + +//<<<<<< PUBLIC DEFINES >>>>>> +//<<<<<< PUBLIC CONSTANTS >>>>>> +//<<<<<< PUBLIC TYPES >>>>>> + +class FaserSCT_ID; + +//<<<<<< PUBLIC VARIABLES >>>>>> +//<<<<<< PUBLIC FUNCTIONS >>>>>> +//<<<<<< CLASS DECLARATIONS >>>>>> + + +/** + ** This class is a converter for the SCT_ID an IdHelper which is + ** stored in the detector store. This class derives from + ** DetDescrConverter which is a converter of the DetDescrCnvSvc. + ** + **/ + +class FaserSCT_IDDetDescrCnv: public DetDescrConverter { + +public: + virtual long int repSvcType() const; + virtual StatusCode initialize(); + virtual StatusCode finalize(); + virtual StatusCode createObj(IOpaqueAddress* pAddr, DataObject*& pObj); + + // Storage type and class ID (used by CnvFactory) + static long storageType(); + static const CLID& classID(); + + FaserSCT_IDDetDescrCnv(ISvcLocator* svcloc); + +private: + /// The helper - only will create it once + FaserSCT_ID* m_sctId; + + /// File to be read for Tracker ids + std::string m_trackerIDFileName; + + /// Tag of RDB record for Tracker ids + std::string m_trackerIdDictTag; + + /// Internal Tracker id tag + std::string m_trackerIDTag; + + /// Whether or not + bool m_doChecks; + +}; + + +//<<<<<< INLINE PUBLIC FUNCTIONS >>>>>> +//<<<<<< INLINE MEMBER FUNCTIONS >>>>>> + +#endif // TRACKERDETDESCRCNV_FASERSCT_IDDETDESCRCNV_H diff --git a/Tracker/TrackerDetDescrCnv/TrackerIdCnv/src/TrackerIdCnv_entries.cxx b/Tracker/TrackerDetDescrCnv/TrackerIdCnv/src/TrackerIdCnv_entries.cxx new file mode 100644 index 000000000..dbf9089b8 --- /dev/null +++ b/Tracker/TrackerDetDescrCnv/TrackerIdCnv/src/TrackerIdCnv_entries.cxx @@ -0,0 +1,6 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ +#include "FaserSCT_IDDetDescrCnv.h" + +DECLARE_CONVERTER(FaserSCT_IDDetDescrCnv) diff --git a/graphics/VTI12/VTI12Gui/src/vp1mainwindow.ui b/graphics/VTI12/VTI12Gui/src/vp1mainwindow.ui index 1aa101925..6a0b7eef4 100644 --- a/graphics/VTI12/VTI12Gui/src/vp1mainwindow.ui +++ b/graphics/VTI12/VTI12Gui/src/vp1mainwindow.ui @@ -613,7 +613,7 @@ p, li { white-space: pre-wrap; } <string><html><head/><body><p>Launch the Analysis Object (AOD) plugin within a new tab.</p></body></html></string> </property> <property name="text"> - <string>This space for rent</string> + <string>Unused</string> </property> </widget> </item> diff --git a/graphics/VTI12/VTI12Systems/VTI12GeometrySystems/src/VolumeTreeModel.cxx b/graphics/VTI12/VTI12Systems/VTI12GeometrySystems/src/VolumeTreeModel.cxx index c4613e0b4..cf8b66f0c 100644 --- a/graphics/VTI12/VTI12Systems/VTI12GeometrySystems/src/VolumeTreeModel.cxx +++ b/graphics/VTI12/VTI12Systems/VTI12GeometrySystems/src/VolumeTreeModel.cxx @@ -105,7 +105,7 @@ VolumeTreeModel::VolumeTreeModel( QObject * parent ) if (Imp::section2string.empty()) { Imp::section2string[Imp::UNKNOWN] = "Unknown"; Imp::section2string[Imp::SCINT] = "Scintillators"; - Imp::section2string[Imp::TRACKER] = "Muon Spectrometer"; + Imp::section2string[Imp::TRACKER] = "Tracker"; Imp::section2string[Imp::CALO] = "Calorimeter"; Imp::section2string[Imp::MISC] = "Miscellaneous"; } @@ -116,42 +116,9 @@ VolumeTreeModel::VolumeTreeModel( QObject * parent ) Imp::defineSubSystem(VP1GeoFlags::Trigger, "Trigger", Imp::SCINT); Imp::defineSubSystem(VP1GeoFlags::Preshower, "Preshower", Imp::SCINT); // Tracker - Imp::defineSubSystem(VP1GeoFlags::SCT, "Tracker", Imp::TRACKER); + Imp::defineSubSystem(VP1GeoFlags::SCT, "SCT", Imp::TRACKER); // Calorimeter Imp::defineSubSystem(VP1GeoFlags::Ecal, "Ecal", Imp::CALO); - - // // Inner Detector - // Imp::defineSubSystem(VP1GeoFlags::Pixel,"Pixel",Imp::INDET); - // Imp::defineSubSystem(VP1GeoFlags::SCT,"SCT",Imp::INDET); - // Imp::defineSubSystem(VP1GeoFlags::TRT,"TRT",Imp::INDET); - // Imp::defineSubSystem(VP1GeoFlags::InDetServMat,"Services",Imp::INDET); - // // Calorimeters - // Imp::defineSubSystem(VP1GeoFlags::LAr,"LAr",Imp::CALO); - // Imp::defineSubSystem(VP1GeoFlags::Tile,"Tile",Imp::CALO); - // //Toroids - // Imp::defineSubSystem(VP1GeoFlags::BarrelToroid,"Toroid Barrel",Imp::MUON); - // Imp::defineSubSystem(VP1GeoFlags::ToroidECA,"Toroid EndCap side A",Imp::MUON); - // Imp::defineSubSystem(VP1GeoFlags::ToroidECC,"Toroid EndCap side C",Imp::MUON); - // // Structure - // Imp::defineSubSystem(VP1GeoFlags::MuonFeet,"Feets",Imp::MUON); - // Imp::defineSubSystem(VP1GeoFlags::MuonShielding,"Shields, etc.",Imp::MUON); - // Imp::defineSubSystem(VP1GeoFlags::MuonToroidsEtc,"Muon etc.",Imp::MUON); - // // Muon chambers - // Imp::defineSubSystem(VP1GeoFlags::MuonBarrelStationInner,"Inner Barrel Stations",Imp::MUON); - // Imp::defineSubSystem(VP1GeoFlags::MuonBarrelStationMiddle,"Middle Barrel Stations",Imp::MUON); - // Imp::defineSubSystem(VP1GeoFlags::MuonBarrelStationOuter,"Outer Barrel Stations",Imp::MUON); - // Imp::defineSubSystem(VP1GeoFlags::MuonEndcapStationCSC,"Endcap CSC",Imp::MUON); - // Imp::defineSubSystem(VP1GeoFlags::MuonEndcapStationTGC,"Endcap TGC",Imp::MUON); - // Imp::defineSubSystem(VP1GeoFlags::MuonEndcapStationMDT,"Endcap MDT",Imp::MUON); - // Imp::defineSubSystem(VP1GeoFlags::MuonEndcapStationNSW,"Endcap NSW",Imp::MUON); - // // Beam Pipe - // Imp::defineSubSystem(VP1GeoFlags::BeamPipe,"Beam Pipe",Imp::MISC); - // // FWD detectors - // Imp::defineSubSystem(VP1GeoFlags::LUCID,"LUCID",Imp::MISC); - // Imp::defineSubSystem(VP1GeoFlags::ZDC,"ZDC",Imp::MISC); - // Imp::defineSubSystem(VP1GeoFlags::ForwardRegion,"ForwardRegion",Imp::MISC); - // // Cavern - // Imp::defineSubSystem(VP1GeoFlags::CavernInfra,"Cavern Infrastructure",Imp::MISC); } } diff --git a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/CMakeLists.txt b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/CMakeLists.txt index 7ac5f9320..bdb4b5753 100644 --- a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/CMakeLists.txt +++ b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/CMakeLists.txt @@ -27,11 +27,11 @@ atlas_depends_on_subdirs( DetectorDescription/FaserDetDescr Event/EventPrimitives # ForwardDetectors/ForwardSimulation/ForwardRegion_SimEv -# InnerDetector/InDetDetDescr/InDetIdentifier -# InnerDetector/InDetDetDescr/InDetReadoutGeometry + Tracker/TrackerDetDescr/TrackerIdentifier + Tracker/TrackerDetDescr/TrackerReadoutGeometry # InnerDetector/InDetRecEvent/InDetPrepRawData # InnerDetector/InDetRecEvent/InDetRIO_OnTrack -# InnerDetector/InDetSimEvent + InnerDetector/InDetSimEvent Scintillator/ScintDetDescr/ScintIdentifier Scintillator/ScintDetDescr/ScintReadoutGeometry Scintillator/ScintSimEvent @@ -81,7 +81,8 @@ atlas_add_library( VTI12TrackSystems VTI12TrackSystems/*.h src/*.cxx PRIVATE_LINK_LIBRARIES ${COIN3D_LIBRARIES} ${CLHEP_LIBRARIES} ${HEPMC_LIBRARIES} AthContainers FaserDetDescr EventPrimitives ScintIdentifier ScintSimEvent ScintReadoutGeometry - #InDetIdentifier InDetReadoutGeometry InDetPrepRawData InDetRIO_OnTrack InDetSimEvent + TrackerIdentifier TrackerReadoutGeometry InDetSimEvent + #InDetPrepRawData InDetRIO_OnTrack Particle TrkDetDescrUtils TrkDetElementBase TrkVolumes TrkCompetingRIOsOnTrack TrkMaterialOnTrack TrkMeasurementBase TrkPrepRawData diff --git a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackCollHandle_TruthTracks.cxx b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackCollHandle_TruthTracks.cxx index 3e5a89743..950460e5d 100644 --- a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackCollHandle_TruthTracks.cxx +++ b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackCollHandle_TruthTracks.cxx @@ -17,6 +17,7 @@ #include "VTI12TrackSystems/SimHitHandleBase.h" #include "VTI12TrackSystems/SimHitHandle_TrackRecord.h" #include "VTI12TrackSystems/SimHitHandle_ScintHit.h" +// #include "VTI12TrackSystems/SimHitHandle_SiHit.h" #include "VTI12TrackSystems/SimBarCode.h" #include "VTI12TrackSystems/TrackSystemController.h" #include "VP1Base/IVP1System.h" @@ -35,7 +36,7 @@ #include "VTI12Utils/VP1SGAccessHelper.h" #include "ScintSimEvent/ScintHitCollection.h" -// #include "InDetSimEvent/SiHitCollection.h" +#include "InDetSimEvent/SiHitCollection.h" #include "CLHEP/Units/PhysicalConstants.h" @@ -113,7 +114,7 @@ QStringList TrackCollHandle_TruthTracks::availableCollections( IVP1System*sys ) QStringList mcevent_keys = sgcont.getKeys<McEventCollection>(); QStringList trackrecord_keys = sgcont.getKeys<TrackRecordCollection>(); - QStringList /*keys_siliconhits,*/ keys_scintillatorhits; + QStringList keys_siliconhits,keys_scintillatorhits; if (VP1JobConfigInfo::hasVetoGeometry() || VP1JobConfigInfo::hasTriggerGeometry() || @@ -123,7 +124,7 @@ QStringList TrackCollHandle_TruthTracks::availableCollections( IVP1System*sys ) // keys_siliconhits = sgcont.getKeys<SiHitCollection>();//"SCT_Hits" bool extrainfo = ! ( keys_scintillatorhits.empty() && - // keys_siliconhits.empty() && + keys_siliconhits.empty() && trackrecord_keys.empty() ); if (extrainfo&&mcevent_keys.empty()) { @@ -254,7 +255,8 @@ bool TrackCollHandle_TruthTracks::Imp::loadHitLists(std::map<SimBarCode,SimHitLi VP1JobConfigInfo::hasPreshowerGeometry()) // std::cout << "Called addHitCollections" << std::endl; addHitCollections<ScintHitCollection>(hitLists); - // addHitCollections<SiHitCollection>(hitLists); + // if (VP1JobConfigInfo::hasSCTGeometry()) + // addHitCollections<SiHitCollection>(hitLists); if (VP1Msg::verbose()) theclass->messageVerbose( "Found " + str( hitLists.size() ) + " lists of sim. hits."); diff --git a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrkObjToString.cxx b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrkObjToString.cxx index cbe97286d..75c1c1977 100644 --- a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrkObjToString.cxx +++ b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrkObjToString.cxx @@ -10,7 +10,7 @@ //DetectorElements #include "ScintReadoutGeometry/ScintDetectorElement.h" -// #include "InDetReadoutGeometry/SiDetectorElement.h" +#include "TrackerReadoutGeometry/SiDetectorElement.h" //MeasurementBase #include "TrkMeasurementBase/MeasurementBase.h" @@ -76,11 +76,11 @@ TrkObjToString::type(const Trk::MeasurementBase* meas) } TrkObjToString::MeasurementType -TrkObjToString::type(const Trk::TrkDetElementBase* /*detEl*/){ - // const InDetDD::SiDetectorElement* siDetEl = dynamic_cast<const InDetDD::SiDetectorElement*> (detEl); - // if (siDetEl){ - // if (siDetEl->isSCT()) {return TrkObjToString::SCT;} - // } +TrkObjToString::type(const Trk::TrkDetElementBase* detEl){ + const TrackerDD::SiDetectorElement* siDetEl = dynamic_cast<const TrackerDD::SiDetectorElement*> (detEl); + if (siDetEl){ + return TrkObjToString::SCT; + } return TrkObjToString::Unknown; // Couldn't cast ROT to anything known } diff --git a/graphics/VTI12/VTI12Utils/CMakeLists.txt b/graphics/VTI12/VTI12Utils/CMakeLists.txt index ca3fa3a00..af07e3edf 100644 --- a/graphics/VTI12/VTI12Utils/CMakeLists.txt +++ b/graphics/VTI12/VTI12Utils/CMakeLists.txt @@ -26,8 +26,8 @@ atlas_depends_on_subdirs( DetectorDescription/Identifier Scintillator/ScintDetDescr/ScintIdentifier Scintillator/ScintDetDescr/ScintReadoutGeometry -# InnerDetector/InDetDetDescr/InDetIdentifier -# InnerDetector/InDetDetDescr/InDetReadoutGeometry + Tracker/TrackerDetDescr/TrackerIdentifier + Tracker/TrackerDetDescr/TrackerReadoutGeometry # InnerDetector/InDetRecEvent/InDetRIO_OnTrack Tracking/TrkDetDescr/TrkSurfaces Tracking/TrkEvent/TrkRIO_OnTrack @@ -58,5 +58,6 @@ atlas_add_library( VTI12Utils VTI12Utils/*.h src/*.cxx src/*.cpp ${EIGEN_LIBRARIES} CxxUtils FaserDetDescr GeoModelUtilities GeoModelFaserUtilities GeoSpecialShapes Identifier ScintIdentifier ScintReadoutGeometry -# InDetIdentifier InDetReadoutGeometry InDetRIO_OnTrack + TrackerIdentifier TrackerReadoutGeometry + #InDetRIO_OnTrack TrkSurfaces TrkRIO_OnTrack VP1HEPVis ) diff --git a/graphics/VTI12/VTI12Utils/VTI12Utils/HitToSoNode.h b/graphics/VTI12/VTI12Utils/VTI12Utils/HitToSoNode.h index 3f624dd31..36d25c6bc 100644 --- a/graphics/VTI12/VTI12Utils/VTI12Utils/HitToSoNode.h +++ b/graphics/VTI12/VTI12Utils/VTI12Utils/HitToSoNode.h @@ -55,7 +55,7 @@ private: // void fillSiValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Trk::LocalPosition*& localposStrip); // void fillValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip); - // void fillSiValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip); + void fillSiValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip); class Imp; Imp * m_d; diff --git a/graphics/VTI12/VTI12Utils/VTI12Utils/VP1DetInfo.h b/graphics/VTI12/VTI12Utils/VTI12Utils/VP1DetInfo.h index 809e43d1f..6f797da4e 100644 --- a/graphics/VTI12/VTI12Utils/VTI12Utils/VP1DetInfo.h +++ b/graphics/VTI12/VTI12Utils/VTI12Utils/VP1DetInfo.h @@ -20,9 +20,7 @@ class IVP1System; class StoreGateSvc; -// namespace InDetDD { class TRT_DetectorManager; } -// namespace InDetDD { class PixelDetectorManager; } -// namespace InDetDD { class SCT_DetectorManager; } +namespace TrackerDD { class SCT_DetectorManager; } namespace ScintDD { class VetoDetectorManager; } namespace ScintDD { class TriggerDetectorManager; } namespace ScintDD { class PreshowerDetectorManager; } @@ -32,9 +30,7 @@ class ScintDetectorID; class VetoID; class TriggerID; class PreshowerID; -// class PixelID; -// class SCT_ID; -// class TRT_ID; +class FaserSCT_ID; class Identifier; @@ -51,9 +47,7 @@ public: static const ScintDD::TriggerDetectorManager * triggerDetMgr(); static const ScintDD::PreshowerDetectorManager * preshowerDetMgr(); - // static const InDetDD::PixelDetectorManager * pixelDetMgr(); - // static const InDetDD::SCT_DetectorManager * sctDetMgr(); - // static const InDetDD::TRT_DetectorManager * trtDetMgr(); + static const TrackerDD::SCT_DetectorManager * sctDetMgr(); //Base identifier helper: static const FaserDetectorID * faserIDHelper(); @@ -64,9 +58,7 @@ public: static const TriggerID * triggerIDHelper(); static const PreshowerID * preshowerIDHelper(); - // static const PixelID * pixelIDHelper(); - // static const SCT_ID * sctIDHelper(); - // static const TRT_ID * trtIDHelper(); + static const FaserSCT_ID * sctIDHelper(); //Todo: Add more as needed. //Combines use of the atlasIDHelper and VP1JobConfigInfo to spot diff --git a/graphics/VTI12/VTI12Utils/src/HitToSodeNode.cxx b/graphics/VTI12/VTI12Utils/src/HitToSodeNode.cxx index beef5e8c2..9bb096aa7 100644 --- a/graphics/VTI12/VTI12Utils/src/HitToSodeNode.cxx +++ b/graphics/VTI12/VTI12Utils/src/HitToSodeNode.cxx @@ -27,7 +27,7 @@ // #include "InDetRIO_OnTrack/TRT_DriftCircleOnTrack.h" #include "ScintReadoutGeometry/ScintDetectorElement.h" -// #include "InDetReadoutGeometry/SiDetectorElement.h" +#include "TrackerReadoutGeometry/SiDetectorElement.h" #include <sstream> #include <cmath> @@ -184,35 +184,35 @@ void HitToSoNode::buildStripShapes(const Trk::RIO_OnTrack& rio, SoSeparator*&sha delete localposROT; } -void HitToSoNode::fillValues(Identifier& /*id*/, const Trk::TrkDetElementBase* /*baseDetEl*/, double& /*striplength*/, double& /*stripWidth*/, double& /*stripThickness*/, Amg::Vector2D*& /*localposStrip*/){ +void HitToSoNode::fillValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip){ const FaserDetectorID * idhelper = VP1DetInfo::faserIDHelper(); if (!idhelper) return; - // if (idhelper->is_indet(id) && (idhelper->is_pixel(id)||idhelper->is_sct(id))) { - // fillSiValues(id, baseDetEl, striplength, stripWidth, stripThickness, localposStrip); return; - // } + if (idhelper->is_sct(id)) { + fillSiValues(id, baseDetEl, striplength, stripWidth, stripThickness, localposStrip); return; + } VP1Msg::message("Warning: HitToSoNode::fillValues(...) unknown technology."); return; } -// void HitToSoNode::fillSiValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip){ -// const InDetDD::SiDetectorElement* detEl = -// dynamic_cast<const InDetDD::SiDetectorElement*>(baseDetEl); -// if ( !detEl){ -// VP1Msg::message("Could not get Si det element"); -// localposStrip = new Amg::Vector2D; -// return; -// } +void HitToSoNode::fillSiValues(Identifier& id, const Trk::TrkDetElementBase* baseDetEl, double& striplength, double& stripWidth, double& stripThickness, Amg::Vector2D*& localposStrip){ + const TrackerDD::SiDetectorElement* detEl = + dynamic_cast<const TrackerDD::SiDetectorElement*>(baseDetEl); + if ( !detEl){ + VP1Msg::message("Could not get Si det element"); + localposStrip = new Amg::Vector2D; + return; + } -// localposStrip = new Amg::Vector2D(detEl->rawLocalPositionOfCell( id )); -// // (*localPosStrip)[Trk::distPhi] += (idhelper->is_pixel(id) ? m_pixelLorentzAngleTool : m_sctLorentzAngleTool)->getLorentzShift(detEl->identifyHash()); -// // SiLorentzAngleTool cannot be used here because HitToSoNode is not a tool nor algorithm + localposStrip = new Amg::Vector2D(detEl->rawLocalPositionOfCell( id )); + // (*localPosStrip)[Trk::distPhi] += (idhelper->is_pixel(id) ? m_pixelLorentzAngleTool : m_sctLorentzAngleTool)->getLorentzShift(detEl->identifyHash()); + // SiLorentzAngleTool cannot be used here because HitToSoNode is not a tool nor algorithm -// striplength = detEl->etaPitch() ; -// stripWidth = detEl->phiPitch( *localposStrip ); -// stripThickness = detEl->thickness()/10.0; + striplength = detEl->etaPitch() ; + stripWidth = detEl->phiPitch( *localposStrip ); + stripThickness = detEl->thickness()/10.0; -// } +} #endif // BUILDVP1LIGHT diff --git a/graphics/VTI12/VTI12Utils/src/VP1DetInfo.cxx b/graphics/VTI12/VTI12Utils/src/VP1DetInfo.cxx index de53862af..c1a2c5b34 100644 --- a/graphics/VTI12/VTI12Utils/src/VP1DetInfo.cxx +++ b/graphics/VTI12/VTI12Utils/src/VP1DetInfo.cxx @@ -24,17 +24,13 @@ #include "ScintReadoutGeometry/VetoDetectorManager.h" -// #include "InDetReadoutGeometry/TRT_DetectorManager.h" -// #include "InDetReadoutGeometry/PixelDetectorManager.h" -// #include "InDetReadoutGeometry/SCT_DetectorManager.h" +#include "TrackerReadoutGeometry/SCT_DetectorManager.h" #include "FaserDetDescr/FaserDetectorID.h" #include "ScintIdentifier/VetoID.h" -// #include "InDetIdentifier/PixelID.h" -// #include "InDetIdentifier/SCT_ID.h" -// #include "InDetIdentifier/TRT_ID.h" +#include "TrackerIdentifier/FaserSCT_ID.h" #include "Identifier/Identifier.h" @@ -51,9 +47,7 @@ public: static const ScintDD::TriggerDetectorManager * m_triggerDetMgr; static const ScintDD::PreshowerDetectorManager * m_preshowerDetMgr; - // static const InDetDD::PixelDetectorManager * m_pixelDetMgr; - // static const InDetDD::SCT_DetectorManager * m_sctDetMgr; - // static const InDetDD::TRT_DetectorManager * m_trtDetMgr; + static const TrackerDD::SCT_DetectorManager * m_sctDetMgr; static const FaserDetectorID * m_faserIDHelper; @@ -62,7 +56,7 @@ public: static const PreshowerID * m_preshowerIDHelper; // static const PixelID * m_pixelIDHelper; - // static const SCT_ID * m_sctIDHelper; + static const FaserSCT_ID * m_sctIDHelper; // static const TRT_ID * m_trtIDHelper; }; @@ -73,9 +67,7 @@ const ScintDD::VetoDetectorManager * VP1DetInfo::Imp::m_vetoDetMgr = 0; const ScintDD::TriggerDetectorManager * VP1DetInfo::Imp::m_triggerDetMgr = 0; const ScintDD::PreshowerDetectorManager * VP1DetInfo::Imp::m_preshowerDetMgr = 0; -// const InDetDD::PixelDetectorManager * VP1DetInfo::Imp::m_pixelDetMgr = 0; -// const InDetDD::SCT_DetectorManager * VP1DetInfo::Imp::m_sctDetMgr = 0; -// const InDetDD::TRT_DetectorManager * VP1DetInfo::Imp::m_trtDetMgr = 0; +const TrackerDD::SCT_DetectorManager * VP1DetInfo::Imp::m_sctDetMgr = 0; const FaserDetectorID * VP1DetInfo::Imp::m_faserIDHelper = 0; @@ -83,9 +75,7 @@ const VetoID * VP1DetInfo::Imp::m_vetoIDHelper = 0; const TriggerID * VP1DetInfo::Imp::m_triggerIDHelper = 0; const PreshowerID * VP1DetInfo::Imp::m_preshowerIDHelper = 0; -// const PixelID * VP1DetInfo::Imp::m_pixelIDHelper = 0; -// const SCT_ID * VP1DetInfo::Imp::m_sctIDHelper = 0; -// const TRT_ID * VP1DetInfo::Imp::m_trtIDHelper = 0; +const FaserSCT_ID * VP1DetInfo::Imp::m_sctIDHelper = 0; //____________________________________________________________________ template <class T> @@ -131,9 +121,7 @@ const ScintDD::PreshowerDetectorManager * VP1DetInfo::preshowerDetMgr() {return // const ScintDD::TriggerDetectorManager * VP1DetInfo::triggerDetMgr() { return Imp::cachedRetrieve(Imp::m_triggerDetMgr,"Trigger",VP1JobConfigInfo::hasTriggerGeometry()); } // const ScintDD::PreshowerDetectorManager * VP1DetInfo::preshowerDetMgr() { return Imp::cachedRetrieve(Imp::m_preshowerDetMgr,"Preshower",VP1JobConfigInfo::hasPreshowerGeometry()); } -// const InDetDD::PixelDetectorManager * VP1DetInfo::pixelDetMgr() { return Imp::cachedRetrieve(Imp::m_pixelDetMgr,"Pixel",VP1JobConfigInfo::hasPixelGeometry()); } -// const InDetDD::SCT_DetectorManager * VP1DetInfo::sctDetMgr() { return Imp::cachedRetrieve(Imp::m_sctDetMgr,"SCT",VP1JobConfigInfo::hasSCTGeometry()); } -// const InDetDD::TRT_DetectorManager * VP1DetInfo::trtDetMgr() { return Imp::cachedRetrieve(Imp::m_trtDetMgr,"TRT",VP1JobConfigInfo::hasTRTGeometry()); } +const TrackerDD::SCT_DetectorManager * VP1DetInfo::sctDetMgr() { return Imp::cachedRetrieve(Imp::m_sctDetMgr,"SCT",VP1JobConfigInfo::hasSCTGeometry()); } const FaserDetectorID * VP1DetInfo::faserIDHelper() { return Imp::cachedRetrieve(Imp::m_faserIDHelper,"FaserID",true); } @@ -143,9 +131,7 @@ const PreshowerID * VP1DetInfo::preshowerIDHelper() { return nullptr; } // const TriggerID * VP1DetInfo::triggerIDHelper() { return Imp::cachedRetrieve(Imp::m_triggerIDHelper,"TriggerID",VP1JobConfigInfo::hasTriggerGeometry()); } // const PreshowerID * VP1DetInfo::preshowerIDHelper() { return Imp::cachedRetrieve(Imp::m_preshowerIDHelper,"PreshowerID",VP1JobConfigInfo::hasPreshowerGeometry()); } -// const PixelID * VP1DetInfo::pixelIDHelper() { return Imp::cachedRetrieve(Imp::m_pixelIDHelper,"PixelID",VP1JobConfigInfo::hasPixelGeometry()); } -// const SCT_ID * VP1DetInfo::sctIDHelper() { return Imp::cachedRetrieve(Imp::m_sctIDHelper,"SCT_ID",VP1JobConfigInfo::hasSCTGeometry()); } -// const TRT_ID * VP1DetInfo::trtIDHelper() { return Imp::cachedRetrieve(Imp::m_trtIDHelper,"TRT_ID",VP1JobConfigInfo::hasTRTGeometry()); } +const FaserSCT_ID * VP1DetInfo::sctIDHelper() { return Imp::cachedRetrieve(Imp::m_sctIDHelper,"FaserSCT_ID",VP1JobConfigInfo::hasSCTGeometry()); } //____________________________________________________________________ bool VP1DetInfo::isUnsafe( const Identifier& id ) { @@ -163,12 +149,13 @@ bool VP1DetInfo::isUnsafe( const Identifier& id ) { return true; } - // if (idhelper->is_indet(id)) { + if (idhelper->is_tracker(id)) { // if (!VP1JobConfigInfo::hasTRTGeometry() && idhelper->is_trt(id)) // return true; // if (!VP1JobConfigInfo::hasPixelGeometry() && idhelper->is_pixel(id)) // return true; - // if (!VP1JobConfigInfo::hasSCTGeometry() && idhelper->is_sct(id)) - // return true; + if (!VP1JobConfigInfo::hasSCTGeometry() && idhelper->is_sct(id)) + return true; + } return false; } -- GitLab