657 **kw):
658
659
660 if version is None:
661 version = versions[-1][0]
662
663
664 for v in versions:
665 if v[0] == version:
666 break
667 else:
668 if version.startswith ('@'):
669
670
671 for v in versions:
672 if v[0] == '@':
673 break
674 else:
675 v = versions[-1]
676 else:
677 raise CaloCorrectionConfigError \
678 ("Can't find version `%s' for correction named `%s'." %
679 (version, basename))
680
681
682 valid_keys = None
683 if len (v) >= 4:
684 valid_keys = v[3]
685
686
687 if key == '@VALID_KEYS':
688 return valid_keys
689
690
691 if source is None:
692 source = flags.Calo.ClusterCorrection.defaultSource
693
694
695 nopool = CALOCORR_NOPOOL in v[2]
696
697
698 if nopool and source == CALOCORR_TOPOOL:
699 return None
700
701
702 if version.startswith ('@'):
703 sgkey = None
704 if version == '@GLOBAL':
705 fulltag = version
706 else:
707 fulltag = version[1:]
708
709 if not nopool:
710
711 source = CALOCORR_COOL
712 else:
713
714 tmp = basename
715 if version != '':
716 tmp = tmp + "-" + version
717 sgkey = "%s.%s" % (corrclass, tmp)
718 fulltag = "%s.%s%s" % (corrclass, generation, tmp)
719 if flags.Input.isMC:
720 fulltag = fulltag[0:4] + 'Ofl' + fulltag[4:]
721
722
723 if not flags.Input.isMC:
724 folder = "/CALO/%s/%s" % (corrclass, basename)
725 else:
726 folder = "/CALO/Ofl/%s/%s" % (corrclass, basename)
727
728
729 prefix = key + sampnames[sampling] + "."
730
731
732 if name is None:
733 name = basename
734 name = name + sampnames[sampling]
735 if version != '':
736 vv = version
737 if vv[0] == '@':
738 vv = vv[1:]
739 vv = vv.split('-')[-1]
740 name = name + "_" + vv
741 if key != '':
742 name = name + "_" + key
743
744
745 if suffix is not None:
746 name = name + suffix
747
748
749 if name in _alltools:
750 if _alltools[name] != (folder, fulltag, sgkey):
751 raise CaloCorrectionConfigError (
752 "Inconsistent configuration of tool %s. Old (folder,tag,sgkey)=%s; new=%s" %
753 (name, _alltools[name], (folder, fulltag, sgkey)))
754 else:
755 _alltools[name] = (folder, fulltag, sgkey)
756
757
758 if confclass is None:
759 confclass = v[1]
760
761
762 if isinstance (confclass, dict) and sampling is not None:
763 confclass = confclass[sampling]
764
765 result = ComponentAccumulator()
766
767
768 corr = confclass (name)
769
770
771 if not nopool:
772 corr.prefix = prefix
773
774
775 if not isinstance (source, list):
776 source = [source]
777 avail = v[2]
778 wherefrom = None
779 for s in source:
780 if s == CALOCORR_JO or s == CALOCORR_TOPOOL:
781 sel = [x for x in avail if _is_jo_source (x)]
782 if len (sel) > 0 and _config_from_jo(corr, sel[0], key,
783 sampling , valid_keys,
784 order):
785 wherefrom = sel[0]
786 break
787
788 elif s == CALOCORR_POOL:
789 sel = [x for x in avail if _is_pool_source (x)]
790 if len (sel) > 0:
791 ca2 = _config_from_pool (flags, corr, sel[0], sgkey)
792 if ca2:
793 result.merge (ca2)
794 _mung_prefix (corr, key, valid_keys)
795 wherefrom = sel[0]
796 break
797
798 elif s == CALOCORR_COOL:
799 sel = [x for x in avail if _is_cool_source (x)]
800 if len (sel) > 0:
801 ca2 = _config_from_cool (flags, corr, folder, fulltag)
802 if ca2:
803 result.merge (ca2)
804 _mung_prefix (corr, key, valid_keys)
805 wherefrom = 'cool'
806 break
807
808 elif _is_jo_source (s):
809 if _config_from_jo (corr, s, key, sampling, valid_keys, order):
810 wherefrom = s
811 break
812
813 elif _is_pool_source (s):
814 ca2 = _config_from_pool (flags, corr, s, sgkey)
815 if ca2:
816 result.merge (ca2)
817 _mung_prefix (corr, key, valid_keys)
818 wherefrom = s
819 break
820
821 if wherefrom is None:
822 raise CaloCorrectionConfigError \
823 ("Can't find any source to configure tool `%s'. Sources: %s" %
824 (name, source))
825
826 log = logging.getLogger ('CaloClusterCorrection')
827 log.debug (" correction %s (%s, from %s)" % (name, confclass.__name__,
828 wherefrom))
829
830
831
832 for (k, val) in kw.items():
833 if val is not None:
834 setattr (corr, k, val)
835
836
837 result.setPrivateTools (corr)
838 return result
839
840
841