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

Last change on this file since 481 was 481, checked in by garnier, 10 years ago

Suppression de methodes deprecated et de quelques warning de compilation

File size: 14.1 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  nameOfSoftware_ = nomDeLogiciel("transport");
11}
12
13softwareTransport::softwareTransport(string inputFileName,sectionToExecute* sect, dataManager* data) : abstractSoftware(inputFileName, sect,data)
14{
15  nameOfSoftware_ = nomDeLogiciel("transport");
16  registerElement(nomdElements::beam,TBoolOk);
17  registerElement(nomdElements::drift,TBoolOk);
18  registerElement(nomdElements::bend,TBoolOk);
19  registerElement(nomdElements::soleno,TBoolOk);
20  registerElement(nomdElements::fit,TBoolOk);
21  registerElement(nomdElements::snapshot,TBoolIgnore);
22}
23
24bool softwareTransport::createInputFile(particleBeam* beamBefore, string workingDir)
25{ 
26
27
28  abstractElement* premierEl = getSectionToExecute()->getElements().front();
29
30  // ceinture et bretelles
31  if ( premierEl == NULL ) {
32    cerr << " premier element inexistant ?? " << endl;
33    return false;
34  }
35
36  string name = workingDir + inputFileName_;
37  ofstream outfile;
38  outfile.open(name.c_str(), ios::out);
39  if (!outfile) {
40    dataManager_->consoleMessage(" softwareTransport::createInputFile : error opening output stream " );
41    cerr << " error opening output stream " << name << endl;
42    return false;
43  }
44
45  outfile << string("'titre provisoire'") << endl;
46  outfile << " 0 " << endl;
47  outfile << " UTRANS " << endl;
48
49
50  //  cout << "debug:: c'est quoi le premier element? " << premierEl->getNomdElement().getElementName() << endl;
51
52  // si le premier element a traiter est un 'beam', on ne fait rien pour l'instant
53  // il sera traite plus bas de maniere standard
54
55  // Dans le cas où le premier element n'est pas beam
56  if ( premierEl->getNomdElement().getElementType() != nomdElements::beam ) {
57    // s'il n'y a pas faisceau courant, erreur
58    if ( beamBefore == NULL ) {
59      dataManager_->consoleMessage(" softwareTransport::createInputFile : no input beam, input file not created");
60      cout << " pas de faisceau " << endl;
61      return false;
62    } else {
63      // s'il y a un faisceau courant
64      if ( !beamBefore->momentRepresentationOk() ) {
65        // s'il n'est pas au format transport (issu de parmela ?)
66        // on le met au format transport, s'il est deja au format 'particules' (par ex/ parmela)
67        if ( !beamBefore->particleRepresentationOk() ) {
68          dataManager_->consoleMessage(" softwareParmela::createInputFile : ca cafouille dans les representations de faisceau : ni particules, ni moments ? " );
69          cout << " ca cafouille dans les representations de faisceau : ni particules, ni moments ? " << endl;
70          return false;
71        } else {
72          beamBefore->buildMomentRepresentation();
73        }
74      }
75      // ici, en principe, on a un faisceau correct
76      // on ecrit sur le fichier input
77      const beam2Moments& moments = beamBefore->getTransportMoments();
78      double P0 = beamBefore->getP0Transport();
79      outfile << moments.writeToTransportInput(P0);
80    }
81  }
82
83  outfile << " PRINT, BEAM, ON; " << endl;
84
85  abstractElement* elPtr;
86  for (unsigned k = 0; k < getSectionToExecute()->getElements().size(); k++)
87    {
88      elPtr = getSectionToExecute()->getElements()[k];
89      cout << "debug:: element [" << k << "] " << elPtr->getNomdElement().getExpandedName() << endl;
90      //      outfile << elPtr->transportOutputFlow();
91      outfile << elementsData(elPtr->parametersToSoftware());
92    }
93
94  outfile << " SENTINEL " << endl;
95  outfile << " SENTINEL " << endl;
96
97  outfile.close();
98  dataManager_->consoleMessage("fichier input termine pour TRANSPORT");
99  return true;
100}
101
102bool softwareTransport::execute(string workingDir)
103{
104  bool ExecuteStatus = true;
105
106  ostringstream sortie;
107  sortie << " EXECUTION DE TRANSPORT " << endl;
108 
109  string transportJob = workingDir + "transport";
110  transportJob += string(" <  ");
111  transportJob += workingDir + inputFileName_;
112  cout << " job transport= " << transportJob << endl;
113 
114  string resultOfRun;
115  bool success = launchJob(transportJob,resultOfRun);
116  sortie << resultOfRun << endl;
117  if ( !success ) {
118    sortie << " launching of transport failed " << endl;
119    ExecuteStatus = false;
120  } else {
121    cout << " execution transport MARCHE " << endl;
122    string nameOut = workingDir + "transport.output";
123    ofstream outfile;
124    outfile.open(nameOut.c_str(), ios::out);
125    if (!outfile) {
126      sortie << " error first opening transport output stream " << nameOut << endl;
127      ExecuteStatus = false;
128    } else {
129      // on copie la sortie dans un fichier 'transport.out'
130      outfile << resultOfRun << endl;
131      outfile.close();
132    }
133  }
134
135  dataManager_->consoleMessage(sortie.str());
136  return ExecuteStatus;
137}
138
139bool softwareTransport::buildBeamAfterElements(string workingDir) 
140{
141
142  bool result = true;
143
144  for (unsigned k = 0; k < getSectionToExecute()->getElements().size(); k++)
145    {
146      abstractElement* ptr = getSectionToExecute()->getElements()[k];
147      if ( ptr == NULL ) {
148        dataManager_->consoleMessage(" softwareTransport::buildBeamAfterElements : null pointer on element " );
149        cout << " softwareTransport::buildBeamAfterElements : null pointer on element " << endl;
150        return false;         
151      }
152
153
154      // if ( ptr->is_accepted_by_software(nameOfSoftware_) != TBoolOk ) {
155      if ( doAcceptElement(ptr->getNomdElement().getElementType())  != TBoolOk ) {
156
157        // si l'element doit etre ignore, on renvoie sur le diag precedent
158        dataManager_->updateCurrentDiagnostic(false);
159      // // si l'element est un snapshot, recuperer la sortie precedente
160      //        if(ptr->getNomdElement().getElementType() == snapshot) {
161      //          string* param = ptr->getParametersString();
162      //          string cliche = workingDir + param[2].c_str();
163      //          cout<<"["<<k<<"] : ecrit sur fichier " << cliche << " le contenu de beam[ ]"<<endl;
164      //        }
165      } else {
166        // si le numero est reconnu de transport
167
168
169
170        string elemLabel = ptr->getLabel();
171        beam2Moments transpMoments;
172        // lecture sortie transport
173        if (!moments2FromTransport(workingDir,elemLabel,ptr->getNomdElement(),transpMoments) )
174          {
175            // si echec, on renvoie sur le diag precedent
176            dataManager_->updateCurrentDiagnostic(false);
177
178            dataManager_->consoleMessage(" softwareTransport::buildBeamAfterElements : element skipped in reading moments from transport output :  " + elemLabel);
179            //   cout << " softwareTransport::buildBeamAfterElements plantage dans lecture moments " << endl;
180            return true;
181          } else {
182          // si succes,
183        // on initialise une nouvelle sortie diagnostic
184          particleBeam* newDiag = dataManager_->updateCurrentDiagnostic(true);
185        // et on la complete
186          newDiag->set2Moments(transpMoments);
187        }
188      }
189    }
190  return result;
191}
192bool softwareTransport::moments2FromTransport(string workingDir,string elLab,const nomdElements elem,beam2Moments& moments) const 
193{
194  string elementLabel = elLab;
195  // transformer le label en majuscules ; je ne suis pas sur que ca
196  // marchera a tous les coups (glm)
197  std::transform(elementLabel.begin(),elementLabel.end(),elementLabel.begin(),(int (*)(int))std::toupper);
198
199  cout << "softwareTransport::moments2FromTransport on cherche element " << elementLabel << endl;
200 
201  string nameIn = workingDir + "transport.output";
202  ifstream infile;
203  infile.open(nameIn.c_str(), ios::in);
204  if (!infile) {
205    dataManager_->consoleMessage(" softwareTransport::moments2FromTransport : error re-opening transport output stream ");
206    cerr << " dataManager::moments2FromTransport : error re-opening transport output stream " << nameIn << endl;
207    return false;
208  }
209
210  string::size_type nn = string::npos;
211  string  fichier;
212  string buf;
213  unsigned compteur = 0;
214  while ( getline(infile, buf) ) {
215    fichier += buf+"\n";
216    nn = buf.find(elementLabel);
217    if ( nn != string::npos ) {
218      compteur++;
219    }
220  }
221  infile.close();
222
223  cout << " compteur= " << compteur << endl;
224  if ( compteur == 0 ) {
225    dataManager_->consoleMessage(" softwareTransport::moments2FromTransport : element"+elementLabel+"not found in the file "+nameIn);
226    cerr << " dataManager::moments2FromTransport : element " << elementLabel << " non trouve dans le fichier  " << nameIn << endl;
227    return false;
228  }
229
230  stringstream fichierStream(fichier);
231  buf.clear();
232  unsigned relu = 0;
233  while ( std::getline(fichierStream, buf) ) {
234    //    cout << " relecture buffer : " << buf << endl;
235    nn = buf.find(elementLabel);
236    if ( nn != string::npos ) {
237      relu++;
238      if ( relu == compteur ) {
239        cout << " TROUVE !" << endl;
240        break;
241      }
242    }
243  }
244
245  return moments.readFromTransportOutput(fichierStream);
246}
247
248string softwareTransport::elementsData(const vector< pair<string, vector<string> > >& donnees) const {
249  unsigned k;
250  cout << " PASSAGE softwareTransport::elementsData " << endl;
251  if ( donnees.at(0).first != "labelsGenericSpecific" ) {
252    cout << " softwareTransport::elementsData ERROR : element badly defined " << endl;
253    return string();
254  }
255  string genericName = donnees.at(0).second.at(0);
256  if ( genericName == "beam" ) return beamData(donnees);
257  if ( genericName == "drift" ) return driftData(donnees);
258  if ( genericName == "solnd" ) return solenoData(donnees);
259  if ( genericName == "bend" ) return bendData(donnees);
260  if ( genericName == "fit" ) return fitData(donnees);
261  return string();
262}
263
264string softwareTransport::beamData(const vector< pair<string, vector<string> > >& donnees) const {
265
266  cout << " PASSAGE softwareTransport::beamData " << endl;
267  double x = 0.0;
268  double xp = 0.0;
269  double y = 0.0;
270  double yp = 0.0;
271  double dl = 0.0;
272  double del = 0.0;
273  double p0 = 0.0;
274  string specificName = "";
275
276  unsigned k;
277  for ( k=0; k < donnees.size(); k++) {
278    if ( donnees.at(k).first == "transverseCoordinates" ) { 
279      x = atof( donnees.at(k).second.at(0).c_str() );
280      xp = atof( donnees.at(k).second.at(1).c_str() );
281      y = atof( donnees.at(k).second.at(2).c_str() );
282      yp = atof( donnees.at(k).second.at(3).c_str() );
283    } else if ( donnees.at(k).first == "longitudinalCoordinates" ) {
284      dl = atof( donnees.at(k).second.at(0).c_str() );
285      del = atof( donnees.at(k).second.at(1).c_str() );
286    } else if ( donnees.at(k).first == "momentum" ) {
287      p0 = atof( donnees.at(k).second.at(0).c_str() );
288    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
289      specificName = donnees.at(k).second.at(1);
290    }
291  }
292  ostringstream sortie;
293    beam2Moments moments(x, xp, y, yp, dl, del);
294    sortie << specificName << ":" << moments.writeToTransportInput(p0) << endl;
295    return sortie.str(); 
296  return sortie.str();
297}
298
299string softwareTransport::driftData(const vector< pair<string, vector<string> > >& donnees) const {
300  cout << " PASSAGE softwareTransport::driftData " << endl;
301
302  string lenght = "0.0";
303  string specificName = "";
304
305  unsigned k;
306  for ( k=0; k < donnees.size(); k++) {
307    if ( donnees.at(k).first == "lenghtAperture" ) { 
308      lenght = donnees.at(k).second.at(0);
309    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
310      specificName = donnees.at(k).second.at(1);
311    }
312  }
313  ostringstream sortie;
314    // longueur en m
315  sortie << specificName << ":" << "  DRIFT, L=" << 0.01*atof(lenght.c_str()) << ";" << endl;
316  return sortie.str();
317}
318
319
320string softwareTransport::solenoData(const vector< pair<string, vector<string> > >& donnees) const {
321  cout << " softwareTransport::solenoData " << endl;
322  string lenght = "0.0";
323  string B0 = "0.0";
324  string varyB0 = "0";
325  string specificName = "";
326
327
328  unsigned k;
329  for ( k=0; k < donnees.size(); k++) {
330    if ( donnees.at(k).first == "lenghtAperture" ) { 
331      lenght = donnees.at(k).second.at(0);
332    } else if ( donnees.at(k).first == "field" ) {
333      B0 = donnees.at(k).second.at(0);
334    } else if ( donnees.at(k).first == "isBvariable" ) {
335      varyB0 = donnees.at(k).second.at(0);
336    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
337      specificName = donnees.at(k).second.at(1);
338    }
339  }
340    ostringstream sortie;
341    // on passe la longueur en metres
342    sortie << specificName << ":" << "  SOLENOID, L=" << 0.01*atof (lenght.c_str()) << ", B=" << B0 << ";" << endl;
343    if ( atoi(varyB0.c_str()) ) {
344      sortie <<  "  VARY, " << specificName+"[B]"  << ";" << endl;
345    }
346    return sortie.str();
347
348}
349
350
351string softwareTransport::bendData(const vector< pair<string, vector<string> > >& donnees) const {
352
353  cout << " softwareTransport::bendData " << endl;
354
355  string lenght = "0.0";
356  string radius = "0.0";
357  string angleDeg = "0.0";
358  string beta1 = "0.0";
359  string beta2 = "0.0";
360
361
362
363  string specificName = "";
364
365  unsigned k;
366  for ( k=0; k < donnees.size(); k++) {
367    if ( donnees.at(k).first == "lenghtAperture" ) { 
368      lenght = donnees.at(k).second.at(0);
369    } else if ( donnees.at(k).first == "angleDegre" ) {
370      angleDeg = donnees.at(k).second.at(0);
371    } else if ( donnees.at(k).first == "radius" ) {
372      radius = donnees.at(k).second.at(0);
373     } else if ( donnees.at(k).first == "rotatedFaces" ) {
374      beta1 = donnees.at(k).second.at(0);
375      beta2 = donnees.at(k).second.at(1);
376    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
377      specificName = donnees.at(k).second.at(1);
378    }   
379  }
380
381    ostringstream sortie;
382    sortie << specificName << ":" << "  SBEND, RADIUS=" << radius << ", ANGLE=" << angleDeg << ", E1=" << beta1 << ", E2=" << beta2 << ";" << endl;
383    return sortie.str();
384
385}
386
387
388string softwareTransport::fitData(const vector< pair<string, vector<string> > >& donnees) const {
389  cout << " softwareTransport::fitData " << endl;
390  string variableName = "";
391  string variableValue = "0.0";
392  string tolerance = "0.0";
393  string specificName = "";
394
395  unsigned k;
396  for ( k=0; k < donnees.size(); k++) {
397    if ( donnees.at(k).first == "variable") { 
398      variableName = donnees.at(k).second.at(0);
399      variableValue = donnees.at(k).second.at(1);
400      tolerance = donnees.at(k).second.at(2);
401    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
402      specificName = donnees.at(k).second.at(1);
403    }   
404  }
405    ostringstream sortie;
406    sortie << specificName << ":" << "  FIT," << variableName << " = " << variableValue << ", TOLER = " << tolerance << " ;" << endl;
407    if ( variableName == "R11" || variableName == "R22" || variableName == "R12" || variableName == "R21" ) {
408        sortie << " PRINT, TRANS;" << endl;
409    }
410    return sortie.str();
411}
Note: See TracBrowser for help on using the repository browser.