//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//* // LOW ENERGY MUON SPIN RELAXATION, ROTATION, RADIATION // // ID :LEMuSRElectricField.hh , v 1.3 // AUTHOR: Taofiq PARAISO // DATE : 2004-09-17 10:20 //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$// // // & &&&&&&&&&& &&&&&&& &&&&&&&& // & & && && & && // & & & & & & && // & &&&&&&& & & &&&&&& &&&&&&&& // & & & && & & && // & & && & & && && & & // &&&&&&&&&& &&&&&&&&&& & &&&&& && &&&&&&& & && // & // & // & // & // Electric Field //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$// #ifndef LEMUSRELECTRICFIELD_H #define LEMUSRELECTRICFIELD_H 1 #include"G4ElectricField.hh" #include"G4ElectroMagneticField.hh" #include "globals.hh" #include "G4ios.hh" #include #include #include #include #include #include "CLHEP/Matrix/Vector.h" #include "CLHEP/Matrix/Matrix.h" /** * The goal of the LEMuSRElectricField class is to read field maps generated by * COMSOL Multiphysics. * \image html field.gif Example of a field map generated using COMSOL. * Those field maps are shared into three ascii files, one per field component, * in the format (x y z B_i). The first line in the file contains * the labels. The second line is (x_min y_min z_min B_i) and the last line * is (x_max y_max z_max B_i). * LEMuSRElectricField reads those files and store them in an array. * Some important parameters must be specified to read a field map: * -# The number of points along each axis which was defined in COMSOL * before exporting the maps. * - It is very important to check that the number of points do not * exceed the size of the array defined in LEMuSRElectricField.hh * -# The unit of the map, which is an important parameter because the * default distance unit in COMSOL is the meter. * - A different unit has an influence * on the coordinates reading, but also on the actual field value which has to * be scaled consequently. * -# The voltage to use. Indeed,the field maps are generated for 1kV potential. * The user should indicate the actual voltage to multiply the fields values. * -# The offset along z axis, in case the map is not centered on the actual * postition of the field. This is the case for the third lense field for example: * the map is centered on (0, 0, 0) and the center or the lens is at (0, 0, -567mm). * . * The field maps can be very heavy files and reading them can cost a lot of time. * For this reason, it is possible to write the field map array in a single file * after the first reading. Such maps files have been produced for the third * lens, the anode and the sample. */ class LEMuSRElectricField : public G4ElectricField { public: //! Constructor from three field maps LEMuSRElectricField(G4double fieldval,G4String Xfile, G4String Yfile, G4String Zfile,G4String map_length_unit, G4double Offset, G4double nx, G4double ny, G4double nz);//offset must be entered in millimeter //! Contructor from a single field map LEMuSRElectricField(G4double fieldval,G4String file,G4String map_length_unit, G4double Offset, G4double nx, G4double ny, G4double nz); ~LEMuSRElectricField(); //! Returns the field value at Point[4] space-time coordinate. /*! * This method is in charge of returning the field value for a given position. * It scales the field array according to the unit and interpolates the field * value from the cube surrounding Point[4]. */ void GetFieldValue(const G4double Point[4], G4double *Bfield) const; //! Debugging test. void Test(); public: // std::vector< std::vector< std::vector< G4double > > > xField; // vector of // vector of // vector of G4doubles [[[a]i]j]k // std::vector< std::vector< std::vector< G4double > > > yField; // std::vector< std::vector< std::vector< G4double > > > zField; //! Bx, By, Bz, for all x positions G4double xField[90][90][201]; //! Bx, By, Bz, for all y positions G4double yField[90][90][201]; //! Bx, By, Bz, for all z positions G4double zField[90][90][201]; //! The physical limits of the defined region G4double minx, maxx, miny, maxy, minz, maxz; G4double //! Number of divisions along axis. nx,ny,nz, //! Offset along propagation axis zOffset, //! Actual voltage value. FieldVal; //! Unit of the field map. G4String map_unit; }; #endif