544 def makeAlgs (self, config) :
545
546 if config.dataType() is not DataType.Data:
547
548
549
550
551 triggerDict = TriggerDict()
552
553 if self.includeAllYearsPerRun:
554 years = [int(year) for year in self.triggerChainsPerYear.keys()]
555 else:
556 from TriggerAnalysisAlgorithms.TriggerAnalysisSFConfig import (
557 get_input_years)
558 years = get_input_years(config)
559
560 triggerYearStartBoundaries = {
561 2015: 260000,
562 2016: 290000,
563 2017: 324000,
564 2018: 348000,
565 2022: 410000,
566 2023: 450000,
567 2024: 470000,
568 2025: 495000,
569 2026: 516000,
570 }
571
572 triggerConfigs = {}
573 triggerConfigYears = {}
574 from TriggerAnalysisAlgorithms.TriggerAnalysisConfig import is_year_in_current_period
575 for year in years:
576 if not is_year_in_current_period(config, year):
577 continue
578
579 triggerChains = self.triggerChainsPerYear.
get(int(year), self.triggerChainsPerYear.
get(str(year), []))
580 for chain in triggerChains:
581 chain = chain.replace(" || ", "_OR_")
582 chain_noHLT = chain.replace("HLT_", "")
583 chain_out = chain_noHLT if self.removeHLTPrefix else chain
584 legs = triggerDict[chain_noHLT]
585 if not legs:
586 if chain_noHLT.startswith('mu') and chain_noHLT[2].isdigit:
587
588 triggerConfigs[chain_out] = chain
589 if chain_out in triggerConfigYears.keys():
590 triggerConfigYears[chain_out].append(year)
591 else:
592 triggerConfigYears[chain_out] = [year]
593 else:
594 for leg in legs:
595 if leg.startswith('mu') and leg[2].isdigit:
596
597 leg_out = leg if self.removeHLTPrefix else f"HLT_{leg}"
598 triggerConfigs[leg_out] = f"HLT_{leg}"
599 if leg_out in triggerConfigYears.keys():
600 triggerConfigYears[leg_out].append(year)
601 else:
602 triggerConfigYears[leg_out] = [year]
603
604 if not triggerConfigs:
605 return
606
607
608 sfTool = config.createPublicTool("CP::MuonTriggerScaleFactors", f"{self.instanceName()}_SFTool{self.customToolSuffix}")
609
610 sfTool.MuonQuality = self.muonID
611 sfTool.AllowZeroSF = True
612 sfTool.CustomInputFolder = self.customInputFolder
613 sfTool.CustomInputFilePerYear = self.customInputFilePerYear
614 sfTool.Campaign = config.campaign().value
615
616 for trig_short, trig in triggerConfigs.items():
617 alg = config.createAlgorithm('CP::MuonTriggerEfficiencyScaleFactorAlg',
618 'MuonTrigEfficiencyCorrectionsAlg_' + trig_short)
619 alg.efficiencyScaleFactorTool = f"{sfTool.getType()}/{sfTool.getName()}"
620
621
622 if self.includeAllYearsPerRun:
623 alg.minRunNumber = 0
624 alg.maxRunNumber = 999999
625
626 if triggerConfigYears[trig_short][0] != years[0]:
627 alg.minRunNumber = triggerYearStartBoundaries.get(triggerConfigYears[trig_short][0], 999999)
628 if triggerConfigYears[trig_short][-1] != years[-1]:
629 alg.maxRunNumber = triggerYearStartBoundaries.get(triggerConfigYears[trig_short][-1] + 1, 999999)
630 elif config.campaign() is Campaign.MC20a:
631 if triggerConfigYears[trig_short] == [2015]:
632 alg.maxRunNumber = 290000
633 elif triggerConfigYears[trig_short] == [2016]:
634 alg.minRunNumber = 290000
635
636 alg.trigger = trig
637
638
639 if config.campaign() is Campaign.MC23a and (trig_short == "HLT_mu8noL1_FSNOSEED" or trig_short == "HLT_mu22_L1MU14FCH"):
640 alg.minRunNumber = 435816
641
642 if self.saveSF:
643 alg.scaleFactorDecoration = f"muon_{self.prefixSF}_{trig_short}_%SYS%"
644 if self.saveEff:
645 alg.mcEfficiencyDecoration = f"muon_{self.prefixEff}_{trig_short}_%SYS%"
646 if self.saveEffData:
647 alg.dataEfficiencyDecoration = f"muon_{self.prefixEffData}_{trig_short}_%SYS%"
648 alg.outOfValidity = 2
649 alg.outOfValidityDeco = f"bad_eff_muontrig_{trig_short}"
650 alg.muons = config.readName (self.containerName)
651 alg.preselection = config.getPreselection (self.containerName, '')
652 if self.saveSF:
653 config.addOutputVar (self.containerName, alg.scaleFactorDecoration, f"{self.prefixSF}_{trig_short}")
654 if self.saveEff:
655 config.addOutputVar (self.containerName, alg.mcEfficiencyDecoration, f"{self.prefixEff}_{trig_short}")
656 if self.saveEffData:
657 config.addOutputVar (self.containerName, alg.dataEfficiencyDecoration, f"{self.prefixEffData}_{trig_short}")
658
659
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)