Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
888c685
base setup cmssw 15X and pixel issue
alaha999 Apr 17, 2025
51f5321
adding new pixel histograms: barrel and fwd
alaha999 Apr 17, 2025
0d8af74
added phase-2 layers in FastSim, turn off FastSim calorimetry
alaha999 Apr 17, 2025
5bbe4c4
modified eos path of resolution histograms
alaha999 Apr 17, 2025
3d42974
modification to import Run4D110 geometry
alaha999 Apr 17, 2025
f8f6e5d
changes upto segfault error, debugging pixel hist failure
alaha999 May 15, 2025
a91f6f7
reproduce error steps, modified resolution file
alaha999 May 15, 2025
c7404d1
copy stack overflow fix to text input case
kpedro88 Jun 30, 2025
245feb0
update forward histogram to follow naming convention
kpedro88 Jun 30, 2025
03db1a8
get pixel templates from db instead of (non-existent) text files
kpedro88 Jun 30, 2025
6cbfcce
Added some phase2 changes
Kirutheeka7 Jul 24, 2025
6bad530
added some fastsim changes for phase2
Kirutheeka7 Jul 24, 2025
2bfd4e1
added phase2 tracking steps and changed simhits to input tags
Kirutheeka7 Aug 1, 2025
236406c
add hgcal digis
Kirutheeka7 Aug 7, 2025
2f9e9a8
Adding Gaussian smearing for additional inner detector layers in phas…
Kirutheeka7 Aug 25, 2025
0e8560a
introduce utility for creating FastSim Phase2 eras (remove run3_GEM e…
Kirutheeka7 Oct 2, 2025
d3a01e4
Added correct seed and track producers for phase 2 - fastsim
Kirutheeka7 Oct 16, 2025
59a303a
Adding back muon, gem and hcalhardcode modifiers to phase2 chain
Kirutheeka7 Nov 13, 2025
974cf32
make MuonDetLayerMeasurements safe against missing collections, added…
Kirutheeka7 Feb 5, 2026
2cf451e
cleanup
kpedro88 Mar 12, 2026
fb945d9
more flexible fastsim geometry customizations
kpedro88 Mar 12, 2026
3c83c93
streamline fastsim geometry customizations
kpedro88 Mar 13, 2026
c560eb6
use real paths
kpedro88 Mar 13, 2026
b7630e9
add fastsim phase2 (tracker-only) matrix workflow
kpedro88 Mar 13, 2026
70645bd
modifier for phase2-specific fastSim changes
kpedro88 Mar 13, 2026
78be03a
support both DB and XML geometry for FastSim
kpedro88 Mar 14, 2026
8705a7c
remove the ugly hack
kpedro88 Mar 16, 2026
53d12ac
separate out HGCal aliases
kpedro88 Mar 16, 2026
1537755
use correct geometry DB cff for fastsim
kpedro88 Mar 16, 2026
bf6da84
isolate phase 2 tracking changes
kpedro88 Mar 16, 2026
0cc4573
simplify era usage
kpedro88 Mar 16, 2026
df64564
add fastsim D121 workflow
kpedro88 Mar 16, 2026
01ba11f
code format
kpedro88 Mar 16, 2026
4b83305
forgot to commit new file
kpedro88 Mar 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion CondFormats/SiPixelTransient/src/SiPixelTemplate.cc
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,10 @@ bool SiPixelTemplate::pushfile(int filenum, std::vector<SiPixelTemplateStore>& p
if (in_file.is_open() && in_file.good()) {
// Create a local template storage entry

SiPixelTemplateStore theCurrentTemp;
// Create a local template storage entry
/// SiPixelTemplateStore theCurrentTemp; // large, don't allocate it on the stack
auto tmpPtr = std::make_unique<SiPixelTemplateStore>(); // must be allocated on the heap instead
auto& theCurrentTemp = *tmpPtr;

// Read-in a header string first and print it

Expand Down
96 changes: 55 additions & 41 deletions Configuration/Applications/python/ConfigBuilder.py
Original file line number Diff line number Diff line change
Expand Up @@ -829,14 +829,18 @@ def addStandardSequences(self):
# load the geometry file
try:
if len(self.stepMap):
self.loadAndRemember(self.GeometryCFF)
if (self.GeometryCFF == 'Configuration/StandardSequences/GeometryRecoDB_cff' and not self.geometryDBLabel):
print("Warning: The default GeometryRecoDB_cff is being used; however, the DB geometry is not applied. You may need to verify your cmsDriver.")
if ('SIM' in self.stepMap or 'reSIM' in self.stepMap) and not self._options.fast:
self.loadAndRemember(self.SimGeometryCFF)
if self.geometryDBLabel:
self.executeAndRemember('if hasattr(process, "XMLFromDBSource"): process.XMLFromDBSource.label="%s"'%(self.geometryDBLabel))
self.executeAndRemember('if hasattr(process, "DDDetectorESProducerFromDB"): process.DDDetectorESProducerFromDB.label="%s"'%(self.geometryDBLabel))
if isinstance(self.GeometryCFF, list):
for cff in self.GeometryCFF:
self.loadAndRemember(cff)
else:
self.loadAndRemember(self.GeometryCFF)
if (self.GeometryCFF == 'Configuration/StandardSequences/GeometryRecoDB_cff' and not self.geometryDBLabel):
print("Warning: The default GeometryRecoDB_cff is being used; however, the DB geometry is not applied. You may need to verify your cmsDriver.")
if ('SIM' in self.stepMap or 'reSIM' in self.stepMap) and not self._options.fast:
self.loadAndRemember(self.SimGeometryCFF)
if self.geometryDBLabel:
self.executeAndRemember('if hasattr(process, "XMLFromDBSource"): process.XMLFromDBSource.label="%s"'%(self.geometryDBLabel))
self.executeAndRemember('if hasattr(process, "DDDetectorESProducerFromDB"): process.DDDetectorESProducerFromDB.label="%s"'%(self.geometryDBLabel))

except ImportError:
print("Geometry option",self._options.geometry,"unknown.")
Expand Down Expand Up @@ -1183,44 +1187,39 @@ def define_Configs(self):
self.GeometryCFF='Configuration/StandardSequences/GeometryRecoDB_cff'
self.geometryDBLabel=None
simGeometry=''
if self._options.fast:
if 'start' in self._options.conditions.lower():
self.GeometryCFF='FastSimulation/Configuration/Geometries_START_cff'

def inGeometryKeys(opt):
from Configuration.StandardSequences.GeometryConf import GeometryConf
if opt in GeometryConf:
return GeometryConf[opt]
else:
self.GeometryCFF='FastSimulation/Configuration/Geometries_MC_cff'
else:
def inGeometryKeys(opt):
from Configuration.StandardSequences.GeometryConf import GeometryConf
if opt in GeometryConf:
return GeometryConf[opt]
else:
if (opt=='SimDB' or opt.startswith('DB:')):
return opt
else:
raise Exception("Geometry "+opt+" does not exist!")

geoms=self._options.geometry.split(',')
if len(geoms)==1: geoms=inGeometryKeys(geoms[0]).split(',')
if len(geoms)==2:
#may specify the reco geometry
if '/' in geoms[1] or '_cff' in geoms[1]:
self.GeometryCFF=geoms[1]
if (opt=='SimDB' or opt.startswith('DB:')):
return opt
else:
self.GeometryCFF='Configuration/Geometry/Geometry'+geoms[1]+'_cff'
raise Exception("Geometry "+opt+" does not exist!")

geoms=self._options.geometry.split(',')
if len(geoms)==1: geoms=inGeometryKeys(geoms[0]).split(',')
if len(geoms)==2:
#may specify the reco geometry
if '/' in geoms[1] or '_cff' in geoms[1]:
self.GeometryCFF=geoms[1]
else:
self.GeometryCFF='Configuration/Geometry/Geometry'+geoms[1]+'_cff'

if (geoms[0].startswith('DB:')):
self.SimGeometryCFF='Configuration/StandardSequences/GeometrySimDB_cff'
self.geometryDBLabel=geoms[0][3:]
print("with DB:")
if (geoms[0].startswith('DB:')):
self.SimGeometryCFF='Configuration/StandardSequences/GeometrySimDB_cff'
self.geometryDBLabel=geoms[0][3:]
print("with DB:")
else:
if '/' in geoms[0] or '_cff' in geoms[0]:
self.SimGeometryCFF=geoms[0]
else:
if '/' in geoms[0] or '_cff' in geoms[0]:
self.SimGeometryCFF=geoms[0]
simGeometry=geoms[0]
if self._options.gflash==True:
self.SimGeometryCFF='Configuration/Geometry/Geometry'+geoms[0]+'GFlash_cff'
else:
simGeometry=geoms[0]
if self._options.gflash==True:
self.SimGeometryCFF='Configuration/Geometry/Geometry'+geoms[0]+'GFlash_cff'
else:
self.SimGeometryCFF='Configuration/Geometry/Geometry'+geoms[0]+'_cff'
self.SimGeometryCFF='Configuration/Geometry/Geometry'+geoms[0]+'_cff'

# synchronize the geometry configuration and the FullSimulation sequence to be used
if simGeometry not in defaultOptions.geometryExtendedOptions:
Expand All @@ -1232,6 +1231,21 @@ def inGeometryKeys(opt):

# fastsim requires some changes to the default cff files and sequences
if self._options.fast:
# always use reco geometry for xml (includes sim components)
if 'Reco' not in self.GeometryCFF and 'DB' not in self.GeometryCFF:
self.GeometryCFF = self.GeometryCFF.replace("_cff","Reco_cff")
if 'DB' in self.GeometryCFF:
self.GeometryCFF = 'Configuration/StandardSequences/GeometryDB_cff'
self.GeometryCFF = [self.GeometryCFF]

if 'DB' in self.GeometryCFF[0]:
self.GeometryCFF.append('FastSimulation/Configuration/GeometryDB_cff')
else:
self.GeometryCFF.append('FastSimulation/Configuration/GeometryXML_cff')
if 'start' in self._options.conditions.lower():
from FastSimulation.Configuration.Geometries_cff import _fastSimGeometryCustomStart
self.executeAndRemember(_fastSimGeometryCustomStart)

self.SIMDefaultCFF = 'FastSimulation.Configuration.SimIdeal_cff'
self.RECODefaultCFF= 'FastSimulation.Configuration.Reconstruction_AftMix_cff'
self.RECOBEFMIXDefaultCFF = 'FastSimulation.Configuration.Reconstruction_BefMix_cff'
Expand Down
6 changes: 6 additions & 0 deletions Configuration/Eras/python/Era_Phase2C17I13M9_FastSim_cff.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import FWCore.ParameterSet.Config as cms

from Configuration.Eras.Era_Phase2C17I13M9_cff import Phase2C17I13M9
from Configuration.Eras.Util_fastSimPhase2_cff import fastSimPhase2

Phase2C17I13M9_FastSim = fastSimPhase2(Phase2C17I13M9)
6 changes: 6 additions & 0 deletions Configuration/Eras/python/Era_Phase2C22I13M9_FastSim_cff.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import FWCore.ParameterSet.Config as cms

from Configuration.Eras.Era_Phase2C22I13M9_cff import Phase2C22I13M9
from Configuration.Eras.Util_fastSimPhase2_cff import fastSimPhase2

Phase2C22I13M9_FastSim = fastSimPhase2(Phase2C22I13M9)
4 changes: 4 additions & 0 deletions Configuration/Eras/python/Modifier_phase2_fastSim_cff.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import FWCore.ParameterSet.Config as cms

phase2_fastSim = cms.Modifier()

16 changes: 16 additions & 0 deletions Configuration/Eras/python/Util_fastSimPhase2_cff.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import FWCore.ParameterSet.Config as cms

from Configuration.Eras.Modifier_run3_GEM_cff import run3_GEM
from Configuration.Eras.Modifier_phase2_muon_cff import phase2_muon
from Configuration.Eras.Modifier_phase2_GEM_cff import phase2_GEM
from Configuration.Eras.Modifier_phase2_timing_cff import phase2_timing
from Configuration.Eras.Modifier_phase2_timing_layer_cff import phase2_timing_layer
from Configuration.Eras.Modifier_phase2_trigger_cff import phase2_trigger
from Configuration.Eras.ModifierChain_trackingMkFitProd_cff import trackingMkFitProdPhase2
from Configuration.Eras.Modifier_phase2_fastSim_cff import phase2_fastSim

def fastSimPhase2(obj):
return cms.ModifierChain(
obj.copyAndExclude([run3_GEM, phase2_muon, phase2_GEM, phase2_timing, phase2_timing_layer, phase2_trigger, trackingMkFitProdPhase2]),
phase2_fastSim,
)
4 changes: 4 additions & 0 deletions Configuration/PyReleaseValidation/python/relval_Run4.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@
numWFIB.extend([35634.0]) #Run4D124
numWFIB.extend([36034.0]) #Run4D125

#Run4 FS (TTbar)
numWFIB.extend([36434.0]) #Run4D110
numWFIB.extend([36834.0]) #Run4D121

#Additional sample for short matrix and IB
#Default Phase-2 Det NoPU
numWFIB.extend([prefixDet+34.911]) #DD4hep XML
Expand Down
18 changes: 18 additions & 0 deletions Configuration/PyReleaseValidation/python/relval_steps.py
Original file line number Diff line number Diff line change
Expand Up @@ -5184,6 +5184,24 @@ def gen2024HiMix(fragment,howMuch):
'--geometry' : geom,
}

upgradeStepDict['FastSimRun4'][k]={'-s':'SIM,RECOBEFMIX,DIGI:pdigi_valid,DIGI2RAW,RECO:reconstruction_trackingOnly,VALIDATION:@trackingOnlyValidation',
'--fast':'',
'--beamspot':beamspot,
'--conditions':gt,
'--geometry':geom,
'--eventcontent':'RECOSIM,DQM',
'--datatier':'GEN-SIM-RECO,DQMIO',
}

upgradeStepDict['HARVESTFastRun4'][k]={'-s':'HARVESTING:@trackingOnlyValidation',
'--conditions':gt,
'--mc':'',
'--fast':'',
'--geometry':geom,
'--scenario':'pp',
'--filetype':'DQM',
'--filein':'file:step2_inDQM.root'}

# setup baseline and variations
for specialType,specialWF in upgradeWFs.items():
specialWF.setup(upgradeStepDict, k, upgradeProperties[year][k])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@
'Run4D124PU',
'Run4D125',
'Run4D125PU',
'Run4D110FS',
'Run4D110FSPU',
'Run4D121FS',
'Run4D121FSPU',
]

# pre-generation of WF numbers
Expand Down Expand Up @@ -237,6 +241,8 @@ def condition(self, fragment, stepList, key, hasHarvest):
'HLT75e33',
'FastSimRun3',
'HARVESTFastRun3',
'FastSimRun4',
'HARVESTFastRun4',
],
PU = [
'DigiTrigger',
Expand All @@ -261,6 +267,8 @@ def condition(self, fragment, stepList, key, hasHarvest):
'HLT75e33',
'FastSimRun3',
'HARVESTFastRun3',
'FastSimRun4',
'HARVESTFastRun4',
],
suffix = '',
offset = 0.0,
Expand Down Expand Up @@ -3750,14 +3758,31 @@ def condition(self, fragment, stepList, key, hasHarvest):
'Era' : 'Phase2C22I13M9',
'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
},
'Run4D110FS' : {
'Geom' : 'ExtendedRun4D110',
'HLTmenu': '@relvalRun4',
'GT' : 'auto:phase2_realistic_T35',
'Era' : 'Phase2C17I13M9_FastSim',
'ScenToRun' : ['GenHLBeamSpot','FastSimRun4','HARVESTFastRun4'],
},
'Run4D121FS' : {
'Geom' : 'ExtendedRun4D121',
'HLTmenu': '@relvalRun4',
'GT' : 'auto:phase2_realistic_T35',
'Era' : 'Phase2C22I13M9_FastSim',
'ScenToRun' : ['GenHLBeamSpot','FastSimRun4','HARVESTFastRun4'],
},
}

