00001 #ifndef BDSBEAMLINE_H
00002 #define BDSBEAMLINE_H
00003
00004 #include "globals.hh"
00005
00006 #include "BDSBeamlineElement.hh"
00007
00008 #include <iterator>
00009 #include <ostream>
00010 #include <utility>
00011 #include <vector>
00012
00033
00034 class BDSBeamline;
00035
00036 class BDSLine;
00037 class BDSTransform3D;
00038
00040 typedef std::vector<BDSBeamlineElement*>::const_iterator BDSBeamlineIterator;
00041
00042 class BDSBeamline{
00043 public:
00046 BDSBeamline();
00047
00051 BDSBeamline(G4ThreeVector initialGlobalPosition,
00052 G4RotationMatrix* initialGlobalRotation);
00053
00054 ~BDSBeamline();
00055
00058 void AddSingleComponent(BDSAcceleratorComponent* component);
00059
00063 void AddComponent(BDSAcceleratorComponent* component);
00064
00070 void ApplyTransform3D(BDSTransform3D* component);
00071
00074 void PrintAllComponents(std::ostream& out) const;
00075
00076 BDSBeamlineElement* GetFirstItem();
00077 BDSBeamlineElement* GetLastItem();
00078
00080 inline G4double GetTotalChordLength() const;
00081
00083 inline G4double GetTotalArcLength() const;
00084
00086 std::vector<BDSBeamlineElement*>::size_type size() const;
00087
00089 G4ThreeVector GetMaximumExtentPositive() const;
00090
00092 G4ThreeVector GetMaximumExtentNegative() const;
00093
00095 G4ThreeVector GetMaximumExtentAbsolute() const;
00096
00097
00099 BDSBeamlineElement* front() const;
00101 BDSBeamlineElement* back() const;
00103 inline std::vector<BDSBeamlineElement*>::iterator begin();
00105 inline std::vector<BDSBeamlineElement*>::iterator end();
00107 inline std::vector<BDSBeamlineElement*>::reverse_iterator rbegin();
00109 inline std::vector<BDSBeamlineElement*>::reverse_iterator rend();
00111 inline std::vector<BDSBeamlineElement*>::const_iterator begin() const;
00113 inline std::vector<BDSBeamlineElement*>::const_iterator end() const;
00115 inline std::vector<BDSBeamlineElement*>::const_reverse_iterator rbegin() const;
00117 inline std::vector<BDSBeamlineElement*>::const_reverse_iterator rend() const;
00119 inline G4bool empty() const;
00120
00122 friend std::ostream& operator<< (std::ostream &out, BDSBeamline const &bl);
00123
00124 private:
00125 std::vector<BDSBeamlineElement*> beamline;
00126
00127 G4double totalChordLength;
00128 G4double totalArcLength;
00129
00130 G4ThreeVector maximumExtentPositive;
00131 G4ThreeVector maximumExtentNegative;
00132
00135 G4ThreeVector xARS, yARS, zARS, xARM, yARM, zARM, xARE, yARE, zARE;
00137
00139 G4RotationMatrix* previousReferenceRotationEnd;
00140
00142 G4ThreeVector previousReferencePositionEnd;
00143
00145 G4double previousSPositionEnd;
00146
00148 BDSBeamline& operator=(const BDSBeamline&);
00149 BDSBeamline(BDSBeamline&);
00150 };
00151
00152 inline BDSBeamlineElement* BDSBeamline::GetFirstItem()
00153 {return front();}
00154
00155 inline BDSBeamlineElement* BDSBeamline::GetLastItem()
00156 {return back();}
00157
00158 inline G4double BDSBeamline::GetTotalChordLength() const
00159 {return totalChordLength;}
00160
00161 inline G4double BDSBeamline::GetTotalArcLength() const
00162 {return totalArcLength;}
00163
00164 inline std::vector<BDSBeamlineElement*>::size_type BDSBeamline::size() const
00165 {return beamline.size();}
00166
00167 inline G4ThreeVector BDSBeamline::GetMaximumExtentPositive() const
00168 {return maximumExtentPositive;}
00169
00170 inline G4ThreeVector BDSBeamline::GetMaximumExtentNegative() const
00171 {return maximumExtentNegative;}
00172
00173 inline BDSBeamlineElement* BDSBeamline::front() const
00174 {return beamline.front();}
00175
00176 inline BDSBeamlineElement* BDSBeamline::back() const
00177 {return beamline.back();}
00178
00179 inline std::vector<BDSBeamlineElement*>::iterator BDSBeamline::begin()
00180 {return beamline.begin();}
00181
00182 inline std::vector<BDSBeamlineElement*>::iterator BDSBeamline::end()
00183 {return beamline.end();}
00184
00185 inline std::vector<BDSBeamlineElement*>::reverse_iterator BDSBeamline::rbegin()
00186 {return beamline.rbegin();}
00187
00188 inline std::vector<BDSBeamlineElement*>::reverse_iterator BDSBeamline::rend()
00189 {return beamline.rend();}
00190
00191 inline std::vector<BDSBeamlineElement*>::const_iterator BDSBeamline::begin() const
00192 {return beamline.begin();}
00193
00194 inline std::vector<BDSBeamlineElement*>::const_iterator BDSBeamline::end() const
00195 {return beamline.end();}
00196
00197 inline std::vector<BDSBeamlineElement*>::const_reverse_iterator BDSBeamline::rbegin() const
00198 {return beamline.rbegin();}
00199
00200 inline std::vector<BDSBeamlineElement*>::const_reverse_iterator BDSBeamline::rend() const
00201 {return beamline.rend();}
00202
00203 inline G4bool BDSBeamline::empty() const
00204 {return beamline.empty();}
00205
00206 #endif