1 // -*- C++ -*-
2 //
3 // This file is part of HepMC
4 // Copyright (C) 2014-2020 The HepMC collaboration (see AUTHORS for details)
5 //
6 #ifndef HEPMC3_UNITS_H
7 #define HEPMC3_UNITS_H
8 /**
9  *  @file Units.h
10  *  @brief Definition of \b class Units
11  *
12  *  @class HepMC3::Units
13  *  @brief Stores units-related enums and conversion functions
14  *
15  *  Manages units used by HepMC::GenEvent
16  *
17  */
18 #include <string>
19 #include "HepMC3/Errors.h"
20 #include "HepMC3/Setup.h"
21 #include "HepMC3/FourVector.h"
22 
23 namespace HepMC3 {
24 
25 
26 class Units {
27 public:
28     /** @brief Momentum units */
29     enum MomentumUnit { MEV, GEV };
30 
31     /** @brief Position units */
32     enum LengthUnit   { MM,  CM  };
33 
34 public:
35     /** @brief Get momentum unit based on its name*/
momentum_unit(const std::string & name)36     static MomentumUnit momentum_unit( const std::string& name ) {
37         if ( name.compare(0,3,"GEV") == 0 ) return GEV;
38         if ( name.compare(0,3,"MEV") == 0 ) return MEV;
39 
40         HEPMC3_ERROR("Units::momentum_unit: unrecognised unit name: '" << name <<"', setting to GEV" )
41 
42         return GEV;
43     }
44 
45     /** @brief Get length unit based on its name*/
length_unit(const std::string & name)46     static LengthUnit length_unit( const std::string& name ) {
47         if ( name.compare(0,2,"CM") == 0 ) return CM;
48         if ( name.compare(0,2,"MM") == 0 ) return MM;
49 
50         HEPMC3_ERROR("Units::length_unit: unrecognised unit name: '" << name <<"', setting to CM" )
51 
52         return CM;
53     }
54 
55     /** @brief Get name of momentum unit */
name(MomentumUnit u)56     static std::string name( MomentumUnit u ) {
57         switch(u) {
58         case MEV:
59             return "MEV";
60         case GEV:
61             return "GEV";
62         }
63 
64         return "<UNDEFINED>";
65     }
66 
67     /** @brief Get name of length unit */
name(LengthUnit u)68     static std::string name( LengthUnit u ) {
69         switch(u) {
70         case MM:
71             return "MM";
72         case CM:
73             return "CM";
74         }
75 
76         return "<UNDEFINED>";
77     }
78 
79     /** @brief Convert FourVector to different momentum unit */
80     template <typename T>
convert(T & m,MomentumUnit from,MomentumUnit to)81     static void convert( T &m, MomentumUnit from, MomentumUnit to ) {
82         if ( from == to ) return;
83 
84         if ( from == GEV ) {
85             // GEV -> MEV
86             m *= 1000.;
87         }
88         else if ( from == MEV ) {
89             // MEV -> GEV
90             m *= 0.001;
91         }
92     }
93 
94     /** @brief Convert FourVector to different length unit */
95     template <typename T>
convert(T & m,LengthUnit from,LengthUnit to)96     static void convert( T &m, LengthUnit from, LengthUnit to ) {
97         if ( from == to ) return;
98 
99         if ( from == CM ) {
100             // CM -> MM
101             m *= 10.0;
102         }
103         else if ( from == MM ) {
104             // MM -> CM
105             m *= 0.1;
106         }
107     }
108 
109 };
110 
111 } // namespace HepMC3
112 
113 #endif
114