source: PSPA/Interface_Web/trunk/pspaWT/sources/controler/src/softwareTransport.cc @ 381

Last change on this file since 381 was 381, checked in by lemeur, 11 years ago

complements graphiques, legendes et unification unites

File size: 8.0 KB
Line 
1#include "softwareTransport.h"
2#include "abstractElement.h"
3#include "beam2Moments.h"
4#include "dataManager.h"
5
6#include <algorithm>
7
8softwareTransport::softwareTransport() : abstractSoftware()
9{;}
10
11softwareTransport::softwareTransport(string inputFileName,globalParameters* globals, dataManager* dt) : abstractSoftware(inputFileName, globals, dt)
12{;}
13
14bool softwareTransport::createInputFile(particleBeam* beamBefore, unsigned int numeroDeb, unsigned int numeroFin, string workingDir)
15{ 
16  if ( numeroDeb < 1 || numeroFin > dataManager_->getBeamLineSize() ) {
17    dataManager_->consoleMessage(" softwareTransport::createInputFile : numero of element out of limits " );
18    cerr << " numero of element out of limits " << endl;
19    return false;
20  }
21
22  abstractElement* premierEl = NULL;
23  premierEl = dataManager_->getElementPointerFromNumero(numeroDeb);
24
25  // ceinture et bretelles
26  if ( premierEl == NULL ) {
27    cerr << " premier element inexistant ?? " << endl;
28    return false;
29  }
30
31  string name = workingDir + inputFileName_;
32  ofstream outfile;
33  outfile.open(name.c_str(), ios::out);
34  if (!outfile) {
35    dataManager_->consoleMessage(" softwareTransport::createInputFile : error opening output stream " );
36    cerr << " error opening output stream " << name << endl;
37    return false;
38  }
39
40  outfile << string("'titre provisoire'") << endl;
41  outfile << " 0 " << endl;
42  outfile << " UTRANS " << endl;
43
44
45  cout << "debug:: c'est quoi le premier element? " << premierEl->getNomdElement().getElementName() << endl;
46
47  // si le premier element a traiter est un 'beam', on ne fait rien pour l'instant
48  // il sera traite plus bas de maniere standard
49
50  // Dans le cas où le premier element n'est pas beam
51  if ( premierEl->getNomdElement().getElementType() != beam ) {
52    // s'il n'y a pas faisceau courant, erreur
53    if ( beamBefore == NULL ) {
54      dataManager_->consoleMessage(" softwareTransport::createInputFile : no input beam");
55      cout << " pas de faisceau " << endl;
56      return false;
57    } else {
58      // s'il y a un faisceau courant
59      if ( !beamBefore->momentRepresentationOk() ) {
60        // s'il n'est pas au format transport (issu de parmela ?)
61        // on le met au format transport, s'il est deja au format 'particules' (par ex/ parmela)
62        if ( !beamBefore->particleRepresentationOk() ) {
63          dataManager_->consoleMessage(" softwareParmela::createInputFile : ca cafouille dans les representations de faisceau : ni particules, ni moments ? " );
64          cout << " ca cafouille dans les representations de faisceau : ni particules, ni moments ? " << endl;
65          return false;
66        } else {
67          beamBefore->buildMomentRepresentation();
68        }
69      }
70      // ici, en principe, on a un faisceau correct
71      // on ecrit sur le fichier input
72      const beam2Moments& moments = beamBefore->getTransportMoments();
73      double P0 = beamBefore->getP0Transport();
74      outfile << moments.writeToTransportInput(P0);
75    }
76  }
77
78  outfile << " PRINT, BEAM, ON; " << endl;
79
80  abstractElement* elPtr;
81  for (unsigned k = numeroDeb; k <= numeroFin; k++)
82    {
83      elPtr = dataManager_->getElementPointerFromNumero(k);
84      cout << "debug:: element [" << k << "] " << elPtr->getNomdElement().getElementName() << endl;
85      if(elPtr->getNomdElement().getElementType() == snapshot) continue;
86      outfile << elPtr->transportOutputFlow() << endl;
87    }
88
89  outfile << " SENTINEL " << endl;
90  outfile << " SENTINEL " << endl;
91
92  outfile.close();
93  dataManager_->consoleMessage("fichier input termine pour TRANSPORT");
94  return true;
95}
96
97bool softwareTransport::execute( unsigned int numeroDeb, unsigned int numeroFin, string workingDir)
98{
99  bool ExecuteStatus = true;
100
101  ostringstream sortie;
102  sortie << " EXECUTION DE TRANSPORT DE " << numeroDeb << " a " << numeroFin << endl;
103 
104  string transportJob = workingDir + "transport";
105  transportJob += string(" <  ");
106  transportJob += workingDir + inputFileName_;
107  cout << " job transport= " << transportJob << endl;
108 
109  string resultOfRun;
110  bool success = launchJob(transportJob,resultOfRun);
111  sortie << resultOfRun << endl;
112  if ( !success ) {
113    sortie << " launching of transport failed " << endl;
114    ExecuteStatus = false;
115  } else {
116    cout << " execution transport MARCHE " << endl;
117    string nameOut = workingDir + "transport.output";
118    ofstream outfile;
119    outfile.open(nameOut.c_str(), ios::out);
120    if (!outfile) {
121      sortie << " error first opening transport output stream " << nameOut << endl;
122      ExecuteStatus = false;
123    } else {
124      // on copie la sortie dans un fichier 'transport.out'
125      outfile << resultOfRun << endl;
126      outfile.close();
127    }
128  }
129
130  dataManager_->consoleMessage(sortie.str());
131  return ExecuteStatus;
132}
133
134bool softwareTransport::buildBeamAfterElements(unsigned int numeroDeb,unsigned int numeroFin, vector<particleBeam>& beams,string workingDir) 
135{
136
137  bool result = true;
138 
139  for (unsigned k = numeroDeb; k <= numeroFin; k++)
140    {
141      abstractElement* ptr = dataManager_->getElementPointerFromNumero(k);
142      if ( ptr == NULL ) {
143        dataManager_->consoleMessage(" softwareTransport::buildBeamAfterElements : null pointer on element " );
144        cout << " softwareTransport::buildBeamAfterElements : null pointer on element " << endl;
145        result = false;
146        break;       
147      }
148
149      // si l'element est un snapshot, recuperer la sortie precedente
150      if(ptr->getNomdElement().getElementType() == snapshot) {
151        int avantDernier = beams.size() - 1;
152        string* param = ptr->getParametersString();
153        string cliche = workingDir + param[2].c_str();
154         cout<<"["<<k<<"] : ecrit sur fichier " << cliche << " le contenu de beam["<<avantDernier<<"]"<<endl;
155         //      continue;
156      }
157
158      beams.push_back(particleBeam());
159      cout << " creation diagn. no " << beams.size() << " par TRANSPORT " << endl;
160      string elemLabel = ptr->getLabel();
161      beam2Moments transpMoments;
162     
163      if (!moments2FromTransport(workingDir,elemLabel,ptr->getNomdElement(),transpMoments) )
164        {
165          dataManager_->consoleMessage(" softwareTransport::buildBeamAfterElements : failure in reading moments " );
166          cout << " softwareTransport::buildBeamAfterElements plantage dans lecture moments " << endl;
167          result = false;
168          break;
169        } 
170      beams.back().set2Moments(transpMoments);
171    }
172  return result;
173}
174
175bool softwareTransport::moments2FromTransport(string workingDir,string elLab,const nomdElements elem,beam2Moments& moments) const 
176{
177  string elementLabel = elLab;
178  // transformer le label en majuscules ; je ne suis pas sur que ca
179  // marchera a tous les coups (glm)
180  std::transform(elementLabel.begin(),elementLabel.end(),elementLabel.begin(),(int (*)(int))std::toupper);
181
182  cout << "softwareTransport::moments2FromTransport on cherche element " << elementLabel << endl;
183 
184  string nameIn = workingDir + "transport.output";
185  ifstream infile;
186  infile.open(nameIn.c_str(), ios::in);
187  if (!infile) {
188    dataManager_->consoleMessage(" softwareTransport::moments2FromTransport : error re-opening transport output stream ");
189    cerr << " dataManager::moments2FromTransport : error re-opening transport output stream " << nameIn << endl;
190    return false;
191  }
192
193  string::size_type nn = string::npos;
194  string  fichier;
195  string buf;
196  unsigned compteur = 0;
197  while ( getline(infile, buf) ) {
198    fichier += buf+"\n";
199    nn = buf.find(elementLabel);
200    if ( nn != string::npos ) {
201      compteur++;
202    }
203  }
204  infile.close();
205
206  cout << " compteur= " << compteur << endl;
207  if ( compteur == 0 ) {
208    dataManager_->consoleMessage(" softwareTransport::moments2FromTransport : element"+elementLabel+"not found in the file "+nameIn);
209    cerr << " dataManager::moments2FromTransport : element " << elementLabel << " non trouve dans le fichier  " << nameIn << endl;
210    return false;
211  }
212
213  stringstream fichierStream(fichier);
214  buf.clear();
215  unsigned relu = 0;
216  while ( std::getline(fichierStream, buf) ) {
217    //    cout << " relecture buffer : " << buf << endl;
218    nn = buf.find(elementLabel);
219    if ( nn != string::npos ) {
220      relu++;
221      if ( relu == compteur ) {
222        cout << " TROUVE !" << endl;
223        break;
224      }
225    }
226  }
227
228  moments.readFromTransportOutput(fichierStream);
229  return true;
230}
Note: See TracBrowser for help on using the repository browser.