Geant4 10.7.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4eBremParametrizedModel.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// -------------------------------------------------------------------
28//
29// GEANT4 Class file
30//
31//
32// File name: G4eBremParametrizedModel
33//
34// Author: Andreas Schaelicke
35//
36// Creation date: 06.04.2011
37//
38// Modifications:
39//
40// Main References:
41// - based on G4eBremsstrahlungModel and G4eBremsstrahlungRelModel
42// -------------------------------------------------------------------
43//
44//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
45//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
46
49#include "G4SystemOfUnits.hh"
50#include "G4Electron.hh"
51#include "G4Positron.hh"
52#include "G4Gamma.hh"
53#include "Randomize.hh"
54#include "G4Material.hh"
55#include "G4Element.hh"
56#include "G4ElementVector.hh"
59#include "G4LossTableManager.hh"
60#include "G4ModifiedTsai.hh"
61#include "G4Exp.hh"
62#include "G4Log.hh"
63
64//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
65
66const G4double G4eBremParametrizedModel::xgi[]={ 0.0199, 0.1017, 0.2372, 0.4083,
67 0.5917, 0.7628, 0.8983, 0.9801 };
68const G4double G4eBremParametrizedModel::wgi[]={ 0.0506, 0.1112, 0.1569, 0.1813,
69 0.1813, 0.1569, 0.1112, 0.0506 };
70
71static const G4double tlow = 1.*CLHEP::MeV;
72
73//
74// GEANT4 internal units.
75//
76static const G4double
77 ah10 = 4.67733E+00, ah11 =-6.19012E-01, ah12 = 2.02225E-02,
78 ah20 =-7.34101E+00, ah21 = 1.00462E+00, ah22 =-3.20985E-02,
79 ah30 = 2.93119E+00, ah31 =-4.03761E-01, ah32 = 1.25153E-02;
80
81static const G4double
82 bh10 = 4.23071E+00, bh11 =-6.10995E-01, bh12 = 1.95531E-02,
83 bh20 =-7.12527E+00, bh21 = 9.69160E-01, bh22 =-2.74255E-02,
84 bh30 = 2.69925E+00, bh31 =-3.63283E-01, bh32 = 9.55316E-03;
85
86static const G4double
87 al00 =-2.05398E+00, al01 = 2.38815E-02, al02 = 5.25483E-04,
88 al10 =-7.69748E-02, al11 =-6.91499E-02, al12 = 2.22453E-03,
89 al20 = 4.06463E-02, al21 =-1.01281E-02, al22 = 3.40919E-04;
90
91static const G4double
92 bl00 = 1.04133E+00, bl01 =-9.43291E-03, bl02 =-4.54758E-04,
93 bl10 = 1.19253E-01, bl11 = 4.07467E-02, bl12 =-1.30718E-03,
94 bl20 =-1.59391E-02, bl21 = 7.27752E-03, bl22 =-1.94405E-04;
95
96using namespace std;
97
99 const G4String& nam)
100 : G4VEmModel(nam),
101 particle(0),
102 isElectron(true),
103 fMigdalConstant(classic_electr_radius*electron_Compton_length*electron_Compton_length*4.0*pi),
104 bremFactor(fine_structure_const*classic_electr_radius*classic_electr_radius*16./3.),
105 isInitialised(false)
106{
108
109 minThreshold = 0.1*keV;
110 lowKinEnergy = 10.*MeV;
111 SetLowEnergyLimit(lowKinEnergy);
112
114
116
119
120 InitialiseConstants();
121 if(p) { SetParticle(p); }
122}
123
124//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
125
126void G4eBremParametrizedModel::InitialiseConstants()
127{
128 facFel = G4Log(184.15);
129 facFinel = G4Log(1194.);
130}
131
132//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
133
135{
136}
137
138//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
139
140void G4eBremParametrizedModel::SetParticle(const G4ParticleDefinition* p)
141{
142 particle = p;
144 if(p == G4Electron::Electron()) { isElectron = true; }
145 else { isElectron = false;}
146}
147
148//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
149
152{
153 return minThreshold;
154}
155
156//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
157
159 const G4Material* mat,
160 G4double kineticEnergy)
161{
162 densityFactor = mat->GetElectronDensity()*fMigdalConstant;
163
164 // calculate threshold for density effect
165 kinEnergy = kineticEnergy;
166 totalEnergy = kineticEnergy + particleMass;
168}
169
170
171//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
172
174 const G4DataVector& cuts)
175{
176 if(p) { SetParticle(p); }
177
178 lowKinEnergy = LowEnergyLimit();
179
180 currentZ = 0.;
181
182 if(IsMaster()) { InitialiseElementSelectors(p, cuts); }
183
184 if(isInitialised) { return; }
186 isInitialised = true;
187}
188
189//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
190
192 G4VEmModel* masterModel)
193{
195}
196
197//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
198
200 const G4Material* material,
201 const G4ParticleDefinition* p,
202 G4double kineticEnergy,
203 G4double cutEnergy)
204{
205 if(!particle) { SetParticle(p); }
206 if(kineticEnergy < lowKinEnergy) { return 0.0; }
207 G4double cut = std::min(cutEnergy, kineticEnergy);
208 if(cut == 0.0) { return 0.0; }
209
210 SetupForMaterial(particle, material,kineticEnergy);
211
212 const G4ElementVector* theElementVector = material->GetElementVector();
213 const G4double* theAtomicNumDensityVector = material->GetAtomicNumDensityVector();
214
215 G4double dedx = 0.0;
216
217 // loop for elements in the material
218 for (size_t i=0; i<material->GetNumberOfElements(); i++) {
219
220 G4VEmModel::SetCurrentElement((*theElementVector)[i]);
221 SetCurrentElement((*theElementVector)[i]->GetZ());
222
223 dedx += theAtomicNumDensityVector[i]*currentZ*currentZ*ComputeBremLoss(cut);
224 }
225 dedx *= bremFactor;
226
227 return dedx;
228}
229
230//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
231
232G4double G4eBremParametrizedModel::ComputeBremLoss(G4double cut)
233{
234 G4double loss = 0.0;
235
236 // number of intervals and integration step
237 G4double vcut = cut/totalEnergy;
238 G4int n = (G4int)(20*vcut) + 3;
239 G4double delta = vcut/G4double(n);
240
241 G4double e0 = 0.0;
242 G4double xs;
243
244 // integration
245 for(G4int l=0; l<n; l++) {
246
247 for(G4int i=0; i<8; i++) {
248
249 G4double eg = (e0 + xgi[i]*delta)*totalEnergy;
250
251 xs = ComputeDXSectionPerAtom(eg);
252
253 loss += wgi[i]*xs/(1.0 + densityCorr/(eg*eg));
254 }
255 e0 += delta;
256 }
257
258 loss *= delta*totalEnergy;
259
260 return loss;
261}
262
263//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
264
266 const G4ParticleDefinition* p,
267 G4double kineticEnergy,
269 G4double cutEnergy,
270 G4double maxEnergy)
271{
272 if(!particle) { SetParticle(p); }
273 if(kineticEnergy < lowKinEnergy) { return 0.0; }
274 G4double cut = std::min(cutEnergy, kineticEnergy);
275 G4double tmax = std::min(maxEnergy, kineticEnergy);
276
277 if(cut >= tmax) { return 0.0; }
278
279 SetCurrentElement(Z);
280
281 G4double cross = ComputeXSectionPerAtom(cut);
282
283 // allow partial integration
284 if(tmax < kinEnergy) { cross -= ComputeXSectionPerAtom(tmax); }
285
286 cross *= Z*Z*bremFactor;
287
288 return cross;
289}
290
291//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
292
293G4double G4eBremParametrizedModel::ComputeXSectionPerAtom(G4double cut)
294{
295 G4double cross = 0.0;
296
297 // number of intervals and integration step
298 G4double vcut = G4Log(cut/totalEnergy);
300 G4int n = (G4int)(0.45*(vmax - vcut)) + 4;
301 // n=1; // integration test
302 G4double delta = (vmax - vcut)/G4double(n);
303
304 G4double e0 = vcut;
305 G4double xs;
306
307 // integration
308 for(G4int l=0; l<n; l++) {
309
310 for(G4int i=0; i<8; i++) {
311
312 G4double eg = G4Exp(e0 + xgi[i]*delta)*totalEnergy;
313
314 xs = ComputeDXSectionPerAtom(eg);
315
316 cross += wgi[i]*xs/(1.0 + densityCorr/(eg*eg));
317 }
318 e0 += delta;
319 }
320
321 cross *= delta;
322
323 return cross;
324}
325
326//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
327
328// compute the value of the screening function 3*PHI1 - PHI2
329
330G4double G4eBremParametrizedModel::ScreenFunction1(G4double ScreenVariable)
331{
332 G4double screenVal;
333
334 if (ScreenVariable > 1.)
335 screenVal = 42.24 - 8.368*G4Log(ScreenVariable+0.952);
336 else
337 screenVal = 42.392 - ScreenVariable* (7.796 - 1.961*ScreenVariable);
338
339 return screenVal;
340}
341
342//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
343
344// compute the value of the screening function 1.5*PHI1 - 0.5*PHI2
345
346G4double G4eBremParametrizedModel::ScreenFunction2(G4double ScreenVariable)
347{
348 G4double screenVal;
349
350 if (ScreenVariable > 1.)
351 screenVal = 42.24 - 8.368*G4Log(ScreenVariable+0.952);
352 else
353 screenVal = 41.734 - ScreenVariable* (6.484 - 1.250*ScreenVariable);
354
355 return screenVal;
356}
357
358//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
359
360// Parametrized cross section
361G4double G4eBremParametrizedModel::ComputeParametrizedDXSectionPerAtom(
362 G4double kineticEnergy,
363 G4double gammaEnergy, G4double Z)
364{
365 SetCurrentElement(Z);
366 G4double FZ = lnZ* (4.- 0.55*lnZ);
367 G4double Z3 = z13;
368 G4double ZZ = z13*nist->GetZ13(G4lrint(Z)+1);
369
370 totalEnergy = kineticEnergy + electron_mass_c2;
371
372 // G4double x, epsil, greject, migdal, grejmax, q;
373 G4double epsil, greject;
374 G4double U = G4Log(kineticEnergy/electron_mass_c2);
375 G4double U2 = U*U;
376
377 // precalculated parameters
378 G4double ah, bh;
379
380 if (kineticEnergy > tlow) {
381
382 G4double ah1 = ah10 + ZZ* (ah11 + ZZ* ah12);
383 G4double ah2 = ah20 + ZZ* (ah21 + ZZ* ah22);
384 G4double ah3 = ah30 + ZZ* (ah31 + ZZ* ah32);
385
386 G4double bh1 = bh10 + ZZ* (bh11 + ZZ* bh12);
387 G4double bh2 = bh20 + ZZ* (bh21 + ZZ* bh22);
388 G4double bh3 = bh30 + ZZ* (bh31 + ZZ* bh32);
389
390 ah = 1. + (ah1*U2 + ah2*U + ah3) / (U2*U);
391 bh = 0.75 + (bh1*U2 + bh2*U + bh3) / (U2*U);
392
393 // limit of the screening variable
394 G4double screenfac =
395 136.*electron_mass_c2/(Z3*totalEnergy);
396
397 epsil = gammaEnergy/totalEnergy; // epsil = x*kineticEnergy/totalEnergy;
398 G4double screenvar = screenfac*epsil/(1.0-epsil);
399 G4double F1 = max(ScreenFunction1(screenvar) - FZ ,0.);
400 G4double F2 = max(ScreenFunction2(screenvar) - FZ ,0.);
401
402
403 greject = (F1 - epsil* (ah*F1 - bh*epsil*F2))/8.; // 1./(42.392 - FZ);
404
405 std::cout << " yy = "<<epsil<<std::endl;
406 std::cout << " F1/(...) "<<F1/(42.392 - FZ)<<std::endl;
407 std::cout << " F2/(...) "<<F2/(42.392 - FZ)<<std::endl;
408 std::cout << " (42.392 - FZ) " << (42.392 - FZ) <<std::endl;
409
410 } else {
411
412 G4double al0 = al00 + ZZ* (al01 + ZZ* al02);
413 G4double al1 = al10 + ZZ* (al11 + ZZ* al12);
414 G4double al2 = al20 + ZZ* (al21 + ZZ* al22);
415
416 G4double bl0 = bl00 + ZZ* (bl01 + ZZ* bl02);
417 G4double bl1 = bl10 + ZZ* (bl11 + ZZ* bl12);
418 G4double bl2 = bl20 + ZZ* (bl21 + ZZ* bl22);
419
420 ah = al0 + al1*U + al2*U2;
421 bh = bl0 + bl1*U + bl2*U2;
422
423 G4double x=gammaEnergy/kineticEnergy;
424 greject=(1. + x* (ah + bh*x));
425
426 /*
427 // Compute the maximum of the rejection function
428 grejmax = max(1. + xmin* (ah + bh*xmin), 1.+ah+bh);
429 G4double xm = -ah/(2.*bh);
430 if ( xmin < xm && xm < xmax) grejmax = max(grejmax, 1.+ xm* (ah + bh*xm));
431 */
432 }
433
434 return greject;
435}
436
437//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
438
439G4double G4eBremParametrizedModel::ComputeDXSectionPerAtom(G4double gammaEnergy)
440{
441
442 if(gammaEnergy < 0.0) { return 0.0; }
443
444 G4double y = gammaEnergy/totalEnergy;
445
446 G4double main=0.;
447 //secondTerm=0.;
448
449 // ** form factors complete screening case **
450 // only valid for high energies (and if LPM suppression does not play a role)
451 main = (3./4.*y*y - y + 1.) * ( (Fel-fCoulomb) + Finel/currentZ );
452 // secondTerm = (1.-y)/12.*(1.+1./currentZ);
453
454 std::cout<<" F1(0) "<<ScreenFunction1(0.) <<std::endl;
455 std::cout<<" F1(0) "<<ScreenFunction2(0.) <<std::endl;
456 std::cout<<"Ekin = "<<kinEnergy<<std::endl;
457 std::cout<<"Z = "<<currentZ<<std::endl;
458 std::cout<<"main = "<<main<<std::endl;
459 std::cout<<" y = "<<y<<std::endl;
460 std::cout<<" Fel-fCoulomb "<< (Fel-fCoulomb) <<std::endl;
461
462 G4double main2 = ComputeParametrizedDXSectionPerAtom(kinEnergy,gammaEnergy,currentZ);
463 std::cout<<"main2 = "<<main2<<std::endl;
464 std::cout<<"main2tot = "<<main2 * ( (Fel-fCoulomb) + Finel/currentZ )/(Fel-fCoulomb);
465
466 G4double cross = main2; //main+secondTerm;
467 return cross;
468}
469
470//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
471
473 std::vector<G4DynamicParticle*>* vdp,
474 const G4MaterialCutsCouple* couple,
475 const G4DynamicParticle* dp,
476 G4double cutEnergy,
477 G4double maxEnergy)
478{
479 G4double kineticEnergy = dp->GetKineticEnergy();
480 if(kineticEnergy < lowKinEnergy) { return; }
481 G4double cut = std::min(cutEnergy, kineticEnergy);
482 G4double emax = std::min(maxEnergy, kineticEnergy);
483 if(cut >= emax) { return; }
484
485 SetupForMaterial(particle, couple->GetMaterial(),kineticEnergy);
486
487 const G4Element* elm = SelectTargetAtom(couple,particle,kineticEnergy,
488 dp->GetLogKineticEnergy(),cut,emax);
489 SetCurrentElement(elm->GetZ());
490
491 kinEnergy = kineticEnergy;
492 totalEnergy = kineticEnergy + particleMass;
494
495 G4double xmin = G4Log(cut*cut + densityCorr);
496 G4double xmax = G4Log(emax*emax + densityCorr);
497 G4double gammaEnergy, f, x;
498
499 CLHEP::HepRandomEngine* rndmEngine = G4Random::getTheEngine();
500
501 do {
502 x = G4Exp(xmin + rndmEngine->flat()*(xmax - xmin)) - densityCorr;
503 if(x < 0.0) x = 0.0;
504 gammaEnergy = sqrt(x);
505 f = ComputeDXSectionPerAtom(gammaEnergy);
506
507 if ( f > fMax ) {
508 G4cout << "### G4eBremParametrizedModel Warning: Majoranta exceeded! "
509 << f << " > " << fMax
510 << " Egamma(MeV)= " << gammaEnergy
511 << " E(mEV)= " << kineticEnergy
512 << G4endl;
513 }
514
515 // Loop checking, 03-Aug-2015, Vladimir Ivanchenko
516 } while (f < fMax*rndmEngine->flat());
517
518 //
519 // angles of the emitted gamma. ( Z - axis along the parent particle)
520 // use general interface
521 //
522 G4ThreeVector gammaDirection =
525 couple->GetMaterial());
526
527 // create G4DynamicParticle object for the Gamma
528 G4DynamicParticle* gamma = new G4DynamicParticle(theGamma,gammaDirection,
529 gammaEnergy);
530 vdp->push_back(gamma);
531
532 G4double totMomentum = sqrt(kineticEnergy*(totalEnergy + electron_mass_c2));
533 G4ThreeVector direction = (totMomentum*dp->GetMomentumDirection()
534 - gammaEnergy*gammaDirection).unit();
535
536 // energy of primary
537 G4double finalE = kineticEnergy - gammaEnergy;
538
539 // stop tracking and create new secondary instead of primary
540 if(gammaEnergy > SecondaryThreshold()) {
543 G4DynamicParticle* el =
545 direction, finalE);
546 vdp->push_back(el);
547
548 // continue tracking
549 } else {
552 }
553}
554
555//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
556
557
std::vector< G4Element * > G4ElementVector
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:179
G4double G4Log(G4double x)
Definition: G4Log.hh:226
@ fStopAndKill
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
virtual double flat()=0
const G4ThreeVector & GetMomentumDirection() const
G4double GetLogKineticEnergy() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
Definition: G4Electron.cc:93
G4double GetZ() const
Definition: G4Element.hh:130
static G4Gamma * Gamma()
Definition: G4Gamma.cc:85
const G4Material * GetMaterial() const
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:188
size_t GetNumberOfElements() const
Definition: G4Material.hh:184
const G4double * GetAtomicNumDensityVector() const
Definition: G4Material.hh:214
G4double GetElectronDensity() const
Definition: G4Material.hh:215
G4double GetZ13(G4double Z) const
static G4NistManager * Instance()
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void SetProposedMomentumDirection(const G4ThreeVector &dir)
virtual G4ThreeVector & SampleDirection(const G4DynamicParticle *dp, G4double finalTotalEnergy, G4int Z, const G4Material *)=0
void SetElementSelectors(std::vector< G4EmElementSelector * > *)
Definition: G4VEmModel.hh:842
G4VEmAngularDistribution * GetAngularDistribution()
Definition: G4VEmModel.hh:611
G4double LowEnergyLimit() const
Definition: G4VEmModel.hh:652
std::vector< G4EmElementSelector * > * GetElementSelectors()
Definition: G4VEmModel.hh:834
G4bool IsMaster() const
Definition: G4VEmModel.hh:736
void SetCurrentElement(const G4Element *)
Definition: G4VEmModel.hh:487
void SetLowEnergyLimit(G4double)
Definition: G4VEmModel.hh:764
void SetAngularDistribution(G4VEmAngularDistribution *)
Definition: G4VEmModel.hh:618
const G4Element * SelectTargetAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double logKineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.hh:587
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
Definition: G4VEmModel.cc:148
G4double SecondaryThreshold() const
Definition: G4VEmModel.hh:680
G4ParticleChangeForLoss * GetParticleChangeForLoss()
Definition: G4VEmModel.cc:118
void ProposeTrackStatus(G4TrackStatus status)
virtual void InitialiseLocal(const G4ParticleDefinition *, G4VEmModel *masterModel) override
static const G4double wgi[8]
virtual G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy) override
virtual G4double MinEnergyCut(const G4ParticleDefinition *, const G4MaterialCutsCouple *) override
G4ParticleChangeForLoss * fParticleChange
const G4ParticleDefinition * particle
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double cutEnergy, G4double maxEnergy) override
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double tkin, G4double Z, G4double, G4double cutEnergy, G4double maxEnergy=DBL_MAX) override
G4eBremParametrizedModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="eBremParam")
static const G4double xgi[8]
virtual void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double) override
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
T max(const T t1, const T t2)
brief Return the largest of the two arguments
int G4lrint(double ad)
Definition: templates.hh:134