513 def makeAlgs (self, config) :
514
515 if config.dataType() is DataType.Data:
516
517 return
518 log = logging.getLogger('GeneratorAnalysis')
519
520
521 streamName = self.streamName or config.defaultHistogramStream()
522
523 if self.runNumber is None:
524 self.runNumber = config.runNumber()
525
526 if self.saveCutBookkeepers and not self.runNumber:
527 raise ValueError ("invalid run number: " + str(self.runNumber))
528
529
530 if self.saveCutBookkeepers:
531 alg = config.createAlgorithm('CP::AsgCutBookkeeperAlg', 'CutBookkeeperAlg')
532 alg.RootStreamName = streamName
533 alg.runNumber = self.runNumber
534 if self.cutBookkeepersSystematics is None:
535 alg.enableSystematics = not config.noSystematics()
536 else:
537 alg.enableSystematics = self.cutBookkeepersSystematics
538 if self.histPattern:
539 alg.histPattern = self.histPattern
540 config.addPrivateTool( 'truthWeightTool', 'PMGTools::PMGTruthWeightTool' )
541
542
543 alg = config.createAlgorithm( 'CP::PMGTruthWeightAlg', 'PMGTruthWeightAlg' )
544 config.addPrivateTool( 'truthWeightTool', 'PMGTools::PMGTruthWeightTool' )
545 alg.decoration = 'generatorWeight_%SYS%'
546 config.addOutputVar ('EventInfo', 'generatorWeight_%SYS%', 'weight_mc')
547
548 if self.detailedPDFinfo:
549 alg = config.createAlgorithm( 'CP::PDFinfoAlg', 'PDFinfoAlg', reentrant=True )
550 for var in ["PDFID1","PDFID2","PDGID1","PDGID2","Q","X1","X2","XF1","XF2"]:
551 config.addOutputVar ('EventInfo', var, 'PDFinfo_' + var, noSys=True)
552
553 if self.doPDFReweighting:
554 generatorInfo = config.flags.Input.GeneratorsInfo
555 log.info(f"Loaded generator info: {generatorInfo}")
556
557 if not generatorInfo:
558 warnings.warn_explicit("No generator info found.", GeneratorWeightWarning, filename='', lineno=0)
559 elif isinstance(generatorInfo, dict):
560
561 unsupported_generators = {
562 "Sherpa": "PDF reweighting for Sherpa is not proven to be reliable. The reweighting closure should be validated within the analysis.",
563 "Powheg": "PDF reweighting for Powheg is not proven to be reliable. The reweighting closure should be validated within the analysis."
564 }
565
566
567 for generator, message in unsupported_generators.items():
568 if generator in generatorInfo:
569 warnings.warn_explicit(
570 message,
571 GeneratorWeightWarning,
572 filename='',
573 lineno=0
574 )
575
576 alg = config.createAlgorithm( 'CP::PDFReweightAlg', 'PDFReweightAlg', reentrant=True )
577
578 if self.inPDFName is None:
579 log.error("Option inPDFName not specified, but is required for PDF reweighting. This means the PDF set the input dataset was generated with is determined as …")
580 else:
581 alg.inPDFName = self.inPDFName
582
583 alg.outPDFName = self.outPDFName
584
585 for pdf_set in self.outPDFName:
586 config.addOutputVar('EventInfo', f'PDFReweightSF_{pdf_set.replace("/", "_")}',
587 f'PDFReweightSF_{pdf_set.replace("/", "_")}', noSys=True, auxType='float')
588
589 if self.doHFProdFracReweighting:
590 generatorInfo = config.flags.Input.GeneratorsInfo
591 log.info(f"Loaded generator info: {generatorInfo}")
592
593 DSID = "000000"
594
595 if not generatorInfo:
596 warnings.warn_explicit(
597 "No generator info found.",
598 GeneratorWeightWarning, filename='', lineno=0)
599 DSID = "000000"
600 elif isinstance(generatorInfo, dict):
601 if "Pythia8" in generatorInfo:
602 DSID = "410470"
603 elif "Sherpa" in generatorInfo and "2.2.8" in generatorInfo["Sherpa"]:
604 DSID = "421152"
605 elif "Sherpa" in generatorInfo and "2.2.10" in generatorInfo["Sherpa"]:
606 DSID = "700122"
607 elif "Sherpa" in generatorInfo and "2.2.11" in generatorInfo["Sherpa"]:
608 warnings.warn_explicit(
609 "HF production fraction reweighting is not configured"
610 " for Sherpa 2.2.11. Using weights for Sherpa 2.2.10"
611 " instead.",
612 GeneratorWeightWarning, filename='', lineno=0)
613 DSID = "700122"
614 elif "Sherpa" in generatorInfo and "2.2.12" in generatorInfo["Sherpa"]:
615 warnings.warn_explicit(
616 "HF production fraction reweighting is not configured"
617 " for Sherpa 2.2.12. Using weights for Sherpa 2.2.10"
618 " instead.",
619 GeneratorWeightWarning, filename='', lineno=0)
620 DSID = "700122"
621 elif "Sherpa" in generatorInfo and "2.2.14" in generatorInfo["Sherpa"]:
622 warnings.warn_explicit(
623 "HF production fraction reweighting is not configured"
624 " for Sherpa 2.2.14. New weights need to be"
625 " calculated.",
626 GeneratorWeightWarning, filename='', lineno=0)
627 DSID = "000000"
628 elif "Sherpa" in generatorInfo and "2.2.1" in generatorInfo["Sherpa"]:
629 DSID = "410250"
630 elif "Herwig7" in generatorInfo and "7.1.3" in generatorInfo["Herwig7"]:
631 DSID = "411233"
632 elif "Herwig7" in generatorInfo and "7.2.1" in generatorInfo["Herwig7"]:
633 DSID = "600666"
634 elif "Herwig7" in generatorInfo and "7." in generatorInfo["Herwig7"]:
635 DSID = "410558"
636 elif "amc@NLO" in generatorInfo:
637 DSID = "410464"
638 else:
639 warnings.warn_explicit(
640 f"HF production fraction reweighting is not configured"
641 f" for this generator: {generatorInfo}."
642 f" New weights need to be calculated.",
643 GeneratorWeightWarning, filename='', lineno=0)
644 DSID = "000000"
645 else:
646 warnings.warn_explicit(
647 "Failed to determine generator from metadata",
648 GeneratorWeightWarning, filename='', lineno=0)
649 DSID = "000000"
650
651 log.info(f"Using HF production fraction weights calculated using DSID {DSID}")
652 if DSID == "000000":
653 warnings.warn_explicit(
654 "HF production fraction reweighting will return dummy"
655 " weights of 1.0",
656 GeneratorWeightWarning, filename='', lineno=0)
657
658 alg = config.createAlgorithm( 'CP::SysTruthWeightAlg', f'SysTruthWeightAlg_{streamName}' )
659 config.addPrivateTool( 'sysTruthWeightTool', 'PMGTools::PMGHFProductionFractionTool' )
660 alg.decoration = 'prodFracWeight_%SYS%'
661 alg.TruthParticleContainer = self.truthParticleContainer
662 alg.sysTruthWeightTool.ShowerGenerator = DSID
663 config.addOutputVar ('EventInfo', 'prodFracWeight_%SYS%', 'weight_HF_prod_frac')
664