diff options
-rw-r--r-- | src/main/Parser.cc | 651 | ||||
-rw-r--r-- | src/main/Parser.h | 278 | ||||
-rw-r--r-- | src/main/simulation.cc | 0 | ||||
-rw-r--r-- | src/main/simulation.xml | 194 | ||||
-rw-r--r-- | src/test/simulationTest.cc | 32 |
5 files changed, 730 insertions, 425 deletions
diff --git a/src/main/Parser.cc b/src/main/Parser.cc index 0aed354..0331c4c 100644 --- a/src/main/Parser.cc +++ b/src/main/Parser.cc @@ -4,115 +4,94 @@ * Created on: 11 mai 2011 * Author: christian */ +#include <isotream> +#include <string> #include "Parser.h" -//TODO balises fermantes et header et constantes et commentaires???????? +using namespace std; namespace vhc { -/** Cf. header.**/ -Parser::Parser(): nameOfFile("") {}; - -Parser::Parser(std::string file): nameOfFile(file) {}; - -Parser::~Parser() {}; - //===========================================balises ouvrantes========================================================================== //balises ouvrantes d'un système -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>"; +static tag Parser::system = "<System>"; +static tag Parser::accelerator ="<Accelerator>"; +static tag Parser::comment = "<!--"; //balises ouvrantes d'une particule -tagStat Parser::particle ="<Particle>"; -tagStat Parser::position = "<Position>"; -tagStat Parser::mass = "<Mass>"; -tagStat Parser::charge = "<Charge>"; -tagStat Parser::energy = "<Energy>"; -tagStat Parser::direction = "<Direction>"; +static tag Parser::particle ="<Particle>"; +static tag Parser::position = "<Position>"; +static tag Parser::mass = "<Mass>"; +static tag Parser::charge = "<Charge>"; +static tag Parser::energy = "<Energy>"; +static tag Parser::direction = "<Direction>"; //balises ouvrantes d'un Element -tagStat Parser::entryPos = "<EntryPosition>"; -tagStat Parser::exitPos = "<ExitPosition>"; -tagStat Parser::sectionRadius = "<SectionRadius>"; +static tag Parser::entryPos = "<EntryPosition>"; +static tag Parser::exitPos = "<ExitPosition>"; +static tag Parser::sectionRadius = "<SectionRadius>"; //balises ouvrantes d'un Dipole -tagStat Parser::dipole ="<Dipole>"; -tagStat Parser::curvature = "<Curvature>"; -tagStat Parser::magneticField = "<MagneticField>"; +static tag Parser::dipole ="<Dipole>"; +static tag Parser::curvature = "<Curvature>"; +static tag Parser::magneticField = "<MagneticField>"; //balise ouvrante commune aux quadrupoles et aux fodo -tagStat Parser::focCoeff = "<FocalizingCoefficient>"; +static tag Parser::focCoeff = "<FocalizingCoefficient>"; //balises ouvrantes d'une FODO -tagStat Parser::fodo ="<FODO>"; -tagStat Parser::straightLength = "<StraightLenght>"; +static tag Parser::fodo ="<FODO>"; +static tag Parser::straightLength = "<StraightLenght>"; //balises ouvrantes d'un Quadrupole -tagStat Parser::quadrupole ="<Quadrupole>"; +static tag Parser::quadrupole ="<Quadrupole>"; //balises ouvrantes d'un StraightElement -tagStat Parser::straightElement ="<StraightElement>"; +static tag Parser::straightElement ="<StraightElement>"; //===================================================balises fermantes================================================================== //balises fermantes d'un système -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>"; +static tag Parser::systemCl = "<\System>"; +static tag Parser::acceleratorCl ="<\Accelerator>"; +static tag Parser::commentCl = "-->"; //balises fermantes d'une particule -tagStat Parser::particleCl ="<\Particle>"; -tagStat Parser::positionCl = "<\Position>"; -tagStat Parser::massCl = "<\Mass>"; -tagStat Parser::chargeCl = "<\Charge>"; -tagStat Parser::energyCl = "<\Energy>"; -tagStat Parser::directionCl = "<\Direction>"; +static tag Parser::particleCl ="<\Particle>"; +static tag Parser::positionCl = "<\Position>"; +static tag Parser::massCl = "<\Mass>"; +static tag Parser::chargeCl = "<\Charge>"; +static tag Parser::energyCl = "<\Energy>"; +static tag Parser::directionCl = "<\Direction>"; //balises fermantes d'un Element -tagStat Parser::entryPosCl = "<\EntryPosition>"; -tagStat Parser::exitPosCl = "<\ExitPosition>"; -tagStat Parser::sectionRadiusCl = "<\SectionRadius>"; +static tag Parser::entryPosCl = "<\EntryPosition>"; +static tag Parser::exitPosCl = "<\ExitPosition>"; +static tag Parser::sectionRadiusCl = "<\SectionRadius>"; //balises fermantes d'un Dipole -tagStat Parser::dipoleCl ="<\Dipole>"; -tagStat Parser::curvatureCl = "<\Curvature>"; -tagStat Parser::magneticFieldCl = "<\MagneticField"; +static tag Parser::dipoleCl ="<\Dipole>"; +static tag Parser::curvatureCl = "<\Curvature>"; +static tag Parser::magneticFieldCl = "<\MagneticField"; //balise fermantes commune aux quadrupoles et aux fodo -tagStat Parser::focCoeffCl = "<\FocalizingCoefficient>"; +static tag Parser::focCoeffCl = "<\FocalizingCoefficient>"; //balises fermantes d'une FODO -tagStat Parser::fodoCl ="<\FODO>"; -tagStat Parser::straightLengthCl = "<\StraightLenght>"; +static tag Parser::fodoCl ="<\FODO>"; +static tag Parser::straightLengthCl = "<\StraightLenght>"; //balises fermantes d'un Quadrupole -tagStat Parser::quadrupoleCl ="<\Quadrupole>"; +static tag Parser::quadrupoleCl ="<\Quadrupole>"; //balises fermantes d'un StraightElement -tagStat Parser::straightElementCl ="<\StraightElement>"; +static tag Parser::straightElementCl ="<\StraightElement>"; //===========================================================création et renvoi d'un accélérateur======================================= Parser::extract() { - Accelerator* acc; + Accelerator* acc = new Accelerator; //on déclare une flot d'entrée ifstream entry; @@ -137,6 +116,7 @@ Parser::extract() { throw IOException("Cannot open file. "+nameOfFile+" not found."); } + acc->close(); return acc; } @@ -157,6 +137,7 @@ Parser::readFile(ifstream& file, Accelerator& acc){ case system : readSystem(file, acc); + closingTag(file, systemCl); break; case comment : @@ -177,7 +158,7 @@ Parser::readFile(ifstream& file, Accelerator& acc){ } catch(Exception const& ex){ - std::cout<<ex.getMessage()<<std::endl; + cout<<ex.getMessage()<<endl; } } @@ -190,18 +171,12 @@ Parser::readSystem(ifstream& file, Accelerator& acc){ tag tmp2 = readOneTag(file); /*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){ - case constants : - - readConstants(file); - break; - case accelerator : buildAccelerator(file, acc); @@ -218,105 +193,26 @@ Parser::readSystem(ifstream& file, Accelerator& acc){ */ default: - throw ReadException("Values found outside of following tags : "+constants+accelerator+ + throw ReadException("Values found outside of following tags : "+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; + cout<<ex.getMessage()<<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); -} - -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){ +Parser::buildAccelerator(ifstream& file, Accelerator& acc){ try { // on lit la balise qu'on doit traiter - tag tmp32 = readOneTag(file); + tag tmp3 = readOneTag(file); - /*on teste si tmp32 correspond à une des balises suivantes : + /*on teste si tmp3 correspond à une des balises suivantes : * - soit dipole * - soit fodo * - soit particle @@ -325,60 +221,87 @@ Parser::buildAccelerator(ifstream& file, Accelerator const& acc){ * - soit un commentaire * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là */ - switch(tmp32){ + switch(tmp3){ case dipole : - acc.add(buildDipole(file)); - break; + acc.add(*buildDipole(file)); + readClosingTag(file, dipoleCl); + tmp3 = readOneTag(file); + if(tmp3 == acceleratorCl) + break; + else + continue; case fodo : - acc.add(buildFODO(file)); - break; + acc.add(*buildFODO(file)); + readClosingTag(file, fodoCl); + tmp3 = readOneTag(file); + if(tmp3 == acceleratorCl) + break; + else + continue; case particle : - Particle* p = new Particle; - acc.add(buildParticle(file,*pa)); - break; + acc.add(*buildParticle(file)); + readClosingTag(file, particleCl); + tmp3 = readOneTag(file); + if(tmp3 == acceleratorCl) + break; + else + continue;; case quadrupole : - acc.add(buildQuadrupole(file)); - break; + acc.add(*buildQuadrupole(file)); + readClosingTag(file, quadrupoleCl); + tmp3 = readOneTag(file); + if(tmp3 == acceleratorCl) + break; + else + continue; case straightElement : - acc.add(buildStraightElement(file)); - break; + acc.add(*buildStraightElement(file)); + readClosingTag(file, straightElementCl); + tmp3 = readOneTag(file); + if(tmp3 == acceleratorCl) + break; + else + continue; case comment : 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) + /* si la variable tmp3 ne contient pas les balises voulues, c'est qu'une valeur + * (celle contenue par la variable tmp3 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); + "\n Value is : "+tmp3); break; }//switch }//try catch(Exception const& ex){ - std::cout<<ex.getMessage()<<std::endl; + cout<<ex.getMessage()<<endl; } } -//===========================================================construction d'une nouvelle particule====================================== -Parser::buildParticle(ifstream& file, Particle const& p){ +//===========================================================création d'une particule=================================================== +Particle* Parser::buildParticle(ifstream& file){ try { + //Initialisation des variables nécessaires à la construction d'une particule. + Vector3D po(0,0,0); double ma(0); double ch(0); double en(0); Vector3D dir(0,0,0); + // on lit la balise qu'on doit traiter tag tmp41 = readOneTag(file); @@ -395,27 +318,32 @@ Parser::buildParticle(ifstream& file, Particle const& p){ case position : - p.setPosition(readPosition(file)); + po = readVector3D(file); + closingTag(file, positionCl); break; case mass : - p.setMass(readMass(file)); + ma = readOneDouble(file); + closingTag(file, massCl); break; case charge : - p.setCharge(readCharge(file)); + ch = readOneDouble(file); + closingTag(file, chargeCl); break; case energy : - p.setEnergy(readEnergy(file));//TODO faire un set Energy!!!!! + en = readOneDouble(file); + closingTag(file, energyCl); break; case direction : - acc.add(buildStraightElement(file)); + dir = readVector3D(file); + closingTag(file, directionCl); break; case comment : @@ -429,83 +357,346 @@ Parser::buildParticle(ifstream& file, Particle const& p){ */ default: - throw ReadException("Values found outside of following tags : "+dipole+fodo+particle+quadrupole+straightElement+ + throw ReadException("Values found outside of following tags : "+position+mass+charge+energy+direction+ "\n Value is : "+tmp41); break; }//switch + + //Construction d'une particule avec les varables récoltées. + Particle* p = new Particle(po, + ma * constants::PROTON_MASS, + ch * constants::E, + en * constants::GeV, + dir); + + return p; + }//try catch(Exception const& ex){ - std::cout<<ex.getMessage()<<std::endl; + cout<<ex.getMessage()<<endl; } } -Parser::readPosition(ifstream& file){ +//===========================================================création d'un Dipole======================================================= +/** Cf. header. */ +Diple* Parser::buildDipole(ifstream& file){ + try { -} + //Initialsation des variables nécessaires à la construction d'un Dipole. + Vector3D enp(0,0,0); Vector3D exp(0,0,0); double sr(0); double cu(0); Vector3D mf(0,0,0); -Parser::readMass(ifstream& file){ + // on lit la balise qu'on doit traiter + tag tmp42 = readOneTag(file); + + /*on teste si tmp42 correspond à une des balises suivantes : + * - soit entryPos + * - soit exitPos + * - soit sectionRadius + * - soit curvature + * - soit magneticField + * - soit un commentaire + * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là + */ + switch(tmp42){ -} + case entryPos : -Parser::readCharge(ifstream& file){ + enp = readVector3D(file); + closingTag(file, entryPosCl); + break; -} + case exitPos : -Parser::readEnergy(ifstream& file){ + exp = readVector3D(file); + closingTag(file, exitPosCl); + break; -} + case sectionRadius : -Parser::readDirection(ifstream& file){ + sr = readOneDouble(file); + closingTag(file, sectionRadiusCl); + break; -} + case curvature : -//===========================================================construction d'une nouvelle FODO=========================================== -Parser::buildFODO(ifstream& file){ + cu = readOneDouble(file); + closingTag(file, curvatureCl); + break; -} + case magneticField : + + mf = readVector3D(file); + closingTag(file, magneticFieldCl); + break; + + case comment : + + jumpComment(file); + break; -//===========================================================construction d'un nouveau Dipole=========================================== -Parser::buildDipole(ifstream& file){ + /* si la variable tmp42 ne contient pas les balises voulues, c'est qu'une valeur + * (celle contenue par la variable tmp42 donc) + * n'a pas été récupérée comme il faut. + */ + default: + + throw ReadException("Values found outside of following tags : "+entryPos+exitPos+sectionRadius+curvature+magneticField+ + "\n Value is : "+tmp42); + break; + }//switch + //Construction d'un dipole avec les variables récoltées. + Dipole* di = new Dipole(enp, exp, sr, cu, mf); + + return di; + + }//try + + catch(Exception const& ex){ + cout<<ex.getMessage()<<endl; + } } -//============================================================construction d'un nouveau quadrupole====================================== -Parser::buildQuadrupole(ifstream& file){ +//===========================================================modification d'une FODO==================================================== +/** Cf. header. */ +FODO* Parser::buildFODO(ifstream& file){ + try { + + //Initialsation des variables nécessaires à la construction d'une FODO. + Vector3D enp(0,0,0); Vector3D exp(0,0,0); double sr(0); double sl(0); double fc(0); + + // on lit la balise qu'on doit traiter + tag tmp43 = readOneTag(file); + + /*on teste si tmp43 correspond à une des balises suivantes : + * - soit entryPos + * - soit exitPos + * - soit sectionRadius + * - soit straightLength + * - soit focCoeff + * - soit un commentaire + * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là + */ + switch(tmp43){ + + case entryPos : + + enp = readVector3D(file); + closingTag(file, entryPosCl); + break; + + case exitPos : + + exp = readVector3D(file); + closingTag(file, exitPosCl); + break; + + case sectionRadius : + + sr = readOneDouble(file); + closingTag(file, sectionRadiusCl); + break; + + case straightLength : + + sl = readOneDouble(file); + closingTag(file, straightLengthCl); + break; + + case focCoeff : + + fc = readOneDouble(file); + closingTag(file, focCoeffCl); + break; + case comment : + + jumpComment(file); + break; + + /* si la variable tmp43 ne contient pas les balises voulues, c'est qu'une valeur + * (celle contenue par la variable tmp43 donc) + * n'a pas été récupérée comme il faut. + */ + default: + + throw ReadException("Values found outside of following tags : "+entryPos+exitPos+sectionRadius+straightLength+focCoeff+ + "\n Value is : "+tmp43); + break; + }//switch + + //Construction d'une FODO avec les variables récoltées. + FODO* fo = new FODO(enp, exp, sr, sl, fc); + + return fo; + + }//try + + catch(Exception const& ex){ + cout<<ex.getMessage()<<endl; + } } -//============================================================construction d'un nouveau straight Element================================ -Parser::buildStraightElement(ifstream& file){ +//============================================================création d'un quadrupole================================================== +/** Cf. header. */ +Quadrupole* Parser::buildQuadrupole(ifstream& file){ + try { + + //Initialsation des variables nécessaires à la construction d'un Quadrupole. + Vector3D enp(0,0,0); Vector3D exp(0,0,0); double sr(0); double fc(0); + + // on lit la balise qu'on doit traiter + tag tmp44 = readOneTag(file); + + /*on teste si tmp44 correspond à une des balises suivantes : + * - soit entryPos + * - soit exitPos + * - soit sectionRadius + * - soit focCoeff + * - soit un commentaire + * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là + */ + switch(tmp44){ + + case entryPos : + + enp = readVector3D(file); + closingTag(file, entryPosCl); + break; + + case exitPos : + + exp = readVector3D(file); + closingTag(file, exitPosCl); + break; + + case sectionRadius : + + sr = readOneDouble(file); + closingTag(file, sectionRadiusCl); + break; + + case focCoeff : + + fc = readOneDouble(file); + closingTag(file, focCoeffCl); + break; + + case comment : + + jumpComment(file); + break; + + /* si la variable tmp44 ne contient pas les balises voulues, c'est qu'une valeur + * (celle contenue par la variable tmp44 donc) + * n'a pas été récupérée comme il faut. + */ + default: + + throw ReadException("Values found outside of following tags : "+entryPos+exitPos+sectionRadius+focCoeff+ + "\n Value is : "+tmp44); + break; + }//switch + + //Construction d'un Quadrupole avec les variables récoltées. + Quadrupole* qu = new Quadrupole(enp, exp, sr, fc); + + return qu; + + }//try + + catch(Exception const& ex){ + cout<<ex.getMessage()<<endl; + } } +//============================================================création d'un StraightElement============================================= +/** Cf. header. */ +StraightElement* Parser::buildStraightElement(ifstream& file){ + try { + + //Initialsation des variables nécessaires à la construction d'un StraightElement. + Vector3D enp(0,0,0); Vector3D exp(0,0,0); double sr(0); + + // on lit la balise qu'on doit traiter + tag tmp45 = readOneTag(file); + + /*on teste si tmp45 correspond à une des balises suivantes : + * - soit entryPos + * - soit exitPos + * - soit sectionRadius + * - soit un commentaire + * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là + */ + switch(tmp45){ + + case entryPos : + + enp = readVector3D(file); + closingTag(file, entryPosCl); + break; + + case exitPos : + + exp = readVector3D(file); + closingTag(file, exitPosCl); + break; + + case sectionRadius : + + sr = readOneDouble(file); + closingTag(file, sectionRadiusCl); + break; + + case comment : + + jumpComment(file); + break; + + /* si la variable tmp45 ne contient pas les balises voulues, c'est qu'une valeur + * (celle contenue par la variable tmp45 donc) + * n'a pas été récupérée comme il faut. + */ + default: + + throw ReadException("Values found outside of following tags : "+entryPos+exitPos+sectionRadius+ + "\n Value is : "+tmp45); + break; + }//switch + + //Construction d'un StraightElement avec les variables récoltées. + StraightElement* se = new StraightElement(enp, exp, sr); + + return se; + + }//try + + catch(Exception const& ex){ + cout<<ex.getMessage()<<endl; + } + //=======================================================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){ + +/** Cf. header. */ +double Parser::readOneDouble(ifstream& file){ file>>ws; double tmp; file>>tmp; return tmp; } -Parser::readComma(ifstream& file){ + +/** Cf. header. */ +void Parser::readComma(ifstream& file){ char trash; file>>ws; file>>trash; } + //===========================================================lecture moléculaire======================================================== -Parser::readVector3D(ifstream& file){ +/** Cf. header. */ +Vector3D Parser::readVector3D(ifstream& file){ double x = readOneDouble(file); readComma(file); @@ -516,28 +707,38 @@ Parser::readVector3D(ifstream& file){ return Vector3D(x,y,z); } -Parser::readOneTag(ifstream& file){ + +/** Cf. header. */ +tag Parser::readOneTag(ifstream& file){ tag tmp; + file>>ws; file>>tag; return tmp; } -Parser::closingTag(ifstream& file){ + +/** Cf. header. */ +void Parser::closingTag(ifstream& file, std::string ta){ 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("<"); + found=tmp.find(ta); if(found() == string::npos) - throw ReadExceptionMessage("No closing tag found."); + throw ReadExceptionMessage("No closing tag "+ta+" found."); } //===========================================================lecture commentaire======================================================== -Parser::jumpComment(ifstream& file){ +/**Cf. header. */ +void 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) + + do{ + file>>ws; + file>>tmp; + found=tmp.find("-->"); + } + while(found() == string::npos); + + if(file.eof()) throw ReadExceptionMessage("No closing tag for comment found."); } diff --git a/src/main/Parser.h b/src/main/Parser.h index a0d5103..12ff5a5 100644 --- a/src/main/Parser.h +++ b/src/main/Parser.h @@ -4,9 +4,13 @@ * Created on: 11 mai 2011 * Author: christian */ +#ifndef PARSER_H_ +#define PARSER_H_ + #include <iostream> #include <string> #include <fstream> +#include <math.h> #include "Vector3D.h" #include "Accelerator.h" #include "Dipole.h" @@ -16,203 +20,185 @@ #include "Particle.h" #include "exceptions.h" -#ifndef PARSER_H_ -#define PARSER_H_ +using namespace std; -typedef tag string; -typedef tagStat static tag; +typedef string 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 - **/ +/** Classe permettant l'extraction d'un Accelerator depuis un fichier .xml. + * 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<\b>: cette méthode est une "factory method", + * donc il faut soi-même ajouter les <code>delete<\code> après appel à <code>extract()<\code> ! + * Sont à supprimer : les pointeurs sur chaque Particle, Element ou Accelerateur contenu dans le .xml + */ class Parser { public: - Parser(); - /** Constructeur d'un Parseur. Prend en argument le chemin d'accès du fichier à lire. **/ - Parser(std::string file); + /** Constructeur d'un Parseur. + * @param file chemin d'accès du fichier à lire */ + inline Parser(std::string file) + : nameOfFile(file) + {} - /**Destructeur virtuel. **/ - virtual ~Parser(); + /**Destructeur virtuel. */ + inline virtual ~Parser() {} - /** Méthode chargée de lire le fichier .xml et de renvoyer un pointeur sur l'accélérateur ainsi construit. **/ + /** Méthode chargée de lire le fichier .xml (lance une exception si le fichier n'est pas valide), + * de créer et renvoyer un accélérateur par appel de fonction privées. + * @return Accelerator construit avec les données récoltées dans le fichier .xml */ Accelerator* extract(); -private: - /** Attribut contenant le chemin d'accès du fichier. **/ - string nameOfFile; +protected: -//===========================================constantes================================================================================= + /** Contient le chemin d'accès du fichier à lire. */ + string nameOfFile; - const double CP; - const double EP; - const double PROTON_MASSP; - const double ELECTRON_MASSP; - const double GeVP = 1E9 * EP; +private: //===========================================balises ouvrantes========================================================================== - /** Balises ouvrantes d'un système. **/ - tagStat system; - tagStat accelerator; - tagStat comment; - - /** 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; - tagStat charge; - tagStat energy; - tagStat direction; - - /** Balises ouvrantes d'un Element. **/ - tagStat entryPos; - tagStat exitPos; - tagStat sectionRadius; - - /** Balises ouvrantes d'un dipole. **/ - tagStat dipole; - tagStat curvature; - tagStat magneticField; - - /** Balise ouvrantes commune aux quadrupoles et aux fodo. **/ - tagStat focCoeff; - - /** Balises ouvrantes d'une FODO. **/ - tagStat fodo; - tagStat straightLength; - - /** Balises ouvrante d'un quadrupole. **/ - tagStat quadrupole; - - /** Balises ouvrantes d'une straightElement. **/ - tagStat straightElement; + /** Balises ouvrantes d'un système. + * On ne peut pas y spécifier des constantes, car elle font partie d'un namespace. */ + static tag system; + static tag accelerator; + static tag comment; + + /** Balises ouvrantes d'une particule. */ + static tag particle; + static tag position; + static tag mass; + static tag charge; + static tag energy; + static tag direction; + + /** Balises ouvrantes d'un Element. */ + static tag entryPos; + static tag exitPos; + static tag sectionRadius; + + /** Balises ouvrantes d'un dipole. */ + static tag dipole; + static tag curvature; + static tag magneticField; + + /** Balise ouvrantes commune aux quadrupoles et aux fodo. */ + static tag focCoeff; + + /** Balises ouvrantes d'une FODO. */ + static tag fodo; + static tag straightLength; + + /** Balises ouvrante d'un quadrupole. */ + static tag quadrupole; + + /** Balises ouvrantes d'une straightElement. */ + static tag straightElement; //===================================================balises fermantes================================================================== - /** Balises fermantes d'un système. **/ - tagStat systemCl; - tagStat acceleratorCl; - tagStat commentCl; - - /** 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; - tagStat chargeCl; - tagStat energyCl; - tagStat directionCl; - - /** Balises fermantes d'un Element. **/ - tagStat entryPosCl; - tagStat exitPosCl; - tagStat sectionRadiusCl; - - /** Balises fermantes d'un dipole. **/ - tagStat dipoleCl; - tagStat curvatureCl; - tagStat magneticFieldCl; - - /** Balise fermantes commune aux quadrupoles et aux fodo. **/ - tagStat focCoeffCl; - - /** Balises fermantes d'une FODO. **/ - tagStat fodoCl; - tagStat straightLengthCl; - - /** Balises fermantes d'un quadrupole. **/ - tagStat quadrupoleCl; - - /** Balises fermantes d'une straightElement. **/ - tagStat straightElementCl; + /** Balises fermantes d'un système. */ + static tag systemCl; + static tag acceleratorCl; + static tag commentCl; -//=============================================================méthodes================================================================= + /** Balises fermantes d'une Particle. */ + static tag particleCl; + static tag positionCl; + static tag massCl; + static tag chargeCl; + static tag energyCl; + static tag directionCl; - /** Crée et renvoie un accélérateur par appel de la fonction readFile. **/ - Accelerator* extract(); + /** Balises fermantes d'un Element. */ + static tag entryPosCl; + static tag exitPosCl; + static tag sectionRadiusCl; - /** Lit le fichier .xml. **/ - void readFile(ifstream& file, Accelerator& acc); + /** Balises fermantes d'un dipole. */ + static tag dipoleCl; + static tag curvatureCl; + static tag magneticFieldCl; - /** Lit la balise system. Cette méthode appelle readConstants et buildAccelerator. **/ - void readSystem(ifstream& file, Accelerator& acc); + /** Balise fermantes commune aux quadrupoles et aux fodo. */ + static tag focCoeffCl; - /** Affecte les attributs statiques contenant les constantes physiques. **/ - void readConstants(ifstream& file); + /** Balises fermantes d'une FODO. */ + static tag fodoCl; + static tag straightLengthCl; - /** Affecte l'attribut dt. **/ - void readdt(ifstream& file); + /** Balises fermantes d'un quadrupole. */ + static tag quadrupoleCl; - /** Affecte l'attribut C. **/ - void readC(ifstream& file); + /** Balises fermantes d'une straightElement. */ + static tag straightElementCl; - /** Affecte l'attribut E. **/ - void readE(ifstream& file); +//=============================================================méthodes================================================================= - /** Affecte l'attribut PROTON_MASS. **/ - void readPROTON_MASS(ifstream& file); + /** Lit le fichier .xml. + * @param file fichier à lire + * @param acc référence sur un Accelerator déjà construit */ + void readFile(ifstream& file, Accelerator& acc); - /** Affecte l'attribut ELECTRON_MASS. **/ - void readELECTRON_MASS(ifstream& file); + /** Lit la balise system. Cette méthode appelle readConstants et buildAccelerator. + * @param file fichier à lire + * @param acc référence sur un Accelerator déjà construit */ + void readSystem(ifstream& file, Accelerator& acc); - /** Ajoute les différents éléments et particules du fichier dans l'Accelerator passé en argument. **/ + /** Ajoute les différents éléments et particules du fichier dans l'Accelerator passé en argument. + * @param file fichier à lire + * @param acc référence sur un Accelerator déjà construit */ void buildAccelerator(ifstream& file, Accelerator const& acc); - /** Construction d'une nouvelle Particle. **/ + /** Construction d'une nouvelle Particle. + * @param file fichier à lire + * @return Particle créée avec les valeurs récoltées dans le fichier .xml */ Particle* buildParticle(ifstream& file); - /** Construction d'une nouvelle FODO. **/ + /** Construction d'une nouvelle FODO. + * @param file fichier à lire + * @return FODO créée avec les valeurs récoltées dans le fichier .xml */ FODO* buildFODO(ifstream& file); - /** Construction d'un nouveau Dipole. **/ + /** Construction d'un nouveau Dipole. + * @param file fichier à lire + * @return Dipole créé avec les valeurs récoltées dans le fichier .xml */ Dipole* buildDipole(ifstream& file); - /** Construction d'un nouveau quadrupole. **/ + /** Construction d'un nouveau quadrupole. + * @param file fichier à lire + * @return Quadrupole créé avec les valeurs récoltées dans le fichier .xml */ Quadrupole* buildQuadrupole(ifstream& file); - /** Construction d'un nouveau StraightElement. **/ + /** Construction d'un nouveau StraightElement. + * @param file fichier à lire + * @return StraightElement créé avec les valeurs récoltées dans le fichier .xml */ StraightElement* buildStraightElement(ifstream& file); - /** Lit un char. **/ - char readOneChar(ifstream& file); - /** Lit un int. **/ - int readOneInt(ifstream& file); - /** Lit un double. **/ + /** Lit un double. + * @param file fichier à lire */ double readOneDouble(ifstream& file); - /** Saute une virgule. **/ + /** Saute une virgule. + * @param file fichier à lire*/ void readComma(ifstream& file); - /** Lit un Vector3D. **/ + /** Lit un Vector3D. + * @param file fichier à lire*/ Vector3D readVector3D(ifstream& file); - /** Lit ue balise. **/ + /** Lit ue balise. + * @param file fichier à lire*/ tag readOneTag(ifstream& file); - /** Cherche et lit une balise fermante. **/ - void closingTag(ifstream& file); - /** Saute un commentaire. **/ + /** Cherche et lit une balise fermante contenant à la chaîne de caractère passée en argument. + * @param file fichier à lire + * @param ta contenu de la balise à trouver */ + void closingTag(ifstream& file, std::string ta); + /** Cherche et lit une balise fermante d'un commentaire. + * @param file fichier à lire*/ void jumpComment(ifstream& file); }; } + #endif /* PARSER_H_ */ diff --git a/src/main/simulation.cc b/src/main/simulation.cc deleted file mode 100644 index e69de29..0000000 --- a/src/main/simulation.cc +++ /dev/null diff --git a/src/main/simulation.xml b/src/main/simulation.xml index 24d1b79..61e4173 100644 --- a/src/main/simulation.xml +++ b/src/main/simulation.xml @@ -1,11 +1,4 @@ <System> - <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> @@ -19,76 +12,169 @@ 1 <\Charge> <!-- ICI PAR RAPPORT A LA CHARGE DE L'ELECTRON --> + <Direction> + 0,-1,0 + <\Direction> <Energy> 2 <\Energy> <!-- ICI PAR RAPPORT A UN GeV --> + <\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 --> <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> + <Energy> + 2 + <\Energy> + <!-- ICI PAR RAPPORT A UN GeV --> <\Particle> <FODO> - <EntryPosition>3,2,0<\EntryPosition> - <ExitPosition>3,-2,0<\ExitPosition> - <SectionRadius>0.2<\SectionRadius> - <StraightLenght>1.<\StraightLenght> - <FocalizingCoefficient>1.2<\FocalizingCoefficient> + <EntryPosition> + 3,2,0 + <\EntryPosition> + <ExitPosition> + 3,-2,0 + <\ExitPosition> + <SectionRadius> + 0.2 + <\SectionRadius> + <StraightLenght> + 1. + <\StraightLenght> + <FocalizingCoefficient> + 1.2 + <\FocalizingCoefficient> <\FODO> <Dipole> - <EntryPosition>3,-2,0<\EntryPosition> - <ExitPosition>2,-3,0<\ExitPosition> - <SectionRadius>0.1<\SectionRadius> - <Curvature>1.<\Curvature> - <MagneticField>0,0,5.89158<\MagneticField> + <EntryPosition> + 3,-2,0 + <\EntryPosition> + <ExitPosition> + 2,-3,0 + <\ExitPosition> + <SectionRadius> + 0.1 + <\SectionRadius> + <Curvature> + 1. + <\Curvature> + <MagneticField> + 0,0,5.89158 + <\MagneticField> <\Dipole> <FODO> - <EntryPosition>2,-3,0<\EntryPosition> - <ExitPosition>-2,-3,0<\ExitPosition> - <SectionRadius>0.2<\SectionRadius> - <StraightLenght>1.<\StraightLenght> - <FocalizingCoefficient>1.2<\FocalizingCoefficient> + <EntryPosition> + 2,-3,0 + <\EntryPosition> + <ExitPosition> + -2,-3,0 + <\ExitPosition> + <SectionRadius> + 0.2 + <\SectionRadius> + <StraightLenght> + 1. + <\StraightLenght> + <FocalizingCoefficient> + 1.2 + <\FocalizingCoefficient> <\FODO> <Dipole> - <EntryPosition>-2,-3,0<\EntryPosition> - <ExitPosition>-3,-2,0<\ExitPosition> - <SectionRadius>0.1<\SectionRadius> - <Curvature>1.<\Curvature> - <MagneticField>0,0,5.89158<\MagneticField> + <EntryPosition> + -2,-3,0 + <\EntryPosition> + <ExitPosition> + -3,-2,0 + <\ExitPosition> + <SectionRadius> + 0.1 + <\SectionRadius> + <Curvature> + 1. + <\Curvature> + <MagneticField> + 0,0,5.89158 + <\MagneticField> <\Dipole> <FODO> - <EntryPosition>-3,-2,0<\EntryPosition> - <ExitPosition>-3,2,0<\ExitPosition> - <SectionRadius>0.2<\SectionRadius> - <StraightLenght>1.<\StraightLenght> - <FocalizingCoefficient>1.2<\FocalizingCoefficient> + <EntryPosition> + -3,-2,0 + <\EntryPosition> + <ExitPosition> + -3,2,0 + <\ExitPosition> + <SectionRadius> + 0.2 + <\SectionRadius> + <StraightLenght> + 1. + <\StraightLenght> + <FocalizingCoefficient> + 1.2 + <\FocalizingCoefficient> <\FODO> <Dipole> - <EntryPosition>-3,2,0<\EntryPosition> - <ExitPosition>-2,3,0<\ExitPosition> - <SectionRadius>0.1<\SectionRadius> - <Curvature>1.<\Curvature> - <MagneticField>0,0,5.89158<\MagneticField> + <EntryPosition> + -3,2,0 + <\EntryPosition> + <ExitPosition> + -2,3,0 + <\ExitPosition> + <SectionRadius> + 0.1 + <\SectionRadius> + <Curvature> + 1. + <\Curvature> + <MagneticField> + 0,0,5.89158 + <\MagneticField> <\Dipole> <FODO> - <EntryPosition>-2,3,0<\EntryPosition> - <ExitPosition>2,3,0<\ExitPosition> - <SectionRadius>0.2<\SectionRadius> - <StraightLenght>1.<\StraightLenght> - <FocalizingCoefficient>1.2<\FocalizingCoefficient> + <EntryPosition> + -2,3,0 + <\EntryPosition> + <ExitPosition> + 2,3,0 + <\ExitPosition> + <SectionRadius> + 0.2 + <\SectionRadius> + <StraightLenght> + 1. + <\StraightLenght> + <FocalizingCoefficient> + 1.2 + <\FocalizingCoefficient> <\FODO> <Dipole> - <EntryPosition>2,3,0<\EntryPosition> - <ExitPosition>3,2,0<\ExitPosition> - <SectionRadius>0.1<\SectionRadius> - <Curvature>1.<\Curvature> - <MagneticField>0,0,5.89158<\MagneticField> + <EntryPosition> + 2,3,0 + <\EntryPosition> + <ExitPosition> + 3,2,0 + <\ExitPosition> + <SectionRadius> + 0.1 + <\SectionRadius> + <Curvature> + 1. + <\Curvature> + <MagneticField> + 0,0,5.89158 + <\MagneticField> <\Dipole> <\Accelerator> <\System>
\ No newline at end of file diff --git a/src/test/simulationTest.cc b/src/test/simulationTest.cc new file mode 100644 index 0000000..b9ac1a4 --- /dev/null +++ b/src/test/simulationTest.cc @@ -0,0 +1,32 @@ +/* + * simulationTest.cc + * + * Created on: 28 mai 2011 + * Author: christian + */ +#include <iostream> +#include "Parser.h" +#include "Accelerator.h" +#include "exceptions.h" + +using namespace std; +using namespace vhc; + +int main(){ + try{ + Parser pars("simulation.xml"); + + Accelerator* a = pars.extract(); + + cout<< *a <<endl; + + a->clear(); + + delete a; + } + catch(Exception const& ex){ + cout<<ex.getExceptionType()<<endl + <<ex.getMessage()<<endl; + } + return 0; +} |