diff options
author | Christian Vazquez <christian.vazquez@epfl.ch> | 2011-05-27 17:14:52 +0000 |
---|---|---|
committer | Christian Vazquez <christian.vazquez@epfl.ch> | 2011-05-27 17:14:52 +0000 |
commit | 1f6a3a16a53342e3885d1d16198bbe18aa1383ab (patch) | |
tree | 07ec1607ed5b5358928c35e63b804b76b95b9cb0 | |
parent | 0006bb53b04fc2569839dfaf41547172a13bc7d1 (diff) | |
download | vhc-1f6a3a16a53342e3885d1d16198bbe18aa1383ab.tar.gz vhc-1f6a3a16a53342e3885d1d16198bbe18aa1383ab.tar.bz2 vhc-1f6a3a16a53342e3885d1d16198bbe18aa1383ab.zip |
Mis à jour la classe parceur et le fichier xml.
-rw-r--r-- | src/main/Parser.cc | 517 | ||||
-rw-r--r-- | src/main/Parser.h | 162 | ||||
-rw-r--r-- | src/main/simulation.xml | 61 |
3 files changed, 560 insertions, 180 deletions
diff --git a/src/main/Parser.cc b/src/main/Parser.cc index 5ac74a5..0aed354 100644 --- a/src/main/Parser.cc +++ b/src/main/Parser.cc @@ -4,13 +4,18 @@ * Created on: 11 mai 2011 * Author: christian */ - #include "Parser.h" +//TODO balises fermantes et header et constantes et commentaires???????? + namespace vhc { + /** Cf. header.**/ -Parser::Parser(string file) - :nameOfFile(file){} +Parser::Parser(): nameOfFile("") {}; + +Parser::Parser(std::string file): nameOfFile(file) {}; + +Parser::~Parser() {}; //===========================================balises ouvrantes========================================================================== @@ -19,6 +24,14 @@ tagStat Parser::system = "<System>"; tagStat Parser::accelerator ="<Accelerator>"; tagStat Parser::comment = "<--"; +//balises ouvrantes des constantes +tagStat Parser::constants = "<constants>"; +tagStat Parser::dt = "<dt>"; +tagStat Parser::C = "<C>"; +tagStat Parser::E = "<E>"; +tagStat Parser::PROTON_MASS = "<PROTON_MASS>"; +tagStat Parser::ELECTRON_MASS = "<ELECTRON_MASS>"; + //balises ouvrantes d'une particule tagStat Parser::particle ="<Particle>"; tagStat Parser::position = "<Position>"; @@ -57,6 +70,14 @@ tagStat Parser::systemCl = "<\System>"; tagStat Parser::acceleratorCl ="<\Accelerator>"; tagStat Parser::commentCl = "-->"; +//balises fermantes des constantes +tagStat Parser::constantsCl = "<\constants>"; +tagStat Parser::dtCl = "<\dt>"; +tagStat Parser::CCl = "<\C>"; +tagStat Parser::ECl = "<\E>"; +tagStat Parser::PROTON_MASSCl = "<\PROTON_MASS>"; +tagStat Parser::ELECTRON_MASSCl = "<\ELECTRON_MASS>"; + //balises fermantes d'une particule tagStat Parser::particleCl ="<\Particle>"; tagStat Parser::positionCl = "<\Position>"; @@ -87,56 +108,13 @@ tagStat Parser::quadrupoleCl ="<\Quadrupole>"; //balises fermantes d'un StraightElement tagStat Parser::straightElementCl ="<\StraightElement>"; -//====================================================================================================================================== -//====================================================================================================================================== -//====================================================================================================================================== -Parser::readOneChar(ifstream& file){ - char tmp; - file>>tmp; - return tmp; -} -Parser::readOneInt(ifstream& file){ - int tmp; - file>>tmp; - return tmp; -} -Parser::readOneDouble(ifstream& file){ - double tmp; - file>>tmp; - return tmp; -} -Parser::readVector3D(ifstream& file){ - - double x = readOneDouble(file); - readComma(file); - double y = readOneDouble(file); - readComma(file); - double z = readOneDouble(file); - - return Vector3D(x,y,z); -} -Parser::readOneTag(ifstream& file){ - tag tmp; - file>>tag; - return tmp; -} -Parser::readComma(ifstream& file){ - char trash; - file>>trash; -} -Parser::readClosingTag(ifstream& file){ - tag tmp; - file>>tmp; - if(tmp != *"Cl") - throw ReadExceptionMessage("No closing tag found."); -} -Parser::findNextTag(ifstream& file){} -Parser::jumpComment(ifstream& file){} -//====================================================================================================================================== +//===========================================================création et renvoi d'un accélérateur======================================= Parser::extract() { - //on déclare une flot d'entrée, ainsi qu'une sortie + Accelerator* acc; + + //on déclare une flot d'entrée ifstream entry; //associe le flot d'entrée au fichier donné par l'utilisateur @@ -144,117 +122,424 @@ Parser::extract() { //teste si l'association a bien pu se faire if(not entry.fail()){ - readFile(entry); + + //Tant qu'on n'est pas arrivé à la fin du fichier, on continue à le lire + while(not file.eof()){ + + //tout se fait depuis ici + readFile(entry, *acc); + } + //A la fin de la lecture, on ferme le flot entry.close(); }else{ //si l'association du flot d'entrée avec le fichier n'a pas pu se faire, on lance une exception throw IOException("Cannot open file. "+nameOfFile+" not found."); } + + return acc; } +//===========================================================lecture du fichier .xml==================================================== +Parser::readFile(ifstream& file, Accelerator& acc){ + try { + + // on lit la balise qu'on doit traiter + tag tmp1 = readOneTag(file); + + /*on teste si tmp1 correspond à une des balises suivantes : + * - soit system + * - soit un commentaire + * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là + */ + switch(tmp1){ + + case system : + + readSystem(file, acc); + break; + + case comment : + + jumpComment(file); + break; + + /* si la variable tmp1 ne contient pas les balises voulues, c'est qu'une valeur + * (celle contenue par la variable tmp1 donc) + * n'a pas été récupérée comme il faut. + */ + default: + + throw ReadException("Values found outside of following tags : "+system+ + "\n Value is : "+tmp1); + break; + } + } + + catch(Exception const& ex){ + std::cout<<ex.getMessage()<<std::endl; + } +} + +//==============================================================lecture de la balise system============================================= +Parser::readSystem(ifstream& file, Accelerator& acc){ -Parser::readTag(ifstream& file){ try { - tag tmp; + // on lit la balise qu'on doit traiter + tag tmp2 = readOneTag(file); - //Tant qu'on n'est pas arrivé à la fin du fichier, on continue à le lire - while(not file.eof()){ + /*on teste si tmp2 correspond à une des balises suivantes : + * - soit constants + * - soit accelerator + * - soit un commentaire + * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là + */ + switch(tmp2){ - tmp = readOneTag(file); + case constants : - //on teste si la ligne correspond à une des balises - switch(tmp){ + readConstants(file); + break; - case system : - break; + case accelerator : - case accelerator : + buildAccelerator(file, acc); + break; - Accelerator* acc = new Accelerator; - break; + case comment : - case dipole : + jumpComment(file); + break; + + /* si la variable tmp2 ne contient pas les balises voulues, c'est qu'une valeur + * (celle contenue par la variable tmp2 donc) + * n'a pas été récupérée comme il faut. + */ + default: + + throw ReadException("Values found outside of following tags : "+constants+accelerator+ + "\n Value is : "+tmp2); + break; + } + } + + catch(Exception const& ex){ + std::cout<<ex.getMessage()<<std::endl; + } +} + +//====================================================================lecture de constantes============================================= +Parser::readConstants(ifstream& file){ + try { + + // on lit la balise qu'on doit traiter + tag tmp31 = readOneTag(file); + + /*on teste si tmp31 correspond à une des balises suivantes : + * - soit C + * - soit E + * - soit PROTON_MASS + * - soit ELECTRON_MASS + * - soit un commentaire + * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là + */ + switch(tmp31){ + + case C : + + readC(file); + break; + + case E : + + readE(file); + break; + + case PROTON_MASS : + + readPROTON_MASS(file); + break; + + case ELECTRON_MASS : + + readELECTRON_MASS(file); + break; + + case comment : + + jumpComment(file); + break; + + /* si la variable tmp31 ne contient pas les balises voulues, c'est qu'une valeur + * (celle contenue par la variable tmp31 donc) + * n'a pas été récupérée comme il faut. + */ + default: + + throw ReadException("Values found outside of following tags : "+dt+C+E+PROTON_MASS+ELECTRON_MASS+ + "\n Value is : "+tmp31); + break; + } + } + + catch(Exception const& ex){ + std::cout<<ex.getMessage()<<std::endl; + } +} + +Parser::readC(ifstream& file){ + Parser::CP = readOneDouble(file); + closingTag(file); +} + +Parser::readE(ifstream& file){ + Parser::EP = readOneDouble(file); + closingTag(file); +} + +Parser::readPROTON_MASS(ifstream& file){ + Parser::PROTON_MASSP = readOneDouble(file); + closingTag(file); +} - try{ - tag tmp3; - tmp=readOneTag(file); +Parser::readELECTRON_MASS(ifstream& file){ + Parser::ELECTRON_MASSP = readOneDouble(file); + closingTag(file); +} + +//==========================================================fabrication de l'accélérateur=============================================== +Parser::buildAccelerator(ifstream& file, Accelerator const& acc){ + + try { - switch(tmp3){ + // on lit la balise qu'on doit traiter + tag tmp32 = readOneTag(file); - case entryPos : - Vector3D diEntryPos = readVector3D(file); - case exitPos : - Vector3D diExitPos = dsfaga - } + /*on teste si tmp32 correspond à une des balises suivantes : + * - soit dipole + * - soit fodo + * - soit particle + * - soit quadrupole + * - soit straightElement + * - soit un commentaire + * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là + */ + switch(tmp32){ + case dipole : - Dipole* di = new Dipole(lkdsflksdanlkfdag); - } - catch(ReadException& ex){ - e.addReadExceptionMessage("Error building Dipole."); - throw; - } + acc.add(buildDipole(file)); + break; case fodo : - try{ - FODO* fodo = new FODO(readsmth); - } - catch(ReadException& ex){ - e.addReadExceptionMessage("Error building FODO."); - throw; - } + acc.add(buildFODO(file)); + break; case particle : - try{ - Particle* pa = new Particle(readsmth); - } - catch(ReadException& ex){ - e.addReadExceptionMessage("Error building Particle."); - throw; - } + Particle* p = new Particle; + acc.add(buildParticle(file,*pa)); + break; case quadrupole : - try{ - Quadrupole* quad = new Quadrupole(readsmth); - } - catch(ReadException& ex){ - e.addReadExceptionMessage("Error building Quadrupole."); - throw; - } + acc.add(buildQuadrupole(file)); + break; case straightElement : - try{ - StraightElement* se = new StraightElement(readsmth); - } - catch(ReadException& ex){ - e.addReadExceptionMessage("Error building StraightElement."); - throw; - } + acc.add(buildStraightElement(file)); + break; - // si la variable tmp est vide, on ne fait rien, si elle est non-vide mais ne contient pas de balise, - // c'est qu'une valeur (celle contenue par la variable donc) n'a pas été récupérée comme il faut. - default: - //TODO si l'opérateur ne lit pas les blancs, sinon il fau mettre ça ailleurs - readClosingTag(file); + case comment : - //TODO est-ce que l'opérateur >> lit les blancs? - //if(tmp != " ") throw ReadException("Values found outside of tag"); + jumpComment(file); break; + /* si la variable tmp32 ne contient pas les balises voulues, c'est qu'une valeur + * (celle contenue par la variable tmp32 donc) + * n'a pas été récupérée comme il faut. + */ + default: - } - } + throw ReadException("Values found outside of following tags : "+dipole+fodo+particle+quadrupole+straightElement+ + "\n Value is : "+tmp32); + break; + }//switch + }//try + catch(Exception const& ex){ + std::cout<<ex.getMessage()<<std::endl; } +} + +//===========================================================construction d'une nouvelle particule====================================== +Parser::buildParticle(ifstream& file, Particle const& p){ + try { + + // on lit la balise qu'on doit traiter + tag tmp41 = readOneTag(file); + + /*on teste si tmp41 correspond à une des balises suivantes : + * - soit position + * - soit mass + * - soit charge + * - soit energy + * - soit direction + * - soit un commentaire + * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là + */ + switch(tmp41){ + + case position : + + p.setPosition(readPosition(file)); + break; + + case mass : + + p.setMass(readMass(file)); + break; + + case charge : + + p.setCharge(readCharge(file)); + break; + + case energy : + + p.setEnergy(readEnergy(file));//TODO faire un set Energy!!!!! + break; + + case direction : + + acc.add(buildStraightElement(file)); + break; + + case comment : + + jumpComment(file); + break; + + /* si la variable tmp41 ne contient pas les balises voulues, c'est qu'une valeur + * (celle contenue par la variable tmp41 donc) + * n'a pas été récupérée comme il faut. + */ + default: + + throw ReadException("Values found outside of following tags : "+dipole+fodo+particle+quadrupole+straightElement+ + "\n Value is : "+tmp41); + break; + }//switch + }//try + catch(Exception const& ex){ std::cout<<ex.getMessage()<<std::endl; } } +Parser::readPosition(ifstream& file){ + +} + +Parser::readMass(ifstream& file){ + +} + +Parser::readCharge(ifstream& file){ + +} + +Parser::readEnergy(ifstream& file){ + +} + +Parser::readDirection(ifstream& file){ + +} + +//===========================================================construction d'une nouvelle FODO=========================================== +Parser::buildFODO(ifstream& file){ + +} + +//===========================================================construction d'un nouveau Dipole=========================================== +Parser::buildDipole(ifstream& file){ + +} + +//============================================================construction d'un nouveau quadrupole====================================== +Parser::buildQuadrupole(ifstream& file){ + +} + +//============================================================construction d'un nouveau straight Element================================ +Parser::buildStraightElement(ifstream& file){ + +} + +//=======================================================lecture atomique=============================================================== +Parser::readOneChar(ifstream& file){ + file>>ws; + char tmp; + file>>tmp; + return tmp; +} +Parser::readOneInt(ifstream& file){ + file>>ws; + int tmp; + file>>tmp; + return tmp; +} +Parser::readOneDouble(ifstream& file){ + file>>ws; + double tmp; + file>>tmp; + return tmp; +} +Parser::readComma(ifstream& file){ + char trash; + file>>ws; + file>>trash; +} +//===========================================================lecture moléculaire======================================================== +Parser::readVector3D(ifstream& file){ + + double x = readOneDouble(file); + readComma(file); + double y = readOneDouble(file); + readComma(file); + double z = readOneDouble(file); + file>>ws; + + return Vector3D(x,y,z); +} +Parser::readOneTag(ifstream& file){ + tag tmp; + file>>tag; + return tmp; +} +Parser::closingTag(ifstream& file){ + tag tmp; + file>>ws; + file>>tmp; + //si on a pas de balise fermante (ici il devrait il y en avoir normalement une) alors on lance une exception + found=tmp.find("<"); + if(found() == string::npos) + throw ReadExceptionMessage("No closing tag found."); +} +//===========================================================lecture commentaire======================================================== +Parser::jumpComment(ifstream& file){ + tag tmp; + file>>ws; + //TODO getLine(file,tmp); + //si on a pas de balise fermante (ici il devrait il y en avoir normalement une) alors on lance une exception + found=tmp.find("-->"); + if(found() == string::npos) + throw ReadExceptionMessage("No closing tag for comment found."); + +} + }//namespace diff --git a/src/main/Parser.h b/src/main/Parser.h index 85460c9..a0d5103 100644 --- a/src/main/Parser.h +++ b/src/main/Parser.h @@ -6,37 +6,71 @@ */ #include <iostream> #include <string> -#include <vector> -#include <ifstream> -#include <ofstream> -#include "Accelerator.h" +#include <fstream> #include "Vector3D.h" +#include "Accelerator.h" +#include "Dipole.h" +#include "FODO.h" +#include "Quadrupole.h" +#include "StraightElement.h" +#include "Particle.h" #include "exceptions.h" #ifndef PARSER_H_ #define PARSER_H_ -namespace vhc { - - typedef tag string; typedef tagStat static tag; +namespace vhc { + +/** Cette classe contient une méthode <code>extract<\code> chargée de créer et renvoyer un pointeur + * sur l'accélérateur contenu dans le .xml. <b>ATTENTION : cette méthode est une "factory method", + * donc il faut soi-même ajouter le <code>delete<\code> après appel à <code>extract<\code> !<\b> + * Sont à supprimer : les pointeurs sur chaque particule, element ou accelerateur contenu dans le .xml + **/ + class Parser { public: - Parser(string); - virtual ~Parser(){} - Accelerator* extract(string); + Parser(); + + /** Constructeur d'un Parseur. Prend en argument le chemin d'accès du fichier à lire. **/ + Parser(std::string file); + + /**Destructeur virtuel. **/ + virtual ~Parser(); + + /** Méthode chargée de lire le fichier .xml et de renvoyer un pointeur sur l'accélérateur ainsi construit. **/ + Accelerator* extract(); private: + + /** Attribut contenant le chemin d'accès du fichier. **/ string nameOfFile; + +//===========================================constantes================================================================================= + + const double CP; + const double EP; + const double PROTON_MASSP; + const double ELECTRON_MASSP; + const double GeVP = 1E9 * EP; + //===========================================balises ouvrantes========================================================================== - //balises ouvrantes d'un système + /** Balises ouvrantes d'un système. **/ tagStat system; tagStat accelerator; tagStat comment; - //balises ouvrantes d'une particule + /** Balises ouvrantes des constantes. **/ + tagStat constants; + tagStat dt; + tagStat C; + tagStat E; + tagStat PROTON_MASS; + tagStat ELECTRON_MASS; + + /** Balises ouvrantes d'une particule. **/ tagStat particle; tagStat position; tagStat mass; @@ -44,37 +78,45 @@ private: tagStat energy; tagStat direction; - //balises ouvrantes d'un Element + /** Balises ouvrantes d'un Element. **/ tagStat entryPos; tagStat exitPos; tagStat sectionRadius; - //balises ouvrantes d'un dipole + /** Balises ouvrantes d'un dipole. **/ tagStat dipole; tagStat curvature; tagStat magneticField; - //balise ouvrantes commune aux quadrupoles et aux fodo + /** Balise ouvrantes commune aux quadrupoles et aux fodo. **/ tagStat focCoeff; - //balises ouvrantes d'une FODO + /** Balises ouvrantes d'une FODO. **/ tagStat fodo; tagStat straightLength; - //balises ouvrante d'un quadrupole + /** Balises ouvrante d'un quadrupole. **/ tagStat quadrupole; - //balises ouvrantes d'une straightElement + /** Balises ouvrantes d'une straightElement. **/ tagStat straightElement; //===================================================balises fermantes================================================================== - //balises fermantes d'un système + /** Balises fermantes d'un système. **/ tagStat systemCl; tagStat acceleratorCl; tagStat commentCl; - //balises fermantes d'une particule + /** Balises fermantes des constantes. **/ + tagStat constantsCl; + tagStat dtCl; + tagStat CCl; + tagStat ECl; + tagStat PROTON_MASSCl; + tagStat ELECTRON_MASSCl; + + /** Balises fermantes d'une particule. **/ tagStat particleCl; tagStat positionCl; tagStat massCl; @@ -82,47 +124,93 @@ private: tagStat energyCl; tagStat directionCl; - //balises fermantes d'un Element + /** Balises fermantes d'un Element. **/ tagStat entryPosCl; tagStat exitPosCl; tagStat sectionRadiusCl; - //balises fermantes d'un dipole + /** Balises fermantes d'un dipole. **/ tagStat dipoleCl; tagStat curvatureCl; tagStat magneticFieldCl; - //balise fermantes commune aux quadrupoles et aux fodo + /** Balise fermantes commune aux quadrupoles et aux fodo. **/ tagStat focCoeffCl; - //balises fermantes d'une FODO + /** Balises fermantes d'une FODO. **/ tagStat fodoCl; tagStat straightLengthCl; - //balises fermantes d'un quadrupole + /** Balises fermantes d'un quadrupole. **/ tagStat quadrupoleCl; - //balises fermantes d'une straightElement + /** Balises fermantes d'une straightElement. **/ tagStat straightElementCl; -//======================================================autres méthodes================================================================= +//=============================================================méthodes================================================================= - //méthodes de lectures génériques - string readFile(ifstream& file); + /** Crée et renvoie un accélérateur par appel de la fonction readFile. **/ + Accelerator* extract(); - //méthodes gestion balises - tag readOpeningBalise(ifstream& file); - tag readClosingBalise(ifstream& file); - tag findNextBalise(ifstream& file); + /** Lit le fichier .xml. **/ + void readFile(ifstream& file, Accelerator& acc); - //méthode pour commentaire - void jumpComment(ifstream& file); + /** Lit la balise system. Cette méthode appelle readConstants et buildAccelerator. **/ + void readSystem(ifstream& file, Accelerator& acc); + + /** Affecte les attributs statiques contenant les constantes physiques. **/ + void readConstants(ifstream& file); + + /** Affecte l'attribut dt. **/ + void readdt(ifstream& file); + + /** Affecte l'attribut C. **/ + void readC(ifstream& file); + + /** Affecte l'attribut E. **/ + void readE(ifstream& file); + + /** Affecte l'attribut PROTON_MASS. **/ + void readPROTON_MASS(ifstream& file); + + /** Affecte l'attribut ELECTRON_MASS. **/ + void readELECTRON_MASS(ifstream& file); - //méthodes atomiques de lecture + /** Ajoute les différents éléments et particules du fichier dans l'Accelerator passé en argument. **/ + void buildAccelerator(ifstream& file, Accelerator const& acc); + + /** Construction d'une nouvelle Particle. **/ + Particle* buildParticle(ifstream& file); + + /** Construction d'une nouvelle FODO. **/ + FODO* buildFODO(ifstream& file); + + /** Construction d'un nouveau Dipole. **/ + Dipole* buildDipole(ifstream& file); + + /** Construction d'un nouveau quadrupole. **/ + Quadrupole* buildQuadrupole(ifstream& file); + + /** Construction d'un nouveau StraightElement. **/ + StraightElement* buildStraightElement(ifstream& file); + + /** Lit un char. **/ char readOneChar(ifstream& file); + /** Lit un int. **/ int readOneInt(ifstream& file); + /** Lit un double. **/ double readOneDouble(ifstream& file); - Vector3D readOnePosition(ifstream& file); + /** Saute une virgule. **/ + void readComma(ifstream& file); + + /** Lit un Vector3D. **/ + Vector3D readVector3D(ifstream& file); + /** Lit ue balise. **/ + tag readOneTag(ifstream& file); + /** Cherche et lit une balise fermante. **/ + void closingTag(ifstream& file); + /** Saute un commentaire. **/ + void jumpComment(ifstream& file); }; diff --git a/src/main/simulation.xml b/src/main/simulation.xml index c70f26e..24d1b79 100644 --- a/src/main/simulation.xml +++ b/src/main/simulation.xml @@ -1,32 +1,39 @@ <System> - <Particle> - <Position> - 3.01,0,0 - <\Position> - <Mass> - 1 - <\Mass> - <!-- ICI PAR RAPPORT A LA MASSE DU PROTON --> - <Charge> - 1 - <\Charge> - <!-- ICI PAR RAPPORT A LA CHARGE DE L'ELECTRON --> - <Energy> - 2 - <\Energy> - <!-- ICI PAR RAPPORT A UN GeV --> - <Direction> - 0,-1,0 - <\Direction> - <\Particle> - <Particle> - <Position>2.99,0,0<\Position> - <Mass>1<\Mass><!-- ICI PAR RAPPORT A LA MASSE DU PROTON --> - <Charge>1<\Charge><!-- ICI PAR RAPPORT A LA CHARGE DE L'ELECTRON --> - <Energy>2<\Energy><!-- ICI PAR RAPPORT A UN GeV --> - <Direction>0,-1,0<\Direction> - <\Particle> + <constants> + <dt>10E-11<\dt> + <C>299792458.0<\C> + <E>1.60217653E-19<\E> + <PROTON_MASS>1.672623E-27<\PROTON_MASS> + <ELECTRON_MASS>9.109383E-31<\ELECTRON_MASS> + <\constants> <Accelerator> + <Particle> + <Position> + 3.01,0,0 + <\Position> + <Mass> + 1 + <\Mass> + <!-- ICI PAR RAPPORT A LA MASSE DU PROTON --> + <Charge> + 1 + <\Charge> + <!-- ICI PAR RAPPORT A LA CHARGE DE L'ELECTRON --> + <Energy> + 2 + <\Energy> + <!-- ICI PAR RAPPORT A UN GeV --> + <Direction> + 0,-1,0 + <\Direction> + <\Particle> + <Particle> + <Position>2.99,0,0<\Position> + <Mass>1<\Mass><!-- ICI PAR RAPPORT A LA MASSE DU PROTON --> + <Charge>1<\Charge><!-- ICI PAR RAPPORT A LA CHARGE DE L'ELECTRON --> + <Energy>2<\Energy><!-- ICI PAR RAPPORT A UN GeV --> + <Direction>0,-1,0<\Direction> + <\Particle> <FODO> <EntryPosition>3,2,0<\EntryPosition> <ExitPosition>3,-2,0<\ExitPosition> |