// // ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // // // // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... #ifndef OAEMFIELD_IFIELDMANAGER_HXX #define OAEMFIELD_IFIELDMANAGER_HXX #include #include "IElementField.hxx" #include #include #include namespace COMET { // IFieldManager - handles the global ElectroMagnetic field // // There is a single IFieldManager object. // // The field from each individual beamline element is given by a // IElementField object. Any number of overlapping IElementField // objects can be added to the global field. Any element that // represents an element with an EM field will be added to the // IElementField list. typedef std::vector FieldList; class IFieldManager { friend void COMET::IElementField::addElementField(); private: IFieldManager(); IFieldManager(const IFieldManager&); ~IFieldManager(); IFieldManager& operator=(const IFieldManager&); void SetupArray(); static bool Recreate(const IFieldDescription& description); public: /// GetObject() returns the single IFieldManager object. /// It is constructed, if necessary. static IFieldManager* GetObject(); /// GetFieldValue() returns the field value at a given point[]. /// field is really field[6]: Bx,By,Bz,Ex,Ey,Ez. /// point[] is in global coordinates: x,y,z,t. void GetFieldValue(const Double_t* point, Double_t* field) const; /// clear all field tracking objects and clear() void ClearField(); /// update field objects, import field for the first only once, // check is not implemented yet! void UpdateField(); /// Set the NoField flag to true so that the GetFieldValue function can work even no field is provided (return value = 0) void SetNoField(); /// prints the field map to a file as a grid map bool WriteToFile(std::string& fileName, double x0, double y0, double z0, double dX, double dY, double dZ, int nX, int nY, int nZ); COMET::IHandle MakeDescription()const; static IFieldManager* Import(const char* filename); static IFieldManager* Import(TDirectory* directory); static IFieldManager* Import(const IFieldDescription* description); static IFieldManager* Import(); void SetUniformed() { fUniformed = true; } private: ///// clear() removes all IElementField-s from the global object, ///// and destroys them. Used before the geometry is completely ///// re-created. void clear(); static IFieldManager* fObject; Int_t fNumFieldPointers; Bool_t fFirst; Bool_t fFirstImport; Bool_t fUniformed; static Bool_t fNoField; FieldList* fFields; const IElementField **fFieldPointers; }; } #endif