From 1f6a3a16a53342e3885d1d16198bbe18aa1383ab Mon Sep 17 00:00:00 2001 From: Christian Vazquez Date: Fri, 27 May 2011 17:14:52 +0000 Subject: Mis à jour la classe parceur et le fichier xml. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/Parser.cc | 517 +++++++++++++++++++++++++++++++++++++----------- src/main/Parser.h | 162 +++++++++++---- src/main/simulation.xml | 61 +++--- 3 files changed, 560 insertions(+), 180 deletions(-) (limited to 'src') 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 = ""; tagStat Parser::accelerator =""; tagStat Parser::comment = "<--"; +//balises ouvrantes des constantes +tagStat Parser::constants = ""; +tagStat Parser::dt = "
"; +tagStat Parser::C = ""; +tagStat Parser::E = ""; +tagStat Parser::PROTON_MASS = ""; +tagStat Parser::ELECTRON_MASS = ""; + //balises ouvrantes d'une particule tagStat Parser::particle =""; tagStat Parser::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<> 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<>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 #include -#include -#include -#include -#include "Accelerator.h" +#include #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 extract<\code> chargée de créer et renvoyer un pointeur + * sur l'accélérateur contenu dans le .xml. ATTENTION : cette méthode est une "factory method", + * donc il faut soi-même ajouter le delete<\code> après appel à 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 @@ - - - 3.01,0,0 - <\Position> - - 1 - <\Mass> - - - 1 - <\Charge> - - - 2 - <\Energy> - - - 0,-1,0 - <\Direction> - <\Particle> - - 2.99,0,0<\Position> - 1<\Mass> - 1<\Charge> - 2<\Energy> - 0,-1,0<\Direction> - <\Particle> + +
10E-11<\dt> + 299792458.0<\C> + 1.60217653E-19<\E> + 1.672623E-27<\PROTON_MASS> + 9.109383E-31<\ELECTRON_MASS> + <\constants> + + + 3.01,0,0 + <\Position> + + 1 + <\Mass> + + + 1 + <\Charge> + + + 2 + <\Energy> + + + 0,-1,0 + <\Direction> + <\Particle> + + 2.99,0,0<\Position> + 1<\Mass> + 1<\Charge> + 2<\Energy> + 0,-1,0<\Direction> + <\Particle> 3,2,0<\EntryPosition> 3,-2,0<\ExitPosition> -- cgit v1.2.3