# standard PU sequences
for key in list(upgradeProperties['Run4'].keys()):
if "GenOnly" in key:
continue
upgradeProperties['Run4'][key+'PU'] = deepcopy(upgradeProperties['Run4'][key])
upgradeProperties['Run4'][key+'PU']['ScenToRun'] = ['GenSimHLBeamSpot','DigiTriggerPU','RecoGlobalPU', 'HARVESTGlobalPU']
if 'FS' not in key:
upgradeProperties['Run4'][key+'PU']['ScenToRun'] = ['GenSimHLBeamSpot','DigiTriggerPU','RecoGlobalPU', 'HARVESTGlobalPU']
else:
upgradeProperties['Run4'][key+'PU']['ScenToRun'] = ['GenHLBeamSpot','FastSimRun4PU','HARVESTFastRun4PU']

# for relvals
defaultDataSets = {}
Expand Down
7 changes: 5 additions & 2 deletions Configuration/StandardSequences/python/Digi_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,18 @@ def _premixStage2GenPUProtons(process):

from Configuration.Eras.Modifier_fastSim_cff import fastSim
def _fastSimDigis(process):
import FastSimulation.Configuration.DigiAliases_cff as DigiAliases

# pretend these digis have been through digi2raw and raw2digi, by using the approprate aliases
# use an alias to make the mixed track collection available under the usual label
from FastSimulation.Configuration.DigiAliases_cff import loadDigiAliases
loadDigiAliases(process)
# no need for the aliases for premixing stage1
modifyDigi_fastSimDigis = (fastSim & ~premix_stage1).makeProcessModifier(_fastSimDigis)

