diff --git a/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py b/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py index 20f9aec6e030665f118198b800d9a53fac0b77ad..ca57806650a14ed39d9d92753515936eb037d1eb 100644 --- a/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py +++ b/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py @@ -2,6 +2,473 @@ from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator from AthenaCommon.SystemOfUnits import MeV +from AthenaCommon.Constants import VERBOSE + +def caloTopoCoolFolderCfg(configFlags): + result=ComponentAccumulator() + from IOVDbSvc.IOVDbSvcConfig import addFolders, IOVDbSvcCfg + result.mergeAll(IOVDbSvcCfg(configFlags)) + # rely on global tag for both MC and data; do not specify folder tags + # use CALO_OFL only for GEO>=18 + hadCalibFolders = [ + "HadCalibration2/CaloEMFrac", + "HadCalibration2/H1ClusterCellWeights", + "HadCalibration2/CaloOutOfCluster", + "HadCalibration2/CaloOutOfClusterPi0", + "HadCalibration2/CaloDMCorr2" + ] + hadCalibPrefix = "/CALO/" + hadCalibDB = "CALO_ONL" + if configFlags.Input.isMC: + hadCalibPrefix = "/CALO/Ofl/" + hadCalibDB = "CALO_OFL" + hadCalibFolders = [ hadCalibPrefix + foldername for foldername in hadCalibFolders ] + result.merge(addFolders(configFlags, hadCalibFolders, hadCalibDB, className="CaloLocalHadCoeff")) + + return result + +def getTopoClusterLocalCalibTools(configFlags, theCaloNoiseTool): + from CaloUtils.CaloUtilsConf import CaloLCClassificationTool, CaloLCWeightTool, CaloLCOutOfClusterTool, CaloLCDeadMaterialTool + from CaloClusterCorrection.CaloClusterCorrectionConf import CaloClusterLocalCalib + # Local cell weights + LCClassify = CaloLCClassificationTool("LCClassify") + LCClassify.ClassificationKey = "EMFracClassify" + LCClassify.UseSpread = False + LCClassify.MaxProbability = 0.5 + # add the moments EM_PROBABILITY, HAD_WEIGHT, OOC_WEIGHT, DM_WEIGHT to the AOD: + LCClassify.StoreClassificationProbabilityInAOD = True + LCClassify.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + + LCWeight = CaloLCWeightTool("LCWeight") + LCWeight.CorrectionKey = "H1ClusterCellWeights" + LCWeight.SignalOverNoiseCut = 2.0 + # ***** + # Needs calo noise tool config + LCWeight.CaloNoiseTool = theCaloNoiseTool + # ***** + LCWeight.UseHadProbability = True + + LocalCalib = CaloClusterLocalCalib ("LocalCalib") + LocalCalib.ClusterClassificationTool = [LCClassify] + LocalCalib.ClusterRecoStatus = [1,2] + LocalCalib.LocalCalibTools = [LCWeight] + LocalCalib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + + # Out-of-cluster corrections + LCOut = CaloLCOutOfClusterTool("LCOut") + LCOut.CorrectionKey = "OOCCorrection" + LCOut.UseEmProbability = False + LCOut.UseHadProbability = True + + OOCCalib = CaloClusterLocalCalib ("OOCCalib") + OOCCalib.ClusterRecoStatus = [1,2] + OOCCalib.LocalCalibTools = [LCOut] + OOCCalib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + + LCOutPi0 = CaloLCOutOfClusterTool("LCOutPi0") + LCOutPi0.CorrectionKey = "OOCPi0Correction" + LCOutPi0.UseEmProbability = True + LCOutPi0.UseHadProbability = False + + OOCPi0Calib = CaloClusterLocalCalib ("OOCPi0Calib") + OOCPi0Calib.ClusterRecoStatus = [1,2] + OOCPi0Calib.LocalCalibTools = [LCOutPi0] + + OOCPi0Calib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + + # Dead material corrections + LCDeadMaterial = CaloLCDeadMaterialTool("LCDeadMaterial") + LCDeadMaterial.HadDMCoeffKey = "HadDMCoeff2" + LCDeadMaterial.ClusterRecoStatus = 0 + LCDeadMaterial.WeightModeDM = 2 + LCDeadMaterial.UseHadProbability = True + LCDeadMaterial.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + + DMCalib = CaloClusterLocalCalib ("DMCalib") + DMCalib.ClusterRecoStatus = [1,2] + DMCalib.LocalCalibTools = [LCDeadMaterial] + + DMCalib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + + lccalibtools = [ + LocalCalib, + OOCCalib, + OOCPi0Calib, + DMCalib] + return lccalibtools + +def getTopoMoments(configFlags,theCaloNoiseTool): + from CaloRec.CaloRecConf import CaloClusterMomentsMaker + TopoMoments = CaloClusterMomentsMaker ("TopoMoments") + TopoMoments.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + from AthenaCommon.SystemOfUnits import deg + TopoMoments.MaxAxisAngle = 20*deg + TopoMoments.CaloNoiseTool = theCaloNoiseTool + TopoMoments.UsePileUpNoise = True + TopoMoments.TwoGaussianNoise = configFlags.Calo.TopoCluster.doTwoGaussianNoise + TopoMoments.MinBadLArQuality = 4000 + TopoMoments.MomentsNames = ["FIRST_PHI" + ,"FIRST_ETA" + ,"SECOND_R" + ,"SECOND_LAMBDA" + ,"DELTA_PHI" + ,"DELTA_THETA" + ,"DELTA_ALPHA" + ,"CENTER_X" + ,"CENTER_Y" + ,"CENTER_Z" + ,"CENTER_MAG" + ,"CENTER_LAMBDA" + ,"LATERAL" + ,"LONGITUDINAL" + ,"FIRST_ENG_DENS" + ,"ENG_FRAC_EM" + ,"ENG_FRAC_MAX" + ,"ENG_FRAC_CORE" + ,"FIRST_ENG_DENS" + ,"SECOND_ENG_DENS" + ,"ISOLATION" + ,"ENG_BAD_CELLS" + ,"N_BAD_CELLS" + ,"N_BAD_CELLS_CORR" + ,"BAD_CELLS_CORR_E" + ,"BADLARQ_FRAC" + ,"ENG_POS" + ,"SIGNIFICANCE" + ,"CELL_SIGNIFICANCE" + ,"CELL_SIG_SAMPLING" + ,"AVG_LAR_Q" + ,"AVG_TILE_Q" + ,"PTD" + ,"MASS" + ] + + # ***** + # Is this still right? + # only add HV related moments if it is offline. + # from IOVDbSvc.CondDB import conddb + # if not conddb.isOnline: + from LArCellRec.LArCellRecConf import LArHVFraction + if configFlags.Input.isMC: + TopoMoments.LArHVFraction=LArHVFraction(HVScaleCorrKey="LArHVScaleCorr") + else: + TopoMoments.LArHVFraction=LArHVFraction(HVScaleCorrKey="LArHVScaleCorrRecomputed") + TopoMoments.MomentsNames += ["ENG_BAD_HV_CELLS" + ,"N_BAD_HV_CELLS" + ] + + return TopoMoments + +# a.k.a. DigiTruth +def getTopoTruthMoments(configFlags,theCaloNoiseTool): + from CaloRec.CaloRecConf import CaloClusterMomentsMaker + TopoMoments_Truth = CaloClusterMomentsMaker_DigiHSTruth ("TopoMoments_Truth") + from LArCellRec.LArCellRecConf import LArHVFraction + TopoMoments_Truth.LArHVFraction=LArHVFraction(HVScaleCorrKey="LArHVScaleCorr") + TopoMoments_Truth.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + from AthenaCommon.SystemOfUnits import deg + TopoMoments_Truth.MaxAxisAngle = 20*deg + TopoMoments_Truth.CaloNoiseTool = theCaloNoiseTool + TopoMoments_Truth.UsePileUpNoise = True + TopoMoments_Truth.TwoGaussianNoise = configFlags.Calo,TopoCluster.doTwoGaussianNoise + TopoMoments_Truth.MinBadLArQuality = 4000 + TopoMoments_Truth.MomentsNames = ["FIRST_PHI_DigiHSTruth" + ,"FIRST_ETA_DigiHSTruth" + ,"SECOND_R_DigiHSTruth" + ,"SECOND_LAMBDA_DigiHSTruth" + ,"DELTA_PHI_DigiHSTruth" + ,"DELTA_THETA_DigiHSTruth" + ,"DELTA_ALPHA_DigiHSTruth" + ,"CENTER_X_DigiHSTruth" + ,"CENTER_Y_DigiHSTruth" + ,"CENTER_Z_DigiHSTruth" + ,"CENTER_MAG_DigiHSTruth" + ,"CENTER_LAMBDA_DigiHSTruth" + ,"LATERAL_DigiHSTruth" + ,"LONGITUDINAL_DigiHSTruth" + ,"ENG_FRAC_CORE_DigiHSTruth" + ,"FIRST_ENG_DENS_DigiHSTruth" + ,"SECOND_ENG_DENS_DigiHSTruth" + ,"ISOLATION_DigiHSTruth" + ,"BAD_CELLS_CORR_E_DigiHSTruth" + ,"ENG_POS_DigiHSTruth" + ,"SIGNIFICANCE_DigiHSTruth" + ,"CELL_SIGNIFICANCE_DigiHSTruth" + ,"CELL_SIG_SAMPLING_DigiHSTruth" + ,"AVG_LAR_Q_DigiHSTruth" + ,"AVG_TILE_Q_DigiHSTruth" + ,"ENERGY_DigiHSTruth" + ,"PHI_DigiHSTruth" + ,"ETA_DigiHSTruth" + ] + return TopoMoments_Truth + +def getTopoCalibMoments(configFlags): + from CaloCalibHitRec.CaloCalibHitRecConf import CaloCalibClusterMomentsMaker2 + TopoCalibMoments = CaloCalibClusterMomentsMaker2 ("TopoCalibMoments") + TopoCalibMoments.MomentsNames = ["ENG_CALIB_TOT" + ,"ENG_CALIB_OUT_L" + #,"ENG_CALIB_OUT_M" + # ,"ENG_CALIB_OUT_T" + # ,"ENG_CALIB_DEAD_L" + # ,"ENG_CALIB_DEAD_M" + # ,"ENG_CALIB_DEAD_T" + ,"ENG_CALIB_EMB0" + ,"ENG_CALIB_EME0" + ,"ENG_CALIB_TILEG3" + ,"ENG_CALIB_DEAD_TOT" + ,"ENG_CALIB_DEAD_EMB0" + ,"ENG_CALIB_DEAD_TILE0" + ,"ENG_CALIB_DEAD_TILEG3" + ,"ENG_CALIB_DEAD_EME0" + ,"ENG_CALIB_DEAD_HEC0" + ,"ENG_CALIB_DEAD_FCAL" + ,"ENG_CALIB_DEAD_LEAKAGE" + ,"ENG_CALIB_DEAD_UNCLASS" + ,"ENG_CALIB_FRAC_EM" + ,"ENG_CALIB_FRAC_HAD" + ,"ENG_CALIB_FRAC_REST"] + + TopoCalibMoments.CalibrationHitContainerNames = ["LArCalibrationHitInactive" + ,"LArCalibrationHitActive" + ,"TileCalibHitActiveCell" + ,"TileCalibHitInactiveCell"] + TopoCalibMoments.DMCalibrationHitContainerNames = ["LArCalibrationHitDeadMaterial" + ,"TileCalibHitDeadMaterial"] + return TopoCalibMOments + +def caloTopoCoolFolderCfg(configFlags): + result=ComponentAccumulator() + from IOVDbSvc.IOVDbSvcConfig import addFolders, IOVDbSvcCfg + result.mergeAll(IOVDbSvcCfg(configFlags)) + # rely on global tag for both MC and data; do not specify folder tags + # use CALO_OFL only for GEO>=18 + hadCalibFolders = [ + "HadCalibration2/CaloEMFrac", + "HadCalibration2/H1ClusterCellWeights", + "HadCalibration2/CaloOutOfCluster", + "HadCalibration2/CaloOutOfClusterPi0", + "HadCalibration2/CaloDMCorr2" + ] + hadCalibPrefix = "/CALO/" + hadCalibDB = "CALO_ONL" + if configFlags.Input.isMC: + hadCalibPrefix = "/CALO/Ofl/" + hadCalibDB = "CALO_OFL" + hadCalibFolders = [ hadCalibPrefix + foldername for foldername in hadCalibFolders ] + result.merge(addFolders(configFlags, hadCalibFolders, hadCalibDB, className="CaloLocalHadCoeff")) + + return result + +def getTopoClusterLocalCalibTools(configFlags, theCaloNoiseTool): + from CaloUtils.CaloUtilsConf import CaloLCClassificationTool, CaloLCWeightTool, CaloLCOutOfClusterTool, CaloLCDeadMaterialTool + from CaloClusterCorrection.CaloClusterCorrectionConf import CaloClusterLocalCalib + # Local cell weights + LCClassify = CaloLCClassificationTool("LCClassify") + LCClassify.ClassificationKey = "EMFracClassify" + LCClassify.UseSpread = False + LCClassify.MaxProbability = 0.5 + # add the moments EM_PROBABILITY, HAD_WEIGHT, OOC_WEIGHT, DM_WEIGHT to the AOD: + LCClassify.StoreClassificationProbabilityInAOD = True + LCClassify.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + + LCWeight = CaloLCWeightTool("LCWeight") + LCWeight.CorrectionKey = "H1ClusterCellWeights" + LCWeight.SignalOverNoiseCut = 2.0 + # ***** + # Needs calo noise tool config + LCWeight.CaloNoiseTool = theCaloNoiseTool + # ***** + LCWeight.UseHadProbability = True + + LocalCalib = CaloClusterLocalCalib ("LocalCalib") + LocalCalib.ClusterClassificationTool = [LCClassify] + LocalCalib.ClusterRecoStatus = [1,2] + LocalCalib.LocalCalibTools = [LCWeight] + LocalCalib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + + # Out-of-cluster corrections + LCOut = CaloLCOutOfClusterTool("LCOut") + LCOut.CorrectionKey = "OOCCorrection" + LCOut.UseEmProbability = False + LCOut.UseHadProbability = True + + OOCCalib = CaloClusterLocalCalib ("OOCCalib") + OOCCalib.ClusterRecoStatus = [1,2] + OOCCalib.LocalCalibTools = [LCOut] + OOCCalib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + + LCOutPi0 = CaloLCOutOfClusterTool("LCOutPi0") + LCOutPi0.CorrectionKey = "OOCPi0Correction" + LCOutPi0.UseEmProbability = True + LCOutPi0.UseHadProbability = False + + OOCPi0Calib = CaloClusterLocalCalib ("OOCPi0Calib") + OOCPi0Calib.ClusterRecoStatus = [1,2] + OOCPi0Calib.LocalCalibTools = [LCOutPi0] + + OOCPi0Calib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + + # Dead material corrections + LCDeadMaterial = CaloLCDeadMaterialTool("LCDeadMaterial") + LCDeadMaterial.HadDMCoeffKey = "HadDMCoeff2" + LCDeadMaterial.ClusterRecoStatus = 0 + LCDeadMaterial.WeightModeDM = 2 + LCDeadMaterial.UseHadProbability = True + LCDeadMaterial.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + + DMCalib = CaloClusterLocalCalib ("DMCalib") + DMCalib.ClusterRecoStatus = [1,2] + DMCalib.LocalCalibTools = [LCDeadMaterial] + + DMCalib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + + lccalibtools = [ + LocalCalib, + OOCCalib, + OOCPi0Calib, + DMCalib] + return lccalibtools + +def getTopoMoments(configFlags,theCaloNoiseTool): + from CaloRec.CaloRecConf import CaloClusterMomentsMaker + TopoMoments = CaloClusterMomentsMaker ("TopoMoments") + TopoMoments.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + from AthenaCommon.SystemOfUnits import deg + TopoMoments.MaxAxisAngle = 20*deg + TopoMoments.CaloNoiseTool = theCaloNoiseTool + TopoMoments.UsePileUpNoise = True + TopoMoments.TwoGaussianNoise = configFlags.Calo.TopoCluster.doTwoGaussianNoise + TopoMoments.MinBadLArQuality = 4000 + TopoMoments.MomentsNames = ["FIRST_PHI" + ,"FIRST_ETA" + ,"SECOND_R" + ,"SECOND_LAMBDA" + ,"DELTA_PHI" + ,"DELTA_THETA" + ,"DELTA_ALPHA" + ,"CENTER_X" + ,"CENTER_Y" + ,"CENTER_Z" + ,"CENTER_MAG" + ,"CENTER_LAMBDA" + ,"LATERAL" + ,"LONGITUDINAL" + ,"FIRST_ENG_DENS" + ,"ENG_FRAC_EM" + ,"ENG_FRAC_MAX" + ,"ENG_FRAC_CORE" + ,"FIRST_ENG_DENS" + ,"SECOND_ENG_DENS" + ,"ISOLATION" + ,"ENG_BAD_CELLS" + ,"N_BAD_CELLS" + ,"N_BAD_CELLS_CORR" + ,"BAD_CELLS_CORR_E" + ,"BADLARQ_FRAC" + ,"ENG_POS" + ,"SIGNIFICANCE" + ,"CELL_SIGNIFICANCE" + ,"CELL_SIG_SAMPLING" + ,"AVG_LAR_Q" + ,"AVG_TILE_Q" + ,"PTD" + ,"MASS" + ] + + # ***** + # Is this still right? + # only add HV related moments if it is offline. + # from IOVDbSvc.CondDB import conddb + # if not conddb.isOnline: + from LArCellRec.LArCellRecConf import LArHVFraction + if configFlags.Input.isMC: + TopoMoments.LArHVFraction=LArHVFraction(HVScaleCorrKey="LArHVScaleCorr") + else: + TopoMoments.LArHVFraction=LArHVFraction(HVScaleCorrKey="LArHVScaleCorrRecomputed") + TopoMoments.MomentsNames += ["ENG_BAD_HV_CELLS" + ,"N_BAD_HV_CELLS" + ] + + return TopoMoments + +# a.k.a. DigiTruth +def getTopoTruthMoments(configFlags,theCaloNoiseTool): + from CaloRec.CaloRecConf import CaloClusterMomentsMaker + TopoMoments_Truth = CaloClusterMomentsMaker_DigiHSTruth ("TopoMoments_Truth") + from LArCellRec.LArCellRecConf import LArHVFraction + TopoMoments_Truth.LArHVFraction=LArHVFraction(HVScaleCorrKey="LArHVScaleCorr") + TopoMoments_Truth.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute + from AthenaCommon.SystemOfUnits import deg + TopoMoments_Truth.MaxAxisAngle = 20*deg + TopoMoments_Truth.CaloNoiseTool = theCaloNoiseTool + TopoMoments_Truth.UsePileUpNoise = True + TopoMoments_Truth.TwoGaussianNoise = configFlags.Calo,TopoCluster.doTwoGaussianNoise + TopoMoments_Truth.MinBadLArQuality = 4000 + TopoMoments_Truth.MomentsNames = ["FIRST_PHI_DigiHSTruth" + ,"FIRST_ETA_DigiHSTruth" + ,"SECOND_R_DigiHSTruth" + ,"SECOND_LAMBDA_DigiHSTruth" + ,"DELTA_PHI_DigiHSTruth" + ,"DELTA_THETA_DigiHSTruth" + ,"DELTA_ALPHA_DigiHSTruth" + ,"CENTER_X_DigiHSTruth" + ,"CENTER_Y_DigiHSTruth" + ,"CENTER_Z_DigiHSTruth" + ,"CENTER_MAG_DigiHSTruth" + ,"CENTER_LAMBDA_DigiHSTruth" + ,"LATERAL_DigiHSTruth" + ,"LONGITUDINAL_DigiHSTruth" + ,"ENG_FRAC_CORE_DigiHSTruth" + ,"FIRST_ENG_DENS_DigiHSTruth" + ,"SECOND_ENG_DENS_DigiHSTruth" + ,"ISOLATION_DigiHSTruth" + ,"BAD_CELLS_CORR_E_DigiHSTruth" + ,"ENG_POS_DigiHSTruth" + ,"SIGNIFICANCE_DigiHSTruth" + ,"CELL_SIGNIFICANCE_DigiHSTruth" + ,"CELL_SIG_SAMPLING_DigiHSTruth" + ,"AVG_LAR_Q_DigiHSTruth" + ,"AVG_TILE_Q_DigiHSTruth" + ,"ENERGY_DigiHSTruth" + ,"PHI_DigiHSTruth" + ,"ETA_DigiHSTruth" + ] + return TopoMoments_Truth + +def getTopoCalibMoments(configFlags): + from CaloCalibHitRec.CaloCalibHitRecConf import CaloCalibClusterMomentsMaker2 + TopoCalibMoments = CaloCalibClusterMomentsMaker2 ("TopoCalibMoments") + TopoCalibMoments.MomentsNames = ["ENG_CALIB_TOT" + ,"ENG_CALIB_OUT_L" + #,"ENG_CALIB_OUT_M" + # ,"ENG_CALIB_OUT_T" + # ,"ENG_CALIB_DEAD_L" + # ,"ENG_CALIB_DEAD_M" + # ,"ENG_CALIB_DEAD_T" + ,"ENG_CALIB_EMB0" + ,"ENG_CALIB_EME0" + ,"ENG_CALIB_TILEG3" + ,"ENG_CALIB_DEAD_TOT" + ,"ENG_CALIB_DEAD_EMB0" + ,"ENG_CALIB_DEAD_TILE0" + ,"ENG_CALIB_DEAD_TILEG3" + ,"ENG_CALIB_DEAD_EME0" + ,"ENG_CALIB_DEAD_HEC0" + ,"ENG_CALIB_DEAD_FCAL" + ,"ENG_CALIB_DEAD_LEAKAGE" + ,"ENG_CALIB_DEAD_UNCLASS" + ,"ENG_CALIB_FRAC_EM" + ,"ENG_CALIB_FRAC_HAD" + ,"ENG_CALIB_FRAC_REST"] + + TopoCalibMoments.CalibrationHitContainerNames = ["LArCalibrationHitInactive" + ,"LArCalibrationHitActive" + ,"TileCalibHitActiveCell" + ,"TileCalibHitInactiveCell"] + TopoCalibMoments.DMCalibrationHitContainerNames = ["LArCalibrationHitDeadMaterial" + ,"TileCalibHitDeadMaterial"] + return TopoCalibMOments def CaloTopoClusterCfg(configFlags): result=ComponentAccumulator() @@ -16,13 +483,22 @@ def CaloTopoClusterCfg(configFlags): from CaloClusterCorrection.CaloClusterCorrectionConf import CaloClusterCellWeightCalib from CaloRec.CaloRecConf import CaloTopoClusterMaker, CaloTopoClusterSplitter, CaloClusterMomentsMaker, CaloClusterMaker, CaloClusterSnapshot #, CaloClusterLockVars, CaloClusterPrinter - result.merge(LArGMCfg(configFlags)) + + from LArBadChannelTool.LArBadChannelConfig import LArBadChannelCfg + result.merge(LArBadChannelCfg(configFlags)) + from LArCalibUtils.LArHVScaleConfig import LArHVScaleCfg + result.merge(LArHVScaleCfg(configFlags)) + result.merge(TileGMCfg(configFlags)) + from TileConditions.TileConditionsConfig import tileCondCfg + result.merge(tileCondCfg(configFlags)) #Get CaloNoiseTool acc,theCaloNoiseTool=CaloNoiseToolCfg(configFlags) result.merge(acc) + + theCaloClusterSnapshot=CaloClusterSnapshot(OutputName="CaloTopoCluster",SetCrossLinks=True) # maker tools TopoMaker = CaloTopoClusterMaker("TopoMaker") @@ -92,10 +568,26 @@ def CaloTopoClusterCfg(configFlags): CaloTopoCluster=CaloClusterMaker("CaloTopoCluster") - CaloTopoCluster.ClustersOutputName="CaloCalTopoClusters" + CaloTopoCluster.ClustersOutputName="CaloTopoClusters" + if configFlags.Calo.TopoCluster.doTopoClusterLocalCalib: + CaloTopoCluster.ClustersOutputName="CaloCalTopoClusters" CaloTopoCluster.ClusterMakerTools = [TopoMaker, TopoSplitter] + from CaloClusterCorrection.CaloClusterBadChannelListCorr import CaloClusterBadChannelListCorr + BadChannelListCorr = CaloClusterBadChannelListCorr() + CaloTopoCluster.ClusterCorrectionTools += [BadChannelListCorr] + + CaloTopoCluster.ClusterCorrectionTools += [getTopoMoments(configFlags,theCaloNoiseTool)] + + CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot] + + if configFlags.Calo.TopoCluster.doTopoClusterLocalCalib: + CaloTopoCluster.ClustersOutputName="CaloCalTopoClusters" + CaloTopoCluster.ClusterCorrectionTools += getTopoClusterLocalCalibTools(configFlags,theCaloNoiseTool) + + result.merge(caloTopoCoolFolderCfg(configFlags)) + return result,CaloTopoCluster @@ -108,17 +600,24 @@ if __name__=="__main__": from AthenaCommon.Constants import DEBUG from AthenaConfiguration.AllConfigFlags import ConfigFlags - log.setLevel(DEBUG) + #log.setLevel(DEBUG) + + ConfigFlags.Input.Files = ["myESD-data.pool.root"] +# ConfigFlags.Output.ESDFileName="esdOut.pool.root" + + nThreads=1 + ConfigFlags.Concurrency.NumThreads = nThreads + if nThreads>0: + ConfigFlags.Scheduler.ShowDataDeps = True + ConfigFlags.Scheduler.ShowDataFlow = True + ConfigFlags.Scheduler.ShowControlFlow = True + ConfigFlags.Concurrency.NumConcurrentEvents = nThreads - ConfigFlags.Input.isMC = False - ConfigFlags.Input.Files = ["myESD.pool.root"] - ConfigFlags.Output.ESDFileName="esdOut.pool.root" ConfigFlags.lock() - from AthenaConfiguration.MainServicesConfig import MainServicesSerialCfg + from AthenaConfiguration.MainServicesConfig import MainServicesThreadedCfg from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg - #cfg=ComponentAccumulator() - cfg=MainServicesSerialCfg() + cfg=MainServicesThreadedCfg(ConfigFlags) cfg.merge(PoolReadCfg(ConfigFlags)) theKey="CaloCalTopoClustersNew" @@ -130,14 +629,28 @@ if __name__=="__main__": cfg.addEventAlgo(topoAlg,sequenceName="AthAlgSeq") from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg - cfg.merge(OutputStreamCfg(ConfigFlags,"ESD", ItemList=["xAOD::CaloClusterContainer#"+theKey, - "xAOD::CaloClusterAuxContainer#"+theKey+"Aux.", - "CaloClusterCellLinkContainer#"+theKey+"_links"])) + cfg.merge(OutputStreamCfg(ConfigFlags,"xAOD", ItemList=["xAOD::CaloClusterContainer#CaloCalTopoClusters*",#+theKey, + "xAOD::CaloClusterAuxContainer#*CaloCalTopoClusters*Aux.",#+theKey+"Aux.", + # "CaloClusterCellLinkContainer#"+theKey+"_links" + ])) + cfg.getEventAlgo("OutputStreamxAOD").ForceRead=True + + from AthenaServices.AthenaServicesConf import ThinningSvc, ThinningOutputTool + cfg.addService(ThinningSvc()) + tot = ThinningOutputTool("Thin_xAOD",ThinningSvc = cfg.getService("ThinningSvc")) + cfg.getEventAlgo("OutputStreamxAOD").HelperTools += [tot] + from ThinningUtils.ThinningUtilsConf import ThinNegativeEnergyCaloClustersAlg + theNegativeEnergyCaloClustersThinner = ThinNegativeEnergyCaloClustersAlg( + "ThinNegativeEnergyCaloClustersAlg", + CaloClustersKey=theKey, + ThinNegativeEnergyCaloClusters = True, + ) + cfg.addEventAlgo(theNegativeEnergyCaloClustersThinner,"AthAlgSeq") - cfg.getService("StoreGateSvc").Dump=True +# cfg.getService("StoreGateSvc").Dump=True - cfg.run() + cfg.run(10) #f=open("CaloTopoCluster.pkl","w") #cfg.store(f) #f.close() diff --git a/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py b/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py index d3e6c0010ed0e80cc1703777dc35915274b90312..3d9b79b0042b982d209038f8c7c70a941707d702 100644 --- a/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py +++ b/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py @@ -1,3 +1,4 @@ + from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator from IOVDbSvc.IOVDbSvcConfig import addFolders from CaloTools.CaloToolsConf import CaloNoiseToolDB @@ -18,7 +19,7 @@ def CaloNoiseToolCfg(configFlags): if configFlags.Common.isOnline: #online mode: folder = "/CALO/Noise/CellNoise" - result.merge(addFolders(configFlags,inputFlags,folder,'CALO_ONL')) + result.merge(addFolders(configFlags,folder,'CALO_ONL')) caloNoiseToolDB.FolderNames=[folder,] if fixedLumi >= 0 : caloNoiseToolDB.Luminosity = fixedLumi @@ -35,7 +36,7 @@ def CaloNoiseToolCfg(configFlags): log.info("online mode: ignore pileup noise") pass result.addPublicTool(caloNoiseToolDB) - return result + return result, caloNoiseToolDB #The not-online case: if isMC: @@ -75,7 +76,7 @@ def CaloNoiseToolCfg(configFlags): lumiFolder = '/TRIGGER/LUMI/LBLESTONL' result.merge(addFolders(configFlags,lumiFolder,'TRIGGER_ONL')) log.info("offline mode: use luminosity = f(Lumiblock) to scale pileup noise") - caloNoiseToolDB.LumiFolderName = lumiFolder + caloNoiseToolDB.LumiFolderName = lumiFolder folders=[("LAR_OFL","/LAR/NoiseOfl/CellNoise"), @@ -85,8 +86,32 @@ def CaloNoiseToolCfg(configFlags): if configFlags.IOVDb.DatabaseInstance=="COMP200": folders.append(("CALO_OFL","/CALO/Ofl/Noise/CellNoise")), - #Fixme: Add rescaling of noise based on HV! + if configFlags.IOVDb.DatabaseInstance=="CONDBR2" and configFlags.Calo.Cell.doLArHVCorr: + log.info("Run2 & doLArHVCorr=True: Will rescale noise automatically for HV trips") + + from LArCalibUtils.LArHVScaleConfig import LArHVScaleCfg + result.merge( LArHVScaleCfg(configFlags) ) + + from LArCondUtils.LArCondUtilsConf import LArHVToolDB + theLArHVToolDB = LArHVToolDB("LArHVToolDB") + result.addPublicTool( theLArHVToolDB ) + from LArRecUtils.LArRecUtilsConf import LArHVCorrTool + theLArHVCorrTool = LArHVCorrTool("LArHVCorrTool") + theLArHVCorrTool.keyOutput = "LArHVScaleCorr" + theLArHVCorrTool.folderName= "/LAR/ElecCalibFlat/HVScaleCorr" + theLArHVCorrTool.doTdrift = False + theLArHVCorrTool.DeltaTupdate = 0 + theLArHVCorrTool.HVTool = theLArHVToolDB + result.addPublicTool( theLArHVCorrTool ) + + from LArCellRec.LArCellRecConf import LArCellHVCorr + theLArCellHVCorr = LArCellHVCorr("LArCellHVCorr") + theLArCellHVCorr.HVCorrTool = theLArHVCorrTool + result.addPublicTool( theLArCellHVCorr ) + + caloNoiseToolDB.RescaleForHV=True + caloNoiseToolDB.LArHVCellCorrTool = theLArCellHVCorr pass #end of real data case @@ -96,7 +121,7 @@ def CaloNoiseToolCfg(configFlags): caloNoiseToolDB.FolderNames=[f[1] for f in folders] result.addPublicTool(caloNoiseToolDB) - + return result,caloNoiseToolDB if __name__ == "__main__": diff --git a/Control/AthenaConfiguration/python/AllConfigFlags.py b/Control/AthenaConfiguration/python/AllConfigFlags.py index cbcef7a4e36e3102c365909f8881a12c8fdf9334..3dbc6b7a75c84e0e220d291d95a834f3f65332ec 100644 --- a/Control/AthenaConfiguration/python/AllConfigFlags.py +++ b/Control/AthenaConfiguration/python/AllConfigFlags.py @@ -35,8 +35,9 @@ def _createCfgFlags(): # replace global.Beam* acf.addFlag('Beam.BunchSpacing', 25) # former global.BunchSpacing - acf.addFlag("Beam.NumberOfCollisions",0) # former global.NumberOfCollisions - acf.addFlag('Beam.Type', 'collisions') # former global.BeamType + acf.addFlag('Beam.Type', lambda prevFlags : GetFileMD(prevFlags.Input.Files).get('beam_type','collisions') )# former global.BeamType + acf.addFlag("Beam.NumberOfCollisions", lambda prevFlags : (GetFileMD(prevFlags.Input.Files)["/Digitization/Parameters"]["numberOfCollisions"] if prevFlags.Input.isMC \ + else (2. if prevFlags.Beam.Type=='collisions' else 0.))) # former global.NumberOfCollisions acf.addFlag('Beam.Energy', lambda prevFlags : GetFileMD(prevFlags.Input.Files).get('BeamEnergy',7*TeV)) # former global.BeamEnergy acf.addFlag('Beam.estimatedLuminosity', lambda prevFlags : ( 1E33*(prevFlags.Beam.NumberOfCollisions)/2.3 ) *\ (25./prevFlags.Beam.BunchSpacing)) # former flobal.estimatedLuminosity @@ -84,11 +85,14 @@ def _createCfgFlags(): #CaloNoise Flags acf.addFlag("Calo.Noise.fixedLumiForNoise",-1) acf.addFlag("Calo.Noise.useCaloNoiseLumi",True) - + +#CaloCell flags + acf.addFlag("Calo.Cell.doLArHVCorr",False) # Disable for now as it is broken... #TopoCluster Flags: acf.addFlag("Calo.TopoCluster.doTwoGaussianNoise",True) acf.addFlag("Calo.TopoCluster.doTreatEnergyCutAsAbsolute",False) + acf.addFlag("Calo.TopoCluster.doTopoClusterLocalCalib",True) def __trigger(): diff --git a/Control/AthenaConfiguration/python/MainServicesConfig.py b/Control/AthenaConfiguration/python/MainServicesConfig.py index e230efaf380c9bc0372131d7797a80100e89d1d5..b2f41bb149213242c1195c7bce4dfe3254d81b54 100644 --- a/Control/AthenaConfiguration/python/MainServicesConfig.py +++ b/Control/AthenaConfiguration/python/MainServicesConfig.py @@ -14,13 +14,32 @@ def MainServicesMiniCfg(LoopMgr='AthenaEventLoopMgr'): cfg.setAppProperty('JobOptionsPreAction', '') return cfg +from AthenaConfiguration.AthConfigFlags import AthConfigFlags -def MainServicesSerialCfg(LoopMgr='AthenaEventLoopMgr'): +def MainServicesSerialCfg(): + serialflags=AthConfigFlags() + serialflags.addFlag('Concurrency.NumProcs', 0) + serialflags.addFlag('Concurrency.NumThreads', 0) + serialflags.addFlag('Concurrency.NumConcurrentEvents', 0) + return MainServicesThreadedCfg(serialflags) + +def MainServicesThreadedCfg(cfgFlags): + + # Run a serial job for threads=0 + LoopMgr = 'AthenaEventLoopMgr' + if cfgFlags.Concurrency.NumThreads>0: + if cfgFlags.Concurrency.NumConcurrentEvents==0: + # In a threaded job this will mess you up because no events will be processed + raise Exception("Requested Concurrency.NumThreads>0 and Concurrency.NumConcurrentEvents==0, which will not process events!") + + LoopMgr = "AthenaHiveEventLoopMgr" + + ######################################################################## + # Core components needed for serial and threaded jobs cfg=ComponentAccumulator("AthMasterSeq") - cfg.merge(MainServicesMiniCfg(LoopMgr)) + cfg.merge( MainServicesMiniCfg(LoopMgr) ) cfg.setAppProperty('TopAlg',['AthSequencer/AthMasterSeq'],overwrite=True) - cfg.setAppProperty('OutStreamType', 'AthenaOutputStream') - + cfg.setAppProperty('OutStreamType', 'AthenaOutputStream') #Build standard sequences: cfg.addSequence(AthSequencer('AthAlgEvtSeq',Sequential=True, StopOverride=True),parentName="AthMasterSeq") @@ -29,9 +48,20 @@ def MainServicesSerialCfg(LoopMgr='AthenaEventLoopMgr'): cfg.addSequence(AthSequencer('AthBeginSeq',Sequential=True),parentName='AthAlgEvtSeq') cfg.addSequence(AthSequencer('AthAllAlgSeq'),parentName='AthAlgEvtSeq') - cfg.addSequence(AthSequencer('AthAlgSeq',IgnoreFilterPassed=True,StopOverride=True),parentName='AthAllAlgSeq') + + if cfgFlags.Concurrency.NumThreads==0: + # For serial execution, we need the CondAlgs to execute first. + cfg.addSequence(AthSequencer('AthCondSeq'),parentName='AthAllAlgSeq') + cfg.addSequence(AthSequencer('AthAlgSeq',IgnoreFilterPassed=True,StopOverride=True),parentName='AthAllAlgSeq') + else: + # In MT, the order of execution is irrelevant (determined by data deps). + # We add the conditions sequence later such that the CondInputLoader gets + # initialized after all other user Algorithms for MT, so the base classes + # of data deps can be correctly determined. + cfg.addSequence(AthSequencer('AthAlgSeq',IgnoreFilterPassed=True,StopOverride=True),parentName='AthAllAlgSeq') + cfg.addSequence(AthSequencer('AthCondSeq'),parentName='AthAllAlgSeq') + cfg.addSequence(AthSequencer('AthEndSeq',Sequential=True),parentName='AthAlgEvtSeq') - cfg.addSequence(AthSequencer('AthCondSeq'),parentName='AthAllAlgSeq') #Set up incident firing: from AthenaServices.AthenaServicesConf import AthIncFirerAlg @@ -47,97 +77,84 @@ def MainServicesSerialCfg(LoopMgr='AthenaEventLoopMgr'): from CLIDComps.CLIDCompsConf import ClassIDSvc cfg.addService(ClassIDSvc(CLIDDBFiles= ['clid.db',"Gaudi_clid.db" ])) - from StoreGate.StoreGateConf import StoreGateSvc cfg.addService(StoreGateSvc()) cfg.addService(StoreGateSvc("DetectorStore")) cfg.addService(StoreGateSvc("HistoryStore")) cfg.setAppProperty('InitializationLoopCheck',False) - return cfg - -def MainServicesThreadedCfg(cfgFlags): - # Neater ways to set the loop manager? Can't be altered - # after setting up the - - # Run a serial job for threads=0 - if cfgFlags.Concurrency.NumThreads==0: - return MainServicesSerialCfg() - - if cfgFlags.Concurrency.NumConcurrentEvents==0: - # In a threaded job this will mess you up because no events will be processed - raise Exception("Requested Concurrency.NumThreads>0 and Concurrency.NumConcurrentEvents==0, which will not process events!") - - cfg = MainServicesSerialCfg("AthenaHiveEventLoopMgr") - - # Migrated code from AtlasThreadedJob.py - from GaudiCoreSvc.GaudiCoreSvcConf import MessageSvc - from GaudiSvc.GaudiSvcConf import StatusCodeSvc, AuditorSvc - - msgsvc = MessageSvc() - msgsvc.defaultLimit = 0 - #msgFmt = "% F%40W%S%4W%e%s%7W%R%T %0W%M" - msgFmt = "% F%18W%S%7W%R%T %0W%M" - msgsvc.Format = msgFmt - cfg.addService(msgsvc) - - scsvc = StatusCodeSvc() - scsvc.AbortOnError = False - cfg.addService(scsvc) - cfg.setAppProperty('StatusCodeCheck',False) - - from StoreGate.StoreGateConf import SG__HiveMgrSvc - hivesvc = SG__HiveMgrSvc("EventDataSvc") - hivesvc.NSlots = cfgFlags.Concurrency.NumConcurrentEvents - cfg.addService( hivesvc ) - - from StoreGate.StoreGateConf import StoreGateSvc - cfg.addService( StoreGateSvc("ConditionStore") ) - - from GaudiHive.GaudiHiveConf import AlgResourcePool - from AthenaCommon.Constants import INFO - arp=AlgResourcePool( OutputLevel = INFO ) - arp.TopAlg=["AthMasterSeq"] #this should enable control flow - cfg.addService( arp ) - - from GaudiHive.GaudiHiveConf import AvalancheSchedulerSvc - scheduler = AvalancheSchedulerSvc() - scheduler.CheckDependencies = cfgFlags.Scheduler.CheckDependencies - scheduler.ShowDataDependencies = cfgFlags.Scheduler.ShowDataDeps - scheduler.ShowDataFlow = cfgFlags.Scheduler.ShowDataFlow - scheduler.ShowControlFlow = cfgFlags.Scheduler.ShowControlFlow - scheduler.ThreadPoolSize = cfgFlags.Concurrency.NumThreads - cfg.addService(scheduler) - - from SGComps.SGCompsConf import SGInputLoader - # FailIfNoProxy=False makes it a warning, not an error, if unmet data - # dependencies are not found in the store. It should probably be changed - # to True eventually. - inputloader = SGInputLoader (FailIfNoProxy = False) - cfg.addEventAlgo( inputloader, "AthAlgSeq" ) - scheduler.DataLoaderAlg = inputloader.getName() - - from AthenaServices.AthenaServicesConf import AthenaHiveEventLoopMgr - - elmgr = AthenaHiveEventLoopMgr() - elmgr.WhiteboardSvc = "EventDataSvc" - elmgr.SchedulerSvc = scheduler.getName() - cfg.addService( elmgr ) - - # enable timeline recording - from GaudiHive.GaudiHiveConf import TimelineSvc - cfg.addService( TimelineSvc( RecordTimeline = True, Partial = False ) ) - - # - ## Setup SGCommitAuditor to sweep new DataObjects at end of Alg execute - # - - auditorsvc = AuditorSvc() - from SGComps.SGCompsConf import SGCommitAuditor - auditorsvc += SGCommitAuditor() - cfg.addService( auditorsvc ) - cfg.setAppProperty("AuditAlgorithms", True) + ######################################################################## + # Additional components needed for threaded jobs only + if cfgFlags.Concurrency.NumThreads>0: + + # Migrated code from AtlasThreadedJob.py + from GaudiCoreSvc.GaudiCoreSvcConf import MessageSvc + from GaudiSvc.GaudiSvcConf import StatusCodeSvc, AuditorSvc + + msgsvc = MessageSvc() + msgsvc.defaultLimit = 0 + #msgFmt = "% F%40W%S%4W%e%s%7W%R%T %0W%M" + msgFmt = "% F%18W%S%7W%R%T %0W%M" + msgsvc.Format = msgFmt + cfg.addService(msgsvc) + + scsvc = StatusCodeSvc() + scsvc.AbortOnError = False + cfg.addService(scsvc) + cfg.setAppProperty('StatusCodeCheck',False) + + from StoreGate.StoreGateConf import SG__HiveMgrSvc + hivesvc = SG__HiveMgrSvc("EventDataSvc") + hivesvc.NSlots = cfgFlags.Concurrency.NumConcurrentEvents + cfg.addService( hivesvc ) + + from StoreGate.StoreGateConf import StoreGateSvc + cfg.addService( StoreGateSvc("ConditionStore") ) + + from GaudiHive.GaudiHiveConf import AlgResourcePool + from AthenaCommon.Constants import INFO + arp=AlgResourcePool( OutputLevel = INFO ) + arp.TopAlg=["AthMasterSeq"] #this should enable control flow + cfg.addService( arp ) + + from GaudiHive.GaudiHiveConf import AvalancheSchedulerSvc + scheduler = AvalancheSchedulerSvc() + scheduler.CheckDependencies = cfgFlags.Scheduler.CheckDependencies + scheduler.ShowDataDependencies = cfgFlags.Scheduler.ShowDataDeps + scheduler.ShowDataFlow = cfgFlags.Scheduler.ShowDataFlow + scheduler.ShowControlFlow = cfgFlags.Scheduler.ShowControlFlow + scheduler.ThreadPoolSize = cfgFlags.Concurrency.NumThreads + cfg.addService(scheduler) + + from SGComps.SGCompsConf import SGInputLoader + # FailIfNoProxy=False makes it a warning, not an error, if unmet data + # dependencies are not found in the store. It should probably be changed + # to True eventually. + inputloader = SGInputLoader (FailIfNoProxy = False) + cfg.addEventAlgo( inputloader, "AthAlgSeq" ) + scheduler.DataLoaderAlg = inputloader.getName() + + from AthenaServices.AthenaServicesConf import AthenaHiveEventLoopMgr + + elmgr = AthenaHiveEventLoopMgr() + elmgr.WhiteboardSvc = "EventDataSvc" + elmgr.SchedulerSvc = scheduler.getName() + cfg.addService( elmgr ) + + # enable timeline recording + from GaudiHive.GaudiHiveConf import TimelineSvc + cfg.addService( TimelineSvc( RecordTimeline = True, Partial = False ) ) + + # + ## Setup SGCommitAuditor to sweep new DataObjects at end of Alg execute + # + + auditorsvc = AuditorSvc() + from SGComps.SGCompsConf import SGCommitAuditor + auditorsvc += SGCommitAuditor() + cfg.addService( auditorsvc ) + cfg.setAppProperty("AuditAlgorithms", True) return cfg diff --git a/LArCalorimeter/LArCalibUtils/python/LArHVScaleConfig.py b/LArCalorimeter/LArCalibUtils/python/LArHVScaleConfig.py new file mode 100644 index 0000000000000000000000000000000000000000..fbe52c53e4564898296da689e8021e61578e9ea0 --- /dev/null +++ b/LArCalorimeter/LArCalibUtils/python/LArHVScaleConfig.py @@ -0,0 +1,80 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator + +def LArHVScaleCfg(configFlags): + result=ComponentAccumulator() + + if configFlags.Input.isMC: + result.merge(addFolders(configFlags,["/LAR/IdentifierOfl/HVLineToElectrodeMap<tag>LARHVLineToElectrodeMap-001</tag>"], "LAR_OFL", className="AthenaAttributeList")) + + elif not configFlags.Common.isOnline: + from IOVDbSvc.IOVDbSvcConfig import addFolders, IOVDbSvcCfg + result.mergeAll(IOVDbSvcCfg(configFlags)) + result.merge(addFolders(configFlags,["/LAR/DCS/HV/BARREl/I16"], "DCS_OFL", className="CondAttrListCollection")) + result.merge(addFolders(configFlags,["/LAR/DCS/HV/BARREL/I8"], "DCS_OFL", className="CondAttrListCollection")) + + result.merge(addFolders(configFlags,["/LAR/IdentifierOfl/HVLineToElectrodeMap"], "LAR_OFL", className="AthenaAttributeList")) + result.merge(addFolders(configFlags,["/LAR/HVPathologiesOfl/Pathologies"], "LAR_OFL", className="AthenaAttributeList")) + + result.merge(addFolders(configFlags,["/LAR/ElecCalibFlat/HVScaleCorr"],"LAR_ONL", className="CondAttrListCollection")) + + from LArBadChannelTool.LArBadChannelConfig import LArBadChannelCfg, LArBadFebCfg + result.merge(LArBadChannelCfg(configFlags)) + result.merge(LArBadFebCfg(configFlags)) + + from LArRecUtils.LArRecUtilsConf import LArHVIdMappingAlg + hvmapalg = LArHVIdMappingAlg(ReadKey="/LAR/IdentifierOfl/HVLineToElectrodeMap",WriteKey="LArHVIdMap") + result.addCondAlgo(hvmapalg) + + from LArRecUtils.LArRecUtilsConf import LArHVPathologyDbCondAlg + hvpath = LArHVPathologyDbCondAlg(PathologyFolder="/LAR/HVPathologiesOfl/Pathologies", + HVMappingKey="LArHVIdMap", + HVPAthologyKey="LArHVPathology") + result.addCondAlgo(hvpath) + + from LArRecUtils.LArRecUtilsConf import LArHVCondAlg + hvcond = LArHVCondAlg("LArHVPathologyAlg",HVPathologies="LArHVPathology",OutputHVData="LArHVData") + result.addCondAlgo(hvcond) + + from LArRecUtils.LArRecUtilsConf import LArFlatConditionsAlg_LArHVScaleCorrFlat_ as LArHVScaleCorrFlat + hvscaleflat = LArHVScaleCorrFlat("LArHVScaleCorrFlat", + ReadKey="/LAR/ElecCalibFlat/HVScaleCorr", + WriteKey='LArHVScaleCorr') + result.addCondAlgo(hvscaleflat) + + from LArRecUtils.LArRecUtilsConf import LArHVScaleCorrCondAlg + hvscalecorrkey = "LArHVScaleCorrRecomputed" + if configFlags.Input.isMC: + hvscalecorrkey = "LArHVScaleCorr" + + hvscale = LArHVScaleCorrCondAlg(keyHVdata="LArHVData",keyOutputCorr=hvscalecorrkey) + hvscale.UndoOnlineHVCorr=True + result.addCondAlgo(hvscale) + + return result + +if __name__=="__main__": + from AthenaCommon.Configurable import Configurable + Configurable.configurableRun3Behavior=1 + from AthenaConfiguration.AllConfigFlags import ConfigFlags + + nThreads=1 + ConfigFlags.Concurrency.NumThreads = nThreads + if nThreads>0: + ConfigFlags.Scheduler.ShowDataDeps = True + ConfigFlags.Scheduler.ShowDataFlow = True + ConfigFlags.Scheduler.ShowControlFlow = True + ConfigFlags.Concurrency.NumConcurrentEvents = nThreads + + ConfigFlags.Input.Files = ["myESD-data.pool.root"] + ConfigFlags.lock() + + from AthenaConfiguration.MainServicesConfig import MainServicesSerialCfg + from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg + cfg=MainServicesSerialCfg() + cfg.merge(PoolReadCfg(ConfigFlags)) + + cfg.merge( LArHVScaleCfg(ConfigFlags) ) + + cfg.run(10) diff --git a/LArCalorimeter/LArCalibUtils/src/LArHVCorrMaker.cxx b/LArCalorimeter/LArCalibUtils/src/LArHVCorrMaker.cxx index 2fc0708ce896c10113c4bac27711d1d1e7c04bfa..2fe8f589b5bdf8cf73e09152afed23aaa62e2d6c 100755 --- a/LArCalorimeter/LArCalibUtils/src/LArHVCorrMaker.cxx +++ b/LArCalorimeter/LArCalibUtils/src/LArHVCorrMaker.cxx @@ -14,8 +14,9 @@ LArHVCorrMaker::LArHVCorrMaker(const std::string& name, ISvcLocator* pSvcLocator) : AthAlgorithm(name, pSvcLocator), m_lar_on_id(0), - m_hvCorrTool("LArHVCorrTool") + m_hvCorrTool("LArHVCorrTool",this) { + declareProperty("HVCorrTool", m_hvCorrTool); } //--------------------------------------------------------------------------- diff --git a/LArCalorimeter/LArRecUtils/src/LArHVCorrTool.cxx b/LArCalorimeter/LArRecUtils/src/LArHVCorrTool.cxx index 8893edfe85ac1cb6418984d7252da8a36f9c0120..f16d01686a8a0c13f29d1d442606bdbc095cefa3 100644 --- a/LArCalorimeter/LArRecUtils/src/LArHVCorrTool.cxx +++ b/LArCalorimeter/LArRecUtils/src/LArHVCorrTool.cxx @@ -36,7 +36,7 @@ LArHVCorrTool::LArHVCorrTool(const std::string& type, m_electrodeID(nullptr), m_calodetdescrmgr(nullptr), m_cablingService("LArCablingLegacyService"), - m_hvtool("LArHVToolMC") + m_hvtool("LArHVToolMC",this) { declareInterface<ILArHVCorrTool>(this);