356def CaloTopoClusterCfg(flags, cellsname="AllCalo", clustersname=None, clustersnapname="CaloTopoClusters"):
357 """
358 Configures topo clustering
359
360 If output writing is enabled (ESD,AOD) the topo clusters are added to them
361 """
362 doLCCalib = flags.Calo.TopoCluster.doTopoClusterLocalCalib
363 if clustersname is None:
364 clustersname = "CaloCalTopoClusters" if doLCCalib else "CaloTopoClusters"
365
366
367 if clustersname=="CaloTopoClusters" and doLCCalib is True:
368 raise RuntimeError("Inconsistent arguments: Name must not be 'CaloTopoClusters' if doLCCalib is True")
369
370 result=ComponentAccumulator()
371
372 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
373 from TileGeoModel.TileGMConfig import TileGMCfg
374 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
375
376 result.merge(CaloNoiseCondAlgCfg(flags,"totalNoise"))
377
378 result.merge(CaloNoiseCondAlgCfg(flags,"electronicNoise"))
379
380 CaloClusterMaker, CaloClusterSnapshot=CompFactory.getComps("CaloClusterMaker","CaloClusterSnapshot",)
381
382 result.merge(LArGMCfg(flags))
383
384 result.merge(TileGMCfg(flags))
385
386 TopoMaker = result.popToolsAndMerge( CaloTopoClusterToolCfg(flags, cellsname=cellsname))
387 TopoSplitter = result.popToolsAndMerge( CaloTopoClusterSplitterToolCfg(flags) )
388
389
390
391
392
393
394
395
397 CaloTopoCluster.ClustersOutputName=clustersname
398
399 CaloTopoCluster.ClusterMakerTools = [TopoMaker, TopoSplitter]
400
401 from CaloBadChannelTool.CaloBadChanToolConfig import CaloBadChanToolCfg
402 caloBadChanTool = result.popToolsAndMerge( CaloBadChanToolCfg(flags) )
403 CaloClusterBadChannelList=CompFactory.CaloClusterBadChannelList
405 CaloTopoCluster.ClusterCorrectionTools += [BadChannelListCorr]
406
407 momentsMaker=result.popToolsAndMerge(getTopoMoments(flags))
408 CaloTopoCluster.ClusterCorrectionTools += [momentsMaker]
409
410
411 if flags.Calo.TopoCluster.doCalibHitMoments:
412 calibHitsMomentsMaker=getTopoCalibMoments(flags)
413 CaloTopoCluster.ClusterCorrectionTools += [calibHitsMomentsMaker]
414 if clustersname == "CaloTopoClusters":
416 caloCalibDecorator = CaloCalibHitDecoratorTool(flags)
417 caloCalibDecoratorFullEnergy = CaloCalibHitDecoratorFullEnergyTool(flags)
418 CaloTopoCluster.ClusterCorrectionTools += [caloCalibTruthMapMaker, caloCalibDecorator, caloCalibDecoratorFullEnergy]
419
420
421
422 if doLCCalib:
423 theCaloClusterSnapshot=
CaloClusterSnapshot(OutputName=clustersnapname,SetCrossLinks=
True,FinalClusterContainerName=clustersname)
424 CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot]
425
426 CaloTopoCluster.ClusterCorrectionTools += getTopoClusterLocalCalibTools(flags)
427
428 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
429 result.merge(caloTopoCoolFolderCfg(flags))
430
431
432 result.addEventAlgo(CaloTopoCluster,primary=True)
433
434 if CaloTopoCluster.ClustersOutputName in flags.Calo.TopoCluster.skipWriteList:
435
436 return result
437
438
439
440 AODMoments=[ "SECOND_R"
441 ,"SECOND_LAMBDA"
442 ,"CENTER_MAG"
443 ,"CENTER_LAMBDA"
444 ,"FIRST_ENG_DENS"
445 ,"ENG_FRAC_MAX"
446 ,"ISOLATION"
447 ,"ENG_BAD_CELLS"
448 ,"N_BAD_CELLS"
449 ,"BADLARQ_FRAC"
450 ,"ENG_POS"
451 ,"SIGNIFICANCE"
452 ,"AVG_LAR_Q"
453 ,"AVG_TILE_Q"
454 ,"EM_PROBABILITY"
455 ,"BadChannelList"
456 ,"SECOND_TIME"
457 ,"NCELL_SAMPLING"]
458
459 if flags.Calo.TopoCluster.writeExtendedClusterMoments:
460 AODMoments += ["LATERAL"
461 ,"LONGITUDINAL"
462 ,"CELL_SIGNIFICANCE"
463 ,"PTD"
464 ,"MASS"]
465
466 if flags.Reco.EnableHI:
467 AODMoments += ["CELL_SIG_SAMPLING"]
468
469 if flags.Calo.TopoCluster.writeCalibHitClusterMoments:
470 AODMoments += ["ENG_CALIB_TOT"
471 ,"ENG_CALIB_OUT_L"
472 ,"ENG_CALIB_OUT_T"
473 ,"ENG_CALIB_EMB0"
474 ,"ENG_CALIB_EME0"
475 ,"ENG_CALIB_TILEG3"
476 ,"ENG_CALIB_DEAD_TOT"
477 ,"ENG_CALIB_DEAD_EMB0"
478 ,"ENG_CALIB_DEAD_TILE0"
479 ,"ENG_CALIB_DEAD_TILEG3"
480 ,"ENG_CALIB_DEAD_EME0"
481 ,"ENG_CALIB_DEAD_HEC0"
482 ,"ENG_CALIB_DEAD_FCAL"
483 ,"ENG_CALIB_DEAD_LEAKAGE"
484 ,"ENG_CALIB_DEAD_UNCLASS"
485 ,"ENG_CALIB_FRAC_EM"
486 ,"ENG_CALIB_FRAC_HAD"
487 ,"ENG_CALIB_FRAC_REST"]
488
489
490 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD, addToESD
491 toESD = [f"xAOD::CaloClusterContainer#{CaloTopoCluster.ClustersOutputName}",
492 f"xAOD::CaloClusterAuxContainer#{CaloTopoCluster.ClustersOutputName}Aux.-sigmaWidth",
493 f"CaloClusterCellLinkContainer#{CaloTopoCluster.ClustersOutputName}_links"]
494 toAOD = [f"xAOD::CaloClusterContainer#{CaloTopoCluster.ClustersOutputName}",
495 f"CaloClusterCellLinkContainer#{CaloTopoCluster.ClustersOutputName}_links"]
496
497 AODMoments.append("CellLink")
498 if flags.Calo.TopoCluster.addCalibrationHitDecoration:
499 AODMoments.append(flags.Calo.TopoCluster.CalibrationHitDecorationName)
500
501 if flags.Calo.TopoCluster.addCPData:
502 AODMoments += ["ClusterWidthEta","ClusterWidthPhi"]
503
504 auxItems = f"xAOD::CaloClusterAuxContainer#{CaloTopoCluster.ClustersOutputName}Aux."
505 auxItems+= ".".join(AODMoments)
506
507 toAOD.append(auxItems)
508
509 result.merge(addToESD(flags, toESD))
510 result.merge(addToAOD(flags, toAOD))
511
512 return result
513
Top algorithm to reconstruct CaloCluster objects from CaloCell objects.