from Configuration.Eras.Modifier_phase2_hgcal_cff import phase2_hgcal
def _fastSimDigisHGCal(process):
from FastSimulation.Configuration.DigiAliases_cff import loadDigiAliasesHGCal
modifyDigi_fastSimDigisHGCal = (fastSim & phase2_hgcal).makeProcessModifier(_fastSimDigisHGCal)

#phase 2 common mods
def _modifyEnableHcalHardcode( theProcess ):
from CalibCalorimetry.HcalPlugins.Hcal_Conditions_forGlobalTag_cff import hcal_db_producer as _hcal_db_producer, es_hardcode as _es_hardcode, es_prefer_hcalHardcode as _es_prefer_hcalHardcode
Expand Down
2 changes: 2 additions & 0 deletions Configuration/StandardSequences/python/Eras.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,12 @@ def __init__(self):
'Phase2C11I13T26M9_noMkFit',
'Phase2C17I13M9',
'Phase2C17I13M9_noMkFit',
'Phase2C17I13M9_FastSim',
'Phase2C20I13M9',
'Phase2C20I13M9_noMkFit',
'Phase2C22I13M9',
'Phase2C22I13M9_noMkFit',
'Phase2C22I13M9_FastSim',
'Phase2C26I13M9',
'Phase2C26I13M9_noMkFit'
]
Expand Down
11 changes: 9 additions & 2 deletions Configuration/StandardSequences/python/Reconstruction_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,16 @@
_run3_globalrecoTask = globalrecoTask.copyAndExclude([CastorFullRecoTask])
run3_common.toReplaceWith(globalrecoTask, _run3_globalrecoTask)

