source: PSPA/Interface_Web/trunk/pspaWT/sources/controler/src/dataManager.cc @ 357

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

suppression folder non convivial dans nom de sauvegarde

File size: 11.6 KB
Line 
1#include "dataManager.h"
2#include "mathematicalConstants.h"
3#include "PhysicalConstants.h"
4#include "softwareParmela.h"
5#include "softwareTransport.h"
6#include "GWt_pspaApplication.h"
7#include "GWt_console.h"
8#include "softwareGenerator.h"
9#include "softwareTest.h"
10
11#include <boost/filesystem.hpp>
12#include <stdio.h>
13#include <fstream>
14
15dataManager::dataManager(PspaApplication* pspa) :
16  currentBeam_(NULL),
17  pspa_ (pspa)
18{}
19
20dataManager::~dataManager() 
21{
22  unsigned k;
23  for (k=0; k < jobList_.size();k++) {
24    if ( jobList_[k] != NULL ) delete jobList_[k];
25  }
26  if ( currentBeam_ == NULL ) delete currentBeam_;
27}
28
29void dataManager::consoleMessage(string message) {
30  GWt_console* console = static_cast<GWt_console*> (wApp->findWidget ("console"));
31  if (console) console->addConsoleMessage(message);
32  pspa_->processEvents();
33}
34
35string dataManager::getLabelFromElementNumero(int numero)
36{
37    abstractElement* ptr = pspa_->getBeamLine()->getAbstractElement(numero-1);
38    if ( ptr == NULL ) return "";
39    return ptr->getLabel();
40}
41
42
43int dataManager::getNumeroFromElementLabel(string label)
44{
45  int index = -1;
46 
47  for (int k = 0; k < getBeamLineSize() ; k++)
48    {
49      if (pspa_->getBeamLine()->getAbstractElement(k) != NULL){
50        if ( pspa_->getBeamLine()->getAbstractElement(k)->getLabel() == label )
51          {
52            index = (int)k + 1;
53            return index;
54          }
55      }
56    }
57  return index;
58}
59
60
61abstractElement* dataManager::getElementPointerFromNumero(int k)
62{
63  return pspa_->getBeamLine()->getAbstractElement(k-1);
64}
65
66
67void dataManager::addSectionToExecute(int debut, int fin, nomDeLogiciel prog)
68{
69  jobList_.push_back(new sectionToExecute);
70  jobList_.back()->firstElement = debut;
71  jobList_.back()->lastElement = fin;
72  jobList_.back()->software  = prog;
73}
74
75void dataManager::clearSectionToExecute()
76{
77  unsigned k;
78  for(k = 0; k < jobList_.size(); k++)
79    {
80      if ( jobList_[k] != NULL ) delete jobList_[k];
81    }
82  jobList_.clear();
83}
84
85trivaluedBool dataManager::checkExecute(string& diagnostic)
86{
87  cout << "dataManager::checkExecute()" << endl;
88  consoleMessage(" VERIFICATION AVANT EXECUTION ");
89 
90  trivaluedBool resul = ok;
91  diagnostic.clear();
92 
93  for(unsigned k = 0; k < jobList_.size(); k++) {
94   
95    unsigned numeroDeb = jobList_[k]->firstElement;
96    unsigned numeroFin = jobList_[k]->lastElement;
97   
98    if ( numeroFin  < numeroDeb ) {
99      diagnostic += " last element before first for job " + (jobList_[k]->software).getString() + " \n";
100      resul = error;
101      break;
102    }
103
104    string checkCompatibility;
105    resul = checkElementsForExec(jobList_[k]->software,numeroDeb,numeroFin,checkCompatibility);
106    diagnostic += checkCompatibility;
107  } //k
108
109  return resul;
110}
111
112trivaluedBool dataManager::checkElementsForExec(nomDeLogiciel logiciel,unsigned numeroDeb,unsigned numeroFin,string& diagnostic)
113{
114  trivaluedBool resul = ok;
115  trivaluedBool accepted;
116
117  diagnostic.clear(); 
118  abstractElement* elPtr;
119
120  for(unsigned j = numeroDeb; j <= numeroFin; j++) {
121    elPtr = pspa_->getBeamLine()->getAbstractElement(j-1);
122    accepted = elPtr->is_accepted_by_software(logiciel);
123
124    if(accepted == error) {
125      diagnostic += " the element " + elPtr->getNomdElement().getElementName() + " is not allowed with " + logiciel.getString() + " \n";
126      resul = error;
127    } else if (accepted  == warning) {
128      diagnostic += " the element " + elPtr->getNomdElement().getElementName() + " will be ignored by " + logiciel.getString() + " \n";
129      if ( resul != error ) resul = warning;
130    }
131  }
132
133  return resul;
134}
135
136void dataManager::initializeExecution()
137{
138  string workingDir = pspa_->getWorkingDir();
139    if (workingDir == "") {
140        return;
141    }
142    removeFile(workingDir + "parmdesz");
143    removeFile(workingDir + "parmin");
144    removeFile(workingDir + "parin.input0");
145    removeFile(workingDir + "transport.input");
146    removeFile(workingDir + "transport.output");
147    removeFile(workingDir + "generator.in");
148    removeFile(workingDir + "faisceau.ini");
149    removeFile(workingDir + "generator.output");
150    diagnosticBeam_.clear();
151    currentBeam_ = NULL;
152    clearSectionToExecute();
153}
154
155void dataManager::removeFile(string nameOfFile)
156{
157    ifstream fileExists;
158    fileExists.open(nameOfFile.c_str(), ios::in);
159    if (fileExists) {
160        fileExists.close();
161        remove(nameOfFile.c_str());
162    }
163}
164
165bool dataManager::executeAll()
166{
167  bool success = true;
168  abstractSoftware* softw = NULL;
169  string workingDir = pspa_->getWorkingDir();
170
171  for(unsigned k = 0; k < jobList_.size(); k++)
172    { 
173      cout << " dataManager::executeAll je m'apprete a executer : " << (jobList_[k]->software).getString() << endl;
174     
175      int debut = jobList_[k]->firstElement;
176      int fin = jobList_[k]->lastElement;
177      softw = createSoftwareConnexion(jobList_[k]->software);
178     
179      if (softw == NULL) {
180        success = false;
181        consoleMessage("dataManager::executeAll : unknown software");
182        break;
183      }
184
185      success = softw->createInputFile(currentBeam_,debut,fin,workingDir);
186      if ( success ) {
187        success = softw->execute(debut,fin,workingDir);
188        if ( success ) {
189          success = softw->buildBeamAfterElements(debut,fin,diagnosticBeam_,workingDir);
190        }
191      }
192     
193      delete softw;
194      if ( success ) {
195        currentBeam_ = &diagnosticBeam_.back();
196        cout << " execute termine avec succes " << endl;
197      } else {
198        currentBeam_ = NULL;
199        cout << " execute termine en ECHEC " << endl;
200      }
201      if ( !success ) break;
202 
203      //debug
204      cout << "dataManager::executeAll #diagnosticBeam= " << diagnosticBeam_.size() << endl;
205      cout << "dataManager::executeAll #getBeamLineSize()= " << getBeamLineSize() << endl;
206      for (int j = debut; j <= fin; j++) {
207        abstractElement* elPtr= getElementPointerFromNumero(j);
208        cout << "[" << j << "] " << elPtr->getNomdElement().getElementName() << endl;
209      } 
210
211    } //k
212 
213  return success;
214}
215
216void dataManager::saveConfiguration(string folder, string nameOfFile)
217{
218    ofstream outfile;
219    //    string name = pspa_->getWorkingDir()+ folder + "/" + nameOfFile + ".save";
220    cout << " dataManager::saveConfiguration : suppression du folder dans le nom de " << endl;
221    cout << " sauvegarde, en attendant que ce soit autre chose que le sessionId" << endl;
222    cout << " et qu'on puisse restaurer normalement" << endl;
223    string name = pspa_->getWorkingDir() + "/" + nameOfFile + ".save";
224
225    // make dir if not exist
226    boost::filesystem::create_directories(pspa_->getWorkingDir() + folder + "/");
227   
228    outfile.open(name.c_str(), ios::out);
229    if (!outfile) {
230        cerr << " error opening output file for persistency " << name << endl;
231    }
232 
233  outfile << globParam_.FileOutputFlow();
234  abstractElement* elPtr;
235  for(unsigned k = 0; k < getBeamLineSize() ; k++)
236    {
237      elPtr = pspa_->getBeamLine()->getAbstractElement(k);
238      outfile << elPtr->FileOutputFlow();
239    }
240  outfile.close();
241}
242
243bool dataManager::restoreElements( string inputFileName)
244{
245    cout << "dataManager::restoreElements() fichier " << inputFileName << endl;
246    ifstream infile;
247    string name = inputFileName;
248    infile.open(name.c_str(), ios::in);
249    if (!infile) {
250        cerr << " error opening input stream " << name << endl;
251        return false;
252    }
253    else cout << " successful opening input stream " << name << endl;
254   
255    string globalTitle;
256    if ( infile >> globalTitle ) {
257        if ( globalTitle == string("globals") ) {
258            globParam_.raz();
259            globParam_.FileInput(infile);
260        } else {
261            cerr << " dataManager::restoreElements ERROR : global parameters seems to be missing" << endl;
262            return false;
263        }
264    } else {
265        cerr << " dataManager::restoreElements ERROR : reading data save file" << endl;
266        return false;
267    }
268   
269    pspa_->getBeamLine()->clear();
270   
271    typedElement elementType;
272    string elementLabel;
273    while (infile >> elementLabel) {
274        elementType = nomdElements::getTypeFromLabel(elementLabel);
275       
276        GWt_abstractElement* nouveau = pspa_->getBeamLine()->addElement(elementType);
277       
278        if ( nouveau == NULL ) {
279            cerr << " dataManager::restoreElements ERROR : restoring element " << elementLabel << " failed " << endl;
280            return false;
281        }
282        nouveau->FileInput(infile);
283    }
284    infile.close();
285
286    // debug
287    // unsigned k;
288    // for(k = 0; k < getBeamLineSize(); k++) {
289    //     abstractElement* ptr = pspa_->getBeamLine()->getAbstractElement(k);       
290    //     cout << "reupere " << ptr->getLabel() << endl;
291    // }
292    return true;
293}
294
295particleBeam* dataManager::getDiagnosticBeam(unsigned index)
296{
297  if (index >= diagnosticBeam_.size()) {
298    return NULL;
299  } else {
300    return &diagnosticBeam_.at(index);
301  }
302}
303
304// void dataManager::donneesRmsEnveloppe(string type,unsigned int numeroDeb,unsigned int numeroFin, vector<double>& xcor,vector<double>& ycor)
305// {
306//   unsigned k;
307//   if ( numeroDeb < 1 ) numeroDeb = 1;
308//   if ( numeroFin > diagnosticBeam_.size() ) numeroFin = diagnosticBeam_.size();
309       
310//   double longueur = 0.0;
311//   double valeur = 0.0;
312//   xcor.clear();
313//   ycor.clear();
314//   if ( type == "x" )
315//     {
316//       for (k= numeroDeb; k <= numeroFin; k++)
317//         {
318//        if ( !diagnosticBeam_.at(k-1).momentRepresentationOk() ) diagnosticBeam_.at(k-1).buildMomentRepresentation();
319//        longueur += pspa_->getBeamLine()->getAbstractElement(k-1)->getLenghtOfElement();
320//        valeur = diagnosticBeam_.at(k-1).getXmaxRms();
321//        cout << " dataManager::donneesRmsEnveloppe longueur = " << longueur << " enveleloppe : " << valeur << endl;
322//        xcor.push_back(longueur);
323//        ycor.push_back(valeur);
324//         }
325//     }
326//   else
327//     {
328//       cerr << " dataManager::donneesRmsEnveloppe type " << type << " not programmed " << endl;
329//       return;
330//     }
331// }
332
333// on ne tient pas compte des elements "snapshot" presents dans la beamLine
334void dataManager::donneesRmsEnveloppe(string type,vector<double>& xcor,vector<double>& ycor)
335{
336  double longueur = 0.0;
337  double valeur = 0.0;
338  xcor.clear();
339  ycor.clear();
340
341  if ( type == "x" ) {
342    unsigned i = 0;
343    cout << " dataManager::donneesRmsEnveloppe BeamLineSize = " << getBeamLineSize() << endl;
344    for (unsigned k = 0; k < getBeamLineSize(); k++) {
345      abstractElement* elPtr = pspa_->getBeamLine()->getAbstractElement(k);
346      if(elPtr->getNomdElement().getElementType() == snapshot) continue;
347      if(elPtr->getNomdElement().getElementType() == fit) continue;
348
349      if ( !diagnosticBeam_.at(i).momentRepresentationOk() ) {
350        diagnosticBeam_.at(i).buildMomentRepresentation();
351      }
352
353      longueur += elPtr->getLenghtOfElement();
354      valeur = diagnosticBeam_.at(i).getXmaxRms();
355      cout << " dataManager::donneesRmsEnveloppe index = " << k <<  " longueur = " << longueur << " enveleloppe : " << valeur << endl;
356      xcor.push_back(longueur);
357      ycor.push_back(valeur);
358      i++;
359    }
360  } else {
361    cerr << " dataManager::donneesRmsEnveloppe type " << type << " not programmed " << endl;
362    return;
363  }
364}
365
366int dataManager::getBeamLineSize() {
367  return pspa_->getBeamLine()->getBeamLineSize();
368}
369
370abstractSoftware* dataManager::createSoftwareConnexion(nomDeLogiciel logi) 
371{
372  string inputFileName;
373  if(logi == nomDeLogiciel::parmela) {
374    inputFileName = "parmin";
375    return new softwareParmela(inputFileName, &globParam_, this);
376  } else if (logi == nomDeLogiciel::transport) {
377    inputFileName = "transport.input";
378    return new softwareTransport(inputFileName, &globParam_, this);
379  } else if (logi == nomDeLogiciel::generator) {
380    inputFileName = "generator.in";
381    return new softwareGenerator(inputFileName, &globParam_, this);
382  } else if (logi == nomDeLogiciel::test) {
383    return new softwareTest(inputFileName, &globParam_, this);
384  } else {
385    return NULL;
386  } 
387}
Note: See TracBrowser for help on using the repository browser.