2 __date__ =
"02 Aug 2012"
3 __author__ =
'olivier.mattelaer@uclouvain.be'
5 from function_library
import *
11 """######################################################################\n""" + \
12 """## PARAM_CARD AUTOMATICALY GENERATED BY THE UFO #####################\n""" + \
13 """######################################################################\n"""
15 def __init__(self, filename, list_of_parameters=None, generic=False):
16 """write a valid param_card.dat"""
18 if not list_of_parameters:
19 from parameters
import all_parameters
20 list_of_parameters = [param
for param
in all_parameters
if
21 param.nature ==
'external']
27 self.
fsockfsock = open(filename,
'w')
31 self.
fsockfsock.close()
34 """define self.dep_mass and self.dep_width in case that they are
35 requested in the param_card.dat"""
36 from particles
import all_particles
38 self.
dep_massdep_mass = [(part, part.mass)
for part
in all_particles
39 if part.pdg_code > 0
and
40 part.mass
not in list_of_parameters]
41 self.
dep_widthdep_width = [(part, part.width)
for part
in all_particles
42 if part.pdg_code > 0
and
43 part.width
not in list_of_parameters]
47 """ order parameter of a given block """
49 maxlen = min([len(obj1.lhacode), len(obj2.lhacode)])
51 for i
in range(maxlen):
52 if obj1.lhacode[i] < obj2.lhacode[i]:
54 elif obj1.lhacode[i] == obj2.lhacode[i]:
59 if len(obj1.lhacode) > len(obj2.lhacode):
61 elif len(obj1.lhacode) == len(obj2.lhacode):
70 all_lhablock = set([param.lhablock
for param
in all_ext_param])
73 all_lhablock = sorted(all_lhablock)
75 for name
in [
'DECAY',
'MASS',
'SMINPUTS']:
76 if name
in all_lhablock:
77 all_lhablock.remove(name)
78 all_lhablock.insert(0, name)
80 for lhablock
in all_lhablock:
82 need_writing = [param
for param
in all_ext_param
if
83 param.lhablock == lhablock]
85 [self.
write_paramwrite_param(param, lhablock)
for param
in need_writing]
88 if lhablock
in [
'MASS',
'DECAY']:
95 """ write a comment for a block"""
97 self.
fsockfsock.writelines(
98 """\n###################################""" +
99 """\n## INFORMATION FOR %s""" % name.upper() +
100 """\n###################################\n"""
103 self.
fsockfsock.write(
"""Block %s \n""" % name)
105 def write_param(self, param, lhablock):
107 lhacode =
' '.join([
'%3s' % key
for key
in param.lhacode])
108 if lhablock !=
'DECAY':
109 text =
""" %s %e # %s \n""" % (lhacode, complex(param.value).real, param.name)
111 text =
'''DECAY %s %e \n''' % (lhacode, complex(param.value).real)
112 self.
fsockfsock.write(text)
114 def write_dep_param_block(self, lhablock):
116 from parameters
import all_parameters
117 from particles
import all_particles
118 for parameter
in all_parameters:
119 exec(
"%s = %s" % (parameter.name, parameter.value))
120 text =
"## Not dependent paramater.\n"
121 text +=
"## Those values should be edited following analytical the \n"
122 text +=
"## analytical expression. Some generator could simply ignore \n"
123 text +=
"## those values and use the analytical expression\n"
125 if lhablock ==
'MASS':
132 for part, param
in data:
133 if isinstance(param.value, str):
134 value = complex(
eval(param.value)).real
138 text +=
"""%s %s %f # %s : %s \n""" % (prefix, part.pdg_code,
139 value, part.name, param.value)
142 if lhablock ==
'MASS':
144 done = [part
for (part, param)
in self.
dep_massdep_mass]
147 done = [part
for (part, param)
in self.
dep_widthdep_width]
148 for particle
in all_particles:
149 if particle.pdg_code < 0:
152 if particle
not in done:
153 if getattr(particle, arg).lhacode[0] != particle.pdg_code:
156 value = float(particle.get(arg).value)
157 name = particle.get(arg).name
158 text +=
"""%s %s %f # %s : %s \n""" % (prefix, particle.pdg_code,
159 value, particle.name, name)
161 self.
fsockfsock.write(text)
163 sm_pdg = [1, 2, 3, 4, 5, 6, 11, 12, 13, 13, 14, 15, 16, 21, 22, 23, 24, 25]
164 data =
"""Block QNUMBERS %(pdg)d # %(name)s
165 1 %(charge)d # 3 times electric charge
166 2 %(spin)d # number of spin states (2S+1)
167 3 %(color)d # colour rep (1: singlet, 3: triplet, 8: octet)
168 4 %(antipart)d # Particle/Antiparticle distinction (0=own anti)\n"""
171 """ write qnumber """
172 from particles
import all_particles
174 print particles.__file__
175 text =
"""#===========================================================\n"""
176 text +=
"""# QUANTUM NUMBERS OF NEW STATE(S) (NON SM PDG CODE)\n"""
177 text +=
"""#===========================================================\n\n"""
179 for part
in all_particles:
180 if part.pdg_code
in self.
sm_pdgsm_pdg
or part.pdg_code < 0:
182 text += self.
datadata % {
'pdg': part.pdg_code,
184 'charge': 3 * part.charge,
187 'antipart': part.name != part.antiname
and 1
or 0}
189 self.
fsockfsock.write(text)
192 if '__main__' == __name__:
194 print 'write ./param_card.dat'
def define_not_dep_param(self, list_of_parameters)
def order_param(obj1, obj2)
def write_card(self, all_ext_param)
def write_param(self, param, lhablock)
def write_dep_param_block(self, lhablock)
def write_block(self, name)
def __init__(self, filename, list_of_parameters=None, generic=False)
double eval(const std::vector< double > &spl, const std::vector< double > &vals, double x)
Evaluate spline (zero order or first order) in point x.