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