DD4hep  1.37.0
Detector Description Toolkit for High Energy Physics
Fields.cpp
Go to the documentation of this file.
1 //==========================================================================
2 // AIDA Detector description implementation
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 
14 #include <DD4hep/Fields.h>
15 #include <DD4hep/Printout.h>
16 #include <DD4hep/InstanceCount.h>
17 #include <DD4hep/detail/Handle.inl>
18 
19 using namespace dd4hep;
20 
23 
26 
27 namespace {
28  void calculate_combined_field(std::vector<CartesianField>& v, const Position& pos, double* field) {
29  for (const auto& i : v ) i.value(pos, field);
30  }
31  void calculate_combined_field(std::vector<CartesianField>& v, const double* pos, double* field) {
32  for (const auto& i : v ) i.value(pos, field);
33  }
34 }
35 
38  // The field_type MUST be overriden by the concrete sublass!
41 }
42 
46 }
47 
49 const char* CartesianField::type() const {
50  return m_element->GetTitle();
51 }
52 
55  return ELECTRIC == (fieldType() & ELECTRIC);
56 }
57 
60  return data<Object>()->properties;
61 }
62 
64 void CartesianField::value(const Position& pos, Direction& field) const {
65  double fld[3] = {0e0, 0e0, 0e0};
66  double position[3] = {pos.X(), pos.Y(), pos.Z()};
67  data<Object>()->fieldComponents(position, fld);
68  field = Direction(fld[0], fld[1], fld[2]);
69 }
70 
72 void CartesianField::value(const Position& pos, double* field) const {
73  double position[3] = {pos.X(), pos.Y(), pos.Z()};
74  data<Object>()->fieldComponents(position, field);
75 }
76 
78 void CartesianField::value(const double* pos, double* field) const {
79  data<Object>()->fieldComponents(pos, field);
80 }
81 
83 OverlayedField::Object::Object() : TypedObject(), electric(), magnetic()
84 {
87 }
88 
92 }
93 
95 OverlayedField::OverlayedField(const std::string& nam) : Ref_t() {
96  auto* obj = new Object();
97  assign(obj, nam, "overlay_field");
98  obj->field_type = CartesianField::OVERLAY;
99 }
100 
103  return data<Object>()->properties;
104 }
105 
108  int field = data<Object>()->field_type;
110 }
111 
114  if (field.isValid()) {
115  Object* o = data<Object>();
116  if ( o ) {
117  int typ = field.fieldType();
118  bool isEle = field.ELECTRIC == (typ & field.ELECTRIC);
119  bool isMag = field.MAGNETIC == (typ & field.MAGNETIC);
120  if (isEle) {
121  std::vector < CartesianField > &v = o->electric_components;
122  v.emplace_back(field);
123  o->field_type |= field.ELECTRIC;
124  o->electric = (v.size() == 1) ? field : CartesianField();
125  }
126  if (isMag) {
127  std::vector < CartesianField > &v = o->magnetic_components;
128  v.emplace_back(field);
129  o->field_type |= field.MAGNETIC;
130  o->magnetic = (v.size() == 1) ? field : CartesianField();
131  }
132  if ( isMag || isEle ) {
133  return;
134  }
135  except("OverlayedField","add: Attempt to add an unknown field type.");
136  }
137  except("OverlayedField","add: Attempt to add an invalid object.");
138  }
139  except("OverlayedField","add: Attempt to add an invalid field.");
140 }
141 
143 void OverlayedField::magneticField(const Position& pos, double* field) const {
144  const double position[3] = {pos.X(), pos.Y(), pos.Z()};
145  magneticField(position, field);
146 }
147 
149 void OverlayedField::magneticField(const double* pos, double* field) const {
150  if ( isValid() ) {
151  field[0] = field[1] = field[2] = 0.0;
152  auto* obj = data<Object>();
153  CartesianField f = obj->magnetic;
154  if ( f.isValid() )
155  f.value(pos, field);
156  else
157  calculate_combined_field(obj->magnetic_components, pos, field);
158  return;
159  }
160  except("OverlayedField","add: Attempt to add an invalid field.");
161 }
162 
164 void OverlayedField::combinedElectric(const Position& pos, double* field) const {
165  field[0] = field[1] = field[2] = 0.;
166  calculate_combined_field(data<Object>()->electric_components, pos, field);
167 }
168 
170 void OverlayedField::combinedMagnetic(const Position& pos, double* field) const {
171  field[0] = field[1] = field[2] = 0.;
172  calculate_combined_field(data<Object>()->magnetic_components, pos, field);
173 }
174 
176 void OverlayedField::electromagneticField(const Position& pos, double* field) const {
177  Object* o = data<Object>();
178  field[0] = field[1] = field[2] = 0.;
179  calculate_combined_field(o->electric_components, pos, field);
180  calculate_combined_field(o->magnetic_components, pos, field + 3);
181 }
dd4hep::OverlayedField::combinedElectric
void combinedElectric(const Position &pos, double *field) const
Returns the 3 electric field components (x, y, z) if many components are present.
Definition: Fields.cpp:164
dd4hep::CartesianField::changesEnergy
bool changesEnergy() const
Does the field change the energy of charged particles?
Definition: Fields.cpp:54
v
View * v
Definition: MultiView.cpp:28
dd4hep::Handle< NamedObject >::Object
NamedObject Object
Extern accessible definition of the contained element type.
Definition: Handle.h:86
dd4hep::CartesianField::UNKNOWN
@ UNKNOWN
Definition: Fields.h:43
dd4hep::OverlayedField::Object::magnetic
CartesianField magnetic
Definition: Fields.h:157
dd4hep::Handle::isValid
bool isValid() const
Check the validity of the object held by the handle.
Definition: Handle.h:126
dd4hep::CartesianField::Object
Internal data class shared by all handles of a given type.
Definition: Fields.h:67
dd4hep::Handle< NamedObject >
dd4hep::CartesianField::MAGNETIC
@ MAGNETIC
Definition: Fields.h:43
dd4hep::OverlayedField::add
void add(CartesianField field)
Add a new field component.
Definition: Fields.cpp:113
dd4hep::InstanceCount::increment
static void increment(T *)
Increment count according to type information.
Definition: InstanceCount.h:98
dd4hep::Direction
Position Direction
Definition: Fields.h:28
dd4hep::OverlayedField::properties
Properties & properties() const
Access to properties container.
Definition: Fields.cpp:102
dd4hep::OverlayedField::Object::~Object
virtual ~Object()
Default destructor.
Definition: Fields.cpp:90
dd4hep::OverlayedField::combinedMagnetic
void combinedMagnetic(const Position &pos, double *field) const
Returns the 3 magnetic field components (x, y, z) if many components are present.
Definition: Fields.cpp:170
OverlayedFieldObject
OverlayedField::Object OverlayedFieldObject
Definition: Fields.cpp:24
dd4hep::Handle< NamedObject >::assign
void assign(Object *n, const std::string &nam, const std::string &title)
Assign a new named object. Note: object references must be managed by the user.
dd4hep::InstanceCount::decrement
static void decrement(T *)
Decrement count according to type information.
Definition: InstanceCount.h:102
dd4hep::CartesianField::Properties
std::map< std::string, std::map< std::string, std::string > > Properties
Definition: Fields.h:45
dd4hep::CartesianField::Object::Object
Object()
Default constructor.
Definition: Fields.cpp:37
dd4hep::CartesianField::fieldType
int fieldType() const
Access the field type.
Definition: Fields.h:99
dd4hep::OverlayedField::Object::electric_components
std::vector< CartesianField > electric_components
Definition: Fields.h:158
dd4hep::Handle< NamedObject >::m_element
NamedObject * m_element
Single and only data member: Reference to the actual element.
Definition: Handle.h:91
dd4hep::NamedObject::GetTitle
const char * GetTitle() const
Get name (used by Handle)
Definition: NamedObject.h:70
dd4hep::CartesianField::properties
Properties & properties() const
Access to properties container.
Definition: Fields.cpp:59
dd4hep::OverlayedField::Object
Internal data class shared by all handles.
Definition: Fields.h:154
dd4hep::CartesianField::value
void value(const Position &pos, Direction &field) const
Returns the 3 field components (x, y, z).
Definition: Fields.cpp:64
dd4hep::Position
ROOT::Math::XYZVector Position
Definition: Objects.h:80
dd4hep::CartesianField::TypedObject::field_type
int field_type
Field type.
Definition: Fields.h:56
dd4hep::OverlayedField::Object::Object
Object()
Default constructor.
Definition: Fields.cpp:83
dd4hep
Namespace for the AIDA detector description toolkit.
Definition: AlignmentsCalib.h:28
dd4hep::OverlayedField::OverlayedField
OverlayedField()=default
Default constructor.
dd4hep::OverlayedField::Object::magnetic_components
std::vector< CartesianField > magnetic_components
Definition: Fields.h:159
dd4hep::OverlayedField::changesEnergy
bool changesEnergy() const
Does the field change the energy of charged particles?
Definition: Fields.cpp:107
CartesianFieldObject
CartesianField::Object CartesianFieldObject
Definition: Fields.cpp:21
dd4hep::OverlayedField::Object::electric
CartesianField electric
Definition: Fields.h:156
dd4hep::OverlayedField::magneticField
void magneticField(const Position &pos, double *field) const
Returns the 3 magnetic field components (x, y, z).
Definition: Fields.cpp:143
dd4hep::CartesianField::ELECTRIC
@ ELECTRIC
Definition: Fields.h:43
dd4hep::OverlayedField::Properties
std::map< std::string, PropertyValues > Properties
Definition: Fields.h:146
dd4hep::CartesianField::TypedObject
Internal data class shared by all handles of a given type.
Definition: Fields.h:53
InstanceCount.h
Fields.h
Printout.h
dd4hep::OverlayedField::electromagneticField
void electromagneticField(const Position &pos, double *field) const
Returns the 3 electric (val[0]-val[2]) and magnetic field components (val[3]-val[5]).
Definition: Fields.cpp:176
dd4hep::CartesianField::OVERLAY
@ OVERLAY
Definition: Fields.h:43
dd4hep::CartesianField::type
const char * type() const
Access the field type (string)
Definition: Fields.cpp:49
DD4HEP_INSTANTIATE_HANDLE
DD4HEP_INSTANTIATE_HANDLE(CartesianFieldObject)
dd4hep::CartesianField::Object::~Object
virtual ~Object()
Default destructor.
Definition: Fields.cpp:44
dd4hep::CartesianField
Base class describing any field with 3D cartesian vectors for the field strength.
Definition: Fields.h:40