BOSS 7.0.9
BESIII Offline Software System
Loading...
Searching...
No Matches
bak-BesEvtGen-00-04-08/src/phokhara/eemmg-lib/src/cache.h
Go to the documentation of this file.
1/*
2 * cache.h - cache classes header
3 *
4 * this file is part of PJFry library
5 * Copyright 2011 Valery Yundin
6 */
7
8#ifndef QUL_CACHE_H
9#define QUL_CACHE_H
10
11#include "common.h"
12#include "kinem.h"
13#include "minor.h"
14#ifdef USE_GOLEM_MODE
15 #include "golem.h"
16#endif
17
18template <typename TK, typename TV>
19class MEntry
20{
21 public:
22 MEntry() : key(), val() {}
23 MEntry(const TK& k, TV& v) : key(k), val(v) {}
24
25 MEntry& operator= (const MEntry& entry)
26 {
27 key=entry.key;
28 val=entry.val;
29 return *this;
30 }
31
32 TK key;
33 mutable TV val; // TODO: remove auto_ptr in the future
34
35 MEntry(const MEntry& entry);
36};
37
38class Cache
39{
40 protected:
41 static const int size6=2;
42
43 static const int size5=size6*6;
44 static const int size4=size6*15;
45 static const int size3=size6*20;
46 static const int size2=size6*15;
47 static const int size1=size6*6;
48
49};
50
51class ICache : public Cache
52{
53#ifdef USE_GOLEM_MODE
54 friend class Golem;
55#endif
56 public:
57 typedef struct { ncomplex val[3]; } Ival;
58
79 };
80
81 enum Dcoefs {dd0=1,dd1,dd2,dd3,
90 };
91
92 enum Ccoefs {cc0=1,cc1,cc2,
96 };
97
98 enum Bcoefs {bb0=1,bb1,
102 };
103
104 // Scalars
105 static ncomplex getI4(int ep, const Kinem4 &k);
106 static ncomplex getI3(int ep, const Kinem3 &k);
107 static ncomplex getI2(int ep, const Kinem2 &k);
108 static ncomplex getI1(int ep, const Kinem1 &k);
109
110 // Tensor PENTAGON
111 static ncomplex getE(int ep, const Kinem5 &kin);
112 static ncomplex getE(int ep, int i, const Kinem5 &kin);
113 static ncomplex getE(int ep, int i, int j, const Kinem5 &kin);
114 static ncomplex getE(int ep, int i, int j, int k, const Kinem5 &kin);
115 static ncomplex getE(int ep, int i, int j, int k, int l, const Kinem5 &kin);
116 static ncomplex getE(int ep, int i, int j, int k, int l, int m, const Kinem5 &kin);
117
118 // Tensor BOX
119 static ncomplex getD(int ep, const Kinem4 &kin) { return getI4(ep, kin); }
120 static ncomplex getD(int ep, int i, const Kinem4 &kin);
121 static ncomplex getD(int ep, int i, int j, const Kinem4 &kin);
122 static ncomplex getD(int ep, int i, int j, int k, const Kinem4 &kin);
123 static ncomplex getD(int ep, int i, int j, int k, int l, const Kinem4 &kin);
124
125 // Tensor TRIANGLE
126 static ncomplex getC(int ep, const Kinem3 &kin) { return getI3(ep, kin); }
127 static ncomplex getC(int ep, int i, const Kinem3 &kin);
128 static ncomplex getC(int ep, int i, int j, const Kinem3 &kin);
129 static ncomplex getC(int ep, int i, int j, int k, const Kinem3 &kin);
130
131 // Tensor BUBBLE
132 static ncomplex getB(int ep, const Kinem2 &kin) { return getI2(ep, kin); }
133 static ncomplex getB(int ep, int i, const Kinem2 &kin);
134 static ncomplex getB(int ep, int i, int j, const Kinem2 &kin);
135
136 // Tadpole
137 static ncomplex getA(int ep, const Kinem1 &kin) { return getI1(ep, kin); }
138
139 static void Clear();
140 static void ClearCC();
141 static void ClearIC();
142
143 static double getMu2();
144 static double setMu2(const double newmu2);
145
146 private:
147 static double mu2;
148 typedef union { int64_t i64; double d64; } ID64;
149 typedef union { double d64; int64_t i64; } DI64;
150 static const ID64 sNAN;
151 friend bool operator==(const double &x, const ICache::ID64 &y);
152
153 // ------------------------------
154 // Tensor integral coefficients
155 // ------------------------------
156 // TODO: rethink and optimize layout later
157 typedef CArray< ncomplex, eeLAST > Save5;
158 typedef MEntry< Kinem5, Save5::Ptr > Entry5;
159 typedef DArray< Entry5, size5 > Array5;
160 static Array5 ic5[3];
161 static Save5* getS5(int ep, const Kinem5 &kin, int coefn);
162
163 typedef CArray< ncomplex, ddLAST > Save4;
164 typedef MEntry< Kinem4, Save4::Ptr > Entry4;
165 typedef DArray< Entry4, size4 > Array4;
166 static Array4 ic4[3];
167 static Save4* getS4(int ep, const Kinem4 &kin, int coefn);
168
169 typedef CArray< ncomplex, ccLAST > Save3;
170 typedef MEntry< Kinem3, Save3::Ptr > Entry3;
171 typedef DArray< Entry3, size3 > Array3;
172 static Array3 ic3[3];
173 static Save3* getS3(int ep, const Kinem3 &kin, int coefn);
174
175 typedef CArray< ncomplex, bbLAST > Save2;
176 typedef MEntry< Kinem2, Save2::Ptr > Entry2;
177 typedef DArray< Entry2, size2 > Array2;
178 static Array2 ic2[3];
179 static Save2* getS2(int ep, const Kinem2 &kin, int coefn);
180
181 // ------------------------------
182 // Scalar integrals
183 // ------------------------------
184 typedef MEntry< Kinem4, Ival > EntryS4;
185 typedef DArray< EntryS4, size4 > ArrayS4;
186 static ArrayS4 ics4;
187
188 typedef MEntry< Kinem3, Ival > EntryS3;
189 typedef DArray< EntryS3, size3 > ArrayS3;
190 static ArrayS3 ics3;
191
192 typedef MEntry< Kinem2, Ival > EntryS2;
193 typedef DArray< EntryS2, size2 > ArrayS2;
194 static ArrayS2 ics2;
195
196 typedef MEntry< Kinem1, Ival > EntryS1;
197 typedef DArray< EntryS1, size1 > ArrayS1;
198 static ArrayS1 ics1;
199};
200
201inline
202bool operator==(const double &x, const ICache::ID64 &y)
203{
204 const ICache::DI64 ix={x};
205 return ix.i64 == y.i64;
206}
207
208
209class MCache : public Cache
210{
211#ifdef USE_GOLEM_MODE
212 friend class Golem;
213#endif
214 public:
215 // TODO: may be return by reference here?
216 static Minor5::Ptr getMinor5(const Kinem5 &k);
217 static Minor4::Ptr getMinor4(const Kinem4 &k);
218 static Minor3::Ptr getMinor3(const Kinem3 &k);
219 static Minor2::Ptr getMinor2(const Kinem2 &k);
220
221 static void insertMinor5(const Kinem5 &k, Minor5::Ptr &m);
222 static void insertMinor4(const Kinem4 &k, Minor4::Ptr &m);
223 static void insertMinor3(const Kinem3 &k, Minor3::Ptr &m);
224 static void insertMinor2(const Kinem2 &k, Minor2::Ptr &m);
225
226#ifdef USE_SMART_INSERT
227# define INSERTMINOR3 smartinsertMinor3
228# define INSERTMINOR2 smartinsertMinor2
229 static void smartinsertMinor3(const Kinem3 &k, Minor3::Ptr &m);
230 static void smartinsertMinor2(const Kinem2 &k, Minor2::Ptr &m);
231#else
232# define INSERTMINOR3 insertMinor3
233# define INSERTMINOR2 insertMinor2
234#endif
235
236 static void Clear();
237
238 private:
239
240 typedef MEntry< Kinem5, Minor5::Ptr > Entry5;
241 typedef DArray< Entry5, size5 > Array5;
242 static Array5 cm5;
243
244 typedef MEntry< Kinem4, Minor4::Ptr > Entry4;
245 typedef DArray< Entry4, size4 > Array4;
246 static Array4 cm4;
247
248 typedef MEntry< Kinem3, Minor3::Ptr > Entry3;
249 typedef DArray< Entry3, size3 > Array3;
250 static Array3 cm3;
251
252 typedef MEntry< Kinem2, Minor2::Ptr > Entry2;
253 typedef DArray< Entry2, size2 > Array2;
254 static Array2 cm2;
255
256};
257
258/* =============================================
259 *
260 * inline functions
261 *
262 * =============================================
263 */
264
265#define insertMinorN(n) \
266inline \
267void MCache::insertMinor##n(const Kinem##n &k, Minor##n::Ptr &m) \
268{ \
269 cm##n.insert(Entry##n(k,m)); \
270}
271
276
277#undef insertMinorN
278
279#endif /* _QUL_CACHE_H */
Double_t x[10]
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
Definition: KarLud.h:35
bool operator==(const double &x, const ICache::ID64 &y)
static double setMu2(const double newmu2)
static ncomplex getI2(int ep, const Kinem2 &k)
static ncomplex getI4(int ep, const Kinem4 &k)
static ncomplex getD(int ep, const Kinem4 &kin)
static ncomplex getI3(int ep, const Kinem3 &k)
static ncomplex getA(int ep, const Kinem1 &kin)
static ncomplex getB(int ep, const Kinem2 &kin)
friend bool operator==(const double &x, const ICache::ID64 &y)
static ncomplex getC(int ep, const Kinem3 &kin)
static ncomplex getE(int ep, const Kinem5 &kin)
static ncomplex getI1(int ep, const Kinem1 &k)
static void insertMinor5(const Kinem5 &k, Minor5::Ptr &m)
static void insertMinor4(const Kinem4 &k, Minor4::Ptr &m)
static Minor5::Ptr getMinor5(const Kinem5 &k)
static Minor2::Ptr getMinor2(const Kinem2 &k)
static Minor3::Ptr getMinor3(const Kinem3 &k)
static void smartinsertMinor2(const Kinem2 &k, Minor2::Ptr &m)
static void insertMinor2(const Kinem2 &k, Minor2::Ptr &m)
static void insertMinor3(const Kinem3 &k, Minor3::Ptr &m)
static Minor4::Ptr getMinor4(const Kinem4 &k)
static void smartinsertMinor3(const Kinem3 &k, Minor3::Ptr &m)
MEntry(const MEntry &entry)
double y[1000]