_fastSim_globalrecoTask = globalrecoTask.copyAndExclude([CastorFullRecoTask,muoncosmicrecoTask])
# these modules are needed for other modules in this task
# keep them together to ensure e.g. trackingOnly reco can work
_fastSim_vertexrecoTask = vertexrecoTask.copy()
_fastSim_vertexrecoTask.add(firstStepPrimaryVerticesUnsorted,initialStepTrackRefsForJets,firstStepPrimaryVertices)
fastSim.toReplaceWith(vertexrecoTask,_fastSim_vertexrecoTask)

# insert the few tracking modules to be run after mixing back in the globalreco sequence
_fastSim_globalrecoTask = globalrecoTask.copyAndExclude([CastorFullRecoTask,muoncosmicrecoTask])
_fastSim_globalrecoTask.add(newCombinedSeeds,trackExtrapolator,caloTowerForTrk,firstStepPrimaryVerticesUnsorted,ak4CaloJetsForTrk,initialStepTrackRefsForJets,firstStepPrimaryVertices)

fastSim.toReplaceWith(globalrecoTask,_fastSim_globalrecoTask)

from Configuration.Eras.Modifier_phase2_hgcal_cff import phase2_hgcal
Expand Down Expand Up @@ -333,4 +340,4 @@
_tau_embedding_sim_globalreco_trackingTask = globalreco_trackingTask.copyAndExclude([offlineBeamSpotTask])
tau_embedding_sim.toReplaceWith(globalreco_trackingTask, _tau_embedding_sim_globalreco_trackingTask)
_tau_embedding_sim_reconstruction_pixelTrackingOnlyTask = reconstruction_pixelTrackingOnlyTask.copyAndExclude([offlineBeamSpotTask])
tau_embedding_sim.toReplaceWith(reconstruction_pixelTrackingOnlyTask, _tau_embedding_sim_reconstruction_pixelTrackingOnlyTask)
tau_embedding_sim.toReplaceWith(reconstruction_pixelTrackingOnlyTask, _tau_embedding_sim_reconstruction_pixelTrackingOnlyTask)
38 changes: 24 additions & 14 deletions FastSimulation/Configuration/python/DigiAliases_cff.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,7 @@
import FWCore.ParameterSet.Config as cms

