View Javadoc

1   package org.lcsim.geometry.field;
2   
3   import hep.physics.vec.BasicHep3Vector;
4   import hep.physics.vec.Hep3Vector;
5   import java.util.ArrayList;
6   import java.util.List;
7   
8   import org.lcsim.geometry.FieldMap;
9   
10  /**
11   * FieldOverlay is a FieldMap that itself
12   * contains a list of references to other FieldMaps.
13   * This setup supports the overlay of multiple
14   * magnetic fields, such as the detector solenoid
15   * and the DiD.
16   *
17   * @see org.lcsim.geometry.Detector
18   *
19   * @author Jeremy McCormick
20   */
21  public class FieldOverlay implements FieldMap
22  {
23     private List<FieldMap> fields = new ArrayList<FieldMap>();
24     
25     public FieldOverlay()
26     {}
27     
28     public void addField(FieldMap field)
29     {
30        fields.add(field);
31     }
32     
33     public void getField(double[] pos, double[] b)
34     {
35        int size = fields.size();
36        if (size == 0)
37        {
38           b[0] = b[1] = b[2] = 0.;
39        }
40        else if (size == 1)
41        {
42           fields.get(0).getField(pos,b);
43        }
44        else
45        {
46           double[] temp = new double[3];
47           b[0] = b[1] = b[2] = 0.;
48           for (FieldMap field : fields)
49           {
50              field.getField(pos, temp);
51              for (int i=0; i<3; i++) b[i] += temp[i];
52           }
53        }
54     }
55     
56     public double[] getField(double[] pos)
57     {
58        double[] b = new double[3];
59        getField(pos, b);
60        return b;
61     }
62     
63     public Hep3Vector getField(Hep3Vector position, BasicHep3Vector field)
64     {
65        if (field == null) field = new BasicHep3Vector();
66        int size = fields.size();
67        if (size == 0)
68        {
69           field.setV(0,0,0);
70        }
71        else if (size == 1)
72        {
73           fields.get(0).getField(position,field);
74        }
75        else
76        {
77           double bx = 0;
78           double by = 0;
79           double bz = 0;
80           BasicHep3Vector temp = new BasicHep3Vector();
81           for (FieldMap map : fields)
82           {
83              map.getField(position,temp);
84              bx += temp.x();
85              by += temp.y();
86              bz += temp.z();
87           }
88           field.setV(bx,by,bz);
89        }
90        return field;
91     }
92     
93     public Hep3Vector getField(Hep3Vector position)
94     {
95        return getField(position,null);
96     }
97  }