LCOV - code coverage report
Current view: top level - test - testMagneticLens.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 87 87 100.0 %
Date: 2024-04-29 14:43:01 Functions: 7 7 100.0 %

          Line data    Source code
       1             : /// Tests gamale with a test lense from file and demonstrating basic
       2             : /// usage
       3             : 
       4             : //--------------------------------------------
       5             : // Project: Galactic magnetic Lense (GaMaLe) -
       6             : // Copyright (C) 2009 Tobias Winchen         -
       7             : //               RWTH Aachen, Germany        -
       8             : // Contact: winchen@physik.rwth-achen.de     -
       9             : // Licensed under the GNU GPL v2             - 
      10             : //--------------------------------------------
      11             : 
      12             : #include <string>
      13             : #include "gtest/gtest.h"
      14             : 
      15             : #include "crpropa/magneticLens/MagneticLens.h"
      16             : #include "crpropa/magneticLens/ModelMatrix.h"
      17             : #include "crpropa/magneticLens/Pixelization.h"
      18             : #include "crpropa/magneticLens/ParticleMapsContainer.h"
      19             : #include "crpropa/Common.h"
      20             : 
      21             : using namespace std;
      22             : using namespace crpropa;
      23             : 
      24           1 : TEST(MagneticLens, Deflection)
      25             : {
      26           1 :         MagneticLens magneticLens(5);
      27           1 :         Pixelization P(5);
      28           1 :         ModelMatrixType M;
      29           1 :         M.resize(P.nPix(), P.nPix());
      30           1 :         M.reserve(P.nPix());
      31             : 
      32             :         // Map any direction (p,t) to (p, -t)
      33       12289 :         for (int i=0;i<P.nPix();i++)
      34             :         {
      35             :                 double theta, phi;
      36       12288 :                 P.pix2Direction(i, phi, theta);
      37       12288 :                 theta*= -1;
      38       12288 :                 int j = P.direction2Pix(phi, theta);
      39       12288 :                 M.insert(i,j) =1;
      40             :         }
      41             : 
      42           1 :         magneticLens.setLensPart(M, 10 * EeV, 100 * EeV);
      43             : 
      44       12289 :         for (int i=0; i < P.nPix(); i++)
      45             :         {
      46             :                 double theta, phi;
      47       12288 :                 P.pix2Direction(i, phi, theta);
      48       12288 :                 double theta0 = theta;
      49             : 
      50             :                 // No CR is allowed to be lost in this lens
      51       12288 :                 EXPECT_TRUE(magneticLens.transformCosmicRay(20 * EeV, phi, theta));
      52       12288 :                 EXPECT_NEAR(theta+theta0,0., 0.05);
      53             :         }
      54           2 : }
      55             : 
      56           1 : TEST(MagneticLens, Vector3Deflection)
      57             : {
      58           1 :         MagneticLens magneticLens(5);
      59           1 :         Pixelization P(5);
      60           1 :         ModelMatrixType M;
      61           1 :         M.resize(P.nPix(), P.nPix());
      62           1 :         M.reserve(P.nPix());
      63             : 
      64             :         // No deflection 
      65       12289 :         for (int i=0;i<P.nPix();i++)
      66             :         {
      67       12288 :                 M.insert(i,i) = 1;
      68             :         }
      69             : 
      70           1 :         magneticLens.setLensPart(M, 10 * EeV, 100 * EeV);
      71             : 
      72             :         Vector3d u(1,0,0);
      73             :         Vector3d v(u);
      74           1 :         EXPECT_TRUE(magneticLens.transformCosmicRay(20 * EeV, v));
      75           1 :         EXPECT_NEAR(u.getAngleTo(v), 0., 2. / 180 * M_PI);
      76             : 
      77           1 :         u.x = 0; u.y = 1; u.z = 0; v = u;
      78           1 :         EXPECT_TRUE(magneticLens.transformCosmicRay(20 * EeV, v));
      79           1 :         EXPECT_NEAR(u.getAngleTo(v), 0., 2. / 180 * M_PI);
      80             : 
      81           1 :         u.x = 0; u.y = 0; u.z = 1; v = u;
      82           1 :         EXPECT_TRUE(magneticLens.transformCosmicRay(20 * EeV, v));
      83           1 :         EXPECT_NEAR(u.getAngleTo(v), 0., 2. / 180 * M_PI);
      84             : 
      85           1 :         u.x = 1; u.y = -2; u.z = 3; v = u;
      86           1 :         EXPECT_TRUE(magneticLens.transformCosmicRay(20 * EeV, v));
      87           1 :         EXPECT_NEAR(u.getAngleTo(v), 0., 2. / 180 * M_PI);
      88           2 : }
      89             : 
      90           1 : TEST(MagneticLens, OutOfBoundsEnergy)
      91             : {
      92           1 :         MagneticLens magneticLens(5);
      93           1 :         Pixelization P(5);
      94           1 :         ModelMatrixType M;
      95           1 :         M.resize(P.nPix(), P.nPix());
      96           1 :         M.reserve(P.nPix());
      97           1 :         magneticLens.setLensPart(M,10. * EeV, 100. * EeV);
      98           1 :         double theta = 0, phi = 0;
      99           1 :         EXPECT_FALSE(magneticLens.transformCosmicRay(1. * EeV, phi, theta));
     100           2 : }
     101             : 
     102             : 
     103           1 : TEST(Pixelization, angularDistance)
     104             : {
     105             :         // test for correct angular distance in case of same vectors 
     106           1 :         Pixelization P(6);
     107       49153 :         for (int idx =0; idx < P.nPix(); idx++)
     108             :         {
     109       49152 :                 double ang = P.angularDistance(idx,idx);
     110       49152 :                 EXPECT_TRUE(ang == ang);
     111             :         }
     112           1 : }
     113             : 
     114             : 
     115           1 : TEST(ParticleMapsContainer, addParticle)
     116             : {
     117           1 :   ParticleMapsContainer maps;
     118           1 :   maps.addParticle(1000010010, 1 * EeV, 0 , 0 );
     119           1 :   std::vector<int> pids = maps.getParticleIds();
     120           1 :   EXPECT_EQ(pids.size(), 1);
     121           1 :   EXPECT_EQ(pids[0], 1000010010);
     122             : 
     123           1 :   std::vector<double> energies = maps.getEnergies(1000010010);
     124           1 :   EXPECT_EQ(energies.size(), 1);
     125           1 : }
     126             : 
     127           1 : TEST(ParticleMapsContainer, getRandomParticles)
     128             : {
     129           1 :   ParticleMapsContainer maps(0.002);
     130           1 :   maps.addParticle(1000010010, 1 * EeV, 0 , 0 );
     131             :   std::vector<double> energies;
     132             :   std::vector<double> lons;
     133             :   std::vector<double> lats;
     134             :   std::vector<int> particleIds;
     135             : 
     136           1 :   size_t N = 420;
     137           1 :         maps.getRandomParticles(N, particleIds, energies, lons, lats);
     138             :                         
     139           1 :   EXPECT_EQ(energies.size(), N);
     140           1 :   EXPECT_EQ(lons.size(), N);
     141           1 :   EXPECT_EQ(lats.size(), N);
     142           1 :   EXPECT_EQ(particleIds.size(), N);
     143             : 
     144         421 :   for(size_t i = 0; i < N; i++)
     145             :   {
     146         420 :     EXPECT_NEAR(log10(energies[i]), 18, 0.002);
     147         420 :     EXPECT_EQ(particleIds[i], 1000010010);
     148         420 :     EXPECT_NEAR(lons[i], 0, 2./180*M_PI);
     149         420 :     EXPECT_NEAR(lats[i], 0, 2./180*M_PI);
     150             :   }
     151             : 
     152           1 : }
     153             : 
     154           1 : TEST(Pixelization, randomDirectionInPixel)
     155             : {
     156           1 :   Pixelization p(6);
     157             :   const double long0 = -35./180 * M_PI;
     158             :   const double lat0 =  12.08/180 * M_PI;
     159             : 
     160           1 :   int pix = p.direction2Pix(long0, lat0);
     161             : 
     162             :   double rlon, rlat;
     163           1 :   p.getRandomDirectionInPixel(pix, rlon, rlat);
     164             : 
     165             :   // new direction should be inside the pixel
     166           1 :   EXPECT_EQ(pix, p.direction2Pix(rlon, rlat));
     167             : 
     168             :   // new direction should be different from input 
     169           1 :   EXPECT_FALSE(long0 == rlon);
     170           1 :   EXPECT_FALSE(lat0 == rlat);
     171             : 
     172           1 : }

Generated by: LCOV version 1.14