21def get_pdf_and_systematic_settings(the_base_fragment,isNLO,useNLOotf=False):
22
23 if not isNLO:
24 useNLOotf=False
25
26
27 runcard_settings={}
28 runcard_systematics_arguments={}
29
30 basefragment_settings={}
31 basefragment_settings['central_pdf']=None
32 basefragment_settings['alternative_pdfs']=None
33 basefragment_settings['pdf_variations']=None
34 basefragment_settings['scale_variations']=None
35 basefragment_settings['alternative_dynamic_scales']=None
36 for s in basefragment_settings:
37 if s in the_base_fragment:
38 if isinstance(basefragment_settings[s],list) and len(basefragment_settings[s])==0:
39 continue
40 basefragment_settings[s]=the_base_fragment[s]
41 else:
42 if s=='central_pdf':
43 raise RuntimeError('No "central_pdf" configured in base fragment')
44 if s=='alternative_dynamic_scales':
45 continue
46 mgsyslog.warning('base fragment or pdf settings does not define "'+s+'"')
47
48
49 for s in basefragment_settings:
50 if s=='central_pdf':
51 if not isinstance(basefragment_settings[s],int):
52 raise RuntimeError(s+', configured in base fragment, has to be an integer')
53 continue
54 if basefragment_settings[s] is None:
55 continue
56 if s=='scale_variations':
57 if not isinstance(basefragment_settings[s],list):
58 raise RuntimeError(s+', configured in base fragment, has to be a list of numbers')
59 for pdf in basefragment_settings[s]:
60 if not isinstance(pdf,float) and not isinstance(pdf,int):
61 raise RuntimeError(s+', configured in base fragment, has to be a list of numbers')
62 else:
63 if not isinstance(basefragment_settings[s],list):
64 raise RuntimeError(s+', configured in base fragment, has to be a list of integers')
65 for element in basefragment_settings[s]:
66 if not isinstance(element,int) or not element>0:
67 raise RuntimeError(s+', configured in base fragment, has to be a list of positive integers')
68
69
70 if basefragment_settings['alternative_pdfs'] is not None:
71
72 if basefragment_settings['pdf_variations'] is not None:
73 basefragment_settings['alternative_pdfs']=[ a for a in basefragment_settings['alternative_pdfs'] if a not in basefragment_settings['pdf_variations'] ]
74
75 if basefragment_settings['central_pdf'] in basefragment_settings['alternative_pdfs']:
76 basefragment_settings['alternative_pdfs'].remove(basefragment_settings['central_pdf'])
77
78
79 runcard_settings['pdlabel']='lhapdf'
80 runcard_settings['lhaid']=str(basefragment_settings['central_pdf'])
81
82
83 if not useNLOotf:
84 if basefragment_settings['alternative_dynamic_scales'] is not None:
85 runcard_systematics_arguments['weight_info']=SYSTEMATICS_WEIGHT_INFO_ALTDYNSCALES
86 else:
87 runcard_systematics_arguments['weight_info']=SYSTEMATICS_WEIGHT_INFO
88 runcard_systematics_arguments['remove_wgts']='".*MUR0.5_MUF2.0.*|.*MUR2.0_MUF0.5.*"'
89
90 runcard_settings['systematics_program']='none'
91 for s in ['alternative_pdfs','pdf_variations','scale_variations']:
92 if basefragment_settings[s] is not None and len(basefragment_settings[s])>0:
93
94 if isNLO:
95 runcard_settings['store_rwgt_info']='True'
96 else:
97 runcard_settings['use_syst']='True'
98
99 runcard_settings['systematics_program']='systematics'
100 break
101
102
103 if useNLOotf:
104
105 if basefragment_settings['pdf_variations'] is not None and basefragment_settings['central_pdf'] in basefragment_settings['pdf_variations']:
106 runcard_settings['reweight_PDF']='True'
107 else:
108 runcard_settings['reweight_PDF']='False'
109 if basefragment_settings['pdf_variations'] is not None:
110 for v in basefragment_settings['pdf_variations']:
111 if v==basefragment_settings['central_pdf']:
112 continue
113 runcard_settings['lhaid']+=' '+str(v)
114 runcard_settings['reweight_PDF']+=' True'
115 if basefragment_settings['alternative_pdfs'] is not None:
116 for a in basefragment_settings['alternative_pdfs']:
117 runcard_settings['lhaid']+=' '+str(a)
118 runcard_settings['reweight_PDF']+=' False'
119
120 else:
121 sys_pdfs=[]
122 if basefragment_settings['pdf_variations'] is not None:
123 for v in basefragment_settings['pdf_variations']:
124 sys_pdfs.append(get_lhapdf_id_and_name(v)[1])
125 if basefragment_settings['alternative_pdfs'] is not None:
126 for a in basefragment_settings['alternative_pdfs']:
127 sys_pdfs.append(get_lhapdf_id_and_name(a)[1]+'@0')
128 if len(sys_pdfs)>0:
129 runcard_systematics_arguments['pdf']=','.join(sys_pdfs)
130 if isNLO:
131 runcard_settings['reweight_PDF']='False'
132
133
134
135 if basefragment_settings['scale_variations'] is None and isNLO:
136 runcard_settings['reweight_scale']='False'
137 if basefragment_settings['scale_variations'] is not None:
138 if useNLOotf:
139 runcard_settings['reweight_scale']='True'
140 runcard_settings['rw_rscale']=' '.join([str(s) for s in basefragment_settings['scale_variations']])
141 runcard_settings['rw_fscale']=' '.join([str(s) for s in basefragment_settings['scale_variations']])
142 else:
143 runcard_systematics_arguments['muf']=','.join([str(s) for s in basefragment_settings['scale_variations']])
144 runcard_systematics_arguments['mur']=','.join([str(s) for s in basefragment_settings['scale_variations']])
145 runcard_systematics_arguments['dyn']='-1'
146 if isNLO:
147 runcard_settings['reweight_scale']='False'
148
149 if basefragment_settings['alternative_dynamic_scales'] is not None:
150 if useNLOotf:
151 raise RuntimeError('Cannot reweight to alternative dynamic scales using the NLO OTF module')
152 else:
153 runcard_systematics_arguments['dyn']=','.join([str(s) for s in [-1]+basefragment_settings['alternative_dynamic_scales']])
154
155 if not useNLOotf:
156 runcard_settings['systematics_arguments']=write_systematics_arguments(runcard_systematics_arguments)
157
158 return runcard_settings
159
160
161
162
163