1 <chapter name="Semi-Internal Resonances">
3 <h2>Semi-Internal Resonances</h2>
5 The introduction of a new <aloc href="SemiInternalProcesses">
6 semi-internal process</aloc> may also involve a new particle,
7 not currently implemented in PYTHIA. Often it is then enough to
8 use the <aloc href="ParticleDataScheme">standard machinery</aloc>
9 to introduce a new particle (<code>id:all = ...</code>) and new
10 decay channels (<code>id:addChannel = ...</code>). By default this
11 only allows you to define a fixed total width and fixed branching
12 ratios. Using <aloc href="ResonanceDecays"><code>meMode</code></aloc>
13 values 100 or bigger provides the possibility of a very
14 simple threshold behaviour.
17 If you want to have complete freedom, however, there are two
18 ways to go. One is that you make the resonance decay part of the
19 hard process itself, either using the
20 <aloc href="LesHouchesAccord">Les Houches interface</aloc> or
21 a semi-internal process. The other is for you to create a new
22 <code>ResonanceWidths</code> object, where you write the code
23 needed for a calculation of the partial width of a particular
27 Here we will explain what is involved in setting up a resonance.
28 Should you actually go ahead with this, it is strongly recommended
29 to use an existing resonance as a template, to get the correct
30 structure. There also exists a sample main program,
31 <code>main26.cc</code>, that illustrates how you could combine
32 a new process and a new resonance.
35 There are three steps involved in implementing a new resonance:
36 <br/>1) providing the standard particle information, as already
37 outlined above (<code>id:all = ...</code>,
38 <code>id:addChannel = ...</code>), except that now branching
39 ratios need not be specified, since they anyway will be overwritten
40 by the dynamically calculated values.
41 <br/>2) writing the class that calculates the partial widths.
42 <br/>3) handing in a pointer to an instance of this class to PYTHIA.
43 <br/>We consider the latter two aspects in turn.
45 <h3>The ResonanceWidths Class</h3>
47 The resonance-width calculation has to be encoded in a new class.
48 The relevant code could either be put before the main program in the
49 same file, or be stored separately, e.g. in a matched pair
50 of <code>.h</code> and <code>.cc</code> files. The latter may be more
51 convenient, in particular if the calculations are lengthy, or
52 likely to be used in many different runs, but of course requires
53 that these additional files are correctly compiled and linked.
56 The class has to be derived from the <code>ResonanceWidths</code>
57 base class. It can implement a number of methods. The constructor
58 and the <code>calcWidth</code> ones are always needed, while others
59 are for convenience. Much of the administrativ machinery is handled
60 by methods in the base class.
62 <p/>Thus, in particular, you must implement expressions for all
63 possible final states, whether switched on in the current run or not,
64 since all contribute to the total width needed in the denominator of
65 the Breit-Wigner expression. Then the methods in the base class take
66 care of selecting only allowed channels where that is required, and
67 also of including effects of closed channels in secondary decays.
68 These methods can be accessed indirectly via the
69 <aloc href="ResonanceDecays"><code>res...</code></aloc>
70 methods of the normal particle database.
73 A <b>constructor</b> for the derived class obviously must be available.
74 Here you are quite free to allow a list of arguments, to set
75 the parameters of your model. The constructor must call the
76 base-class <code>initBasic(idResIn)</code> method, where the argument
77 <code>idResIn</code> is the PDG-style identity code you have chosen
78 for the new resonance. When you create several related resonances
79 as instances of the same class you would naturally make
80 <code>idResIn</code> an argument of the constructor; for the
81 PYTHIA classes this convention is used also in cases when it is
83 <br/>The <code>initBasic(...)</code> method will
84 hook up the <code>ResonanceWidths</code> object with the corresponding
85 entry in the generic particle database, i.e. with the normal particle
86 information you set up in point 1) above. It will store, in base-class
87 member variables, a number of quantities that you later may find useful:
88 <br/><code>idRes</code> : the identity code you provide;
89 <br/><code>hasAntiRes</code> : whether there is an antiparticle;
90 <br/><code>mRes</code> : resonance mass;
91 <br/><code>GammaRes</code> resonance width;
92 <br/><code>m2Res</code> : the squared mass;
93 <br/><code>GamMRat</code> : the ratio of width to mass.
96 A <b>destructor</b> is only needed if you plan to delete the resonance
97 before the natural end of the run, and require some special behaviour
98 at that point. If you call such a destructor you will leave a pointer
99 dangling inside the <code>Pythia</code> object you gave it in to,
100 if that still exists.
102 <method name="void initConstants()">
103 is called once during initialization, and can then be used to set up
104 further parameters specific to this particle species, such as couplings,
105 and perform calculations that need not be repeated for each new event,
106 thereby saving time. This method needs not be implemented.
108 <method name="void calcPreFac(bool calledFromInit = false)">
109 is called once a mass has been chosen for the resonance, but before
110 a specific final state is considered. This routine can therefore
111 be used to perform calculations that otherwise might have to be repeated
112 over and over again in <code>calcWidth</code> below. It is optional
113 whether you want to use this method, however, or put
114 everything in <code>calcWidth()</code>.
115 <br/>The optional argument will have the value <code>true</code> when
116 the resonance is initialized, and then be <code>false</code> throughout
117 the event generation, should you wish to make a distinction.
118 In PYTHIA such a distinction is made for <ei>gamma^*/Z^0</ei> and
119 <ei>gamma^*/Z^0/Z'^0</ei>, owing to the necessity of a special
120 description of interference effects, but not for other resonances.
121 <br/>In addition to the base-class member variables already described
122 above, <code>mHat</code> contains the current mass of the resonance.
123 At initialization this agrees with the nominal mass <code>mRes</code>,
124 but during the run it will not (in general).
126 <method name="void calcWidth(bool calledFromInit = false)">
127 is the key method for width calculations and returns a partial width
128 value, as further described below. It is called for a specific
129 final state, typically in a loop over all allowed final states,
130 subsequent to the <code>calcPreFac(...)</code> call above.
131 Information on the final state is stored in a number of base-class
132 variables, for you to use in your calculations:
133 <br/><code>iChannel</code> : the channel number in the list of
134 possible decay channels;
135 <br/><code>mult</code> : the number of decay products;
136 <br/><code>id1, id2, id3</code> : the identity code of up to the first
137 three decay products, arranged in descending order of the absolute value
138 of the identity code;
139 <br/><code>id1Abs, id2Abs, id3Abs</code> : the absolute value of the
140 above three identity codes;
141 <br/><code>mHat</code> : the current resonance mass, which is the same
142 as in the latest <code>calcPreFac(...)</code> call;
143 <br/><code>mf1, mf2, mf3</code> : masses of the above decay products;
144 <br/><code>mr1, mr2, mr3</code> : squared ratio of the product masses
145 to the resonance mass;
146 <br/><code>ps</code> : is only meaningful for two-body decays, where it
147 gives the phase-space factor
148 <ei>ps = sqrt( (1. - mr1 - mr2)^2 - 4. * mr1 * mr2 )</ei>;
149 <br/>In two-body decays the third slot is zero for the above properties.
150 Should there be more than three particles in the decay, you would have
151 to take care of the subsequent products yourself, e.g. using
152 <br/><code>particlePtr->decay[iChannel].product(j);</code>
153 <br/>to extract the <code>j</code>'th decay products (with
154 <code>j = 0</code> for the first, etc.). Currently we are not aware
155 of any such examples.
156 <br/>The base class also contains methods for <ei>alpha_em</ei> and
157 <ei>alpha_strong</ei> evaluation, and can access many standard-model
158 couplings; see the existing code for examples.
159 <br/>The result of your calculation should be stored in
160 <br/><code>widNow</code> : the partial width of the current channel,
163 <method name="double widthChan( mHat, idAbs1, idAbs2)">
164 is not normally used. In PYTHIA the only exception is Higgs decays,
165 where it is used to define the width (except for colour factors)
166 associated with a specific incoming state. It allows the results of
167 some loop expressions to be pretabulated.
170 <h3>Access to resonance widths</h3>
172 Once you have implemented a class, it is straightforward to
173 make use of it in a run. Assume you have written a new class
174 <code>MyResonance</code>, which inherits from
175 <code>ResonanceWidths</code>. You then create an instance of
176 this class and hand it in to a <code>pythia</code> object with
178 ResonanceWidths* myResonance = new MyResonance();
179 pythia.setResonancePtr( myResonance);
181 If you have several resonances you can repeat the procedure any number
182 of times. When <code>pythia.init(...)</code> is called these resonances
183 are initialized along with all the internal resonances, and treated in
184 exactly the same manner. See also the <aloc href="ProgramFlow">Program
189 If the code should be of good quality and general usefulness,
190 it would be simple to include it as a permanently available process
191 in the standard program distribution. The final step of that integration
192 ought to be left for the PYTHIA authors, but basically all that is
193 needed is to add one line in
194 <code>ParticleDataTable::initResonances</code>, where one creates an
195 instance of the resonance in the same way as for the resonances already
196 there. In addition, the particle data and decay table for the new
197 resonance has to be added to the permanent
198 <aloc href="ParticleData">particle database</aloc>, and the code itself
199 to <code>include/ResonanceWidths.h</code> and
200 <code>src/ResonanceWidths.cc</code>.
204 <!-- Copyright (C) 2008 Torbjorn Sjostrand -->