# This is an ugly hack (but better what was before) to record if the
# loadDigiAliases() was called with premixing or not. Unfortunately
# which alias to use depends on that. If we had a premixing Modifier,
# this hack would not be needed.
_loadDigiAliasesWasCalledPremix = None

def loadGeneralTracksAlias(process):
if _loadDigiAliasesWasCalledPremix is None:
raise Exception("This function may be called only after loadDigiAliases() has been called")

nopremix = not _loadDigiAliasesWasCalledPremix
def loadGeneralTracksAlias(process, premix=False):
nopremix = not premix
process.generalTracks = cms.EDAlias(
**{"mix" if nopremix else "mixData" :
cms.VPSet(
Expand All @@ -35,8 +26,6 @@ def loadGeneralTracksAlias(process):

def loadDigiAliases(process, premix=False):
nopremix = not premix
global _loadDigiAliasesWasCalledPremix
_loadDigiAliasesWasCalledPremix = premix

process.ecalPreshowerDigis = cms.EDAlias(
**{"simEcalPreshowerDigis" if nopremix else "DMEcalPreshowerDigis" :
Expand Down Expand Up @@ -135,7 +124,28 @@ def loadDigiAliases(process, premix=False):
# ),
)
)


def loadDigiAliasesHGCal(process):
process.hgcalDigis = cms.EDAlias(
mix = cms.VPSet(
cms.PSet(
fromProductInstance = cms.string('HGCDigisEE'),
toProductInstance = cms.string('EE'),
type = cms.string('DetIdHGCSampleHGCDataFramesSorted')
),
cms.PSet(
fromProductInstance = cms.string('HGCDigisHEfront'),
toProductInstance = cms.string('HEfront'),
type = cms.string('DetIdHGCSampleHGCDataFramesSorted')
),
cms.PSet(
fromProductInstance = cms.string('HGCDigisHEback'),
toProductInstance = cms.string('HEback'),
type = cms.string('DetIdHGCSampleHGCDataFramesSorted')
)
)
)

def loadTriggerDigiAliases(process):
process.caloStage1LegacyFormatDigis = cms.EDAlias(
**{ "simCaloStage1LegacyFormatDigis" :
Expand Down
8 changes: 0 additions & 8 deletions FastSimulation/Configuration/python/Geometries_MC_cff.py

This file was deleted.

Loading