diff --git a/Configuration/AlCa/python/autoCondPhase2.py b/Configuration/AlCa/python/autoCondPhase2.py
index ee50bf9dc82ed..4e2844156d2c9 100644
--- a/Configuration/AlCa/python/autoCondPhase2.py
+++ b/Configuration/AlCa/python/autoCondPhase2.py
@@ -19,6 +19,7 @@
## (TFPX: Changed sensors spacing within all double-disks + Increased distance between Disks 6 and 7 + TBPX portcards between Disks 6 and 7.)
## T25: Phase2 tilted tracker. Outer Tracker (v8.0.0): same as T24/T21. Inner Tracker (v7.0.2): Based on (v6.1.5) (T24/T21), but with 3D sensors in TBPX L1.
## T30: Phase2 tilted tracker, exploratory geometry *only to be used in D91 for now*. Outer Tracker (v8.0.1): based on v8.0.0 with updated TB2S spacing. Inner Tracker (v6.4.0): based on v6.1.5 but TFPX with more realistic module positions
+## T33: Phase2 tilted tracker. As T25 - OT v8.0.0 (but with BTL overlap removed). IT: v7.1.1 - as in T25, except with more realistic description of 3D sensors.
#combines in a single dict of dict the tags defined below
allTags={}
@@ -27,6 +28,7 @@
'T21' : ( ','.join( [ 'SiPixelLorentzAngle_phase2_T15_v5_mc' ,SiPixelLARecord,connectionString, "", "2020-05-05 20:00:00.000"] ), ), #uH = 0.053/T (TBPX), uH=0.0/T (TEPX+TFPX)
'T25' : ( ','.join( [ 'SiPixelLorentzAngle_phase2_T25_v0_mc' ,SiPixelLARecord,connectionString, "", "2021-03-16 20:00:00.000"] ), ), #uH = 0.053/T (TBPX L2,L3,L4), uH=0.0/T (TBPX L1 TEPX+TFPX)
'T30' : ( ','.join( [ 'SiPixelLorentzAngle_phase2_IT_v6.4.0_25x100_v1_mc' ,SiPixelLARecord,connectionString, "", "2021-11-22 21:00:00.000"] ), ), #uH = 0.053/T (TBPX), uH=0.0/T (TEPX+TFPX)
+ 'T33' : ( ','.join( [ 'SiPixelLorentzAngle_phase2_IT_v7.1.1_25x100_v1_mc' ,SiPixelLARecord,connectionString, "", "2023-05-16 20:00:00.000"] ), ), #uH = 0.053/T (TBPX L2,L3,L4), uH=0.0/T (TBPX L1 TEPX+TFPX)
}
allTags["LAWidth"] = {
@@ -49,32 +51,37 @@
allTags["GenError"] = {
'T21' : ( ','.join( [ 'SiPixelGenErrorDBObject_phase2_IT_v6.1.5_25x100_v3_mc',SiPixelGenErrorRecord,connectionString, "", "2021-01-27 10:00:00"] ), ), # cell is 25um (local-x) x 100um (local-y) , VBias=350V
- 'T25' : ( ','.join( [ 'SiPixelGenErrorDBObject_phase2_IT_v7.0.2_25x100_v2_mc' ,SiPixelGenErrorRecord,connectionString, "", "2021-04-17 20:00:00"] ), ), # cell is 25um (local-x) x 100um (local-y) , VBias=350V, 3D pixels in TBPX L1
+ 'T25' : ( ','.join( [ 'SiPixelGenErrorDBObject_phase2_IT_v7.0.2_25x100_v2_mc' ,SiPixelGenErrorRecord,connectionString, "", "2021-04-17 20:00:00"] ), ), # cell is 25um (local-x) x 100um (local-y), VBias=350V, 3D pixels in TBPX L1
'T30' : ( ','.join( [ 'SiPixelGenErrorDBObject_phase2_IT_v6.4.0_25x100_v1_mc',SiPixelGenErrorRecord,connectionString, "", "2021-11-22 21:00:00"] ), ), # cell is 25um (local-x) x 100um (local-y) , VBias=350V
+ 'T33' : ( ','.join( [ 'SiPixelGenErrorDBObject_phase2_IT_v7.1.1_25x100_v1_mc' ,SiPixelGenErrorRecord,connectionString, "", "2023-05-16 20:00:00"] ), ), # cell is 25um (local-x) x 100um (local-y) , VBias=350V, 3D pixels in TBPX L1
}
allTags["Template"] = {
'T21' : ( ','.join( [ 'SiPixelTemplateDBObject_phase2_IT_v6.1.5_25x100_v3_mc',SiPixelTemplatesRecord,connectionString, "", "2021-01-27 10:00:00"] ), ), # cell is 25um (local-x) x 100um (local-y) , VBias=350V
- 'T25' : ( ','.join( [ 'SiPixelTemplateDBObject_phase2_IT_v7.0.2_25x100_v2_mc' ,SiPixelTemplatesRecord,connectionString, "", "2021-04-17 20:00:00"] ), ), # cell is 25um (local-x) x 100um (local-y) , VBias=350V, 3D pixels in TBPX L1
+ 'T25' : ( ','.join( [ 'SiPixelTemplateDBObject_phase2_IT_v7.0.2_25x100_v2_mc' ,SiPixelTemplatesRecord,connectionString, "", "2021-04-17 20:00:00"] ), ), # cell is 25um (local-x) x 100um (local-y), VBias=350V, 3D pixels in TBPX L1
'T30' : ( ','.join( [ 'SiPixelTemplateDBObject_phase2_IT_v6.4.0_25x100_v1_mc',SiPixelTemplatesRecord,connectionString, "", "2021-11-22 21:00:00"] ), ), # cell is 25um (local-x) x 100um (local-y) , VBias=350V
+ 'T33' : ( ','.join( [ 'SiPixelTemplateDBObject_phase2_IT_v7.1.1_25x100_v1_mc' ,SiPixelTemplatesRecord,connectionString, "", "2023-05-16 20:00:00"] ), ), # cell is 25um (local-x) x 100um (local-y) , VBias=350V, 3D pixels in TBPX L1
}
allTags["TkAlignment"] = {
'T21' : ( ','.join( [ 'TrackerAlignment_Upgrade2026_T21_design_v0' ,TkAlRecord, connectionString, "", "2023-03-16 15:30:00"] ), ),
'T25' : ( ','.join( [ 'TrackerAlignment_Upgrade2026_T25_design_v0' ,TkAlRecord, connectionString, "", "2023-03-16 15:30:00"] ), ),
'T30' : ( ','.join( [ 'TrackerAlignment_Upgrade2026_T30_design_v0' ,TkAlRecord, connectionString, "", "2023-03-16 15:30:00"] ), ),
+ 'T33' : ( ','.join( [ 'TrackerAlignment_Upgrade2026_T33_design_v0' ,TkAlRecord, connectionString, "", "2023-06-07 21:00:00"] ), ),
}
allTags["TkAPE"] = {
'T21' : ( ','.join( [ 'TrackerAlignmentErrorsExtended_Upgrade2026_T21_design_v0' ,TkAPERecord, connectionString, "", "2023-03-16 15:30:00"] ), ),
'T25' : ( ','.join( [ 'TrackerAlignmentErrorsExtended_Upgrade2026_T25_design_v0' ,TkAPERecord, connectionString, "", "2023-03-16 15:30:00"] ), ),
'T30' : ( ','.join( [ 'TrackerAlignmentErrorsExtended_Upgrade2026_T30_design_v0' ,TkAPERecord, connectionString, "", "2023-03-16 15:30:00"] ), ),
+ 'T33' : ( ','.join( [ 'TrackerAlignmentErrorsExtended_Upgrade2026_T33_design_v0' ,TkAPERecord, connectionString, "", "2023-06-07 21:00:00"] ), ),
}
allTags["TkSurf"] = {
'T21' : ( ','.join( [ 'TrackerSurfaceDeformations_Upgrade2026_Zero' ,TkSurfRecord, connectionString, "", "2023-03-16 15:30:00"] ), ),
'T25' : ( ','.join( [ 'TrackerSurfaceDeformations_Upgrade2026_Zero' ,TkSurfRecord, connectionString, "", "2023-03-16 15:30:00"] ), ),
'T30' : ( ','.join( [ 'TrackerSurfaceDeformations_Upgrade2026_Zero' ,TkSurfRecord, connectionString, "", "2023-03-16 15:30:00"] ), ),
+ 'T33' : ( ','.join( [ 'TrackerSurfaceDeformations_Upgrade2026_Zero' ,TkSurfRecord, connectionString, "", "2023-03-16 15:30:00"] ), ),
}
##
@@ -86,12 +93,14 @@
'T21' : ( ','.join( [ 'SiPhase2OuterTrackerLorentzAngle_v0_mc' ,TrackerLARecord,connectionString, "", "2020-07-19 17:00:00.000"] ), ), #uH = 0.07/T
'T25' : ( ','.join( [ 'SiPhase2OuterTrackerLorentzAngle_v0_mc' ,TrackerLARecord,connectionString, "", "2020-07-19 17:00:00.000"] ), ), #uH = 0.07/T
'T30' : ( ','.join( [ 'SiPhase2OuterTrackerLorentzAngle_v0_mc' ,TrackerLARecord,connectionString, "", "2020-07-19 17:00:00.000"] ), ), #uH = 0.07/T
+ 'T33' : ( ','.join( [ 'SiPhase2OuterTrackerLorentzAngle_v0_mc' ,TrackerLARecord,connectionString, "", "2020-07-19 17:00:00.000"] ), ), #uH = 0.07/T
}
allTags["SimOTLA"] = {
'T21' : ( ','.join( [ 'SiPhase2OuterTrackerLorentzAngleSim_v0_mc' ,TrackerSimLARecord,connectionString, "", "2020-07-19 17:00:00.000"] ), ), #uH = 0.07/T
'T25' : ( ','.join( [ 'SiPhase2OuterTrackerLorentzAngleSim_v0_mc' ,TrackerSimLARecord,connectionString, "", "2020-07-19 17:00:00.000"] ), ), #uH = 0.07/T
'T30' : ( ','.join( [ 'SiPhase2OuterTrackerLorentzAngleSim_v0_mc' ,TrackerSimLARecord,connectionString, "", "2020-07-19 17:00:00.000"] ), ), #uH = 0.07/T
+ 'T33' : ( ','.join( [ 'SiPhase2OuterTrackerLorentzAngleSim_v0_mc' ,TrackerSimLARecord,connectionString, "", "2020-07-19 17:00:00.000"] ), ), #uH = 0.07/T
}
'''
@@ -111,7 +120,7 @@
activeKeys = ["LA", "LAWidth", "SimLA", "LAfromAlignment", "GenError", "Template", "TkAlignment", "TkAPE", "TkSurf"] #,"SimOTLA","OTLA"]
# list of geometries supported
-activeDets = ["T21","T25","T30"]
+activeDets = ["T21","T25","T30","T33"]
phase2GTs = {}
for det in activeDets:
appendedTags = ()
diff --git a/Configuration/Geometry/README.md b/Configuration/Geometry/README.md
index 4fc12e8858a68..3dfd0d5eb1e35 100644
--- a/Configuration/Geometry/README.md
+++ b/Configuration/Geometry/README.md
@@ -68,6 +68,7 @@ Tracker:
* T30: Phase2 tilted tracker. Exploratory geometry *only to be used in D91 for now*. Outer Tracker (v8.0.1): based on v8.0.0 with updated TB2S spacing. Inner Tracker (v6.4.0): based on v6.1.5 but TFPX with more realistic module positions.
* T31: Phase2 tilted tracker. The tracker description is identical to T24/T21. The outer radius of the tracker volume is reduced to avoid a clash with the BTL geometry. The positions of the tracker components are not affected
* T32: Phase2 tilted tracker. The tracker description is identical to T25. The outer radius of the tracker volume is reduced to avoid a clash with the BTL geometry (same as T31). The positions of the tracker components are not affected. This geometry is intended as a transition step towards a realistic configuration with 3D sensors in TBPX layer1.
+* T33: Phase2 tilted tracker. Identical to T32 apart from a more realistic description of the 3D sensors in TBPX layer1.
Calorimeters:
* C9: HGCal (v11 post TDR HGCal Geometry w/ corner centering for HE part) + Phase2 HCAL and EB + Tracker cables (used in 2026D49)
@@ -127,4 +128,5 @@ Several detector combinations have been generated:
* D97 = T25+C17+M10+I15+O9+F6
* D98 = T32+C17+M10+I16+O9+F6
* D99 = T32+C18+M10+I16+O9+F6
+* D100 = T33+C17+M10+I16+O9+F6
diff --git a/Configuration/Geometry/python/GeometryDD4hepExtended2026D100Reco_cff.py b/Configuration/Geometry/python/GeometryDD4hepExtended2026D100Reco_cff.py
new file mode 100644
index 0000000000000..36696d6526470
--- /dev/null
+++ b/Configuration/Geometry/python/GeometryDD4hepExtended2026D100Reco_cff.py
@@ -0,0 +1,59 @@
+import FWCore.ParameterSet.Config as cms
+
+# This config was generated automatically using generate2026Geometry.py
+# If you notice a mistake, please update the generating script, not just this config
+
+from Configuration.Geometry.GeometryDD4hepExtended2026D100_cff import *
+
+# tracker
+from Geometry.CommonTopologies.globalTrackingGeometry_cfi import *
+from RecoTracker.GeometryESProducer.TrackerRecoGeometryESProducer_cfi import *
+from Geometry.TrackerGeometryBuilder.trackerParameters_cff import *
+from Geometry.TrackerNumberingBuilder.trackerTopology_cfi import *
+from Geometry.TrackerGeometryBuilder.idealForDigiTrackerGeometry_cff import *
+trackerGeometry.applyAlignment = True
+
+# calo
+from Geometry.CaloEventSetup.HGCalTopology_cfi import *
+from Geometry.HGCalGeometry.HGCalGeometryESProducer_cfi import *
+from Geometry.CaloEventSetup.CaloTopology_cfi import *
+from Geometry.CaloEventSetup.CaloGeometryBuilder_cfi import *
+CaloGeometryBuilder = cms.ESProducer("CaloGeometryBuilder",
+ SelectedCalos = cms.vstring("HCAL",
+ "ZDC",
+ "EcalBarrel",
+ "TOWER",
+ "HGCalEESensitive",
+ "HGCalHESiliconSensitive",
+ "HGCalHEScintillatorSensitive"
+ )
+)
+from Geometry.EcalAlgo.EcalBarrelGeometry_cfi import *
+from Geometry.HcalEventSetup.HcalGeometry_cfi import *
+from Geometry.HcalEventSetup.CaloTowerGeometry_cfi import *
+from Geometry.HcalEventSetup.CaloTowerTopology_cfi import *
+from Geometry.HcalCommonData.hcalDDDRecConstants_cfi import *
+from Geometry.HcalEventSetup.hcalTopologyIdeal_cfi import *
+from Geometry.CaloEventSetup.EcalTrigTowerConstituents_cfi import *
+from Geometry.EcalMapping.EcalMapping_cfi import *
+from Geometry.EcalMapping.EcalMappingRecord_cfi import *
+
+# muon
+from Geometry.MuonNumbering.muonNumberingInitialization_cfi import *
+from RecoMuon.DetLayers.muonDetLayerGeometry_cfi import *
+from Geometry.GEMGeometryBuilder.gemGeometry_cff import *
+from Geometry.CSCGeometryBuilder.idealForDigiCscGeometry_cff import *
+from Geometry.DTGeometryBuilder.idealForDigiDtGeometry_cff import *
+
+# forward
+from Geometry.ForwardGeometry.ForwardGeometry_cfi import *
+
+# timing
+from RecoMTD.DetLayers.mtdDetLayerGeometry_cfi import *
+from Geometry.MTDGeometryBuilder.mtdParameters_cff import *
+from Geometry.MTDNumberingBuilder.mtdNumberingGeometry_cff import *
+from Geometry.MTDNumberingBuilder.mtdTopology_cfi import *
+from Geometry.MTDGeometryBuilder.mtdGeometry_cfi import *
+from Geometry.MTDGeometryBuilder.idealForDigiMTDGeometry_cff import *
+mtdGeometry.applyAlignment = False
+
diff --git a/Configuration/Geometry/python/GeometryDD4hepExtended2026D100_cff.py b/Configuration/Geometry/python/GeometryDD4hepExtended2026D100_cff.py
new file mode 100644
index 0000000000000..266b2d2c1f9bd
--- /dev/null
+++ b/Configuration/Geometry/python/GeometryDD4hepExtended2026D100_cff.py
@@ -0,0 +1,17 @@
+import FWCore.ParameterSet.Config as cms
+
+# This config was generated automatically using generate2026Geometry.py
+# If you notice a mistake, please update the generating script, not just this config
+
+from Configuration.Geometry.GeometryDD4hep_cff import *
+DDDetectorESProducer.confGeomXMLFiles = cms.FileInPath("Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D100.xml")
+
+from Geometry.TrackerNumberingBuilder.trackerNumberingGeometry_cff import *
+from SLHCUpgradeSimulations.Geometry.fakePhase2OuterTrackerConditions_cff import *
+from Geometry.EcalCommonData.ecalSimulationParameters_cff import *
+from Geometry.HcalCommonData.hcalDDDSimConstants_cff import *
+from Geometry.HGCalCommonData.hgcalParametersInitialization_cfi import *
+from Geometry.HGCalCommonData.hgcalNumberingInitialization_cfi import *
+from Geometry.MuonNumbering.muonGeometryConstants_cff import *
+from Geometry.MuonNumbering.muonOffsetESProducer_cff import *
+from Geometry.MTDNumberingBuilder.mtdNumberingGeometry_cff import *
diff --git a/Configuration/Geometry/python/GeometryExtended2026D100Reco_cff.py b/Configuration/Geometry/python/GeometryExtended2026D100Reco_cff.py
new file mode 100644
index 0000000000000..5bb73e9ae2aec
--- /dev/null
+++ b/Configuration/Geometry/python/GeometryExtended2026D100Reco_cff.py
@@ -0,0 +1,59 @@
+import FWCore.ParameterSet.Config as cms
+
+# This config was generated automatically using generate2026Geometry.py
+# If you notice a mistake, please update the generating script, not just this config
+
+from Configuration.Geometry.GeometryExtended2026D100_cff import *
+
+# tracker
+from Geometry.CommonTopologies.globalTrackingGeometry_cfi import *
+from RecoTracker.GeometryESProducer.TrackerRecoGeometryESProducer_cfi import *
+from Geometry.TrackerGeometryBuilder.trackerParameters_cff import *
+from Geometry.TrackerNumberingBuilder.trackerTopology_cfi import *
+from Geometry.TrackerGeometryBuilder.idealForDigiTrackerGeometry_cff import *
+trackerGeometry.applyAlignment = True
+
+# calo
+from Geometry.CaloEventSetup.HGCalTopology_cfi import *
+from Geometry.HGCalGeometry.HGCalGeometryESProducer_cfi import *
+from Geometry.CaloEventSetup.CaloTopology_cfi import *
+from Geometry.CaloEventSetup.CaloGeometryBuilder_cfi import *
+CaloGeometryBuilder = cms.ESProducer("CaloGeometryBuilder",
+ SelectedCalos = cms.vstring("HCAL",
+ "ZDC",
+ "EcalBarrel",
+ "TOWER",
+ "HGCalEESensitive",
+ "HGCalHESiliconSensitive",
+ "HGCalHEScintillatorSensitive"
+ )
+)
+from Geometry.EcalAlgo.EcalBarrelGeometry_cfi import *
+from Geometry.HcalEventSetup.HcalGeometry_cfi import *
+from Geometry.HcalEventSetup.CaloTowerGeometry_cfi import *
+from Geometry.HcalEventSetup.CaloTowerTopology_cfi import *
+from Geometry.HcalCommonData.hcalDDDRecConstants_cfi import *
+from Geometry.HcalEventSetup.hcalTopologyIdeal_cfi import *
+from Geometry.CaloEventSetup.EcalTrigTowerConstituents_cfi import *
+from Geometry.EcalMapping.EcalMapping_cfi import *
+from Geometry.EcalMapping.EcalMappingRecord_cfi import *
+
+# muon
+from Geometry.MuonNumbering.muonNumberingInitialization_cfi import *
+from RecoMuon.DetLayers.muonDetLayerGeometry_cfi import *
+from Geometry.GEMGeometryBuilder.gemGeometry_cff import *
+from Geometry.CSCGeometryBuilder.idealForDigiCscGeometry_cff import *
+from Geometry.DTGeometryBuilder.idealForDigiDtGeometry_cff import *
+
+# forward
+from Geometry.ForwardGeometry.ForwardGeometry_cfi import *
+
+# timing
+from RecoMTD.DetLayers.mtdDetLayerGeometry_cfi import *
+from Geometry.MTDGeometryBuilder.mtdParameters_cff import *
+from Geometry.MTDNumberingBuilder.mtdNumberingGeometry_cff import *
+from Geometry.MTDNumberingBuilder.mtdTopology_cfi import *
+from Geometry.MTDGeometryBuilder.mtdGeometry_cfi import *
+from Geometry.MTDGeometryBuilder.idealForDigiMTDGeometry_cff import *
+mtdGeometry.applyAlignment = False
+
diff --git a/Configuration/Geometry/python/GeometryExtended2026D100_cff.py b/Configuration/Geometry/python/GeometryExtended2026D100_cff.py
new file mode 100644
index 0000000000000..983cb8f4e85f6
--- /dev/null
+++ b/Configuration/Geometry/python/GeometryExtended2026D100_cff.py
@@ -0,0 +1,15 @@
+import FWCore.ParameterSet.Config as cms
+
+# This config was generated automatically using generate2026Geometry.py
+# If you notice a mistake, please update the generating script, not just this config
+
+from Geometry.CMSCommonData.cmsExtendedGeometry2026D100XML_cfi import *
+from Geometry.TrackerNumberingBuilder.trackerNumberingGeometry_cff import *
+from SLHCUpgradeSimulations.Geometry.fakePhase2OuterTrackerConditions_cff import *
+from Geometry.EcalCommonData.ecalSimulationParameters_cff import *
+from Geometry.HcalCommonData.hcalDDDSimConstants_cff import *
+from Geometry.HGCalCommonData.hgcalParametersInitialization_cfi import *
+from Geometry.HGCalCommonData.hgcalNumberingInitialization_cfi import *
+from Geometry.MuonNumbering.muonGeometryConstants_cff import *
+from Geometry.MuonNumbering.muonOffsetESProducer_cff import *
+from Geometry.MTDNumberingBuilder.mtdNumberingGeometry_cff import *
diff --git a/Configuration/Geometry/python/dict2026Geometry.py b/Configuration/Geometry/python/dict2026Geometry.py
index 1f9d98d937a40..b53ff92ede7bf 100644
--- a/Configuration/Geometry/python/dict2026Geometry.py
+++ b/Configuration/Geometry/python/dict2026Geometry.py
@@ -348,7 +348,43 @@
'trackerGeometry.applyAlignment = True',
],
"era" : "phase2_tracker, phase2_3DPixels, trackingPhase2PU140",
- }
+ },
+ "T33" : {
+ 1 : [
+ 'Geometry/TrackerCommonData/data/PhaseII/trackerParameters.xml',
+ 'Geometry/TrackerCommonData/data/pixfwdCommon.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_2021_02/pixfwd.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_OT800_IT615_2022_10/pixbar.xml',
+ 'Geometry/TrackerCommonData/data/trackermaterial.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_2021_02/tracker.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/OuterTracker616_2020_04/otst.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixel.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/TiltedTracker404/trackerbar.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/TiltedTracker404/trackerfwd.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_2021_02/trackerStructureTopology.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelStructureTopology.xml',
+ 'Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_2021_02/trackersens.xml',
+ 'Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelsens.xml',
+ 'Geometry/TrackerRecoData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/trackerRecoMaterial.xml',
+ 'Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_2021_02/trackerProdCuts.xml',
+ 'Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelProdCuts.xml',
+ 'Geometry/TrackerSimData/data/trackerProdCutsBEAM.xml',
+ ],
+ "sim" : [
+ 'from Geometry.TrackerNumberingBuilder.trackerNumberingGeometry_cff import *',
+ 'from SLHCUpgradeSimulations.Geometry.fakePhase2OuterTrackerConditions_cff import *',
+ ],
+ "reco" : [
+ 'from Geometry.CommonTopologies.globalTrackingGeometry_cfi import *',
+ 'from RecoTracker.GeometryESProducer.TrackerRecoGeometryESProducer_cfi import *',
+ 'from Geometry.TrackerGeometryBuilder.trackerParameters_cff import *',
+ 'from Geometry.TrackerNumberingBuilder.trackerTopology_cfi import *',
+ 'from Geometry.TrackerGeometryBuilder.idealForDigiTrackerGeometry_cff import *',
+ 'trackerGeometry.applyAlignment = True',
+ ],
+ "era" : "phase2_tracker, phase2_3DPixels, trackingPhase2PU140",
+ },
+
}
@@ -1249,6 +1285,7 @@
("O9","T25","C17","M10","F6","I15") : "D97",
("O9","T32","C17","M10","F6","I16") : "D98",
("O9","T32","C18","M10","F6","I16") : "D99",
+ ("O9","T33","C17","M10","F6","I15") : "D100",
}
deprecatedDets = set([ "D1", "D2", "D3", "D5", "D6" , "D7", "D4", "D8" , "D9", "D12", "D13", "D15", "D10", "D11", "D14", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "D25", "D26", "D27", "D28", "D29", "D30", "D31", "D32", "D33", "D34", "D36", "D37", "D38", "D39", "D40", "D42", "D35", "D41", "D43", "D44", "D45", "D46", "D48", "D47", "D50", "D51", "D52", "D53", "D54", "D55", "D56", "D57", "D58", "D59", "D61", "D62", "D63", "D64", "D65", "D66", "D67", "D69", "D71", "D72", "D73", "D74", "D75", "D78", "D79", "D87", "D89", "D90", "D49", "D60", "D68", "D70", "D76", "D77", "D80", "D81", "D82", "D83", "D84", "D85"])
diff --git a/Configuration/PyReleaseValidation/python/relval_2026.py b/Configuration/PyReleaseValidation/python/relval_2026.py
index 857b5cdc121d5..eb087217468a4 100644
--- a/Configuration/PyReleaseValidation/python/relval_2026.py
+++ b/Configuration/PyReleaseValidation/python/relval_2026.py
@@ -34,6 +34,7 @@
numWFIB.extend([24434.0]) #2026D97
numWFIB.extend([24834.0]) #2026D98
numWFIB.extend([25234.0,25234.911]) #2026D99 DDD XML, DD4hep XML
+numWFIB.extend([25634.0]) #2026D100
#Additional sample for short matrix and IB
#CloseByPGun for HGCAL
diff --git a/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py b/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py
index 62f600a967f0e..6654462e09e7c 100644
--- a/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py
+++ b/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py
@@ -55,6 +55,8 @@
'2026D98PU',
'2026D99',
'2026D99PU',
+ '2026D100',
+ '2026D100PU',
]
# pre-generation of WF numbers
@@ -2623,6 +2625,13 @@ def condition(self, fragment, stepList, key, hasHarvest):
'Era' : 'Phase2C17I13M9',
'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
},
+ '2026D100' : {
+ 'Geom' : 'Extended2026D100',
+ 'HLTmenu': '@fake2',
+ 'GT' : 'auto:phase2_realistic_T33',
+ 'Era' : 'Phase2C17I13M9',
+ 'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
+ },
}
# standard PU sequences
diff --git a/Configuration/StandardSequences/python/GeometryConf.py b/Configuration/StandardSequences/python/GeometryConf.py
index 572d373a409a2..914b2926a9a0f 100644
--- a/Configuration/StandardSequences/python/GeometryConf.py
+++ b/Configuration/StandardSequences/python/GeometryConf.py
@@ -83,4 +83,6 @@
'DD4hepExtended2026D98' : 'DD4hepExtended2026D98,DD4hepExtended2026D98Reco',
'Extended2026D99' : 'Extended2026D99,Extended2026D99Reco',
'DD4hepExtended2026D99' : 'DD4hepExtended2026D99,DD4hepExtended2026D99Reco',
+ 'Extended2026D100' : 'Extended2026D100,Extended2026D100Reco',
+ 'DD4hepExtended2026D100' : 'DD4hepExtended2026D100,DD4hepExtended2026D100Reco',
}
diff --git a/DataFormats/TrackerCommon/interface/TrackerTopology.h b/DataFormats/TrackerCommon/interface/TrackerTopology.h
index 2852a6d900870..18dafa02c8cdd 100644
--- a/DataFormats/TrackerCommon/interface/TrackerTopology.h
+++ b/DataFormats/TrackerCommon/interface/TrackerTopology.h
@@ -19,9 +19,11 @@ class TrackerTopology {
unsigned int layerStartBit_;
unsigned int ladderStartBit_;
unsigned int moduleStartBit_;
+ unsigned int doubleStartBit_;
unsigned int layerMask_;
unsigned int ladderMask_;
unsigned int moduleMask_;
+ unsigned int doubleMask_;
};
struct PixelEndcapValues {
@@ -233,13 +235,19 @@ class TrackerTopology {
//generic function to return DetIds and boolean factors
uint32_t glued(const DetId &id) const;
uint32_t stack(const DetId &id) const;
+ uint32_t doubleSensor(const DetId &id) const;
uint32_t lower(const DetId &id) const;
uint32_t upper(const DetId &id) const;
+ uint32_t first(const DetId &id) const;
+ uint32_t second(const DetId &id) const;
bool isStereo(const DetId &id) const;
bool isRPhi(const DetId &id) const;
+ bool isDoubleSens(const DetId &id) const;
bool isLower(const DetId &id) const;
bool isUpper(const DetId &id) const;
+ bool isFirst(const DetId &id) const;
+ bool isSecond(const DetId &id) const;
//specific function to return boolean factors
bool tobIsDoubleSide(const DetId &id) const { return tobGlued(id) == 0 && (tobLayer(id) == 1 || tobLayer(id) == 2); }
@@ -288,6 +296,11 @@ class TrackerTopology {
return (((id.rawId() >> tecVals_.sterStartBit_) & tecVals_.sterMask_) == 1) ? 1 : 0;
}
+ //phase 2 split sensor
+ uint32_t pixFirst(const DetId &id) const {
+ return (((id.rawId() >> pbVals_.doubleStartBit_) & pbVals_.doubleMask_) == 1) ? 1 : 0;
+ }
+
//phase0 stereo == phase2 lower
uint32_t tibLower(const DetId &id) const { return tibStereo(id); }
uint32_t tidLower(const DetId &id) const { return tidStereo(id); }
@@ -327,6 +340,14 @@ class TrackerTopology {
}
}
+ uint32_t pixSecond(const DetId &id) const {
+ if (((id.rawId() >> pbVals_.doubleStartBit_) & pbVals_.doubleMask_) == 2) {
+ return ((id.rawId() >> pbVals_.doubleStartBit_) & pbVals_.doubleMask_);
+ } else {
+ return 0;
+ }
+ }
+
//phase0 rphi == phase2 upper
uint32_t tibUpper(const DetId &id) const { return tibRPhi(id); }
uint32_t tidUpper(const DetId &id) const { return tidRPhi(id); }
@@ -354,6 +375,11 @@ class TrackerTopology {
return (testId == 0) ? 0 : (id.rawId() - testId);
}
+ uint32_t pixDouble(const DetId &id) const {
+ uint32_t testId = (id.rawId() >> pbVals_.doubleStartBit_) & pbVals_.doubleMask_;
+ return (testId == 0) ? 0 : (id.rawId() - testId);
+ }
+
//phase0 glued == phase2 stack
uint32_t tibStack(const DetId &id) const { return tibGlued(id); }
uint32_t tidStack(const DetId &id) const { return tidGlued(id); }
@@ -363,6 +389,16 @@ class TrackerTopology {
//these should be used now!!
DetId partnerDetId(const DetId &id) const;
+ DetId pixPartnerDetId(const DetId &id) const {
+ if (((id.rawId() >> pbVals_.doubleStartBit_) & pbVals_.doubleMask_) == 1) {
+ return DetId(id.rawId() + 1);
+ } else if (((id.rawId() >> pbVals_.doubleStartBit_) & pbVals_.doubleMask_) == 2) {
+ return DetId(id.rawId() - 1);
+ } else {
+ return DetId();
+ }
+ }
+
DetId tibPartnerDetId(const DetId &id) const {
if (((id.rawId() >> tibVals_.sterStartBit_) & tibVals_.sterMask_) == 1) {
return DetId(id.rawId() + 1);
diff --git a/DataFormats/TrackerCommon/src/TrackerTopology.cc b/DataFormats/TrackerCommon/src/TrackerTopology.cc
index 09b48b98a1305..b52649e7d33a2 100644
--- a/DataFormats/TrackerCommon/src/TrackerTopology.cc
+++ b/DataFormats/TrackerCommon/src/TrackerTopology.cc
@@ -119,6 +119,60 @@ uint32_t TrackerTopology::stack(const DetId &id) const {
throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::stack";
}
+uint32_t TrackerTopology::doubleSensor(const DetId &id) const {
+ uint32_t subdet = id.subdetId();
+ if (subdet == PixelSubdetector::PixelBarrel)
+ return pixDouble(id);
+ if (subdet == PixelSubdetector::PixelEndcap)
+ return 0;
+ if (subdet == SiStripSubdetector::TIB)
+ return 0;
+ if (subdet == SiStripSubdetector::TID)
+ return 0;
+ if (subdet == SiStripSubdetector::TOB)
+ return 0;
+ if (subdet == SiStripSubdetector::TEC)
+ return 0;
+
+ throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::stack";
+}
+
+uint32_t TrackerTopology::first(const DetId &id) const {
+ uint32_t subdet = id.subdetId();
+ if (subdet == PixelSubdetector::PixelBarrel)
+ return pixFirst(id);
+ if (subdet == PixelSubdetector::PixelEndcap)
+ return 0;
+ if (subdet == SiStripSubdetector::TIB)
+ return 0;
+ if (subdet == SiStripSubdetector::TID)
+ return 0;
+ if (subdet == SiStripSubdetector::TOB)
+ return 0;
+ if (subdet == SiStripSubdetector::TEC)
+ return 0;
+
+ throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::doubleSens";
+}
+
+uint32_t TrackerTopology::second(const DetId &id) const {
+ uint32_t subdet = id.subdetId();
+ if (subdet == PixelSubdetector::PixelBarrel)
+ return pixSecond(id);
+ if (subdet == PixelSubdetector::PixelEndcap)
+ return 0;
+ if (subdet == SiStripSubdetector::TIB)
+ return 0;
+ if (subdet == SiStripSubdetector::TID)
+ return 0;
+ if (subdet == SiStripSubdetector::TOB)
+ return 0;
+ if (subdet == SiStripSubdetector::TEC)
+ return 0;
+
+ throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::doubleSensor";
+}
+
uint32_t TrackerTopology::lower(const DetId &id) const {
uint32_t subdet = id.subdetId();
if (subdet == PixelSubdetector::PixelBarrel)
@@ -192,6 +246,26 @@ bool TrackerTopology::isRPhi(const DetId &id) const {
throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::isRPhi";
return false;
}
+
+bool TrackerTopology::isDoubleSens(const DetId &id) const {
+ uint32_t subdet = id.subdetId();
+ if (subdet == PixelSubdetector::PixelBarrel)
+ return pixDouble(id) != 0;
+ if (subdet == PixelSubdetector::PixelEndcap)
+ return false;
+ if (subdet == SiStripSubdetector::TIB)
+ return false;
+ if (subdet == SiStripSubdetector::TID)
+ return false;
+ if (subdet == SiStripSubdetector::TOB)
+ return false;
+ if (subdet == SiStripSubdetector::TEC)
+ return false;
+
+ throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::isDoubleSens";
+ return false;
+}
+
bool TrackerTopology::isLower(const DetId &id) const {
uint32_t subdet = id.subdetId();
if (subdet == PixelSubdetector::PixelBarrel)
@@ -230,10 +304,48 @@ bool TrackerTopology::isUpper(const DetId &id) const {
return false;
}
+bool TrackerTopology::isFirst(const DetId &id) const {
+ uint32_t subdet = id.subdetId();
+ if (subdet == PixelSubdetector::PixelBarrel)
+ return pixFirst(id) != 0;
+ if (subdet == PixelSubdetector::PixelEndcap)
+ return false;
+ if (subdet == SiStripSubdetector::TIB)
+ return false;
+ if (subdet == SiStripSubdetector::TID)
+ return false;
+ if (subdet == SiStripSubdetector::TOB)
+ return false;
+ if (subdet == SiStripSubdetector::TEC)
+ return false;
+
+ throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::isFirst";
+ return false;
+}
+
+bool TrackerTopology::isSecond(const DetId &id) const {
+ uint32_t subdet = id.subdetId();
+ if (subdet == PixelSubdetector::PixelBarrel)
+ return pixSecond(id) != 0;
+ if (subdet == PixelSubdetector::PixelEndcap)
+ return false;
+ if (subdet == SiStripSubdetector::TIB)
+ return false;
+ if (subdet == SiStripSubdetector::TID)
+ return false;
+ if (subdet == SiStripSubdetector::TOB)
+ return false;
+ if (subdet == SiStripSubdetector::TEC)
+ return false;
+
+ throw cms::Exception("Invalid DetId") << "Unsupported DetId in TrackerTopology::isSecond";
+ return false;
+}
+
DetId TrackerTopology::partnerDetId(const DetId &id) const {
uint32_t subdet = id.subdetId();
if (subdet == PixelSubdetector::PixelBarrel)
- return 0;
+ return pixPartnerDetId(id);
if (subdet == PixelSubdetector::PixelEndcap)
return 0;
if (subdet == SiStripSubdetector::TIB)
@@ -257,8 +369,14 @@ std::string TrackerTopology::print(DetId id) const {
unsigned int theLayer = pxbLayer(id);
unsigned int theLadder = pxbLadder(id);
unsigned int theModule = pxbModule(id);
+ std::string typeUpgrade;
+ typeUpgrade = (isFirst(id)) ? "first" : typeUpgrade;
+ typeUpgrade = (isSecond(id)) ? "second" : typeUpgrade;
+ typeUpgrade = (isFirst(id) || isSecond(id)) ? typeUpgrade + " double" : "module";
strstr << "PixelBarrel"
- << " Layer " << theLayer << " Ladder " << theLadder << " Module " << theModule;
+ << " Layer " << theLayer << " Ladder " << theLadder;
+ strstr << " Module for phase0 " << theModule;
+ strstr << " Module for phase2 " << theModule << " " << typeUpgrade;
strstr << " (" << id.rawId() << ")";
return strstr.str();
}
diff --git a/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D100.xml b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D100.xml
new file mode 100644
index 0000000000000..6605b3d90169c
--- /dev/null
+++ b/Geometry/CMSCommonData/data/dd4hep/cmsExtendedGeometry2026D100.xml
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Geometry/CMSCommonData/python/cmsExtendedGeometry2026D100XML_cfi.py b/Geometry/CMSCommonData/python/cmsExtendedGeometry2026D100XML_cfi.py
new file mode 100644
index 0000000000000..8a5ba165a7e33
--- /dev/null
+++ b/Geometry/CMSCommonData/python/cmsExtendedGeometry2026D100XML_cfi.py
@@ -0,0 +1,130 @@
+import FWCore.ParameterSet.Config as cms
+
+# This config was generated automatically using generate2026Geometry.py
+# If you notice a mistake, please update the generating script, not just this config
+
+XMLIdealGeometryESSource = cms.ESSource("XMLIdealGeometryESSource",
+ geomXMLFiles = cms.vstring(
+ 'Geometry/CMSCommonData/data/materials/2021/v1/materials.xml',
+ 'Geometry/CMSCommonData/data/rotations.xml',
+ 'Geometry/CMSCommonData/data/extend/v2/cmsextent.xml',
+ 'Geometry/CMSCommonData/data/cavernData/2021/v1/cavernData.xml',
+ 'Geometry/CMSCommonData/data/cms/2026/v5/cms.xml',
+ 'Geometry/CMSCommonData/data/cmsMother.xml',
+ 'Geometry/CMSCommonData/data/eta3/etaMax.xml',
+ 'Geometry/CMSCommonData/data/cmsTracker.xml',
+ 'Geometry/CMSCommonData/data/caloBase/2026/v7/caloBase.xml',
+ 'Geometry/CMSCommonData/data/cmsCalo.xml',
+ 'Geometry/CMSCommonData/data/muonBase/2026/v5/muonBase.xml',
+ 'Geometry/CMSCommonData/data/cmsMuon.xml',
+ 'Geometry/CMSCommonData/data/mgnt.xml',
+ 'Geometry/CMSCommonData/data/beampipe/2026/v3/beampipe.xml',
+ 'Geometry/CMSCommonData/data/cmsBeam/2026/v1/cmsBeam.xml',
+ 'Geometry/CMSCommonData/data/muonMB.xml',
+ 'Geometry/CMSCommonData/data/muonMagnet.xml',
+ 'Geometry/CMSCommonData/data/cavern/2021/v1/cavern.xml',
+ 'Geometry/CMSCommonData/data/cavernFloor/2017/v1/cavernFloor.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/trackerParameters.xml',
+ 'Geometry/TrackerCommonData/data/pixfwdCommon.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_2021_02/pixfwd.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_OT800_IT615_2022_10/pixbar.xml',
+ 'Geometry/TrackerCommonData/data/trackermaterial.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_2021_02/tracker.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/OuterTracker616_2020_04/otst.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixel.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/TiltedTracker404/trackerbar.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/TiltedTracker404/trackerfwd.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_2021_02/trackerStructureTopology.xml',
+ 'Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelStructureTopology.xml',
+ 'Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_2021_02/trackersens.xml',
+ 'Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelsens.xml',
+ 'Geometry/TrackerRecoData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/trackerRecoMaterial.xml',
+ 'Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_2021_02/trackerProdCuts.xml',
+ 'Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelProdCuts.xml',
+ 'Geometry/TrackerSimData/data/trackerProdCutsBEAM.xml',
+ 'Geometry/EcalCommonData/data/eregalgo/2026/v2/eregalgo.xml',
+ 'Geometry/EcalCommonData/data/ectkcable/2026/v1/ectkcable.xml',
+ 'Geometry/EcalCommonData/data/ectkcablemat/2026/v2/ectkcablemat.xml',
+ 'Geometry/EcalCommonData/data/ebalgo.xml',
+ 'Geometry/EcalCommonData/data/ebcon/2021/v1/ebcon.xml',
+ 'Geometry/EcalCommonData/data/ebrot.xml',
+ 'Geometry/HcalCommonData/data/hcalrotations.xml',
+ 'Geometry/HcalCommonData/data/hcal/v2/hcalalgo.xml',
+ 'Geometry/HcalCommonData/data/hcalbarrelalgo.xml',
+ 'Geometry/HcalCommonData/data/hcalcablealgo/v2/hcalcablealgo.xml',
+ 'Geometry/HcalCommonData/data/hcalouteralgo.xml',
+ 'Geometry/HcalCommonData/data/hcalforwardalgo.xml',
+ 'Geometry/HcalCommonData/data/hcalSimNumbering/NoHE/v1/hcalSimNumbering.xml',
+ 'Geometry/HcalCommonData/data/hcalRecNumbering/NoHE/v1/hcalRecNumbering.xml',
+ 'Geometry/HcalCommonData/data/average/hcalforwardmaterial.xml',
+ 'Geometry/HGCalCommonData/data/hgcalMaterial/v2/hgcalMaterial.xml',
+ 'Geometry/HGCalCommonData/data/hgcal/v16/hgcal.xml',
+ 'Geometry/HGCalCommonData/data/hgcalcell/v16/hgcalcell.xml',
+ 'Geometry/HGCalCommonData/data/hgcalwafer/v16/hgcalwafer.xml',
+ 'Geometry/HGCalCommonData/data/hgcalEE/v16/hgcalEE.xml',
+ 'Geometry/HGCalCommonData/data/hgcalHEsil/v16/hgcalHEsil.xml',
+ 'Geometry/HGCalCommonData/data/hgcalHEmix/v16/hgcalHEmix.xml',
+ 'Geometry/HGCalCommonData/data/hgcalCons/v16/hgcalCons.xml',
+ 'Geometry/HGCalCommonData/data/hgcalConsData/v16/hgcalConsData.xml',
+ 'Geometry/MuonCommonData/data/mbCommon/2021/v1/mbCommon.xml',
+ 'Geometry/MuonCommonData/data/mb1/2015/v2/mb1.xml',
+ 'Geometry/MuonCommonData/data/mb2/2015/v2/mb2.xml',
+ 'Geometry/MuonCommonData/data/mb3/2015/v2/mb3.xml',
+ 'Geometry/MuonCommonData/data/mb4/2015/v2/mb4.xml',
+ 'Geometry/MuonCommonData/data/mb4Shield/2021/v1/mb4Shield.xml',
+ 'Geometry/MuonCommonData/data/muonYoke/2026/v3/muonYoke.xml',
+ 'Geometry/MuonCommonData/data/mf/2026/v8/mf.xml',
+ 'Geometry/MuonCommonData/data/csc/2021/v2/csc.xml',
+ 'Geometry/MuonCommonData/data/rpcf/2026/v3/rpcf.xml',
+ 'Geometry/MuonCommonData/data/gemf/TDR_BaseLine/gemf.xml',
+ 'Geometry/MuonCommonData/data/gem11/TDR_BaseLine/gem11.xml',
+ 'Geometry/MuonCommonData/data/gem21/TDR_Eta16/gem21.xml',
+ 'Geometry/MuonCommonData/data/mfshield/2026/v6/mfshield.xml',
+ 'Geometry/MuonCommonData/data/ge0/TDR_Dev/v4/ge0.xml',
+ 'Geometry/MuonCommonData/data/ge0shield/2026/v1/ge0shield.xml',
+ 'Geometry/ForwardCommonData/data/forwardshield/2026/v4/forwardshield.xml',
+ 'Geometry/ForwardCommonData/data/brmrotations.xml',
+ 'Geometry/ForwardCommonData/data/brm/2026/v1/brm.xml',
+ 'Geometry/ForwardCommonData/data/zdcmaterials/2021/v1/zdcmaterials.xml',
+ 'Geometry/ForwardCommonData/data/lumimaterials.xml',
+ 'Geometry/ForwardCommonData/data/zdcrotations.xml',
+ 'Geometry/ForwardCommonData/data/lumirotations.xml',
+ 'Geometry/ForwardCommonData/data/zdc/2026/v1/zdc.xml',
+ 'Geometry/ForwardCommonData/data/zdclumi/2021/v2/zdclumi.xml',
+ 'Geometry/ForwardCommonData/data/cmszdc.xml',
+ 'Geometry/MTDCommonData/data/mtdMaterial/v3/mtdMaterial.xml',
+ 'Geometry/MTDCommonData/data/btl/v1/btl.xml',
+ 'Geometry/MTDCommonData/data/etl/v7/etl.xml',
+ 'Geometry/MTDCommonData/data/mtdParameters/v3/mtdStructureTopology.xml',
+ 'Geometry/MTDCommonData/data/mtdParameters/v2/mtdParameters.xml',
+ )+
+ cms.vstring(
+ 'Geometry/MuonCommonData/data/muonNumbering/TDR_DeV/v5/muonNumbering.xml',
+ 'Geometry/EcalSimData/data/PhaseII/ecalsens.xml',
+ 'Geometry/HcalCommonData/data/hcalsens/NoHE/hcalsenspmf.xml',
+ 'Geometry/HcalSimData/data/hf.xml',
+ 'Geometry/HcalSimData/data/hfpmt.xml',
+ 'Geometry/HcalSimData/data/hffibrebundle.xml',
+ 'Geometry/HcalSimData/data/CaloUtil/2026/v2c/CaloUtil.xml',
+ 'Geometry/HGCalSimData/data/hgcsensv15.xml',
+ 'Geometry/MuonSimData/data/PhaseII/v2/muonSens.xml',
+ 'Geometry/DTGeometryBuilder/data/dtSpecsFilter/2021/v1/dtSpecsFilter.xml',
+ 'Geometry/CSCGeometryBuilder/data/cscSpecsFilter.xml',
+ 'Geometry/CSCGeometryBuilder/data/cscSpecs.xml',
+ 'Geometry/RPCGeometryBuilder/data/2026/v1/RPCSpecs.xml',
+ 'Geometry/GEMGeometryBuilder/data/v12/GEMSpecsFilter.xml',
+ 'Geometry/GEMGeometryBuilder/data/v12/GEMSpecs.xml',
+ 'Geometry/ForwardCommonData/data/brmsens.xml',
+ 'Geometry/ForwardSimData/data/zdcsens.xml',
+ 'Geometry/MTDSimData/data/v2/mtdsens.xml',
+ 'Geometry/HcalSimData/data/HcalProdCuts/2026/v1/HcalProdCuts.xml',
+ 'Geometry/EcalSimData/data/EcalProdCuts.xml',
+ 'Geometry/HGCalSimData/data/hgcProdCutsv15.xml',
+ 'Geometry/MuonSimData/data/muonProdCuts/2026/v2/muonProdCuts.xml',
+ 'Geometry/ForwardSimData/data/zdcProdCuts/2021/v2/zdcProdCuts.xml',
+ 'Geometry/ForwardSimData/data/ForwardShieldProdCuts.xml',
+ 'Geometry/MTDSimData/data/v2/mtdProdCuts.xml',
+ 'Geometry/CMSCommonData/data/FieldParameters.xml',
+ ),
+ rootNodeName = cms.string('cms:OCMS')
+)
diff --git a/Geometry/CommonDetUnit/interface/DoubleSensGeomDet.h b/Geometry/CommonDetUnit/interface/DoubleSensGeomDet.h
new file mode 100644
index 0000000000000..255373d496e6e
--- /dev/null
+++ b/Geometry/CommonDetUnit/interface/DoubleSensGeomDet.h
@@ -0,0 +1 @@
+#include "Geometry/CommonTopologies/interface/DoubleSensGeomDet.h"
diff --git a/Geometry/CommonTopologies/interface/DoubleSensGeomDet.h b/Geometry/CommonTopologies/interface/DoubleSensGeomDet.h
new file mode 100644
index 0000000000000..a827f30ec79b8
--- /dev/null
+++ b/Geometry/CommonTopologies/interface/DoubleSensGeomDet.h
@@ -0,0 +1,30 @@
+#ifndef Geometry_CommonTopologies_DoubleSensGeomDet_H
+#define Geometry_CommonTopologies_DoubleSensGeomDet_H
+
+#include "Geometry/CommonTopologies/interface/TrackerGeomDet.h"
+#include "DataFormats/DetId/interface/DetId.h"
+
+class DoubleSensGeomDet : public TrackerGeomDet {
+public:
+ DoubleSensGeomDet(BoundPlane* sp,
+ const GeomDetUnit* firstDet,
+ const GeomDetUnit* secondDet,
+ const DetId doubleSensDetId);
+
+ ~DoubleSensGeomDet() override;
+
+ bool isLeaf() const override { return false; }
+ std::vector components() const override;
+
+ // Which subdetector
+ SubDetector subDetector() const override { return theFirstDet->subDetector(); };
+
+ const GeomDetUnit* firstDet() const { return theFirstDet; };
+ const GeomDetUnit* secondDet() const { return theSecondDet; };
+
+private:
+ const GeomDetUnit* theFirstDet;
+ const GeomDetUnit* theSecondDet;
+};
+
+#endif
diff --git a/Geometry/CommonTopologies/src/DoubleSensGeomDet.cc b/Geometry/CommonTopologies/src/DoubleSensGeomDet.cc
new file mode 100644
index 0000000000000..22e5c713f7dae
--- /dev/null
+++ b/Geometry/CommonTopologies/src/DoubleSensGeomDet.cc
@@ -0,0 +1,15 @@
+#include "Geometry/CommonTopologies/interface/DoubleSensGeomDet.h"
+
+DoubleSensGeomDet::DoubleSensGeomDet(BoundPlane* sp,
+ const GeomDetUnit* firstDet,
+ const GeomDetUnit* secondDet,
+ const DetId doubleSensDetId)
+ : TrackerGeomDet(sp), theFirstDet(firstDet), theSecondDet(secondDet) {
+ setDetId(doubleSensDetId);
+}
+
+DoubleSensGeomDet::~DoubleSensGeomDet() {}
+
+std::vector DoubleSensGeomDet::components() const {
+ return std::vector{theFirstDet, theSecondDet};
+}
diff --git a/Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixel.xml b/Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixel.xml
new file mode 100644
index 0000000000000..ac3311d6e177b
--- /dev/null
+++ b/Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixel.xml
@@ -0,0 +1,14009 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 0*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 2.75*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, -4*mm
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0*mm, 0*mm, 4*mm
+
+
+
+
+
+
diff --git a/Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelStructureTopology.xml b/Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelStructureTopology.xml
new file mode 100644
index 0000000000000..0bd692996bffe
--- /dev/null
+++ b/Geometry/TrackerCommonData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelStructureTopology.xml
@@ -0,0 +1,756 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Geometry/TrackerCommonData/data/PhaseII/trackerParameters.xml b/Geometry/TrackerCommonData/data/PhaseII/trackerParameters.xml
index ef2d2b52e0f1a..abf3e518f26f4 100644
--- a/Geometry/TrackerCommonData/data/PhaseII/trackerParameters.xml
+++ b/Geometry/TrackerCommonData/data/PhaseII/trackerParameters.xml
@@ -4,8 +4,8 @@
80, 52, 0, 0, 2, 8
-
- 20, 12, 2, 0xF, 0xFF, 0x3FF
+
+ 20, 12, 2, 0, 0xF, 0xFF, 0x3FF, 0x3
23, 18, 12, 10, 2, 0x3, 0xF, 0x3F, 0x3, 0xFF
diff --git a/Geometry/TrackerGeometryBuilder/src/TrackerGeomBuilderFromGeometricDet.cc b/Geometry/TrackerGeometryBuilder/src/TrackerGeomBuilderFromGeometricDet.cc
index f995eeb14ad41..b464a094b4323 100644
--- a/Geometry/TrackerGeometryBuilder/src/TrackerGeomBuilderFromGeometricDet.cc
+++ b/Geometry/TrackerGeometryBuilder/src/TrackerGeomBuilderFromGeometricDet.cc
@@ -4,6 +4,7 @@
#include "Geometry/CommonDetUnit/interface/GeomDet.h"
#include "Geometry/CommonDetUnit/interface/GluedGeomDet.h"
#include "Geometry/CommonDetUnit/interface/StackGeomDet.h"
+#include "Geometry/CommonDetUnit/interface/DoubleSensGeomDet.h"
#include "Geometry/CommonDetUnit/interface/PixelGeomDetType.h"
#include "Geometry/CommonDetUnit/interface/PixelGeomDetUnit.h"
#include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetType.h"
@@ -233,8 +234,9 @@ void TrackerGeomBuilderFromGeometricDet::buildGeomDet(TrackerGeometry* tracker)
string gduTypeName = gdu[i]->type().name();
//this step is time consuming >> TO FIX with a MAP?
- if ((gduTypeName.find("Ster") != std::string::npos || gduTypeName.find("Lower") != std::string::npos) &&
- (theTopo->glued(gduId[i]) != 0 || theTopo->stack(gduId[i]) != 0)) {
+ if ((gduTypeName.find("Ster") != std::string::npos || gduTypeName.find("Lower") != std::string::npos ||
+ gduTypeName.find("One") != std::string::npos) &&
+ (theTopo->glued(gduId[i]) != 0 || theTopo->stack(gduId[i]) != 0 || theTopo->doubleSensor(gduId[i]))) {
int partner_pos = -1;
for (u_int32_t jj = 0; jj < gduId.size(); jj++) {
if (theTopo->partnerDetId(gduId[i]) == gduId[jj]) {
@@ -267,6 +269,13 @@ void TrackerGeomBuilderFromGeometricDet::buildGeomDet(TrackerGeometry* tracker)
StackGeomDet* stackDet = new StackGeomDet(&(*plane), dus, dum, composedDetId);
tracker->addDet((GeomDet*)stackDet);
tracker->addDetId(composedDetId);
+ } else if (gduTypeName.find("One") != std::string::npos) {
+ //The plane is *not* built in the middle, but on the First surface
+ Plane* plane = new Plane(dus->surface());
+ composedDetId = theTopo->doubleSensor(gduId[i]);
+ DoubleSensGeomDet* doubleSensDet = new DoubleSensGeomDet(&(*plane), dus, dum, composedDetId);
+ tracker->addDet((GeomDet*)doubleSensDet);
+ tracker->addDetId(composedDetId);
}
}
}
diff --git a/Geometry/TrackerGeometryBuilder/src/TrackerGeometry.cc b/Geometry/TrackerGeometryBuilder/src/TrackerGeometry.cc
index 1c6cc137d003f..adfe93b625b69 100644
--- a/Geometry/TrackerGeometryBuilder/src/TrackerGeometry.cc
+++ b/Geometry/TrackerGeometryBuilder/src/TrackerGeometry.cc
@@ -278,6 +278,10 @@ TrackerGeometry::ModuleType TrackerGeometry::moduleType(const std::string& name)
return ModuleType::Ph2PXB;
} else if (name.find("InnerPixel3DActive") != std::string::npos) {
return ModuleType::Ph2PXB3D;
+ } else if (name.find("InnerPixel3DOneActive") != std::string::npos) {
+ return ModuleType::Ph2PXB3D;
+ } else if (name.find("InnerPixel3DTwoActive") != std::string::npos) {
+ return ModuleType::Ph2PXB3D;
}
}
// forward
@@ -286,6 +290,10 @@ TrackerGeometry::ModuleType TrackerGeometry::moduleType(const std::string& name)
return ModuleType::Ph2PXF;
} else if (name.find("InnerPixel3DActive") != std::string::npos) {
return ModuleType::Ph2PXF3D;
+ } else if (name.find("InnerPixel3DOneActive") != std::string::npos) {
+ return ModuleType::Ph2PXB3D;
+ } else if (name.find("InnerPixel3DTwoActive") != std::string::npos) {
+ return ModuleType::Ph2PXB3D;
}
}
}
diff --git a/Geometry/TrackerNumberingBuilder/interface/GeometricDet.h b/Geometry/TrackerNumberingBuilder/interface/GeometricDet.h
index b4a99f34e046d..41b447f06dc4e 100644
--- a/Geometry/TrackerNumberingBuilder/interface/GeometricDet.h
+++ b/Geometry/TrackerNumberingBuilder/interface/GeometricDet.h
@@ -68,6 +68,7 @@ class GeometricDet {
PixelPhase1Barrel = 101,
PixelPhase1EndCap = 102,
PixelPhase1Disk = 117,
+ ITPhase2Combined = 180,
OTPhase2EndCap = 204,
OTPhase2Barrel = 205,
OTPhase2Layer = 208,
@@ -138,6 +139,8 @@ class GeometricDet {
bool stereo() const { return stereo_; }
bool isLowerSensor() const { return isLowerSensor_; }
bool isUpperSensor() const { return isUpperSensor_; }
+ bool isFirstSensor() const { return isFirstSensor_; }
+ bool isSecondSensor() const { return isSecondSensor_; }
double siliconAPVNum() const { return siliconAPVNum_; }
// DETECTOR DESCRIPTION ORIGIN INFO
@@ -195,6 +198,8 @@ class GeometricDet {
bool stereo_ = false;
bool isLowerSensor_ = false;
bool isUpperSensor_ = false;
+ bool isFirstSensor_ = false;
+ bool isSecondSensor_ = false;
double siliconAPVNum_ = 0.;
bool isFromDD4hep_ = false;
diff --git a/Geometry/TrackerNumberingBuilder/plugins/CmsDetConstruction.cc b/Geometry/TrackerNumberingBuilder/plugins/CmsDetConstruction.cc
index 449b1344c0ac7..6da97e59f249f 100644
--- a/Geometry/TrackerNumberingBuilder/plugins/CmsDetConstruction.cc
+++ b/Geometry/TrackerNumberingBuilder/plugins/CmsDetConstruction.cc
@@ -43,6 +43,26 @@ void CmsDetConstruction::buildSmallDetsforStack(FilteredView& fv,
mother->addComponent(det);
}
+template
+void CmsDetConstruction::buildSmallDetsfor3D(FilteredView& fv,
+ GeometricDet* mother,
+ const std::string& attribute) {
+ GeometricDet* det = new GeometricDet(&fv,
+ CmsTrackerLevelBuilder::theCmsTrackerStringToEnum.type(
+ ExtractStringFromDDD::getString(attribute, &fv)));
+
+ if (det->isFirstSensor()) {
+ uint32_t temp = 1;
+ det->setGeographicalID(DetId(temp));
+ } else if (det->isSecondSensor()) {
+ uint32_t temp = 2;
+ det->setGeographicalID(DetId(temp));
+ } else {
+ edm::LogError("DetConstruction") << " module defined in a 3D module but not first or second sensor!? ";
+ }
+ mother->addComponent(det);
+}
+
/*
* OLD DD.
* Module with 2 sensors: calculate the sensor local ID, and add the sensor to its mother volume (module).
@@ -63,9 +83,10 @@ void CmsDetConstruction::buildComponent(DDFilteredView& fv,
const bool isPhase1ModuleWith2Sensors = (myTopologicalType == GeometricDet::mergedDet);
const bool isPhase2ModuleWith2Sensors = (myTopologicalType == GeometricDet::OTPhase2Stack);
+ const bool isPhase2BarrelModuleWith2Sensors = (myTopologicalType == GeometricDet::ITPhase2Combined);
// CASE A: MODULE HAS 2 SENSORS
- if (isPhase1ModuleWith2Sensors || isPhase2ModuleWith2Sensors) {
+ if (isPhase1ModuleWith2Sensors || isPhase2ModuleWith2Sensors || isPhase2BarrelModuleWith2Sensors) {
// Go down in hierarchy: from module to sensor
bool dodets = fv.firstChild(); // very important
while (dodets) {
@@ -76,6 +97,8 @@ void CmsDetConstruction::buildComponent(DDFilteredView& fv,
// PHASE 2 (STACKDET)
else if (isPhase2ModuleWith2Sensors) {
buildSmallDetsforStack(fv, det, attribute);
+ } else if (isPhase2BarrelModuleWith2Sensors) {
+ buildSmallDetsfor3D(fv, det, attribute);
}
dodets = fv.nextSibling();
@@ -110,9 +133,10 @@ void CmsDetConstruction::buildComponent(cms::DDFilteredView
const bool isPhase1ModuleWith2Sensors = (myTopologicalType == GeometricDet::mergedDet);
const bool isPhase2ModuleWith2Sensors = (myTopologicalType == GeometricDet::OTPhase2Stack);
+ const bool isPhase2BarrelModuleWith2Sensors = (myTopologicalType == GeometricDet::ITPhase2Combined);
// CASE A: MODULE HAS 2 SENSORS
- if (isPhase1ModuleWith2Sensors || isPhase2ModuleWith2Sensors) {
+ if (isPhase1ModuleWith2Sensors || isPhase2ModuleWith2Sensors || isPhase2BarrelModuleWith2Sensors) {
// Go down in hierarchy: from module to sensor
if (!fv.firstChild()) { // very important
edm::LogError("CmsDetConstruction::buildComponent. Cannot go down to sensor volume.");
@@ -131,6 +155,8 @@ void CmsDetConstruction::buildComponent(cms::DDFilteredView
// PHASE 2 (STACKDET)
else if (isPhase2ModuleWith2Sensors) {
buildSmallDetsforStack(fv, det, attribute);
+ } else if (isPhase2BarrelModuleWith2Sensors) {
+ buildSmallDetsfor3D(fv, det, attribute);
}
// Go to the next volume in FilteredView.
diff --git a/Geometry/TrackerNumberingBuilder/plugins/CmsDetConstruction.h b/Geometry/TrackerNumberingBuilder/plugins/CmsDetConstruction.h
index 2e61ed508faca..e049ba7d7ef05 100644
--- a/Geometry/TrackerNumberingBuilder/plugins/CmsDetConstruction.h
+++ b/Geometry/TrackerNumberingBuilder/plugins/CmsDetConstruction.h
@@ -17,6 +17,7 @@ class CmsDetConstruction : public CmsTrackerLevelBuilder {
void buildDets(const FilteredView&, GeometricDet*, const std::string&);
void buildSmallDetsforGlued(FilteredView&, GeometricDet*, const std::string&);
void buildSmallDetsforStack(FilteredView&, GeometricDet*, const std::string&);
+ void buildSmallDetsfor3D(FilteredView&, GeometricDet*, const std::string&);
};
#endif // Geometry_TrackerNumberingBuilder_CmsDetConstruction_H
diff --git a/Geometry/TrackerNumberingBuilder/plugins/DDDCmsTrackerContruction.cc b/Geometry/TrackerNumberingBuilder/plugins/DDDCmsTrackerContruction.cc
index a8ab8fb685c90..25f91f70a8670 100644
--- a/Geometry/TrackerNumberingBuilder/plugins/DDDCmsTrackerContruction.cc
+++ b/Geometry/TrackerNumberingBuilder/plugins/DDDCmsTrackerContruction.cc
@@ -148,6 +148,8 @@ void DDDCmsTrackerContruction::printAllTrackerGeometricDets(const GeometricDet*
outputFile << "myDet->stereo() = " << myDet->stereo() << std::endl;
outputFile << "myDet->isLowerSensor() = " << myDet->isLowerSensor() << std::endl;
outputFile << "myDet->isUpperSensor() = " << myDet->isUpperSensor() << std::endl;
+ outputFile << "myDet->isFirstSensor() = " << myDet->isFirstSensor() << std::endl;
+ outputFile << "myDet->isSecondSensor() = " << myDet->isSecondSensor() << std::endl;
outputFile << "myDet->siliconAPVNum() = " << myDet->siliconAPVNum() << std::endl;
}
}
diff --git a/Geometry/TrackerNumberingBuilder/plugins/TrackerTopologyEP.cc b/Geometry/TrackerNumberingBuilder/plugins/TrackerTopologyEP.cc
index c042c51d0d264..a090a70fb6fad 100644
--- a/Geometry/TrackerNumberingBuilder/plugins/TrackerTopologyEP.cc
+++ b/Geometry/TrackerNumberingBuilder/plugins/TrackerTopologyEP.cc
@@ -70,12 +70,23 @@ void TrackerTopologyEP::fillParameters(const PTrackerParameters& ptp,
TrackerTopology::TIBValues& tibVals,
TrackerTopology::TIDValues& tidVals,
TrackerTopology::TOBValues& tobVals) {
- pxbVals.layerStartBit_ = ptp.vitems[0].vpars[0]; // 16
- pxbVals.ladderStartBit_ = ptp.vitems[0].vpars[1]; // 8
- pxbVals.moduleStartBit_ = ptp.vitems[0].vpars[2]; // 2
- pxbVals.layerMask_ = ptp.vitems[0].vpars[3]; // 0xF
- pxbVals.ladderMask_ = ptp.vitems[0].vpars[4]; // 0xFF
- pxbVals.moduleMask_ = ptp.vitems[0].vpars[5]; // 0x3F
+ if (ptp.vitems[0].vpars.size() > 6) { //Phase 2: extra hierarchy level for 3D sensors
+ pxbVals.layerStartBit_ = ptp.vitems[0].vpars[0]; // 16
+ pxbVals.ladderStartBit_ = ptp.vitems[0].vpars[1]; // 8
+ pxbVals.moduleStartBit_ = ptp.vitems[0].vpars[2]; // 2
+ pxbVals.doubleStartBit_ = ptp.vitems[0].vpars[3]; // 0
+ pxbVals.layerMask_ = ptp.vitems[0].vpars[4]; // 0xF
+ pxbVals.ladderMask_ = ptp.vitems[0].vpars[5]; // 0xFF
+ pxbVals.moduleMask_ = ptp.vitems[0].vpars[6]; // 0x3F
+ pxbVals.doubleMask_ = ptp.vitems[0].vpars[7]; // 0x3
+ } else { //Phase 1
+ pxbVals.layerStartBit_ = ptp.vitems[0].vpars[0]; // 16
+ pxbVals.ladderStartBit_ = ptp.vitems[0].vpars[1]; // 8
+ pxbVals.moduleStartBit_ = ptp.vitems[0].vpars[2]; // 2
+ pxbVals.layerMask_ = ptp.vitems[0].vpars[3]; // 0xF
+ pxbVals.ladderMask_ = ptp.vitems[0].vpars[4]; // 0xFF
+ pxbVals.moduleMask_ = ptp.vitems[0].vpars[5]; // 0x3F
+ }
if (ptp.vitems[1].vpars.size() >
11) { //Tracker with subdisk hierarchy level (additional hierarchy level wrt original)
diff --git a/Geometry/TrackerNumberingBuilder/src/CmsTrackerStringToEnum.cc b/Geometry/TrackerNumberingBuilder/src/CmsTrackerStringToEnum.cc
index 4ab5c08965341..81c41128ee60f 100644
--- a/Geometry/TrackerNumberingBuilder/src/CmsTrackerStringToEnum.cc
+++ b/Geometry/TrackerNumberingBuilder/src/CmsTrackerStringToEnum.cc
@@ -22,7 +22,8 @@ CmsTrackerStringToEnum::Impl::Impl() {
_map.insert(std::pair("Phase2OTBarrelPanel", GeometricDet::panel));
_map.insert(
std::pair("Phase2OTBarrelStack", GeometricDet::OTPhase2Stack));
-
+ _map.insert(std::pair("Phase2ITBarrelCombined",
+ GeometricDet::ITPhase2Combined));
_map.insert(std::pair("PixelEndcapSubDet", GeometricDet::PixelEndCap));
_map.insert(std::pair("PixelEndcapDisk", GeometricDet::disk));
_map.insert(std::pair("PixelEndcapPanel", GeometricDet::panel));
@@ -103,6 +104,8 @@ CmsTrackerStringToEnum::Impl::Impl() {
_reverseMap.insert(std::pair(GeometricDet::OTPhase2EndCap, "TID"));
_reverseMap.insert(std::pair(GeometricDet::OTPhase2Wheel, "Wheel"));
_reverseMap.insert(std::pair(GeometricDet::OTPhase2Stack, "Stack"));
+ _reverseMap.insert(
+ std::pair(GeometricDet::ITPhase2Combined, "Combined"));
_reverseMap.insert(std::pair(GeometricDet::strng, "String"));
_reverseMap.insert(std::pair(GeometricDet::rod, "Rod"));
_reverseMap.insert(std::pair(GeometricDet::petal, "Petal"));
diff --git a/Geometry/TrackerNumberingBuilder/src/GeometricDet.cc b/Geometry/TrackerNumberingBuilder/src/GeometricDet.cc
index 1000033349137..e784dcfe88977 100644
--- a/Geometry/TrackerNumberingBuilder/src/GeometricDet.cc
+++ b/Geometry/TrackerNumberingBuilder/src/GeometricDet.cc
@@ -96,6 +96,8 @@ GeometricDet::GeometricDet(DDFilteredView* fv, GeometricEnumType type)
stereo_ = (getString("TrackerStereoDetectors", *fv) == strue);
isLowerSensor_ = (getString("TrackerLowerDetectors", *fv) == strue);
isUpperSensor_ = (getString("TrackerUpperDetectors", *fv) == strue);
+ isFirstSensor_ = (getString("TrackerFirstDetectors", *fv) == strue);
+ isSecondSensor_ = (getString("TrackerSecondDetectors", *fv) == strue);
siliconAPVNum_ = getDouble("SiliconAPVNumber", *fv);
}
}
@@ -135,6 +137,8 @@ GeometricDet::GeometricDet(cms::DDFilteredView* fv, GeometricEnumType type)
// Phase 2 OT sensors only (NB: hence could add a branch here, but not a critical part on perf)
isLowerSensor_ = (fv->get("TrackerLowerDetectors") == strue);
isUpperSensor_ = (fv->get("TrackerUpperDetectors") == strue);
+ isFirstSensor_ = (fv->get("TrackerFirstDetectors") == strue);
+ isSecondSensor_ = (fv->get("TrackerSecondDetectors") == strue);
// All sensors: IT or OT, Phase 1 or Phase 2 (NB: critical part on perf)
fv->findSpecPar("TrackerRadLength", "TrackerXi");
diff --git a/Geometry/TrackerRecoData/data/PhaseII/Tracker_DD4hep_compatible_IT710_2023_04/trackerRecoMaterial.xml b/Geometry/TrackerRecoData/data/PhaseII/Tracker_DD4hep_compatible_IT710_2023_04/trackerRecoMaterial.xml
new file mode 100644
index 0000000000000..3076e8e5e25c3
--- /dev/null
+++ b/Geometry/TrackerRecoData/data/PhaseII/Tracker_DD4hep_compatible_IT710_2023_04/trackerRecoMaterial.xml
@@ -0,0 +1,540 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Geometry/TrackerRecoData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/trackerRecoMaterial.xml b/Geometry/TrackerRecoData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/trackerRecoMaterial.xml
new file mode 100644
index 0000000000000..b537750e5fdfc
--- /dev/null
+++ b/Geometry/TrackerRecoData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/trackerRecoMaterial.xml
@@ -0,0 +1,540 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelProdCuts.xml b/Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelProdCuts.xml
new file mode 100644
index 0000000000000..57a44841b30d5
--- /dev/null
+++ b/Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelProdCuts.xml
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelsens.xml b/Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelsens.xml
new file mode 100644
index 0000000000000..b66e0d892908f
--- /dev/null
+++ b/Geometry/TrackerSimData/data/PhaseII/Tracker_DD4hep_compatible_IT711_2023_05/pixelsens.xml
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RecoTracker/MeasurementDet/plugins/MeasurementTrackerImpl.cc b/RecoTracker/MeasurementDet/plugins/MeasurementTrackerImpl.cc
index bd7c54e22fa4f..0a7472679aa48 100644
--- a/RecoTracker/MeasurementDet/plugins/MeasurementTrackerImpl.cc
+++ b/RecoTracker/MeasurementDet/plugins/MeasurementTrackerImpl.cc
@@ -7,6 +7,7 @@
#include "Geometry/CommonDetUnit/interface/GeomDet.h"
#include "Geometry/CommonDetUnit/interface/GluedGeomDet.h"
#include "Geometry/CommonDetUnit/interface/StackGeomDet.h"
+#include "Geometry/CommonDetUnit/interface/DoubleSensGeomDet.h"
#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
#include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
@@ -33,6 +34,7 @@
#include "TkPhase2OTMeasurementDet.h"
#include "TkGluedMeasurementDet.h"
#include "TkStackMeasurementDet.h"
+#include "TkDoubleSensMeasurementDet.h"
#include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
#include "CondFormats/DataRecord/interface/SiStripNoisesRcd.h"
@@ -172,6 +174,11 @@ void MeasurementTrackerImpl::initialize(const TrackerTopology* trackerTopology)
for (unsigned int i = 0; i != theStackDets.size(); ++i)
initStackDet(theStackDets[i]);
+ // and then the double sensor dets
+ sortTKD(theDoubleSensGeomDets);
+ for (unsigned int i = 0; i != theDoubleSensGeomDets.size(); ++i)
+ initDoubleSensDet(theDoubleSensGeomDets[i]);
+
if (!checkDets())
throw MeasurementDetException("Number of dets in MeasurementTracker not consistent with TrackerGeometry!");
}
@@ -235,14 +242,19 @@ void MeasurementTrackerImpl::addDets(const TrackingGeometry::DetContainer& dets,
//Glued or Stack GeomDet
const GluedGeomDet* gluedDet = dynamic_cast(*gd);
const StackGeomDet* stackDet = dynamic_cast(*gd);
+ const DoubleSensGeomDet* doubleSensGeomDet = dynamic_cast(*gd);
- if ((gluedDet == nullptr && stackDet == nullptr) || (gluedDet != nullptr && stackDet != nullptr)) {
- throw MeasurementDetException("MeasurementTracker ERROR: GeomDet neither DetUnit nor GluedDet nor StackDet");
+ if ((gluedDet == nullptr && stackDet == nullptr && doubleSensGeomDet == nullptr) ||
+ (gluedDet != nullptr && stackDet != nullptr && doubleSensGeomDet != nullptr)) {
+ throw MeasurementDetException(
+ "MeasurementTracker ERROR: GeomDet neither DetUnit nor GluedDet nor StackDet nor DoubleSensGeomDet");
}
if (gluedDet != nullptr)
addGluedDet(gluedDet);
- else
+ else if (stackDet != nullptr)
addStackDet(stackDet);
+ else
+ addDoubleSensGeomDet(doubleSensGeomDet);
}
}
}
@@ -287,6 +299,10 @@ void MeasurementTrackerImpl::addStackDet(const StackGeomDet* gd) {
theStackDets.push_back(TkStackMeasurementDet(gd, thePxDetConditions.pixelCPE()));
}
+void MeasurementTrackerImpl::addDoubleSensGeomDet(const DoubleSensGeomDet* gd) {
+ theDoubleSensGeomDets.push_back(TkDoubleSensMeasurementDet(gd, thePxDetConditions.pixelCPE()));
+}
+
void MeasurementTrackerImpl::initGluedDet(TkGluedMeasurementDet& det, const TrackerTopology* trackerTopology) {
const GluedGeomDet& gd = det.specificGeomDet();
const MeasurementDet* monoDet = findDet(gd.monoDet()->geographicalId());
@@ -311,6 +327,19 @@ void MeasurementTrackerImpl::initStackDet(TkStackMeasurementDet& det) {
theDetMap[gd.geographicalId()] = &det;
}
+void MeasurementTrackerImpl::initDoubleSensDet(TkDoubleSensMeasurementDet& det) {
+ const DoubleSensGeomDet& gd = det.specificGeomDet();
+ const MeasurementDet* firstDet = findDet(gd.firstDet()->geographicalId());
+ const MeasurementDet* secondDet = findDet(gd.secondDet()->geographicalId());
+ if (firstDet == nullptr || secondDet == nullptr) {
+ edm::LogError("MeasurementDet")
+ << "MeasurementTracker ERROR: DoubleSensDet components not found as MeasurementDets ";
+ throw MeasurementDetException("MeasurementTracker ERROR: DoubleSensDet components not found as MeasurementDets");
+ }
+ det.init(firstDet, secondDet);
+ theDetMap[gd.geographicalId()] = &det;
+}
+
void MeasurementTrackerImpl::initializeStripStatus(const BadStripCutsDet& badStripCuts,
const SiStripQuality* quality,
int qualityFlags,
diff --git a/RecoTracker/MeasurementDet/plugins/MeasurementTrackerImpl.h b/RecoTracker/MeasurementDet/plugins/MeasurementTrackerImpl.h
index 7794f31e5fe94..10c54eb529158 100644
--- a/RecoTracker/MeasurementDet/plugins/MeasurementTrackerImpl.h
+++ b/RecoTracker/MeasurementDet/plugins/MeasurementTrackerImpl.h
@@ -28,10 +28,12 @@ class TkPixelMeasurementDet;
class TkPhase2OTMeasurementDet;
class TkGluedMeasurementDet;
class TkStackMeasurementDet;
+class TkDoubleSensMeasurementDet;
class GeometricSearchTracker;
class SiStripRecHitMatcher;
class GluedGeomDet;
class StackGeomDet;
+class DoubleSensGeomDet;
class SiPixelFedCabling;
class TrackerGeometry;
@@ -100,6 +102,7 @@ class dso_hidden MeasurementTrackerImpl final : public MeasurementTracker {
const std::vector& pixelDets() const { return thePixelDets; }
const std::vector& gluedDets() const { return theGluedDets; }
const std::vector& stackDets() const { return theStackDets; }
+ const std::vector& doubleSensGeomDets() const { return theDoubleSensGeomDets; }
const StMeasurementConditionSet& stripDetConditions() const override { return theStDetConditions; }
const PxMeasurementConditionSet& pixelDetConditions() const override { return thePxDetConditions; }
@@ -117,6 +120,7 @@ class dso_hidden MeasurementTrackerImpl final : public MeasurementTracker {
std::vector thePhase2Dets;
std::vector theGluedDets;
std::vector theStackDets;
+ std::vector theDoubleSensGeomDets;
const SiPixelFedCabling* thePixelCabling;
@@ -131,9 +135,11 @@ class dso_hidden MeasurementTrackerImpl final : public MeasurementTracker {
void addGluedDet(const GluedGeomDet* gd);
void addStackDet(const StackGeomDet* gd);
+ void addDoubleSensGeomDet(const DoubleSensGeomDet* gd);
void initGluedDet(TkGluedMeasurementDet& det, const TrackerTopology* trackerTopology);
void initStackDet(TkStackMeasurementDet& det);
+ void initDoubleSensDet(TkDoubleSensMeasurementDet& det);
void addDets(const TrackingGeometry::DetContainer& dets, bool subIsPixel, bool subIsOT);
diff --git a/RecoTracker/MeasurementDet/plugins/TkDoubleSensMeasurementDet.cc b/RecoTracker/MeasurementDet/plugins/TkDoubleSensMeasurementDet.cc
new file mode 100644
index 0000000000000..b2c9b882c07f6
--- /dev/null
+++ b/RecoTracker/MeasurementDet/plugins/TkDoubleSensMeasurementDet.cc
@@ -0,0 +1,105 @@
+#include "TkDoubleSensMeasurementDet.h"
+
+#include "TrackingTools/MeasurementDet/interface/MeasurementDetException.h"
+
+using namespace std;
+
+TkDoubleSensMeasurementDet::TkDoubleSensMeasurementDet(const DoubleSensGeomDet* gdet,
+ const PixelClusterParameterEstimator* cpe)
+ : MeasurementDet(gdet), thePixelCPE(cpe), theFirstDet(nullptr), theSecondDet(nullptr) {}
+
+void TkDoubleSensMeasurementDet::init(const MeasurementDet* firstDet, const MeasurementDet* secondDet) {
+ theFirstDet = dynamic_cast(firstDet);
+ theSecondDet = dynamic_cast(secondDet);
+
+ if ((theFirstDet == nullptr) || (theSecondDet == nullptr)) {
+ throw MeasurementDetException(
+ "TkDoubleSensMeasurementDet ERROR: Trying to glue a det which is not a TkPixelMeasurementDet");
+ }
+}
+
+TkDoubleSensMeasurementDet::RecHitContainer TkDoubleSensMeasurementDet::recHits(
+ const TrajectoryStateOnSurface& ts, const MeasurementTrackerEvent& data) const {
+ RecHitContainer result;
+
+ if (data.pixelData().handle()->data().empty())
+ return result;
+ LogTrace("MeasurementTracker") << " is not empty";
+ if (!isActive(data))
+ return result;
+ LogTrace("MeasurementTracker") << " and is active";
+
+ //find clusters to skip
+ const detset& firstDetSet = data.pixelData().detSet(firstDet()->index());
+ const detset& secondDetSet = data.pixelData().detSet(secondDet()->index());
+ std::vector skipClustersUpper(data.pixelClustersToSkip().empty() ? 0 : secondDetSet.size(), false);
+ std::vector skipClustersLower(data.pixelClustersToSkip().empty() ? 0 : firstDetSet.size(), false);
+
+ const SiPixelCluster* begin = nullptr;
+ if (!data.pixelData().handle()->data().empty()) {
+ begin = &(data.pixelData().handle()->data().front());
+ }
+ if (!data.pixelClustersToSkip().empty()) {
+ if (!firstDetSet.empty()) {
+ for (const_iterator cil = firstDetSet.begin(); cil != firstDetSet.end(); ++cil) {
+ if (cil < begin) {
+ edm::LogError("IndexMisMatch") << "TkDoubleSensMeasurementDet cannot create hit because of index mismatch.";
+ return result;
+ }
+ unsigned int indexl = cil - begin;
+ if (data.pixelClustersToSkip()[indexl]) {
+ int iLocalL = std::distance(firstDetSet.begin(), cil);
+ skipClustersLower[iLocalL] = true;
+ }
+ }
+ }
+ if (!secondDetSet.empty()) {
+ for (const_iterator ciu = secondDetSet.begin(); ciu != secondDetSet.end(); ++ciu) {
+ if (ciu < begin) {
+ edm::LogError("IndexMisMatch") << "TkDoubleSensMeasurementDet cannot create hit because of index mismatch.";
+ return result;
+ }
+ unsigned int indexu = ciu - begin;
+ if (data.pixelClustersToSkip()[indexu]) {
+ int iLocalU = std::distance(secondDetSet.begin(), ciu);
+ skipClustersUpper[iLocalU] = true;
+ }
+ }
+ }
+ }
+
+ return result;
+}
+
+bool TkDoubleSensMeasurementDet::measurements(const TrajectoryStateOnSurface& stateOnThisDet,
+ const MeasurementEstimator& est,
+ const MeasurementTrackerEvent& data,
+ TempMeasurements& result) const {
+ LogDebug("MeasurementTracker") << "TkDoubleSensMeasurementDet::measurements";
+
+ if (!isActive(data)) {
+ result.add(theInactiveHit, 0.F);
+ return true;
+ }
+
+ LogTrace("MeasurementTracker") << " is active";
+
+ auto oldSize = result.size();
+ MeasurementDet::RecHitContainer&& allHits = recHits(stateOnThisDet, data);
+
+ for (auto&& hit : allHits) {
+ std::pair diffEst = est.estimate(stateOnThisDet, *hit);
+ if (diffEst.first) {
+ LogDebug("MeasurementTracker") << "New vh added with chi2: " << diffEst.second;
+ result.add(std::move(hit), diffEst.second);
+ }
+ }
+
+ if (result.size() > oldSize)
+ return true;
+
+ // create a TrajectoryMeasurement with an invalid RecHit and zero estimate
+ result.add(theMissingHit, 0.F);
+ LogDebug("MeasurementTracker") << "adding missing hit";
+ return false;
+}
diff --git a/RecoTracker/MeasurementDet/plugins/TkDoubleSensMeasurementDet.h b/RecoTracker/MeasurementDet/plugins/TkDoubleSensMeasurementDet.h
new file mode 100644
index 0000000000000..93afc7b3ecebc
--- /dev/null
+++ b/RecoTracker/MeasurementDet/plugins/TkDoubleSensMeasurementDet.h
@@ -0,0 +1,54 @@
+#ifndef TkDoubleSensMeasurementDet_H
+#define TkDoubleSensMeasurementDet_H
+
+#include "TrackingTools/MeasurementDet/interface/MeasurementDet.h"
+#include "TkPixelMeasurementDet.h"
+
+#include "Geometry/CommonDetUnit/interface/StackGeomDet.h"
+#include "Geometry/CommonDetUnit/interface/DoubleSensGeomDet.h"
+#include "RecoLocalTracker/ClusterParameterEstimator/interface/PixelClusterParameterEstimator.h"
+
+#include "FWCore/Utilities/interface/Visibility.h"
+
+class TkDoubleSensMeasurementDet final : public MeasurementDet {
+public:
+ TkDoubleSensMeasurementDet(const DoubleSensGeomDet* gdet, const PixelClusterParameterEstimator* cpe);
+
+ void init(const MeasurementDet* firstDet, const MeasurementDet* secondDet);
+
+ RecHitContainer recHits(const TrajectoryStateOnSurface&, const MeasurementTrackerEvent& data) const override;
+
+ const DoubleSensGeomDet& specificGeomDet() const { return static_cast(fastGeomDet()); }
+ typedef edm::Ref, Phase2TrackerCluster1D> Phase2TrackerCluster1DRef;
+
+ typedef edmNew::DetSet detset;
+ typedef detset::const_iterator const_iterator;
+
+ bool measurements(const TrajectoryStateOnSurface& stateOnThisDet,
+ const MeasurementEstimator& est,
+ const MeasurementTrackerEvent& data,
+ TempMeasurements& result) const override;
+
+ const TkPixelMeasurementDet* firstDet() const { return theFirstDet; }
+ const TkPixelMeasurementDet* secondDet() const { return theSecondDet; }
+
+ /// return TRUE if both first and second components are active
+ bool isActive(const MeasurementTrackerEvent& data) const override {
+ return firstDet()->isActive(data) && secondDet()->isActive(data);
+ }
+ bool isEmpty(const PxMeasurementDetSet& data) const {
+ return data.empty(firstDet()->index()) || data.empty(secondDet()->index());
+ }
+
+ /// return TRUE if at least one of the first and second components has badChannels
+ bool hasBadComponents(const TrajectoryStateOnSurface& tsos, const MeasurementTrackerEvent& data) const override {
+ return (firstDet()->hasBadComponents(tsos, data) || secondDet()->hasBadComponents(tsos, data));
+ }
+
+private:
+ const PixelClusterParameterEstimator* thePixelCPE;
+ const TkPixelMeasurementDet* theFirstDet;
+ const TkPixelMeasurementDet* theSecondDet;
+};
+
+#endif
diff --git a/RecoTracker/PixelLowPtUtilities/src/ClusterShapeHitFilter.cc b/RecoTracker/PixelLowPtUtilities/src/ClusterShapeHitFilter.cc
index 12c2a8a0f24be..852ff217c4b76 100644
--- a/RecoTracker/PixelLowPtUtilities/src/ClusterShapeHitFilter.cc
+++ b/RecoTracker/PixelLowPtUtilities/src/ClusterShapeHitFilter.cc
@@ -121,13 +121,14 @@ void ClusterShapeHitFilter::fillPixelData() {
for (auto det : theTracker->detsPXB()) {
// better not to fail..
const PixelGeomDetUnit* pixelDet = dynamic_cast(det);
- assert(pixelDet);
- PixelData& pd = pixelData[pixelDet->geographicalId()];
- pd.det = pixelDet;
- pd.part = 0;
- pd.layer = theTkTopol->pxbLayer(pixelDet->geographicalId());
- pd.cotangent = getCotangent(pixelDet);
- pd.drift = getDrift(pixelDet);
+ if (pixelDet) {
+ PixelData& pd = pixelData[pixelDet->geographicalId()];
+ pd.det = pixelDet;
+ pd.part = 0;
+ pd.layer = theTkTopol->pxbLayer(pixelDet->geographicalId());
+ pd.cotangent = getCotangent(pixelDet);
+ pd.drift = getDrift(pixelDet);
+ }
}
//endcap
diff --git a/RecoTracker/TkDetLayers/src/PixelRodBuilder.cc b/RecoTracker/TkDetLayers/src/PixelRodBuilder.cc
index d001e81c714e8..b5fb1fc2b4afa 100644
--- a/RecoTracker/TkDetLayers/src/PixelRodBuilder.cc
+++ b/RecoTracker/TkDetLayers/src/PixelRodBuilder.cc
@@ -7,10 +7,18 @@ PixelRod* PixelRodBuilder::build(const GeometricDet* aRod, const TrackerGeometry
vector allGeometricDets = aRod->components();
vector theGeomDets;
- for (vector::iterator it = allGeometricDets.begin(); it != allGeometricDets.end(); it++) {
- const GeomDet* theGeomDet = theGeomDetGeometry->idToDet((*it)->geographicalId());
- theGeomDets.push_back(theGeomDet);
+ vector compGeometricDets;
+ for (auto& it : allGeometricDets) {
+ compGeometricDets = it->components();
+ if (it->type() == GeometricDet::ITPhase2Combined) {
+ const GeomDet* theGeomDet = theGeomDetGeometry->idToDet(compGeometricDets[0]->geographicalId());
+ theGeomDets.push_back(theGeomDet);
+ const GeomDet* theGeomDetBrother = theGeomDetGeometry->idToDet(compGeometricDets[1]->geographicalId());
+ theGeomDets.push_back(theGeomDetBrother);
+ } else if (it->type() == GeometricDet::DetUnit) {
+ const GeomDet* theGeomDet = theGeomDetGeometry->idToDet(it->geographicalId());
+ theGeomDets.push_back(theGeomDet);
+ }
}
-
return new PixelRod(theGeomDets);
}