Newer
Older
/*
* (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
*
* This software is distributed under the terms of the GNU General Public
* Licence version 3 (GPL Version 3). See file LICENSE for a full version of
* the license.
*/
#include <catch2/catch.hpp>
#include <corsika/modules/radio/ZHS.hpp>
#include <corsika/modules/radio/CoREAS.hpp>
#include <corsika/modules/radio/antennas/TimeDomainAntenna.hpp>
#include <corsika/modules/radio/detectors/RadioDetector.hpp>
#include <corsika/modules/radio/propagators/StraightPropagator.hpp>
#include <corsika/modules/radio/propagators/SignalPath.hpp>
#include <corsika/modules/radio/propagators/RadioPropagator.hpp>
#include <vector>
#include <xtensor/xtensor.hpp>
#include <xtensor/xbuilder.hpp>
#include <xtensor/xio.hpp>
#include <xtensor/xcsv.hpp>
#include <istream>
#include <fstream>
#include <iostream>
#include <corsika/media/Environment.hpp>
#include <corsika/media/FlatExponential.hpp>
#include <corsika/media/HomogeneousMedium.hpp>
#include <corsika/media/IMagneticFieldModel.hpp>
#include <corsika/media/LayeredSphericalAtmosphereBuilder.hpp>
#include <corsika/media/NuclearComposition.hpp>
#include <corsika/media/MediumPropertyModel.hpp>
#include <corsika/media/UniformMagneticField.hpp>
#include <corsika/media/SlidingPlanarExponential.hpp>
#include <corsika/media/Environment.hpp>
#include <corsika/media/HomogeneousMedium.hpp>
#include <corsika/media/IMediumModel.hpp>
#include <corsika/media/IRefractiveIndexModel.hpp>
#include <corsika/media/LayeredSphericalAtmosphereBuilder.hpp>
#include <corsika/media/UniformRefractiveIndex.hpp>
#include <corsika/media/ExponentialRefractiveIndex.hpp>
#include <corsika/media/VolumeTreeNode.hpp>
#include <corsika/framework/geometry/CoordinateSystem.hpp>
#include <corsika/framework/geometry/Line.hpp>
#include <corsika/framework/geometry/Point.hpp>
#include <corsika/framework/geometry/RootCoordinateSystem.hpp>
#include <corsika/framework/geometry/Vector.hpp>
#include <corsika/setup/SetupStack.hpp>
#include <corsika/setup/SetupEnvironment.hpp>
#include <corsika/setup/SetupTrajectory.hpp>
#include <corsika/framework/core/PhysicalUnits.hpp>
#include <corsika/framework/core/PhysicalConstants.hpp>
#include <corsika/media/UniformMagneticField.hpp>
using namespace corsika;
double constexpr absMargin = 1.0e-7;
template <typename TInterface>
using MyExtraEnv =
UniformRefractiveIndex<MediumPropertyModel<UniformMagneticField<TInterface>>>;
SECTION("CoREAS process") {
// // Environment 1 (works)
// // first step is to construct an environment for the propagation (uniform index 1)
// using UniRIndex =
// UniformRefractiveIndex<HomogeneousMedium<IRefractiveIndexModel<IMediumModel>>>;
// using EnvType = Environment<IRefractiveIndexModel<IMediumModel>>;
// EnvType envCoREAS;
// // get a coordinate system
// const CoordinateSystemPtr rootCSCoREAS = envCoREAS.getCoordinateSystem();
// auto MediumCoREAS = EnvType::createNode<Sphere>(
// Point{rootCSCoREAS, 0_m, 0_m, 0_m}, 1_km * std::numeric_limits<double>::infinity());
// auto const propsCoREAS = MediumCoREAS->setModelProperties<UniRIndex>(
// 1.000327, 1_kg / (1_m * 1_m * 1_m),
// NuclearComposition(
// std::vector<Code>{Code::Nitrogen},
// std::vector<float>{1.f}));
// envCoREAS.getUniverse()->addChild(std::move(MediumCoREAS));
//////////////////////////////////////////////////////////////////////////////////////
// // Environment 2 (works)
// using IModelInterface = IRefractiveIndexModel<IMediumPropertyModel<IMagneticFieldModel<IMediumModel>>>;
// using AtmModel = UniformRefractiveIndex<MediumPropertyModel<UniformMagneticField<HomogeneousMedium
// <IModelInterface>>>>;
// using EnvType = Environment<AtmModel>;
// EnvType envCoREAS;
// CoordinateSystemPtr const& rootCSCoREAS = envCoREAS.getCoordinateSystem();
// // get the center point
// Point const center{rootCSCoREAS, 0_m, 0_m, 0_m};
// // a refractive index
// const double ri_{1.000327};
//
// // the constant density
// const auto density{19.2_g / cube(1_cm)};
// // the composition we use for the homogeneous medium
// NuclearComposition const protonComposition(std::vector<Code>{Code::Proton},
// std::vector<float>{1.f});
//
// // create magnetic field vector
// Vector B1(rootCSCoREAS, 0_T, 0_T, 1_T);
//
// auto Medium = EnvType::createNode<Sphere>(
// center, 1_km * std::numeric_limits<double>::infinity());
//
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// auto const props = Medium->setModelProperties<AtmModel>(ri_, Medium::AirDry1Atm, B1, density, protonComposition);
// envCoREAS.getUniverse()->addChild(std::move(Medium));
//////////////////////////////////////////////////////////////////////////////////////
// Environment 3 (works)
using EnvironmentInterface =
IRefractiveIndexModel<IMediumPropertyModel<IMagneticFieldModel<IMediumModel>>>;
using EnvType = Environment<EnvironmentInterface>;
EnvType envCoREAS;
CoordinateSystemPtr const& rootCSCoREAS = envCoREAS.getCoordinateSystem();
Point const center{rootCSCoREAS, 0_m, 0_m, 0_m};
auto builder = make_layered_spherical_atmosphere_builder<
EnvironmentInterface, MyExtraEnv>::create(center,
constants::EarthRadius::Mean, 1.000327,
Medium::AirDry1Atm,
MagneticFieldVector{rootCSCoREAS, 0_T,
50_uT, 0_T});
builder.setNuclearComposition(
{{Code::Nitrogen, Code::Oxygen},
{0.7847f, 1.f - 0.7847f}}); // values taken from AIRES manual, Ar removed for now
// builder.addExponentialLayer(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km);
// builder.addExponentialLayer(1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km);
// builder.addExponentialLayer(1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km);
// builder.addExponentialLayer(540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km);
builder.addLinearLayer(1e9_cm, 112.8_km);
builder.assemble(envCoREAS);
//////////////////////////////////////////////////////////////////////////////////////////
// now create antennas and detectors
// the antennas location
const auto point1{Point(envCoREAS.getCoordinateSystem(), 100_m, 2_m, 3_m)};
const auto point2{Point(envCoREAS.getCoordinateSystem(), 4_m, 80_m, 6_m)};
const auto point3{Point(envCoREAS.getCoordinateSystem(), 7_m, 8_m, 9_m)};
const auto point4{Point(envCoREAS.getCoordinateSystem(), 5_m, 5_m, 10_m)};
// create times for the antenna
const TimeType t1{0_s}; // TODO: initialization of times to antennas! particle hits the observation level should be zero
const TimeType t2{10_s};
const InverseTimeType t3{1e+3_Hz};
const TimeType t4{11_s};
// check that I can create an antenna at (1, 2, 3)
TimeDomainAntenna ant1("antenna_name", point1, t1, t2, t3);
TimeDomainAntenna ant2("antenna_name2", point2, t1, t2, t3);
// TimeDomainAntenna ant3("antenna1", point1, 0_s, 2_s, 1/1e-7_s);
// std::cout << "static cast " << static_cast<int>(1/1000) << std::endl;
// construct a radio detector instance to store our antennas
AntennaCollection<TimeDomainAntenna> detector;
// add the antennas to the detector
detector.addAntenna(ant1);
detector.addAntenna(ant2);
// detector.addAntenna(ant3);
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
// create a particle
auto const particle{Code::Electron};
// auto const particle{Code::Gamma};
const auto pmass{get_mass(particle)};
VelocityVector v0(rootCSCoREAS, {5e+2_m / second, 5e+2_m / second, 5e+2_m / second});
Vector B0(rootCSCoREAS, 5_T, 5_T, 5_T);
Line const line(point3, v0);
auto const k{1_m * ((1_m) / ((1_s * 1_s) * 1_V))};
auto const t = 1_s;
LeapFrogTrajectory base(point4, v0, B0, k, t);
// create a new stack for each trial
setup::Stack stack;
// construct an energy
const HEPEnergyType E0{1_TeV};
// compute the necessary momentumn
const HEPMomentumType P0{sqrt(E0 * E0 - pmass * pmass)};
// and create the momentum vector
const auto plab{MomentumVector(rootCSCoREAS, {0_GeV, 0_GeV, P0})};
// and create the location of the particle in this coordinate system
const Point pos(rootCSCoREAS, 50_m, 10_m, 80_m);
// add the particle to the stack
auto const particle1{stack.addParticle(std::make_tuple(particle, E0, plab, pos, 0_ns))};
auto const charge_ {get_charge(particle1.getPID())};
// std::cout << "charge: " << charge_ << std::endl;
// std::cout << "1 / c: " << 1. / constants::c << std::endl;
// set up a track object
// setup::Tracking tracking;
// auto startPoint_ {base.getPosition(0)};
// auto midPoint_ {base.getPosition(0.5)};
// auto endPoint_ {base.getPosition(1)};
// std::cout << "startPoint_: " << startPoint_ << std::endl;
// std::cout << "midPoint_: " << midPoint_ << std::endl;
// std::cout << "endPoint_: " << endPoint_ << std::endl;
// auto velo_ {base.getVelocity(0)};
// std::cout << "velocity: " << velo_ << std::endl;
// auto startTime_ {particle1.getTime() - base.getDuration()}; // time at the start point of the track hopefully.
// auto endTime_ {particle1.getTime()};
// std::cout << "startTime_: " << startTime_ << std::endl;
// std::cout << "endTime_: " << endTime_ << std::endl;
// auto beta_ {((endPoint_ - startPoint_) / (constants::c * (endTime_ - startTime_))).normalized()};
// std::cout << "beta_: " << beta_ << std::endl;
// Vector<dimensionless_d> v1(rootCSCoREAS, {0, 0, 1});
// std::cout << "v1: " << v1.getComponents() << std::endl;
// std::cout << "beta_.dot(v1): " << beta_.dot(v1) << std::endl;
// std::cout << "Pi: " << 1/M_PI << std::endl;
// std::cout << "speed of light: " << constants::c << std::endl;
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
// std::cout << "vacuum permitivity: " << constants::epsilonZero << std::endl;
// Create a CoREAS instance
// CoREAS<decltype(detector), decltype(StraightPropagator(envCoREAS))> coreas1(detector, envCoREAS);
// create a radio process instance using CoREAS
RadioProcess<decltype(detector), CoREAS<decltype(detector), decltype(StraightPropagator(envCoREAS))>, decltype(StraightPropagator(envCoREAS))>
coreas(detector, envCoREAS);
// check doContinuous and simulate methods
coreas.doContinuous(particle1, base, true);
// coreas1.simulate(particle1, base);
// check writeOutput method -> should produce 2 csv files for each antenna
coreas.writeOutput();
}
SECTION("Synchrotron radiation") {
// create a suitable environment ///////////////////////////////////////////////////
using IModelInterface = IRefractiveIndexModel<IMediumPropertyModel<IMagneticFieldModel<IMediumModel>>>;
using AtmModel = UniformRefractiveIndex<MediumPropertyModel<UniformMagneticField<HomogeneousMedium
<IModelInterface>>>>;
using EnvType = Environment<AtmModel>;
EnvType env;
CoordinateSystemPtr const& rootCS = env.getCoordinateSystem();
// get the center point
Point const center{rootCS, 0_m, 0_m, 0_m};
// a refractive index for the vacuum
const double ri_{1};
// the constant density
const auto density{19.2_g / cube(1_cm)};
// the composition we use for the homogeneous medium
NuclearComposition const Composition(std::vector<Code>{Code::Nitrogen},
std::vector<float>{1.f});
// create magnetic field vector
Vector B1(rootCS, 0_T, 0_T, 0.3809_T);
// create a Sphere for the medium
auto Medium = EnvType::createNode<Sphere>(
center, 1_km * std::numeric_limits<double>::infinity());
// set the environment properties
auto const props = Medium->setModelProperties<AtmModel>(ri_, Medium::AirDry1Atm, B1, density, Composition);
// bind things together
env.getUniverse()->addChild(std::move(Medium));
// now create antennas and detectors/////////////////////////////////////////////
const auto point1{Point(rootCS, 100_m, 100_m, 0_m)};
const auto point2{Point(rootCS, 100_m, -100_m, 0_m)};
const auto point3{Point(rootCS, -100_m, -100_m, 0_m)};
const auto point4{Point(rootCS, -100_m, 100_m, 0_m)};
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
// create times for the antenna
const TimeType t1{0_s};
const TimeType t2{1e-6_s};
const InverseTimeType t3{1e+9_Hz};
// create 4 cool antennas
TimeDomainAntenna ant1("cool antenna", point1, t1, t2, t3);
TimeDomainAntenna ant2("cooler antenna", point2, t1, t2, t3);
TimeDomainAntenna ant3("coolest antenna", point3, t1, t2, t3);
TimeDomainAntenna ant4("No, I am the coolest antenna", point4, t1, t2, t3);
// construct a radio detector instance to store our antennas
AntennaCollection<TimeDomainAntenna> detector;
// add the antennas to the detector
detector.addAntenna(ant1);
detector.addAntenna(ant2);
detector.addAntenna(ant3);
detector.addAntenna(ant4);
// create points that make a 2D circle of radius=100m ////////////////////////////////
Point p0(rootCS, {0_m, 100_m, 0_m});
Point p1(rootCS, {1_m, 99.995_m, 0_m});
Point p2(rootCS, {2_m,99.98_m, 0_m});
Point p3(rootCS, {3_m,99.955_m, 0_m});
Point p4(rootCS, {4_m,99.92_m, 0_m});
Point p5(rootCS, {5_m,99.875_m, 0_m});
Point p6(rootCS, {6_m,99.82_m, 0_m});
Point p7(rootCS, {7_m,99.755_m, 0_m});
Point p8(rootCS, {8_m,99.679_m, 0_m});
Point p9(rootCS, {9_m,99.594_m, 0_m});
Point p10(rootCS,{10_m,99.499_m, 0_m});
Point p11(rootCS,{11_m,99.393_m, 0_m});
Point p12(rootCS,{12_m,99.277_m, 0_m});
Point p13(rootCS,{13_m,99.151_m, 0_m});
Point p14(rootCS,{14_m,99.015_m, 0_m});
Point p15(rootCS,{15_m,98.869_m, 0_m});
Point p16(rootCS,{16_m,98.712_m, 0_m});
Point p17(rootCS,{17_m,98.544_m, 0_m});
Point p18(rootCS,{18_m,98.367_m, 0_m});
Point p19(rootCS,{19_m,98.178_m, 0_m});
Point p20(rootCS,{20_m,97.98_m, 0_m});
Point p21(rootCS,{21_m,97.77_m, 0_m});
Point p22(rootCS,{22_m,97.55_m, 0_m});
Point p23(rootCS,{23_m,97.319_m, 0_m});
Point p24(rootCS,{24_m,97.077_m, 0_m});
Point p25(rootCS,{25_m,96.825_m, 0_m});
Point p26(rootCS,{26_m,96.561_m, 0_m});
Point p27(rootCS,{27_m,96.286_m, 0_m});
Point p28(rootCS,{28_m,96_m, 0_m});
Point p29(rootCS,{29_m,95.703_m, 0_m});
Point p30(rootCS,{30_m,95.394_m, 0_m});
Point p31(rootCS,{31_m,95.074_m, 0_m});
Point p32(rootCS,{32_m,94.742_m, 0_m});
Point p33(rootCS,{33_m,94.398_m, 0_m});
Point p34(rootCS,{34_m,94.043_m, 0_m});
Point p35(rootCS,{35_m,93.675_m, 0_m});
Point p36(rootCS,{36_m,93.295_m, 0_m});
Point p37(rootCS,{37_m,92.903_m, 0_m});
Point p38(rootCS,{38_m,92.499_m, 0_m});
Point p39(rootCS,{39_m,92.081_m, 0_m});
Point p40(rootCS,{40_m,91.652_m, 0_m});
Point p41(rootCS,{41_m,91.209_m, 0_m});
Point p42(rootCS,{42_m,90.752_m, 0_m});
Point p43(rootCS,{43_m,90.283_m, 0_m});
Point p44(rootCS,{44_m,89.8_m, 0_m});
Point p45(rootCS,{45_m,89.303_m, 0_m});
Point p46(rootCS,{46_m,88.792_m, 0_m});
Point p47(rootCS,{47_m,88.267_m, 0_m});
Point p48(rootCS,{48_m,87.727_m, 0_m});
Point p49(rootCS,{49_m,87.171_m, 0_m});
Point p50(rootCS,{50_m,86.603_m, 0_m});
Point p51(rootCS,{51_m,86.017_m, 0_m});
Point p52(rootCS,{52_m,85.417_m, 0_m});
Point p53(rootCS,{53_m,84.8_m, 0_m});
Point p54(rootCS,{54_m,84.167_m, 0_m});
Point p55(rootCS,{55_m,83.516_m, 0_m});
Point p56(rootCS,{56_m,82.849_m, 0_m});
Point p57(rootCS,{57_m,82.164_m, 0_m});
Point p58(rootCS,{58_m,81.462_m, 0_m});
Point p59(rootCS,{59_m,80.74_m, 0_m});
Point p60(rootCS,{60_m,80_m, 0_m});
Point p61(rootCS,{61_m,79.24_m, 0_m});
Point p62(rootCS,{62_m,78.46_m, 0_m});
Point p63(rootCS,{63_m,77.66_m, 0_m});
Point p64(rootCS,{64_m,76.837_m, 0_m});
Point p65(rootCS,{65_m,75.993_m, 0_m});
Point p66(rootCS,{66_m,75.127_m, 0_m});
Point p67(rootCS,{67_m,74.236_m, 0_m});
Point p68(rootCS,{68_m,73.321_m, 0_m});
Point p69(rootCS,{69_m,72.476_m, 0_m});
Point p70(rootCS,{70_m,71.414_m, 0_m});
Point p71(rootCS,{71_m,70.42_m, 0_m});
Point p72(rootCS,{72_m,69.397_m, 0_m});
Point p73(rootCS,{73_m,68.345_m, 0_m});
Point p74(rootCS,{74_m,67.261_m, 0_m});
Point p75(rootCS,{75_m,66.144_m, 0_m});
Point p76(rootCS,{76_m,64.992_m, 0_m});
Point p77(rootCS,{77_m,63.804_m, 0_m});
Point p78(rootCS,{78_m,62.578_m, 0_m});
Point p79(rootCS,{79_m,61.311_m, 0_m});
Point p80(rootCS,{80_m,60_m, 0_m});
Point p81(rootCS,{81_m,58.643_m, 0_m});
Point p82(rootCS,{82_m,57.236_m, 0_m});
Point p83(rootCS,{83_m,55.776_m, 0_m});
Point p84(rootCS,{84_m,54.259_m, 0_m});
Point p85(rootCS,{85_m,52.678_m, 0_m});
Point p86(rootCS,{86_m,51.029_m, 0_m});
Point p87(rootCS,{87_m,49.305_m, 0_m});
Point p88(rootCS,{88_m,47.497_m, 0_m});
Point p89(rootCS,{89_m,45.596_m, 0_m});
Point p90(rootCS,{90_m,43.589_m, 0_m});
Point p91(rootCS,{91_m,41.461_m, 0_m});
Point p92(rootCS,{92_m,39.192_m, 0_m});
Point p93(rootCS,{93_m,36.756_m, 0_m});
Point p94(rootCS,{94_m,34.117_m, 0_m});
Point p95(rootCS,{95_m,31.225_m, 0_m});
Point p96(rootCS,{96_m,28_m, 0_m});
Point p97(rootCS,{97_m,24.31_m, 0_m});
Point p98(rootCS,{98_m,19.9_m, 0_m});
Point p99(rootCS,{99_m,14.107_m, 0_m});
Point p100(rootCS,{100_m,0_m, 0_m});
Point p101(rootCS,{99_m,-14.107_m, 0_m});
Point p102(rootCS,{98_m,-19.9_m, 0_m});
Point p103(rootCS,{97_m,-24.31_m, 0_m});
Point p104(rootCS,{96_m,-28_m, 0_m});
Point p105(rootCS,{95_m,-31.225_m, 0_m});
Point p106(rootCS,{94_m,-34.117_m, 0_m});
Point p107(rootCS,{93_m,-36.756_m, 0_m});
Point p108(rootCS,{92_m,-39.192_m, 0_m});
Point p109(rootCS,{91_m,-41.461_m, 0_m});
Point p110(rootCS,{90_m,-43.589_m, 0_m});
Point p111(rootCS,{89_m,-45.596_m, 0_m});
Point p112(rootCS,{88_m,-47.497_m, 0_m});
Point p113(rootCS,{87_m,-49.305_m, 0_m});
Point p114(rootCS,{86_m,-51.029_m, 0_m});
Point p115(rootCS,{85_m,-52.678_m, 0_m});
Point p116(rootCS,{84_m,-54.259_m, 0_m});
Point p117(rootCS,{83_m,-55.776_m, 0_m});
Point p118(rootCS,{82_m,-57.236_m, 0_m});
Point p119(rootCS,{81_m,-58.643_m, 0_m});
Point p120(rootCS,{80_m,-60_m, 0_m});
Point p121(rootCS,{79_m,-61.311_m, 0_m});
Point p122(rootCS,{78_m,-62.578_m, 0_m});
Point p123(rootCS,{77_m,-63.804_m, 0_m});
Point p124(rootCS,{76_m,-64.992_m, 0_m});
Point p125(rootCS,{75_m,-66.144_m, 0_m});
Point p126(rootCS,{74_m,-67.261_m, 0_m});
Point p127(rootCS,{73_m,-68.345_m, 0_m});
Point p128(rootCS,{72_m,-69.397_m, 0_m});
Point p129(rootCS,{71_m,-70.42_m, 0_m});
Point p130(rootCS,{70_m,-71.414_m, 0_m});
Point p131(rootCS,{69_m,-72.476_m, 0_m});
Point p132(rootCS,{68_m,-73.321_m, 0_m});
Point p133(rootCS,{67_m,-74.236_m, 0_m});
Point p134(rootCS,{66_m,-75.127_m, 0_m});
Point p135(rootCS,{65_m,-75.993_m, 0_m});
Point p136(rootCS,{64_m,-76.837_m, 0_m});
Point p137(rootCS,{63_m,-77.66_m, 0_m});
Point p138(rootCS,{62_m,-78.46_m, 0_m});
Point p139(rootCS,{61_m,-79.24_m, 0_m});
Point p140(rootCS,{60_m,-80_m, 0_m});
Point p141(rootCS,{59_m,-80.74_m, 0_m});
Point p142(rootCS,{58_m,-81.462_m, 0_m});
Point p143(rootCS,{57_m,-82.164_m, 0_m});
Point p144(rootCS,{56_m,-82.849_m, 0_m});
Point p145(rootCS,{55_m,-83.516_m, 0_m});
Point p146(rootCS,{54_m,-84.167_m, 0_m});
Point p147(rootCS,{53_m,-84.8_m, 0_m});
Point p148(rootCS,{52_m,-85.417_m, 0_m});
Point p149(rootCS,{51_m,-86.017_m, 0_m});
Point p150(rootCS,{50_m,-86.603_m, 0_m});
Point p151(rootCS,{49_m,-87.171_m, 0_m});
Point p152(rootCS,{48_m,-87.727_m, 0_m});
Point p153(rootCS,{47_m,-88.267_m, 0_m});
Point p154(rootCS,{46_m,-88.792_m, 0_m});
Point p155(rootCS,{45_m,-89.303_m, 0_m});
Point p156(rootCS,{44_m,-89.8_m, 0_m});
Point p157(rootCS,{43_m,-90.283_m, 0_m});
Point p158(rootCS,{42_m,-90.752_m, 0_m});
Point p159(rootCS,{41_m,-91.209_m, 0_m});
Point p160(rootCS,{40_m,-91.652_m, 0_m});
Point p161(rootCS,{39_m,-92.081_m, 0_m});
Point p162(rootCS,{38_m,-92.499_m, 0_m});
Point p163(rootCS,{37_m,-92.903_m, 0_m});
Point p164(rootCS,{36_m,-93.295_m, 0_m});
Point p165(rootCS,{35_m,-93.675_m, 0_m});
Point p166(rootCS,{34_m,-94.043_m, 0_m});
Point p167(rootCS,{33_m,-94.398_m, 0_m});
Point p168(rootCS,{32_m,-94.742_m, 0_m});
Point p169(rootCS,{31_m,-95.074_m, 0_m});
Point p170(rootCS,{30_m,-95.394_m, 0_m});
Point p171(rootCS,{29_m,-95.703_m, 0_m});
Point p172(rootCS,{28_m,-96_m, 0_m});
Point p173(rootCS,{27_m,-96.286_m, 0_m});
Point p174(rootCS,{26_m,-96.561_m, 0_m});
Point p175(rootCS,{25_m,-96.825_m, 0_m});
Point p176(rootCS,{24_m,-97.077_m, 0_m});
Point p177(rootCS,{23_m,-97.319_m, 0_m});
Point p178(rootCS,{22_m,-97.55_m, 0_m});
Point p179(rootCS,{21_m,-97.77_m, 0_m});
Point p180(rootCS,{20_m,-97.98_m, 0_m});
Point p181(rootCS,{19_m,-98.178_m, 0_m});
Point p182(rootCS,{18_m,-98.367_m, 0_m});
Point p183(rootCS,{17_m,-98.544_m, 0_m});
Point p184(rootCS,{16_m,-98.712_m, 0_m});
Point p185(rootCS,{15_m,-98.869_m, 0_m});
Point p186(rootCS,{14_m,-99.015_m, 0_m});
Point p187(rootCS,{13_m,-99.151_m, 0_m});
Point p188(rootCS,{12_m,-99.277_m, 0_m});
Point p189(rootCS,{11_m,-99.393_m, 0_m});
Point p190(rootCS,{10_m,-99.499_m, 0_m});
Point p191(rootCS,{9_m,-99.594_m, 0_m});
Point p192(rootCS,{8_m,-99.679_m, 0_m});
Point p193(rootCS,{7_m,-99.755_m, 0_m});
Point p194(rootCS,{6_m,-99.82_m, 0_m});
Point p195(rootCS,{5_m,-99.875_m, 0_m});
Point p196(rootCS,{4_m,-99.92_m, 0_m});
Point p197(rootCS,{3_m,-99.955_m, 0_m});
Point p198(rootCS,{2_m,-99.98_m, 0_m});
Point p199(rootCS,{1_m,-99.995_m, 0_m});
Point p200(rootCS,{0_m,-100_m, 0_m});
Point p201(rootCS,{-1_m,-99.995_m, 0_m});
Point p202(rootCS,{-2_m,-99.98_m, 0_m});
Point p203(rootCS,{-3_m,-99.955_m, 0_m});
Point p204(rootCS,{-4_m,-99.92_m, 0_m});
Point p205(rootCS,{-5_m,-99.875_m, 0_m});
Point p206(rootCS,{-6_m,-99.82_m, 0_m});
Point p207(rootCS,{-7_m,-99.755_m, 0_m});
Point p208(rootCS,{-8_m,-99.679_m, 0_m});
Point p209(rootCS,{-9_m,-99.594_m, 0_m});
Point p210(rootCS,{-10_m,-99.499_m, 0_m});
Point p211(rootCS,{-11_m,-99.393_m, 0_m});
Point p212(rootCS,{-12_m,-99.277_m, 0_m});
Point p213(rootCS,{-13_m,-99.151_m, 0_m});
Point p214(rootCS,{-14_m,-99.015_m, 0_m});
Point p215(rootCS,{-15_m,-98.869_m, 0_m});
Point p216(rootCS,{-16_m,-98.712_m, 0_m});
Point p217(rootCS,{-17_m,-98.544_m, 0_m});
Point p218(rootCS,{-18_m,-98.367_m, 0_m});
Point p219(rootCS,{-19_m,-98.178_m, 0_m});
Point p220(rootCS,{-20_m,-97.98_m, 0_m});
Point p221(rootCS,{-21_m,-97.77_m, 0_m});
Point p222(rootCS,{-22_m,-97.55_m, 0_m});
Point p223(rootCS,{-23_m,-97.319_m, 0_m});
Point p224(rootCS,{-24_m,-97.077_m, 0_m});
Point p225(rootCS,{-25_m,-96.825_m, 0_m});
Point p226(rootCS,{-26_m,-96.561_m, 0_m});
Point p227(rootCS,{-27_m,-96.286_m, 0_m});
Point p228(rootCS,{-28_m,-96_m, 0_m});
Point p229(rootCS,{-29_m,-95.703_m, 0_m});
Point p230(rootCS,{-30_m,-95.394_m, 0_m});
Point p231(rootCS,{-31_m,-95.074_m, 0_m});
Point p232(rootCS,{-32_m,-94.742_m, 0_m});
Point p233(rootCS,{-33_m,-94.398_m, 0_m});
Point p234(rootCS,{-34_m,-94.043_m, 0_m});
Point p235(rootCS,{-35_m,-93.675_m, 0_m});
Point p236(rootCS,{-36_m,-93.295_m, 0_m});
Point p237(rootCS,{-37_m,-92.903_m, 0_m});
Point p238(rootCS,{-38_m,-92.499_m, 0_m});
Point p239(rootCS,{-39_m,-92.081_m, 0_m});
Point p240(rootCS,{-40_m,-91.652_m, 0_m});
Point p241(rootCS,{-41_m,-91.209_m, 0_m});
Point p242(rootCS,{-42_m,-90.752_m, 0_m});
Point p243(rootCS,{-43_m,-90.283_m, 0_m});
Point p244(rootCS,{-44_m,-89.8_m, 0_m});
Point p245(rootCS,{-45_m,-89.303_m, 0_m});
Point p246(rootCS,{-46_m,-88.792_m, 0_m});
Point p247(rootCS,{-47_m,-88.267_m, 0_m});
Point p248(rootCS,{-48_m,-87.727_m, 0_m});
Point p249(rootCS,{-49_m,-87.171_m, 0_m});
Point p250(rootCS,{-50_m,-86.603_m, 0_m});
Point p251(rootCS,{-51_m,-86.017_m, 0_m});
Point p252(rootCS,{-52_m,-85.417_m, 0_m});
Point p253(rootCS,{-53_m,-84.8_m, 0_m});
Point p254(rootCS,{-54_m,-84.167_m, 0_m});
Point p255(rootCS,{-55_m,-83.516_m, 0_m});
Point p256(rootCS,{-56_m,-82.849_m, 0_m});
Point p257(rootCS,{-57_m,-82.164_m, 0_m});
Point p258(rootCS,{-58_m,-81.462_m, 0_m});
Point p259(rootCS,{-59_m,-80.74_m, 0_m});
Point p260(rootCS,{-60_m,-80_m, 0_m});
Point p261(rootCS,{-61_m,-79.24_m, 0_m});
Point p262(rootCS,{-62_m,-78.46_m, 0_m});
Point p263(rootCS,{-63_m,-77.66_m, 0_m});
Point p264(rootCS,{-64_m,-76.837_m, 0_m});
Point p265(rootCS,{-65_m,-75.993_m, 0_m});
Point p266(rootCS,{-66_m,-75.127_m, 0_m});
Point p267(rootCS,{-67_m,-74.236_m, 0_m});
Point p268(rootCS,{-68_m,-73.321_m, 0_m});
Point p269(rootCS,{-69_m,-72.476_m, 0_m});
Point p270(rootCS,{-70_m,-71.414_m, 0_m});
Point p271(rootCS,{-71_m,-70.42_m, 0_m});
Point p272(rootCS,{-72_m,-69.397_m, 0_m});
Point p273(rootCS,{-73_m,-68.345_m, 0_m});
Point p274(rootCS,{-74_m,-67.261_m, 0_m});
Point p275(rootCS,{-75_m,-66.144_m, 0_m});
Point p276(rootCS,{-76_m,-64.992_m, 0_m});
Point p277(rootCS,{-77_m,-63.804_m, 0_m});
Point p278(rootCS,{-78_m,-62.578_m, 0_m});
Point p279(rootCS,{-79_m,-61.311_m, 0_m});
Point p280(rootCS,{-80_m,-60_m, 0_m});
Point p281(rootCS,{-81_m,-58.643_m, 0_m});
Point p282(rootCS,{-82_m,-57.236_m, 0_m});
Point p283(rootCS,{-83_m,-55.776_m, 0_m});
Point p284(rootCS,{-84_m,-54.259_m, 0_m});
Point p285(rootCS,{-85_m,-52.678_m, 0_m});
Point p286(rootCS,{-86_m,-51.029_m, 0_m});
Point p287(rootCS,{-87_m,-49.305_m, 0_m});
Point p288(rootCS,{-88_m,-47.497_m, 0_m});
Point p289(rootCS,{-89_m,-45.596_m, 0_m});
Point p290(rootCS,{-90_m,-43.589_m, 0_m});
Point p291(rootCS,{-91_m,-41.461_m, 0_m});
Point p292(rootCS,{-92_m,-39.192_m, 0_m});
Point p293(rootCS,{-93_m,-36.756_m, 0_m});
Point p294(rootCS,{-94_m,-34.117_m, 0_m});
Point p295(rootCS,{-95_m,-31.225_m, 0_m});
Point p296(rootCS,{-96_m,-28_m, 0_m});
Point p297(rootCS,{-97_m,-24.31_m, 0_m});
Point p298(rootCS,{-98_m,-19.9_m, 0_m});
Point p299(rootCS,{-99_m,-14.107_m, 0_m});
Point p300(rootCS,{-100_m,0_m, 0_m});
Point p301(rootCS,{-99_m,14.107_m, 0_m});
Point p302(rootCS,{-98_m,19.9_m, 0_m});
Point p303(rootCS,{-97_m,24.31_m, 0_m});
Point p304(rootCS,{-96_m,28_m, 0_m});
Point p305(rootCS,{-95_m,31.225_m, 0_m});
Point p306(rootCS,{-94_m,34.117_m, 0_m});
Point p307(rootCS,{-93_m,36.756_m, 0_m});
Point p308(rootCS,{-92_m,39.192_m, 0_m});
Point p309(rootCS,{-91_m,41.461_m, 0_m});
Point p310(rootCS,{-90_m,43.589_m, 0_m});
Point p311(rootCS,{-89_m,45.596_m, 0_m});
Point p312(rootCS,{-88_m,47.497_m, 0_m});
Point p313(rootCS,{-87_m,49.305_m, 0_m});
Point p314(rootCS,{-86_m,51.029_m, 0_m});
Point p315(rootCS,{-85_m,52.678_m, 0_m});
Point p316(rootCS,{-84_m,54.259_m, 0_m});
Point p317(rootCS,{-83_m,55.776_m, 0_m});
Point p318(rootCS,{-82_m,57.236_m, 0_m});
Point p319(rootCS,{-81_m,58.643_m, 0_m});
Point p320(rootCS,{-80_m,60_m, 0_m});
Point p321(rootCS,{-79_m,61.311_m, 0_m});
Point p322(rootCS,{-78_m,62.578_m, 0_m});
Point p323(rootCS,{-77_m,63.804_m, 0_m});
Point p324(rootCS,{-76_m,64.992_m, 0_m});
Point p325(rootCS,{-75_m,66.144_m, 0_m});
Point p326(rootCS,{-74_m,67.261_m, 0_m});
Point p327(rootCS,{-73_m,68.345_m, 0_m});
Point p328(rootCS,{-72_m,69.397_m, 0_m});
Point p329(rootCS,{-71_m,70.42_m, 0_m});
Point p330(rootCS,{-70_m,71.414_m, 0_m});
Point p331(rootCS,{-69_m,72.476_m, 0_m});
Point p332(rootCS,{-68_m,73.321_m, 0_m});
Point p333(rootCS,{-67_m,74.236_m, 0_m});
Point p334(rootCS,{-66_m,75.127_m, 0_m});
Point p335(rootCS,{-65_m,75.993_m, 0_m});
Point p336(rootCS,{-64_m,76.837_m, 0_m});
Point p337(rootCS,{-63_m,77.66_m, 0_m});
Point p338(rootCS,{-62_m,78.46_m, 0_m});
Point p339(rootCS,{-61_m,79.24_m, 0_m});
Point p340(rootCS,{-60_m,80_m, 0_m});
Point p341(rootCS,{-59_m,80.74_m, 0_m});
Point p342(rootCS,{-58_m,81.462_m, 0_m});
Point p343(rootCS,{-57_m,82.164_m, 0_m});
Point p344(rootCS,{-56_m,82.849_m, 0_m});
Point p345(rootCS,{-55_m,83.516_m, 0_m});
Point p346(rootCS,{-54_m,84.167_m, 0_m});
Point p347(rootCS,{-53_m,84.8_m, 0_m});
Point p348(rootCS,{-52_m,85.417_m, 0_m});
Point p349(rootCS,{-51_m,86.017_m, 0_m});
Point p350(rootCS,{-50_m,86.603_m, 0_m});
Point p351(rootCS,{-49_m,87.171_m, 0_m});
Point p352(rootCS,{-48_m,87.727_m, 0_m});
Point p353(rootCS,{-47_m,88.267_m, 0_m});
Point p354(rootCS,{-46_m,88.792_m, 0_m});
Point p355(rootCS,{-45_m,89.303_m, 0_m});
Point p356(rootCS,{-44_m,89.8_m, 0_m});
Point p357(rootCS,{-43_m,90.283_m, 0_m});
Point p358(rootCS,{-42_m,90.752_m, 0_m});
Point p359(rootCS,{-41_m,91.209_m, 0_m});
Point p360(rootCS,{-40_m,91.652_m, 0_m});
Point p361(rootCS,{-39_m,92.081_m, 0_m});
Point p362(rootCS,{-38_m,92.499_m, 0_m});
Point p363(rootCS,{-37_m,92.903_m, 0_m});
Point p364(rootCS,{-36_m,93.295_m, 0_m});
Point p365(rootCS,{-35_m,93.675_m, 0_m});
Point p366(rootCS,{-34_m,94.043_m, 0_m});
Point p367(rootCS,{-33_m,94.398_m, 0_m});
Point p368(rootCS,{-32_m,94.742_m, 0_m});
Point p369(rootCS,{-31_m,95.074_m, 0_m});
Point p370(rootCS,{-30_m,95.394_m, 0_m});
Point p371(rootCS,{-29_m,95.703_m, 0_m});
Point p372(rootCS,{-28_m,96_m, 0_m});
Point p373(rootCS,{-27_m,96.286_m, 0_m});
Point p374(rootCS,{-26_m,96.561_m, 0_m});
Point p375(rootCS,{-25_m,96.825_m, 0_m});
Point p376(rootCS,{-24_m,97.077_m, 0_m});
Point p377(rootCS,{-23_m,97.319_m, 0_m});
Point p378(rootCS,{-22_m,97.55_m, 0_m});
Point p379(rootCS,{-21_m,97.77_m, 0_m});
Point p380(rootCS,{-20_m,97.98_m, 0_m});
Point p381(rootCS,{-19_m,98.178_m, 0_m});
Point p382(rootCS,{-18_m,98.367_m, 0_m});
Point p383(rootCS,{-17_m,98.544_m, 0_m});
Point p384(rootCS,{-16_m,98.712_m, 0_m});
Point p385(rootCS,{-15_m,98.869_m, 0_m});
Point p386(rootCS,{-14_m,99.015_m, 0_m});
Point p387(rootCS,{-13_m,99.151_m, 0_m});
Point p388(rootCS,{-12_m,99.277_m, 0_m});
Point p389(rootCS,{-11_m,99.393_m, 0_m});
Point p390(rootCS,{-10_m,99.499_m, 0_m});
Point p391(rootCS,{-9_m,99.594_m, 0_m});
Point p392(rootCS,{-8_m,99.679_m, 0_m});
Point p393(rootCS,{-7_m,99.755_m, 0_m});
Point p394(rootCS,{-6_m,99.82_m, 0_m});
Point p395(rootCS,{-5_m,99.875_m, 0_m});
Point p396(rootCS,{-4_m,99.92_m, 0_m});
Point p397(rootCS,{-3_m,99.955_m, 0_m});
Point p398(rootCS,{-2_m,99.98_m, 0_m});
Point p399(rootCS,{-1_m,99.995_m, 0_m});
// Point p400(rootCS,{0_m,100_m, 0_m}); // same as p0
// store all the points in a std::array
std::array<Point, 400> points_
{p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,
p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,
p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,
p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,
p50,p51,p52,p53,p54,p55,p56,p57,p58,p59,
p60,p61,p62,p63,p64,p65,p66,p67,p68,p69,
p70,p71,p72,p73,p74,p75,p76,p77,p78,p79,
p80,p81,p82,p83,p84,p85,p86,p87,p88,p89,
p90,p91,p92,p93,p94,p95,p96,p97,p98,p99,
p100,p101,p102,p103,p104,p105,p106,p107,p108,p109,
p110,p111,p112,p113,p114,p115,p116,p117,p118,p119,
p120,p121,p122,p123,p124,p125,p126,p127,p128,p129,
p130,p131,p132,p133,p134,p135,p136,p137,p138,p139,
p140,p141,p142,p143,p144,p145,p146,p147,p148,p149,
p150,p151,p152,p153,p154,p155,p156,p157,p158,p159,
p160,p161,p162,p163,p164,p165,p166,p167,p168,p169,
p170,p171,p172,p173,p174,p175,p176,p177,p178,p179,
p180,p181,p182,p183,p184,p185,p186,p187,p188,p189,
p190,p191,p192,p193,p194,p195,p196,p197,p198,p199,
p200,p201,p202,p203,p204,p205,p206,p207,p208,p209,
p210,p211,p212,p213,p214,p215,p216,p217,p218,p219,
p220,p221,p222,p223,p224,p225,p226,p227,p228,p229,
p230,p231,p232,p233,p234,p235,p236,p237,p238,p239,
p240,p241,p242,p243,p244,p245,p246,p247,p248,p249,
p250,p251,p252,p253,p254,p255,p256,p257,p258,p259,
p260,p261,p262,p263,p264,p265,p266,p267,p268,p269,
p270,p271,p272,p273,p274,p275,p276,p277,p278,p279,
p280,p281,p282,p283,p284,p285,p286,p287,p288,p289,
p290,p291,p292,p293,p294,p295,p296,p297,p298,p299,
p300,p301,p302,p303,p304,p305,p306,p307,p308,p309,
p310,p311,p312,p313,p314,p315,p316,p317,p318,p319,
p320,p321,p322,p323,p324,p325,p326,p327,p328,p329,
p330,p331,p332,p333,p334,p335,p336,p337,p338,p339,
p340,p341,p342,p343,p344,p345,p346,p347,p348,p349,
p350,p351,p352,p353,p354,p355,p356,p357,p358,p359,
p360,p361,p362,p363,p364,p365,p366,p367,p368,p369,
p370,p371,p372,p373,p374,p375,p376,p377,p378,p379,
p380,p381,p382,p383,p384,p385,p386,p387,p388,p389,
p390,p391,p392,p393,p394,p395,p396,p397,p398,p399};
//////////////////////////////////////////////////////////////////////////////////
// create a new stack for each trial
setup::Stack stack;
stack.clear();
const Code particle{Code::Electron};
const HEPMassType pmass{get_mass(particle)};
// construct an energy // move in the for loop
const HEPEnergyType E0{11.4_MeV};
// create a radio process instance using CoREAS
RadioProcess<decltype(detector), CoREAS<decltype(detector), decltype(StraightPropagator(env))>, decltype(StraightPropagator(env))>
coreas(detector, env);
// loop over all the tracks except the last one
for (size_t i = 1; i <= 399; i++) {
TimeType t {(points_[i] - points_[i-1]).getNorm() / (0.999 * constants::c)};
VelocityVector v { (points_[i] - points_[i-1]) / t };
auto beta {v / constants::c};
auto gamma {E0/pmass};
auto plab {beta * pmass * gamma};
Line l {points_[i-1],v};
StraightTrajectory track {l,t};
auto particle1{stack.addParticle(std::make_tuple(particle, E0, plab, points_[i-1], t))}; //TODO: plab is inconsistent
coreas.doContinuous(particle1,track,true);
TimeType t {(points_[0] - points_[399]).getNorm() / (0.999 * constants::c)};
VelocityVector v { (points_[0] - points_[399]) / t };
auto beta {v / constants::c};
auto gamma {E0/pmass};
auto plab {beta * pmass * gamma};
Line l {points_[399],v};
StraightTrajectory track {l,t};
auto particle1{stack.addParticle(std::make_tuple(particle, E0, plab, points_[399], t))};
coreas.doContinuous(particle1,track,true);
// get the output
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
SECTION("Synchrotron radiation 2") {
// create a suitable environment ///////////////////////////////////////////////////
using IModelInterface = IRefractiveIndexModel<IMediumPropertyModel<IMagneticFieldModel<IMediumModel>>>;
using AtmModel = UniformRefractiveIndex<MediumPropertyModel<UniformMagneticField<HomogeneousMedium
<IModelInterface>>>>;
using EnvType = Environment<AtmModel>;
EnvType env;
CoordinateSystemPtr const& rootCS = env.getCoordinateSystem();
// get the center point
Point const center{rootCS, 0_m, 0_m, 0_m};
// a refractive index for the vacuum
const double ri_{1};
// the constant density
const auto density{19.2_g / cube(1_cm)};
// the composition we use for the homogeneous medium
NuclearComposition const Composition(std::vector<Code>{Code::Nitrogen},
std::vector<float>{1.f});
// create magnetic field vector
Vector B1(rootCS, 0_T, 0_T, 0.3809_T);
// create a Sphere for the medium
auto Medium = EnvType::createNode<Sphere>(
center, 1_km * std::numeric_limits<double>::infinity());
// set the environment properties
auto const props = Medium->setModelProperties<AtmModel>(ri_, Medium::AirDry1Atm, B1, density, Composition);
// bind things together
env.getUniverse()->addChild(std::move(Medium));
// now create antennas and detectors/////////////////////////////////////////////
// the antennas location
const auto point1{Point(rootCS, 200_m, 0_m, 0_m)};
// const auto point1{Point(rootCS, 30000_m, 0_m, 0_m)};
// const auto point2{Point(rootCS, 5000_m, 100_m, 0_m)};
// const auto point3{Point(rootCS, -100_m, -100_m, 0_m)};
// const auto point4{Point(rootCS, -100_m, 100_m, 0_m)};
// create times for the antenna
// const TimeType t1{0.998e-4_s};
// const TimeType t2{1.0000e-4_s};
// const InverseTimeType t3{1e+11_Hz};
const TimeType t1{0_s};
const TimeType t2{1e-6_s};
const InverseTimeType t3{1e+9_Hz};
// create 4 cool antennas
TimeDomainAntenna ant1("cool antenna", point1, t1, t2, t3);
// TimeDomainAntenna ant2("cooler antenna", point2, t1, t2, t3);
// TimeDomainAntenna ant3("coolest antenna", point3, t1, t2, t3);
// TimeDomainAntenna ant4("No, I am the coolest antenna", point4, t1, t2, t3);
// construct a radio detector instance to store our antennas
AntennaCollection<TimeDomainAntenna> detector;
// add the antennas to the detector
detector.addAntenna(ant1);
// detector.addAntenna(ant2);
// detector.addAntenna(ant3);
// detector.addAntenna(ant4);
//////////////////////////////////////////////////////////////////////////////////
// create a new stack for each trial
setup::Stack stack;
stack.clear();
const Code particle{Code::Electron};
const HEPMassType pmass{get_mass(particle)};
// construct an energy // move in the for loop
const HEPEnergyType E0{11.4_MeV};
// create a radio process instance using CoREAS or ZHS
RadioProcess<decltype(detector), CoREAS<decltype(detector), decltype(StraightPropagator(env))>, decltype(StraightPropagator(env))>
coreas(detector, env);
// loop over all the tracks except the last one
int const n_points {1000};
LengthType const radius {100_m};
for (size_t i = 0; i <= n_points; i++) {
Point const point_1(rootCS,{radius*cos(M_PI*2*i/n_points),radius*sin(M_PI*2*i/n_points), 0_m});
Point const point_2(rootCS,{radius*cos(M_PI*2*(i+1)/n_points),radius*sin(M_PI*2*(i+1)/n_points), 0_m});
TimeType t {(point_2 - point_1).getNorm() / (0.999 * constants::c)};
VelocityVector v { (point_2 - point_1) / t };
auto beta {v / constants::c};
auto gamma {E0/pmass};
auto plab {beta * pmass * gamma};
Line l {point_1,v};
StraightTrajectory track {l,t};
auto particle1{stack.addParticle(std::make_tuple(particle, E0, plab, point_1, t))}; //TODO: plab is inconsistent
coreas.doContinuous(particle1,track,true);
stack.clear();
}
// get the output
coreas.writeOutput();
}
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
SECTION("TimeDomainAntenna") {
// create an environment so we can get a coordinate system
using EnvType = Environment<IRefractiveIndexModel<IMediumModel>>;
EnvType env6;
using UniRIndex =
UniformRefractiveIndex<HomogeneousMedium<IRefractiveIndexModel<IMediumModel>>>;
// the antenna location
const auto point1{Point(env6.getCoordinateSystem(), 1_m, 2_m, 3_m)};
const auto point2{Point(env6.getCoordinateSystem(), 4_m, 5_m, 6_m)};
// get a coordinate system
const CoordinateSystemPtr rootCS6 = env6.getCoordinateSystem();
auto Medium6 = EnvType::createNode<Sphere>(
Point{rootCS6, 0_m, 0_m, 0_m}, 1_km * std::numeric_limits<double>::infinity());
auto const props6 = Medium6->setModelProperties<UniRIndex>(
1, 1_kg / (1_m * 1_m * 1_m),
NuclearComposition(
std::vector<Code>{Code::Nitrogen},
std::vector<float>{1.f}));
env6.getUniverse()->addChild(std::move(Medium6));
// create times for the antenna
const TimeType t1{10_s};
const TimeType t2{10_s};
const InverseTimeType t3{1/1_s};
const TimeType t4{11_s};
// check that I can create an antenna at (1, 2, 3)
TimeDomainAntenna ant1("antenna_name", point1, t1, t2, t3);
TimeDomainAntenna ant2("antenna_name2", point2, t4, t2, t3);
// assert that the antenna name is correct
REQUIRE(ant1.getName() == "antenna_name");
REQUIRE(ant2.getName() == "antenna_name2");
// and check that the antenna is at the right location
REQUIRE((ant1.getLocation() - point1).getNorm() < 1e-12 * 1_m);
REQUIRE((ant2.getLocation() - point2).getNorm() < 1e-12 * 1_m);
// construct a radio detector instance to store our antennas
AntennaCollection<TimeDomainAntenna> detector;
// add this antenna to the process
detector.addAntenna(ant1);
detector.addAntenna(ant2);
CHECK(detector.size() == 2);
// get a unit vector
Vector<dimensionless_d> v1(rootCS6, {0, 0, 1});
QuantityVector<ElectricFieldType::dimension_type> v11{10_V / 1_m, 10_V / 1_m, 10_V / 1_m};
Vector<dimensionless_d> v2(rootCS6, {0, 1, 0});
QuantityVector<ElectricFieldType::dimension_type> v22{20_V / 1_m, 20_V / 1_m, 20_V / 1_m};
// use receive methods
ant1.receive(15_s, v1, v11);
ant2.receive(16_s, v2, v22);
// use getWaveform() method
auto [t111, E1] = ant1.getWaveform();
CHECK(E1(5,0) - 10 == 0);
auto [t222, E2] = ant2.getWaveform();
CHECK(E2(5,0) -20 == 0);
// use the receive method in a for loop. It works now!
for (auto& xx : detector.getAntennas()) {
xx.receive(15_s, v1, v11);
}