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

Last change on this file since 485 was 485, checked in by lemeur, 10 years ago

liste des logiciels compatibles dans les tooltip des elements

File size: 14.2 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_ = new nomDeLogiciel("transport");
11}
12
13softwareTransport::softwareTransport(string inputFileName,sectionToExecute* sect, dataManager* data) : abstractSoftware(inputFileName, sect,data)
14{
15  nameOfSoftware_ = new 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      if ( nameOfSoftware_->doAcceptElement(ptr->getNomdElement().getElementType())  != TBoolOk ) {
154      //      if ( doAcceptElement(ptr->getNomdElement().getElementType())  != TBoolOk ) {
155
156        // si l'element doit etre ignore, on renvoie sur le diag precedent
157        dataManager_->updateCurrentDiagnostic(false);
158      // // si l'element est un snapshot, recuperer la sortie precedente
159      //        if(ptr->getNomdElement().getElementType() == snapshot) {
160      //          string* param = ptr->getParametersString();
161      //          string cliche = workingDir + param[2].c_str();
162      //          cout<<"["<<k<<"] : ecrit sur fichier " << cliche << " le contenu de beam[ ]"<<endl;
163      //        }
164      } else {
165        // si le numero est reconnu de transport
166
167
168
169        string elemLabel = ptr->getLabel();
170        beam2Moments transpMoments;
171        // lecture sortie transport
172        if (!moments2FromTransport(workingDir,elemLabel,ptr->getNomdElement(),transpMoments) )
173          {
174            // si echec, on renvoie sur le diag precedent
175            dataManager_->updateCurrentDiagnostic(false);
176
177            dataManager_->consoleMessage(" softwareTransport::buildBeamAfterElements : element skipped in reading moments from transport output :  " + elemLabel);
178            //   cout << " softwareTransport::buildBeamAfterElements plantage dans lecture moments " << endl;
179            return true;
180          } else {
181          // si succes,
182        // on initialise une nouvelle sortie diagnostic
183          particleBeam* newDiag = dataManager_->updateCurrentDiagnostic(true);
184        // et on la complete
185          newDiag->set2Moments(transpMoments);
186        }
187      }
188    }
189  return result;
190}
191bool softwareTransport::moments2FromTransport(string workingDir,string elLab,const nomdElements elem,beam2Moments& moments) const 
192{
193  string elementLabel = elLab;
194  // transformer le label en majuscules ; je ne suis pas sur que ca
195  // marchera a tous les coups (glm)
196  std::transform(elementLabel.begin(),elementLabel.end(),elementLabel.begin(),(int (*)(int))std::toupper);
197
198  cout << "softwareTransport::moments2FromTransport on cherche element " << elementLabel << endl;
199 
200  string nameIn = workingDir + "transport.output";
201  ifstream infile;
202  infile.open(nameIn.c_str(), ios::in);
203  if (!infile) {
204    dataManager_->consoleMessage(" softwareTransport::moments2FromTransport : error re-opening transport output stream ");
205    cerr << " dataManager::moments2FromTransport : error re-opening transport output stream " << nameIn << endl;
206    return false;
207  }
208
209  string::size_type nn = string::npos;
210  string  fichier;
211  string buf;
212  unsigned compteur = 0;
213  while ( getline(infile, buf) ) {
214    fichier += buf+"\n";
215    nn = buf.find(elementLabel);
216    if ( nn != string::npos ) {
217      compteur++;
218    }
219  }
220  infile.close();
221
222  cout << " compteur= " << compteur << endl;
223  if ( compteur == 0 ) {
224    dataManager_->consoleMessage(" softwareTransport::moments2FromTransport : element"+elementLabel+"not found in the file "+nameIn);
225    cerr << " dataManager::moments2FromTransport : element " << elementLabel << " non trouve dans le fichier  " << nameIn << endl;
226    return false;
227  }
228
229  stringstream fichierStream(fichier);
230  buf.clear();
231  unsigned relu = 0;
232  while ( std::getline(fichierStream, buf) ) {
233    //    cout << " relecture buffer : " << buf << endl;
234    nn = buf.find(elementLabel);
235    if ( nn != string::npos ) {
236      relu++;
237      if ( relu == compteur ) {
238        cout << " TROUVE !" << endl;
239        break;
240      }
241    }
242  }
243
244  return moments.readFromTransportOutput(fichierStream);
245}
246
247string softwareTransport::elementsData(const vector< pair<string, vector<string> > >& donnees) const {
248  unsigned k;
249  cout << " PASSAGE softwareTransport::elementsData " << endl;
250  if ( donnees.at(0).first != "labelsGenericSpecific" ) {
251    cout << " softwareTransport::elementsData ERROR : element badly defined " << endl;
252    return string();
253  }
254  string genericName = donnees.at(0).second.at(0);
255  if ( genericName == "beam" ) return beamData(donnees);
256  if ( genericName == "drift" ) return driftData(donnees);
257  if ( genericName == "solnd" ) return solenoData(donnees);
258  if ( genericName == "bend" ) return bendData(donnees);
259  if ( genericName == "fit" ) return fitData(donnees);
260  return string();
261}
262
263string softwareTransport::beamData(const vector< pair<string, vector<string> > >& donnees) const {
264
265  cout << " PASSAGE softwareTransport::beamData " << endl;
266  double x = 0.0;
267  double xp = 0.0;
268  double y = 0.0;
269  double yp = 0.0;
270  double dl = 0.0;
271  double del = 0.0;
272  double p0 = 0.0;
273  string specificName = "";
274
275  unsigned k;
276  for ( k=0; k < donnees.size(); k++) {
277    if ( donnees.at(k).first == "transverseCoordinates" ) { 
278      x = atof( donnees.at(k).second.at(0).c_str() );
279      xp = atof( donnees.at(k).second.at(1).c_str() );
280      y = atof( donnees.at(k).second.at(2).c_str() );
281      yp = atof( donnees.at(k).second.at(3).c_str() );
282    } else if ( donnees.at(k).first == "longitudinalCoordinates" ) {
283      dl = atof( donnees.at(k).second.at(0).c_str() );
284      del = atof( donnees.at(k).second.at(1).c_str() );
285    } else if ( donnees.at(k).first == "momentum" ) {
286      p0 = atof( donnees.at(k).second.at(0).c_str() );
287    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
288      specificName = donnees.at(k).second.at(1);
289    }
290  }
291  ostringstream sortie;
292    beam2Moments moments(x, xp, y, yp, dl, del);
293    sortie << specificName << ":" << moments.writeToTransportInput(p0) << endl;
294    return sortie.str(); 
295  return sortie.str();
296}
297
298string softwareTransport::driftData(const vector< pair<string, vector<string> > >& donnees) const {
299  cout << " PASSAGE softwareTransport::driftData " << endl;
300
301  string lenght = "0.0";
302  string specificName = "";
303
304  unsigned k;
305  for ( k=0; k < donnees.size(); k++) {
306    if ( donnees.at(k).first == "lenghtAperture" ) { 
307      lenght = donnees.at(k).second.at(0);
308    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
309      specificName = donnees.at(k).second.at(1);
310    }
311  }
312  ostringstream sortie;
313    // longueur en m
314  sortie << specificName << ":" << "  DRIFT, L=" << 0.01*atof(lenght.c_str()) << ";" << endl;
315  return sortie.str();
316}
317
318
319string softwareTransport::solenoData(const vector< pair<string, vector<string> > >& donnees) const {
320  cout << " softwareTransport::solenoData " << endl;
321  string lenght = "0.0";
322  string B0 = "0.0";
323  string varyB0 = "0";
324  string specificName = "";
325
326
327  unsigned k;
328  for ( k=0; k < donnees.size(); k++) {
329    if ( donnees.at(k).first == "lenghtAperture" ) { 
330      lenght = donnees.at(k).second.at(0);
331    } else if ( donnees.at(k).first == "field" ) {
332      B0 = donnees.at(k).second.at(0);
333    } else if ( donnees.at(k).first == "isBvariable" ) {
334      varyB0 = donnees.at(k).second.at(0);
335    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
336      specificName = donnees.at(k).second.at(1);
337    }
338  }
339    ostringstream sortie;
340    // on passe la longueur en metres
341    sortie << specificName << ":" << "  SOLENOID, L=" << 0.01*atof (lenght.c_str()) << ", B=" << B0 << ";" << endl;
342    if ( atoi(varyB0.c_str()) ) {
343      sortie <<  "  VARY, " << specificName+"[B]"  << ";" << endl;
344    }
345    return sortie.str();
346
347}
348
349
350string softwareTransport::bendData(const vector< pair<string, vector<string> > >& donnees) const {
351
352  cout << " softwareTransport::bendData " << endl;
353
354  string lenght = "0.0";
355  string radius = "0.0";
356  string angleDeg = "0.0";
357  string beta1 = "0.0";
358  string beta2 = "0.0";
359
360
361
362  string specificName = "";
363
364  unsigned k;
365  for ( k=0; k < donnees.size(); k++) {
366    if ( donnees.at(k).first == "lenghtAperture" ) { 
367      lenght = donnees.at(k).second.at(0);
368    } else if ( donnees.at(k).first == "angleDegre" ) {
369      angleDeg = donnees.at(k).second.at(0);
370    } else if ( donnees.at(k).first == "radius" ) {
371      radius = donnees.at(k).second.at(0);
372     } else if ( donnees.at(k).first == "rotatedFaces" ) {
373      beta1 = donnees.at(k).second.at(0);
374      beta2 = donnees.at(k).second.at(1);
375    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
376      specificName = donnees.at(k).second.at(1);
377    }   
378  }
379
380    ostringstream sortie;
381    sortie << specificName << ":" << "  SBEND, RADIUS=" << radius << ", ANGLE=" << angleDeg << ", E1=" << beta1 << ", E2=" << beta2 << ";" << endl;
382    return sortie.str();
383
384}
385
386
387string softwareTransport::fitData(const vector< pair<string, vector<string> > >& donnees) const {
388  cout << " softwareTransport::fitData " << endl;
389  string variableName = "";
390  string variableValue = "0.0";
391  string tolerance = "0.0";
392  string specificName = "";
393
394  unsigned k;
395  for ( k=0; k < donnees.size(); k++) {
396    if ( donnees.at(k).first == "variable") { 
397      variableName = donnees.at(k).second.at(0);
398      variableValue = donnees.at(k).second.at(1);
399      tolerance = donnees.at(k).second.at(2);
400    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
401      specificName = donnees.at(k).second.at(1);
402    }   
403  }
404    ostringstream sortie;
405    sortie << specificName << ":" << "  FIT," << variableName << " = " << variableValue << ", TOLER = " << tolerance << " ;" << endl;
406    if ( variableName == "R11" || variableName == "R22" || variableName == "R12" || variableName == "R21" ) {
407        sortie << " PRINT, TRANS;" << endl;
408    }
409    return sortie.str();
410}
Note: See TracBrowser for help on using the repository browser.