Pluto v6.3.0
Loading...
Searching...
No Matches
PEtaDecaysPlugin.cc
Go to the documentation of this file.
1
2//Plugin for (rare) eta decays
3//
4//The complex version of the eta Double Dalitz (with the angles)
5//is based on a calculation by A. Wirzba and T. Petri (diploma theses)
6//
7//The mod is automatically enabled, i.e. each PReaction can use it
8//without activating it.
9//
10//However, it can be activated manually via:
11//makeDistributionManager()->Exec("eta_decays");
12//
13//
14//eta -> pi+ pi- e+ e-
15//--------------------
16//This decay uses the "genbod" technique:
17//The 4-body decay is done via genbod, and the mass distribution
18//
19// M(q^2) = F(q^2) / (8*q^2)
20//
21//is folded into the genbod model. For the form factor by default
22//the "simple VMD model" based on PSimpleVMDFF is used:
23//
24// F(q^2) = m_v^2 / (m_v^2 - q^2) with m_v = 0.77GeV
25//
26//In total, the following matrix element is used:
27//
28// A^2 = M(q^2) * s_pipi * beta_pi^2 sin^2(theta_pi)
29// * lambda(m_eta^2,s_pipi,q^2) (1+beta_e^2*sin^2(theta_e)*sin^2(phi))
30//
31//The reaction itself can be contructed with (e.g.) the following line:
32//PReaction my_reaction("_T1=2.2","p","d","He3 eta [e+ e- pi+ pi-]","eta_pi_pi_dilepton");
33//
34//Interaction models:
35// [eta_ee_pipi_vmd_ff] VMD form factor (optional)
36// [eta_ee_pipi_mass] Dilepton mass (mandatory)
37// [eta_ee_pipi_genbod] Genbod (mandatory)
38// [eta_ee_pipi] Decay angles (optional)
39//
40//
41//eta -> e+ e- e+ e-
42//------------------
43//
44//This decay goes via 2 virtual photons:
45//
46//PReaction my_reaction("_T1=2.2","p","d","He3 eta[dilepton [e+ e-] dilepton [e+ e-]]","etae+e-e+e-");
47//
48//In the first step, the sampling of the 2 dilepton masses is done. This is
49//based on a source code provided by A. Kupsc and implemented in the model [eta_double_dalitz_simple]
50//
51//In the second step, the angular distributions are sampled via the rejection method
52//[eta_double_dalitz_complex]. This distribution is based on the calculation of T. Petri and A. Wirzba
53//(Kinematics and matrix elements of the decay eta -> ee mumu)
54//
55//The angular distributions and the form factors can be disabled with:
56// makeDistributionManager()->Disable("eta_double_dalitz_complex");
57// makeDistributionManager()->Disable("eta_double_dalitz_vmd_ff");
58//
59//The form factors
60//----------------
61//
62//All form factor models can be obtained via:
63//PSimpleVMDFF *ff = (PSimpleVMDFF*)makeDistributionManager()->GetDistribution("...")
64//with ... and the distribution name (see above). The equation of the form factor
65//can be exchanged via:
66// ff->AddEquation("_ff2 = 1.");
67//for details see PSimpleVMDFF
68//
69//eta -> gamma e+ e-
70//------------------
71//Not a rare decay, but the distribution of the e+e- decay angle is
72//implemented via this class as well. A form factor is not yet
73//included by default but van be attached via a compiled class
74//(see demo macro)
75//
76// Author: I. Froehlich
77// Written: 17.09.2009
78// Released: 08.12.2010
79//
81
82#include "PDataBase.h"
83#include "PEtaDecaysPlugin.h"
84#include "PSimpleVMDFF.h"
85#include "PEtaPiPiDilepton.h"
87
88#include "PGenBod.h"
89
90//#include "PTCrossWeight.h"
91
92
95
96
97PEtaDecaysPlugin::PEtaDecaysPlugin(const Char_t *id, const Char_t *de):
99
100 eta_dd_simple = NULL;
101 eta_dd_ff = NULL;
102 eta_pipi_gamma = NULL;
103};
104
107
109 return kTRUE;
110};
111
112
113Bool_t PEtaDecaysPlugin::ExecCommand(const char *, Double_t) {
114
116
117 //called the 1st time?
118 if (!eta_pipi_gamma) {
119 //add some groups in the distribution manager
120 pdmutil->AddSubGroup("rare_eta_decays", "Rare eta decays", "eta_physics");
121 pdmutil->SetGroup("eta_physics");
122
123 //
124 // eta -> pipi gamma (not rare)
125 //
126
127 //Standalone models, up to now nothing special
128 eta_pipi_gamma =
129 new PEtaPiPiGamma("eta_pipi_gamma_matrix_weighting@eta_to_pi+_pi-_g/matrix",
130 "Matrix element eta -> pipi gamma (Weighting)", -1);
131
132 eta_pipi_gamma->EnableWeighting();
133 makeDistributionManagerUtil()->Add(eta_pipi_gamma);
134 eta_pipi_gamma =
135 new PEtaPiPiGamma("eta_pipi_gamma_matrix@eta_to_pi+_pi-_g/matrix",
136 "Matrix element eta -> pipi gamma", -1);
137 makeDistributionManagerUtil()->Add(eta_pipi_gamma);
138
139 //
140 // eta -> e+e-e+e- (rare)
141 //
142
143 Int_t ipid[5];
144
145 //Add dilepton decay, if not yet present:
146 ipid[0] = makeStaticData()->GetParticleID("eta");
147 ipid[1] = makeStaticData()->GetParticleID("dilepton");
148 ipid[2] = makeStaticData()->GetParticleID("dilepton");
149
150 if (makeStaticData()->GetDecayKey(ipid, 2) < 0)
151 makeStaticData()->AddDecay(-1,"eta -> dilepton + dilepton",
152 "eta", "dilepton,dilepton", ETA_DOUBLE_DALITZ_BR);
153
154 //Create and add simple model:
155 eta_dd_simple = new PEtaDoubleDalitz("eta_double_dalitz_simple@eta_to_dilepton_dilepton",
156 "Dilepton generator for eta -> dilepton + dilepton", -1);
157
158 makeDistributionManagerUtil()->SetGroup("rare_eta_decays");
159 makeDistributionManagerUtil()->Add(eta_dd_simple);
160
161 //the more complex version uses the envelope method
162 //of Pluto, the 4 leptons are rejected after the full
163 //chain has been sampled
164
165 eta_dd_complex = new PEtaDoubleDalitzEnv("eta_double_dalitz_complex@eta_to_dilepton_dilepton/full",
166 "Full dilepton generator for eta -> e+ e- e+ e-", -1);
167 eta_dd_complex->Add("eta,parent");
168 eta_dd_complex->Add("dilepton,daughter");
169 eta_dd_complex->Add("dilepton,daughter");
170 eta_dd_complex->Add("e+,granddaughter"); // <--- the order is very important
171 eta_dd_complex->Add("e-,granddaughter");
172 eta_dd_complex->Add("e+,granddaughter");
173 eta_dd_complex->Add("e-,granddaughter");
174
175 makeDistributionManagerUtil()->Add(eta_dd_complex);
176
177 PSimpleVMDFF *ff = new PSimpleVMDFF("eta_double_dalitz_vmd_ff@eta_to_dilepton_dilepton/formfactor",
178 "Simple VMD form factor for eta Double Dalitz", -1);
179 ff->SetVectorMesonMass(0.77);
180 ff->SetWeightMax(5.);
181
183
184 //
185 // eta -> e+e-pi+pi- (rare)
186 //
187 //
188
189
190 //Add decay, if not yet present:
191 ipid[0] = makeStaticData()->GetParticleID("eta");
192 ipid[1] = makeStaticData()->GetParticleID("e+");
193 ipid[2] = makeStaticData()->GetParticleID("e-");
194 ipid[3] = makeStaticData()->GetParticleID("pi+");
195 ipid[4] = makeStaticData()->GetParticleID("pi-");
196
197 if (makeStaticData()->GetDecayKey(ipid, 4) < 0)
198 makeStaticData()->AddDecay(-1,"eta -> e+ + e- + pi+ + pi-",
199 "eta", "e+,e-,pi+,pi-", ETA_EE_PIPI_BR);
200
201 //first, the standard ff
202 ff = new PSimpleVMDFF("eta_ee_pipi_vmd_ff@eta_to_e+_e-_pi+_pi-/formfactor",
203 "eta -> pi pi dilepton VMD form factor", -1);
204 ff->SetVectorMesonMass(0.77);
206
207
208 //mass distribution of the di-lepton mass. Here we use the
209 //function to be folded into the genbod model
211 new PEtaPiPiDileptonMass("eta_ee_pipi_mass@eta_to_e+_e-_pi+_pi-/correlation",
212 "eta -> pi pi dilepton a la Wirzba (dilepton mass)", -1);
214
215 //...and now the adapted genbod:
216 PGenBod *genbod = new PGenBod("eta_ee_pipi_genbod@eta_to_e+_e-_pi+_pi-/genbod",
217 "eta -> pi pi dilepton genbod", -1);
218 genbod->Add("eta,parent");
219 genbod->Add("pi+,daughter");
220 genbod->Add("pi-,daughter");
221 genbod->Add("e+,daughter,corr1");
222 genbod->Add("e-,daughter,corr2");
224
225 //main distribution (afterburner to take 4-body correlation into account)
226 PEtaPiPiDilepton *final = new PEtaPiPiDilepton("eta_ee_pipi@eta_to_e+_e-_pi+_pi-",
227 "eta -> pi pi dilepton a la Wirzba (decay angles)", -1);
229 }
230
231 return kTRUE;
232}
233
235
236
237
ClassImp(PBeamLineSimulation) PBeamLineSimulation
PDistributionManagerUtil * makeDistributionManagerUtil()
#define ETA_EE_PIPI_BR
#define ETA_DOUBLE_DALITZ_BR
PStaticData * makeStaticData()
int Add(PDistribution *dist)
Int_t AddSubGroup(const Char_t *id, const Char_t *de, const Char_t *sub)
void SetGroup(const Char_t *id)
Int_t Add(const Char_t *opt)
void SetWeightMax(Double_t w)
Bool_t ExecCommand(const char *command, Double_t value)
void SetVectorMesonMass(Double_t x)
int AddDecay(int didx, const char *name, const char *parent, const char *daughters, double br)
int GetParticleID(const char *id, int warn=1)