DD4hep - The AIDA detector description toolkit for high energy physics experiments
DD4hep  Rev:Unversioneddirectory
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Fields.h
Go to the documentation of this file.
1 //==========================================================================
2 // AIDA Detector description implementation for LCD
3 //--------------------------------------------------------------------------
4 // Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
5 // All rights reserved.
6 //
7 // For the licensing terms see $DD4hepINSTALL/LICENSE.
8 // For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
9 //
10 // Author : M.Frank
11 //
12 //==========================================================================
13 #ifndef DD4HEP_GEOMETRY_FIELDS_H
14 #define DD4HEP_GEOMETRY_FIELDS_H
15 
16 // Framework include files
17 #include "DD4hep/NamedObject.h"
18 #include "DD4hep/Objects.h"
19 
20 // C/C++ include files
21 #include <vector>
22 #include <map>
23 
25 namespace DD4hep {
26 
28  namespace Geometry {
29 
30  // Forward declarations
32 
33 
35 
46  class CartesianField: public Ref_t {
47  public:
48  enum FieldType {
49  UNKNOWN = 0, ELECTRIC = 0x1, MAGNETIC = 0x2
50  };
51  typedef std::map<std::string, std::string> PropertyValues;
52  typedef std::map<std::string, PropertyValues> Properties;
53 
55 
60  class Object: public NamedObject {
61  public:
63  int type;
67  Object();
69  virtual ~Object();
71  virtual void fieldComponents(const double* pos, double* field) = 0;
72  };
73 
75  CartesianField() = default;
76 
78  CartesianField(const CartesianField& e) = default;
79 
81  template <typename Q> CartesianField(const Handle<Q>& e) : Ref_t(e) {
82  }
83 
85  CartesianField& operator=(const CartesianField& f) = default;
86 
88  int fieldType() const {
89  return data<Object>()->type;
90  }
91 
93  const char* type() const;
94 
96  bool changesEnergy() const;
97 
99  void value(const Position& pos, Direction& field) const; // { value(pos,&field.x); }
100 
102  void value(const Position& pos, double* val) const; // { value(&pos.x,val); }
103 
105  void value(const double* pos, double* val) const;
106 
108  Properties& properties() const;
109  };
110 
113 
115 
130  class OverlayedField: public Ref_t {
131  public:
132  enum FieldType {
133  ELECTRIC = 0x1, MAGNETIC = 0x2
134  };
135  typedef std::map<std::string, std::string> PropertyValues;
136  typedef std::map<std::string, PropertyValues> Properties;
137 
139 
144  class Object: public NamedObject {
145  public:
146  int type;
149  std::vector<DD4hep::Geometry::CartesianField> electric_components;
150  std::vector<DD4hep::Geometry::CartesianField> magnetic_components;
154  Object();
156  virtual ~Object();
157  };
158 
160  OverlayedField() = default;
161 
163  template <typename Q> OverlayedField(const Handle<Q>& e) : Ref_t(e) { }
164 
166  OverlayedField(const std::string& name);
167 
169  int type() const {
170  return data<Object>()->type;
171  }
172 
174  bool changesEnergy() const;
175 
177  void add(CartesianField field);
178 
180  void combinedElectric(const Position& pos, double* field) const {
181  combinedElectric((const double*) &pos, field);
182  }
183 
185  void combinedElectric(const double* pos, double* field) const;
186 
188  void combinedMagnetic(const Position& pos, double* field) const {
189  combinedMagnetic((const double*) &pos, field);
190  }
191 
193  void combinedMagnetic(const double* pos, double* field) const;
194 
196  void electricField(const Position& pos, Direction& field) const {
197  electricField((const double*) &pos, (double*) &field);
198  }
199 
201  void electricField(const Position& pos, double* field) const {
202  electricField((double*) &pos, field);
203  }
204 
206  void electricField(const double* pos, double* field) const {
207  field[0] = field[1] = field[2] = 0.0;
208  CartesianField f = data<Object>()->electric;
209  f.isValid() ? f.value(pos, field) : combinedElectric(pos, field);
210  }
211 
213  void magneticField(const Position& pos, Direction& field) const {
214  magneticField((double*) &pos, (double*) &field);
215  }
216 
218  void magneticField(const Position& pos, double* field) const {
219  magneticField((double*) &pos, field);
220  }
221 
223  void magneticField(const double* pos, double* field) const {
224  field[0] = field[1] = field[2] = 0.0;
225  CartesianField f = data<Object>()->magnetic;
226  f.isValid() ? f.value(pos, field) : combinedMagnetic(pos, field);
227  }
228 
230  void electromagneticField(const Position& pos, double* val) const {
231  electromagneticField((double*) &pos, val);
232  }
233 
235  void electromagneticField(const double* pos, double* val) const;
236 
238  Properties& properties() const;
239  };
240 
242 
243  } /* End namespace Geometry */
244 } /* End namespace DD4hep */
245 #endif /* DD4HEP_GEOMETRY_FIELDS_H */
DD4hep::Geometry::CartesianField electric
Definition: Fields.h:147
Properties & properties() const
Access to properties container.
Definition: Fields.cpp:94
Internal data class shared by all handles of a given type.
Definition: Fields.h:60
Object()
Default constructor.
Definition: Fields.cpp:36
bool changesEnergy() const
Does the field change the energy of charged particles?
Definition: Fields.cpp:99
void combinedMagnetic(const Position &pos, double *field) const
Returns the 3 magnetic field components (x, y, z) if many components are present. ...
Definition: Fields.h:188
void magneticField(const Position &pos, Direction &field) const
Returns the 3 magnetic field components (x, y, z).
Definition: Fields.h:213
Object()
Default constructor.
Definition: Fields.cpp:77
Properties properties
Field extensions.
Definition: Fields.h:65
int fieldType() const
Access the field type.
Definition: Fields.h:88
Internal data class shared by all handles.
Definition: Fields.h:144
CartesianField ElectricField
Definition: Fields.h:111
std::map< std::string, std::string > PropertyValues
Definition: Fields.h:135
void add(CartesianField field)
Add a new field component.
Definition: Fields.cpp:105
std::map< std::string, PropertyValues > Properties
Definition: Fields.h:52
OverlayedField ElectroMagneticField
Definition: Fields.h:241
std::map< std::string, PropertyValues > Properties
Definition: Fields.h:136
std::vector< DD4hep::Geometry::CartesianField > electric_components
Definition: Fields.h:149
void magneticField(const double *pos, double *field) const
Returns the 3 magnetic field components (x, y, z).
Definition: Fields.h:223
const char * type() const
Access the field type (string)
Definition: Fields.cpp:47
void electricField(const Position &pos, Direction &field) const
Returns the 3 electric field components (x, y, z).
Definition: Fields.h:196
return e
Definition: Volumes.cpp:297
CartesianField MagneticField
Definition: Fields.h:112
OverlayedField(const Handle< Q > &e)
Constructor to be used when reading the already parsed DOM tree.
Definition: Fields.h:163
Class describing a field overlay with several sources.
Definition: Fields.h:130
Implementation of a named object.
Definition: NamedObject.h:31
bool changesEnergy() const
Does the field change the energy of charged particles?
Definition: Fields.cpp:52
CartesianField(const Handle< Q > &e)
Constructor to be used when reading the already parsed DOM tree.
Definition: Fields.h:81
std::vector< DD4hep::Geometry::CartesianField > magnetic_components
Definition: Fields.h:150
void electromagneticField(const Position &pos, double *val) const
Returns the 3 electric (val[0]-val[2]) and magnetic field components (val[3]-val[5]).
Definition: Fields.h:230
OverlayedField()=default
Default constructor.
std::map< std::string, std::string > PropertyValues
Definition: Fields.h:51
int type() const
Access the field type.
Definition: Fields.h:169
virtual void fieldComponents(const double *pos, double *field)=0
Call to access the field components at a given location.
ROOT::Math::XYZVector Position
Definition: Objects.h:75
void electricField(const double *pos, double *field) const
Returns the 3 electric field components (x, y, z).
Definition: Fields.h:206
Position Direction
Definition: Fields.h:31
CartesianField()=default
Default constructor.
Handle< NamedObject > Ref_t
Default Ref_t definition describing named objects.
Definition: Handle.h:176
virtual ~Object()
Default destructor.
Definition: Fields.cpp:42
Properties & properties() const
Access to properties container.
Definition: Fields.cpp:57
virtual ~Object()
Default destructor.
Definition: Fields.cpp:83
Handle: a templated class like a shared pointer, which allows specialized access to tgeometry objects...
Definition: Handle.h:87
Handle class describing any field with 3D cartesian vectors for the field strength.
Definition: Fields.h:46
void combinedElectric(const Position &pos, double *field) const
Returns the 3 electric field components (x, y, z) if many components are present. ...
Definition: Fields.h:180
void electricField(const Position &pos, double *field) const
Returns the 3 electric field components (x, y, z).
Definition: Fields.h:201
DD4hep::Geometry::CartesianField magnetic
Definition: Fields.h:148
CartesianField & operator=(const CartesianField &f)=default
Assignment operator.
void magneticField(const Position &pos, double *field) const
Returns the 3 magnetic field components (x, y, z).
Definition: Fields.h:218
void value(const Position &pos, Direction &field) const
Returns the 3 field components (x, y, z).
Definition: Fields.cpp:62
Properties properties
Field extensions.
Definition: Fields.h:152