70
70
(*config)["particle_decay"] = Json::Value(false);
71
71
simulation->GetPhysicsList()->Setup();
73
(*config)["simulation_reference_particle"] = JsonWrapper::StringToJson(
74
std::string("{\"position\":{\"x\":0.0,\"y\":0.0,\"z\":1000.0},")+
75
std::string("\"momentum\":{\"x\":0.0,\"y\":0.0,\"z\":200.0},")+
76
std::string("\"particle_id\":-13,\"energy\":226.1939223,\"time\":0.0,")+
77
std::string("\"random_seed\":2}")
73
std::stringstream reference_particle_string;
74
reference_particle_string
75
<< std::setprecision(1)
76
<< "{\"position\":{\"x\":0.0,\"y\":0.0,\"z\":" << kPrimaryPlane << "},"
77
<< "\"momentum\":{\"x\":0.0,\"y\":0.0,\"z\":200.0},"
78
<< "\"particle_id\":-13,\"energy\":226.1939223,\"time\":0.0,"
79
<< "\"random_seed\":2}";
80
(*config)["simulation_reference_particle"]
81
= JsonWrapper::StringToJson(reference_particle_string.str());
80
83
Json::Value ellipse(Json::objectValue);
81
84
ellipse["Emittance_T"] = Json::Value(10.0);
115
118
virtual_planes_ = new MAUS::VirtualPlaneManager();
116
119
simulation->SetVirtualPlanes(virtual_planes_);
117
120
MAUS::VirtualPlane start_plane = MAUS::VirtualPlane::BuildVirtualPlane(
118
CLHEP::HepRotation(), CLHEP::Hep3Vector(0., 0., 1000.), -1, true,
119
1000., BTTracker::z, MAUS::VirtualPlane::ignore, false);
121
CLHEP::HepRotation(), CLHEP::Hep3Vector(0., 0., kPrimaryPlane),
123
kPrimaryPlane, BTTracker::z, MAUS::VirtualPlane::ignore, false);
120
124
virtual_planes_->AddPlane(new MAUS::VirtualPlane(start_plane), NULL);
122
126
MAUS::VirtualPlane mid_plane = MAUS::VirtualPlane::BuildVirtualPlane(
123
CLHEP::HepRotation(), CLHEP::Hep3Vector(0., 0., 2000.), -1, true,
124
2000., BTTracker::z, MAUS::VirtualPlane::ignore, false);
127
CLHEP::HepRotation(), CLHEP::Hep3Vector(0., 0., kPrimaryPlane+1000.),
129
kPrimaryPlane+1000., BTTracker::z, MAUS::VirtualPlane::ignore, false);
125
130
virtual_planes_->AddPlane(new MAUS::VirtualPlane(mid_plane), NULL);
127
132
MAUS::VirtualPlane end_plane = MAUS::VirtualPlane::BuildVirtualPlane(
128
CLHEP::HepRotation(), CLHEP::Hep3Vector(0., 0., 3000.), -1, true,
129
3000., BTTracker::z, MAUS::VirtualPlane::ignore, false);
133
CLHEP::HepRotation(), CLHEP::Hep3Vector(0., 0., kPrimaryPlane+2000.),
135
kPrimaryPlane+2000., BTTracker::z, MAUS::VirtualPlane::ignore, false);
130
136
virtual_planes_->AddPlane(new MAUS::VirtualPlane(end_plane), NULL);
181
189
TEST_F(PolynomialOpticsModelTest, Constructor) {
182
190
const PolynomialOpticsModel optics_model(
183
*MAUS::Globals::GetConfigurationCards());
191
MAUS::Globals::GetConfigurationCards());
195
TEST_F(PolynomialOpticsModelTest, Build) {
196
// Bad build -- incomplete particle tracks
197
Json::Value * config = MAUS::Globals::GetConfigurationCards();
198
(*config)["reference_physics_processes"] = Json::Value("mean_energy_loss");
199
(*config)["physics_processes"] = Json::Value("mean_energy_loss");
200
(*config)["particle_decay"] = Json::Value(true);
201
(*config)["muon_half_life"] = Json::Value(1.0); // 1 ns -> ~25 cm
202
std::string config_string = JsonWrapper::JsonToString(*config);
203
MAUS::GlobalsManager::DeleteGlobals();
204
MAUS::GlobalsManager::InitialiseGlobals(config_string);
205
PolynomialOpticsModel bad_optics_model_1(config);
206
bool success = false;
208
bad_optics_model_1.Build();
209
} catch (MAUS::Exception exc) {
212
EXPECT_TRUE(success);
186
216
TEST_F(PolynomialOpticsModelTest, Accessors) {
187
217
PolynomialOpticsModel optics_model(
188
*MAUS::Globals::GetConfigurationCards());
189
double first_plane = optics_model.first_plane();
190
ASSERT_DOUBLE_EQ(1000., first_plane);
192
optics_model.set_first_plane(2000.);
193
first_plane = optics_model.first_plane();
194
ASSERT_DOUBLE_EQ(2000., first_plane);
218
MAUS::Globals::GetConfigurationCards());
219
double primary_plane = optics_model.primary_plane();
220
ASSERT_DOUBLE_EQ(kPrimaryPlane, primary_plane);
222
optics_model.set_primary_plane(kPrimaryPlane+1000.);
223
primary_plane = optics_model.primary_plane();
224
ASSERT_DOUBLE_EQ(kPrimaryPlane+1000., primary_plane);
227
TEST_F(PolynomialOpticsModelTest, AvailablePositions) {
228
PolynomialOpticsModel optics_model(
229
MAUS::Globals::GetConfigurationCards());
231
// Bad position query before model is built
232
bool success = false;
234
optics_model.GetAvailableMapPositions();
235
} catch (MAUS::Exception exc) {
238
EXPECT_TRUE(success);
240
// One position per virtual detectors
241
optics_model.Build();
242
const std::vector<int64_t> positions
243
= optics_model.GetAvailableMapPositions();
244
const size_t position_count = positions.size();
245
// start, mid, and end virtual detectors
246
EXPECT_EQ(position_count, static_cast<size_t>(3));
197
249
TEST_F(PolynomialOpticsModelTest, Transport) {
198
250
PolynomialOpticsModel optics_model(
199
*MAUS::Globals::GetConfigurationCards());
251
MAUS::Globals::GetConfigurationCards());
200
253
// The configuration specifies a 2m drift between 1m and 3m.
201
254
optics_model.Build();
202
255
// Check transport to start plane
203
256
MAUS::PhaseSpaceVector input_vector(0., 226., 1., 0., 3., 0.);
204
257
MAUS::PhaseSpaceVector output_vector = optics_model.Transport(input_vector,
206
259
for (int index = 0; index < 6; ++index) {
207
EXPECT_NEAR(input_vector[index], output_vector[index], 1.0e-4);
260
EXPECT_NEAR(input_vector[index], output_vector[index], 5.0e-4);
210
263
MAUS::CovarianceMatrix output_errors
211
= optics_model.Transport(kCovarianceMatrix, 1000.);
264
= optics_model.Transport(kCovarianceMatrix, kPrimaryPlane);
212
265
for (int row = 1; row <= 6; ++row) {
213
266
for (int column = 1; column <= 6; ++column) {
214
267
EXPECT_NEAR(kCovarianceMatrix(row, column), output_errors(row, column),
219
272
// Check transport to end plane
220
273
MAUS::PhaseSpaceVector expected_vector(7.5466, 226., 1., 0., 3., 0.);
221
output_vector = optics_model.Transport(input_vector, 3000.);
274
output_vector = optics_model.Transport(input_vector, kPrimaryPlane+2000.);
222
275
for (int index = 0; index < 6; ++index) {
223
276
EXPECT_NEAR(expected_vector[index], output_vector[index], 5.0e-4);
226
279
// Check transport to mid plane
227
280
expected_vector = MAUS::PhaseSpaceVector(3.7733, 226., 1., 0., 3., 0.);
228
output_vector = optics_model.Transport(input_vector, 2000.);
281
output_vector = optics_model.Transport(input_vector, kPrimaryPlane+1000.);
229
282
for (int index = 0; index < 6; ++index) {
230
283
EXPECT_NEAR(expected_vector[index], output_vector[index], 5.0e-4);