diff options
Diffstat (limited to 'src/main/Parser.cc')
-rw-r--r-- | src/main/Parser.cc | 651 |
1 files changed, 426 insertions, 225 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."); } |