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

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

interface software

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