#include "softwareUsersprogram.h" #include "abstractElement.h" #include "dataManager.h" #include softwareUsersprogram::softwareUsersprogram() : abstractSoftware() { nameOfSoftware_ = nomDeLogiciel("usersprogram"); } softwareUsersprogram::softwareUsersprogram(string inputFileName,globalParameters* globals, dataManager* dt) : abstractSoftware(inputFileName, globals, dt) { cout << " softwareUsersprogram::softwareUsersprogram ENREGISTREMENT " << endl; nameOfSoftware_ = nomDeLogiciel("usersprogram"); registerElement(nomdElements::snapshot,TBoolOk); } bool softwareUsersprogram::createInputFile(particleBeam* beamBefore, unsigned int numeroDeb, unsigned int numeroFin, string workingDir) { if ( !initComputationLimits(numeroDeb,numeroFin) ) return false; if ( numeroDeb_ != numeroFin_ ) { cout << " ERROR softwareUsersprogram::createInputFile : plusieurs elements " << endl; return false; } abstractElement* element = NULL; element = dataManager_->getElementPointerFromNumero(numeroDeb_); // Dans le cas où l'element n'est pas snapshot if ( element->getNomdElement().getElementType() != nomdElements::snapshot ) { cout << " ERROR softwareUsersprogram::execute : element non snapshot " << endl; return false; } vector< pair > > donnees = element->parametersToSoftware(); nomProgram_ = ""; outputFileName_ = ""; for (int k=0; k < donnees.size(); k++) { if ( donnees.at(k).first == "nameOfFiles" ) { if ( donnees.at(k).second.size() < 3 ) { cout << " ERROR softwareUsersprogram::createInputFile " << endl; return false; } nomProgram_ = donnees.at(k).second.at(0).c_str(); inputFileName_ = donnees.at(k).second.at(1).c_str(); outputFileName_ = donnees.at(k).second.at(2).c_str(); break; } } string aml_file = workingDir + inputFileName_ + ".aml"; beamBefore->writeToAMLFile(aml_file); return true; } bool softwareUsersprogram::execute(string workingDir) { bool ExecuteStatus = true; ostringstream sortie; sortie << " EXECUTION DE " << nomProgram_ << " element " << numeroDeb_ << endl; string usersprogramJob = workingDir + nomProgram_; usersprogramJob += " " + workingDir + inputFileName_; usersprogramJob += " " + workingDir + outputFileName_; cout << " job utilisateur= " << usersprogramJob << endl; string resultOfRun; bool success = launchJob(usersprogramJob,resultOfRun); sortie << resultOfRun << endl; if ( !success ) { sortie << " launching of transport failed " << endl; ExecuteStatus = false; } else { string nameOut = workingDir + outputFileName_; ofstream outfile; outfile.open(nameOut.c_str(), ios::out); if (!outfile) { sortie << " error first opening user's program output stream " << nameOut << endl; ExecuteStatus = false; } else { outfile.close(); } } dataManager_->consoleMessage(sortie.str()); return ExecuteStatus; } bool softwareUsersprogram::buildBeamAfterElements(string workingDir) { bool result = true; if ( !ComputationLimitsOk() ) return false; // for (unsigned k = numeroDeb_; k <= numeroFin_; k++) abstractElement* ptr = dataManager_->getElementPointerFromNumero(numeroDeb_); if ( ptr == NULL ) { dataManager_->consoleMessage("ERROR softwareUsersprogram::buildBeamAfterElements : null pointer on element " ); cout << " ERROR softwareUsersprogram::buildBeamAfterElements : null pointer on element " << endl; return false; } if ( doAcceptElement(ptr->getNomdElement().getElementType()) != TBoolOk ) { dataManager_->consoleMessage("ERROR softwareUsersprogram::buildBeamAfterElements : element rejected by user's program " ); cout << "ERROR softwareUsersprogram::buildBeamAfterElements : element rejected by user's program " << endl; } else { // si le numero est reconnu string elemLabel = ptr->getLabel(); // on initialise une nouvelle sortie diagnostic particleBeam* newDiag = dataManager_->updateCurrentDiagnostic(true); // et on la complete string aml_file = workingDir + outputFileName_ + ".aml"; newDiag->readFromAMLFile(aml_file); } return result; }