source: PSPA/Interface_Web/trunk/pspaWT/sources/controler/src/softwareUsersprogram.cc @ 472

Last change on this file since 472 was 472, checked in by garnier, 11 years ago

Modification pour remettre en marche le Run. Desormais Transport passe, mais aucun test ne permet de dire si c est bon

File size: 3.8 KB
Line 
1#include "softwareUsersprogram.h"
2#include "abstractElement.h"
3#include "dataManager.h"
4
5#include <algorithm>
6
7softwareUsersprogram::softwareUsersprogram() : abstractSoftware()
8{
9  nameOfSoftware_ = nomDeLogiciel("usersprogram");
10}
11
12softwareUsersprogram::softwareUsersprogram(string inputFileName, sectionToExecute* sect, dataManager* data) : abstractSoftware(inputFileName, sect,data)
13{
14  cout << " softwareUsersprogram::softwareUsersprogram ENREGISTREMENT " << endl;
15  nameOfSoftware_ = nomDeLogiciel("usersprogram");
16  registerElement(nomdElements::snapshot,TBoolOk);
17}
18
19bool softwareUsersprogram::createInputFile(particleBeam* beamBefore, string workingDir)
20{ 
21
22  abstractElement* element = getSectionToExecute()->getElements().front();
23
24  // Dans le cas où l'element n'est pas snapshot
25  if ( element->getNomdElement().getElementType() != nomdElements::snapshot ) {
26    cout << " ERROR softwareUsersprogram::execute : element non snapshot " << endl;
27    return false;
28  }
29
30  vector< pair<string, vector<string> > > donnees = element->parametersToSoftware();
31  nomProgram_ = "";
32  outputFileName_ = "";
33  for (int k=0; k < donnees.size(); k++) {
34    if ( donnees.at(k).first == "nameOfFiles" ) {
35      if ( donnees.at(k).second.size() < 3 ) {
36        cout << " ERROR softwareUsersprogram::createInputFile " << endl;
37        return false;
38      }
39      nomProgram_ = donnees.at(k).second.at(0).c_str();
40      inputFileName_ = donnees.at(k).second.at(1).c_str();
41      outputFileName_ = donnees.at(k).second.at(2).c_str();
42      break;
43    }
44  }
45
46  string aml_file = workingDir  + inputFileName_ + ".aml";
47    beamBefore->writeToAMLFile(aml_file);
48
49  return true;
50}
51
52bool softwareUsersprogram::execute(string workingDir)
53{
54  bool ExecuteStatus = true;
55
56
57  ostringstream sortie;
58  sortie << " EXECUTION DE " << nomProgram_ << endl;
59 
60  string usersprogramJob = workingDir + nomProgram_;
61  usersprogramJob += " " + workingDir + inputFileName_;
62  usersprogramJob += " " + workingDir + outputFileName_;
63  cout << " job utilisateur= " << usersprogramJob << endl;
64 
65  string resultOfRun;
66  bool success = launchJob(usersprogramJob,resultOfRun);
67  sortie << resultOfRun << endl;
68  if ( !success ) {
69    sortie << " launching of transport failed " << endl;
70    ExecuteStatus = false;
71  } else {
72    string nameOut = workingDir + outputFileName_;
73    ofstream outfile;
74    outfile.open(nameOut.c_str(), ios::out);
75    if (!outfile) {
76      sortie << " error first opening user's program output stream " << nameOut << endl;
77      ExecuteStatus = false;
78    } else {
79      outfile.close();
80    }
81  }
82
83  dataManager_->consoleMessage(sortie.str());
84  return ExecuteStatus;
85}
86
87bool softwareUsersprogram::buildBeamAfterElements(string workingDir) 
88{
89
90  bool result = true;
91
92
93
94
95
96
97
98  if ( !ComputationLimitsOk_deprecated() ) return false;
99 
100  //  for (unsigned k = numeroDeb_; k <= numeroFin_; k++)
101 
102  abstractElement* ptr = getSectionToExecute()->getElements().front();
103      if ( ptr == NULL ) {
104        dataManager_->consoleMessage("ERROR  softwareUsersprogram::buildBeamAfterElements : null pointer on element " );
105        cout << " ERROR softwareUsersprogram::buildBeamAfterElements : null pointer on element " << endl;
106        return false;         
107      }
108
109
110      if ( doAcceptElement(ptr->getNomdElement().getElementType())  != TBoolOk ) {
111        dataManager_->consoleMessage("ERROR  softwareUsersprogram::buildBeamAfterElements : element rejected by user's program " );
112        cout << "ERROR  softwareUsersprogram::buildBeamAfterElements : element rejected by user's program " << endl;
113
114      } else {
115        // si le numero est reconnu
116        string elemLabel = ptr->getLabel();
117        // on initialise une nouvelle sortie diagnostic
118          particleBeam* newDiag = dataManager_->updateCurrentDiagnostic(true);
119        // et on la complete
120          string aml_file = workingDir  + outputFileName_ + ".aml";
121
122          newDiag->readFromAMLFile(aml_file);
123       
124      }
125  return result;
126}
Note: See TracBrowser for help on using the repository browser.