27 if(p_pipeline->OriginalBranches().size() == 1) {
28 p_inBranches.push_back(
"");
29 p_outBranches.push_back(
"");
30 p_enableBranch.push_back(
true);
34 p_outBranches = p_pipeline->OriginalBranches();
35 for(
int i=0; i<(int)p_outBranches.size(); i++) {
36 p_enableBranch.push_back(
true);
52 p_previous = previous;
56 p_inBranches = p_previous->OutputBranches();
57 p_outBranches = p_previous->OutputBranches();
58 for(
int i=0; i<(int)p_outBranches.size(); i++) {
59 p_enableBranch.push_back(
true);
61 p_previous->SetNext(
this);
76 p_supportsVirtualBands = supportsVirtualBands;
91 if(value == LastAppOutputList) {
93 p_outBranches.clear();
94 p_outBranches.push_back(
"");
96 else if(value == LastAppOutputListNoMerge) {
98 value = LastAppOutputList;
102 p_supportsVirtualBands = supportsVirtualBands;
117 const QString &outNameModifier,
const QString &outFileExtension) {
118 p_output.push_back(
PipelineParameter(FindBranch(branch,
false), outputParamName));
119 p_outputMod = outNameModifier;
120 p_outputExtension = outFileExtension;
134 p_outputMod = outNameModifier;
135 p_outputExtension = outFileExtension;
158 if(modString ==
"") {
159 string msg =
"Can not add empty branch to pipeline";
168 if(p_outBranches[0] ==
"") {
169 p_outBranches.clear();
170 p_enableBranch.clear();
173 if(p_inBranches.size() == 1) {
174 p_outBranches.push_back(modString);
175 p_enableBranch.push_back(
true);
177 else if(p_inBranches.size() == p_outBranches.size()) {
178 for(
int outBranch = p_outBranches.size() - 1; outBranch >= 0; outBranch --) {
179 if(p_inBranches[outBranch] == p_outBranches[outBranch]) {
180 p_outBranches[outBranch] = p_inBranches[outBranch] +
"." + modString;
183 p_outBranches.push_back(p_inBranches[outBranch] +
"." + modString);
184 p_enableBranch.push_back(
true);
189 for(
unsigned int inBranch = 0; inBranch < p_inBranches.size(); inBranch ++) {
190 p_outBranches.push_back(p_inBranches[inBranch] +
"." + modString);
191 p_enableBranch.push_back(
true);
241 for(
unsigned int i = 0; !added && i < p_params.size(); i++) {
242 if(p_params[i].Name() == appParamName) {
265 p_params.push_back(
PipelineParameter(FindBranch(branch,
false), appParamName, appParamValue));
290 p_params.push_back(
PipelineParameter(FindBranch(branch,
false), appParamName, value));
303 p_paramString.clear();
307 if(!Enabled())
return;
311 bool needList =
false;
314 bool runOnce = Merges() && !Branches();
327 if(!runOnce && p_input.size() == 1) {
332 for(
int param = 0; param < (int)p_params.size() && runOnce; param++) {
333 runOnce = (p_params[param].IsSpecial() && p_params[param].Special() == LastAppOutputList) ||
334 (!p_params[param].
IsSpecial() && p_params[param].AffectsAllBranches());
340 for(
int branch = 0; branch < (int)p_inBranches.size(); branch ++) {
341 if(runOnce && branch > 0) {
345 if(!BranchEnabled(branch)) {
346 QString tmpBranch(branch);
347 p_outputs.push_back(p_name +
"." +tmpBranch +
".blank");
353 QString inputFile = CalculateInputFile(branch);
355 QString outputFile = CalculateOutputFile(branch);
364 needList = (inputParam.
IsSpecial() && inputParam.
Special() == LastAppOutputList);
366 for(
int param = 0; param < (int)p_params.size() && !needList; param++) {
367 needList = (p_params[param].IsSpecial() && p_params[param].Special() == LastAppOutputList);
373 QString listName = outputFile;
375 if(listName.isEmpty()) {
382 QString input = p_pipeline->TemporaryFolder() +
"/" +
FileName(listName).
baseName() +
".lis";
383 params =
">>LIST " + input +
" ";
387 while(prev != NULL && infile < (
int)p_inBranches.size()) {
397 p_tempFiles.push_back(input);
398 p_paramString.push_back(params);
406 params = GetInputParameter(branch).
Name() +
"=\"" + listFile +
"\"";
411 params = GetInputParameter(branch).Name() +
"=\"" + inputFile;
412 if(p_virtualBands.size() == 1) {
413 params +=
"+" + p_virtualBands[0];
415 else if(p_virtualBands.size() == p_inBranches.size() && !p_virtualBands[branch].isEmpty()) {
416 params +=
"+" + p_virtualBands[branch];
423 if(p_output.size() != 0) {
424 if(Branches() && p_output.size() != 1) {
426 for(
unsigned int outBranch = 0; outBranch < p_outBranches.size(); outBranch ++) {
428 bool outputSet =
false;
431 if(p_inBranches.size() > 1) {
432 if(!StringStartsWith(p_outBranches[outBranch], p_inBranches[branch])) {
438 for(
unsigned int outParam = 0; outParam < p_output.size(); outParam++) {
439 if(p_output[outParam].AppliesToBranch(outBranch)) {
440 params +=
" " + p_output[outParam].Name() +
"=\"" + p_outputs[outBranch] +
"\"";
443 QString message =
"Application [" + Name() +
"] in the pipeline branches with an ";
444 message +=
"output parameter for each branch, but branch [" + p_outBranches[outBranch];
445 message +=
"] has multiple output files specified.";
454 QString message =
"Application [" + Name() +
"] in the pipeline branches with an ";
455 message +=
"output parameter for each branch, but branch [" + p_outBranches[outBranch];
456 message +=
"] has no output files specified.";
462 bool foundBranch =
false;
465 for(
unsigned int outputParam = 0; outputParam < p_output.size(); outputParam++) {
466 if(p_output[outputParam].AppliesToBranch(branch)) {
467 params +=
" " + p_output[0].Name() +
"=\"" + outputFile +
"\"";
472 if(!foundBranch)
continue;
477 for(
int i = 0; i < (int)p_params.size() && i < (int)p_params.size(); i++) {
478 if(p_params[i].AppliesToBranch(branch)) {
480 params +=
" " + p_params[i].Name() +
"=\"" + p_params[i].Value() +
"\"";
482 else if(p_params[i].Special() == LastOutput) {
483 params +=
" " + p_params[i].Name() +
"=\"" + GetRealLastOutput(
true) +
"\"";
485 else if(p_params[i].Special() == LastAppOutputList) {
486 params +=
" " + p_params[i].Name() +
"=\"" + listFile +
"\"";
491 if(inputFile.isEmpty()) {
492 QString message =
"There was a problem with calculating the inputs for program [" + Name();
493 message +=
"]. Please verify your program is not setting outputs for branches that ";
494 message +=
"don't have input.";
499 p_paramString.push_back(params);
524 while (prev != NULL && file==
"") {
527 string msg =
"Application branches but branch is disabled";
557 file = p_pipeline->OriginalInput(branch);
558 if (file.isEmpty()) {
559 int index = branch / (p_pipeline->OriginalBranchesSize() / p_pipeline->OriginalInputSize());
560 file = p_pipeline->OriginalInput(index);
565 for(
int i = 0; i < (int)p_input.size(); i++) {
566 if(p_input[i].AppliesToBranch(branch) && p_input[i].IsSpecial()) {
567 if(p_input[i].Special() == LastOutput) {
568 file = GetRealLastOutput();
586 QString outFolder = p_pipeline->TemporaryFolder();
590 bool usedBranch =
false;
591 unsigned int usedBranchIndex = 0;
592 unsigned int numUsedBranches = 0;
594 for(
unsigned int outputBranch = 0; outputBranch < p_outBranches.size(); outputBranch++) {
595 bool outBranchUsed =
false;
597 for(
unsigned int outputParam = 0; outputParam < p_output.size(); outputParam ++) {
598 if(p_output[outputParam].AppliesToBranch(outputBranch)) {
599 outBranchUsed =
true;
604 if(outputBranch < (
unsigned int)branch) {
608 if((
unsigned int)branch == outputBranch) {
616 if(!usedBranch)
return "";
618 if(!LastApplicationWithOutput()) {
619 QString lastOutput = p_pipeline->FinalOutput(branch,
false);
620 outputFile = outFolder +
"/" +
621 FileName(lastOutput).
baseName() +
"." + p_outputMod +
"." + p_outputExtension;
623 if(p_outputMod.isEmpty()) {
624 outputFile = outFolder +
"/" +
629 outputFile = p_pipeline->FinalOutput(branch, numUsedBranches > 1);
633 if(!LastApplicationWithOutput() && numUsedBranches != 1 && !p_outputMod.isEmpty()) {
636 QString realOut(outFolder +
"/" + outfile.
baseName() +
"." + p_outBranches[branch] +
"." + p_outputExtension);
641 if(p_outputs.size() == usedBranchIndex) {
642 p_outputs.push_back(realOut);
648 if(branch == 0 && Branches()) {
649 for(
unsigned int i = 1; i < OutputBranches().size(); i++) {
650 CalculateOutputFile(i);
659 outputFile = realOut;
663 else if(!p_outputMod.isEmpty()) {
664 if(p_outputs.size() == usedBranchIndex) {
665 p_outputs.push_back(outputFile);
671 if(branch == 0 && Branches()) {
672 for(
unsigned int i = 1; i < OutputBranches().size(); i++) {
673 CalculateOutputFile(i);
689 if(!Next() && !p_output.empty()) {
692 if(!Next() && p_output.empty()) {
697 return !Next()->FutureOutputFileCreated();
708 if(!p_output.empty()) {
712 if(!Next() && p_output.empty()) {
716 return Next()->FutureOutputFileCreated();
728 for(
int i = 0; i < (int)p_input.size(); i++) {
729 if(p_input[i].AppliesToBranch(branch)) {
734 if(p_inBranches[0] !=
"") {
735 QString msg =
"Application [" + Name() +
"] in the pipeline does not have an input for branch [" + p_inBranches[branch] +
"]";
739 QString msg =
"Application [" + Name() +
"] in the pipeline does not have an input";
758 while(!found && branchIndex < (
int)p_inBranches.size()) {
759 if(p_inBranches[branchIndex] == name) {
768 while(!found && branchIndex < (
int)p_outBranches.size()) {
769 if(p_outBranches[branchIndex] == name) {
779 QString msg =
"Branch [" + name +
"] does not exist in the pipeline application [" + Name() +
"]";
796 if(!LastApplicationWithOutput()) {
797 for(
int i = 0; i < (int)p_outputs.size(); i++) {
798 tmp.push_back(p_outputs[i]);
802 for(
int i = 0; i < (int)p_tempFiles.size(); i++) {
803 tmp.push_back(p_tempFiles[i]);
821 return GetOutputs()[GetOutputs().size()-1];
824 if(p_outputs.size() > 1) {
825 return GetOutputs()[GetOutputs().size()-2];
828 return Previous()->GetOutputs()[Previous()->GetOutputs().size()-1];
839 if(!Enabled())
return false;
840 return p_supportsVirtualBands;
851 p_virtualBands = bands;
856 if(Enabled() && p_outputs.size() != 0) {
859 else if(Previous()) {
860 return Previous()->GetOutputs();
QString path() const
Returns the path of the file name.
bool BranchEnabled(int branch)
Check whether a branch is enabled given branch index.
static UserInterface & GetUserInterface()
Returns the UserInterface object.
File name manipulation and expansion.
const QString & Name() const
Get the name of this pipeline application.
std::vector< QString > & GetOutputs()
This returns this application's output files. Only valid after BuildParamString is called...
PipelineApplication::CustomParameterValue Special()
Special value of the parameter.
bool LastApplicationWithOutput()
Returns true if this is the last application with output.
void BuildParamString()
This method calculates the inputs, outputs and necessary calls to this program for the pipeline...
Namespace for the standard library.
QString GetAsString(const QString ¶mName) const
Allows the retrieval of a value for a parameter of any type.
bool FutureOutputFileCreated()
Returns true if a future application creates output.
This class helps to call other Isis Applications in a Pipeline.
This error is for when a programmer made an API call that was illegal.
QString CalculateOutputFile(int branch)
This method calculates the output file for the specified branch.
Pipeline * GetPipeline()
Returns the pipeline.
void AddBranch(const QString &modString, NameModifierType type)
This method adds branch to this program.
std::vector< QString > OriginalBranches()
Returns the names of the original branches of the pipeline (input files * branches if any) ...
NameModifierType
This is used for branches.
PipelineApplication * Previous() const
This returns the last enabled pipeline application or null.
This class represents one application in the pipeline.
#define _FILEINFO_
Macro for the filename and line number.
bool Branches()
Return true is this application does branch (one input branch, multiple output)
void AddConstParameter(const QString &appParamName, const QString &appParamValue)
This method adds a parameter to this application with a known value (does not get it from the user in...
bool SupportsVirtualBands()
Returns true if virtual bands are supported.
bool IsSpecial(const double d)
Returns if the input pixel is special.
int FindBranch(QString name, bool input=true)
The method, given a string, finds the index of a branch.
This class represents a parameter of some type for the PipelineApplication.
PipelineApplication(QString appName, Pipeline *pipe)
Constructs the first pipeline application.
void SetVirtualBands(std::vector< QString > bands)
Set the virtual bands that this application is to apply.
bool IsSpecial()
True if the parameter value is special.
CustomParameterValue
This is used to set custom values that must be calculated on the fly.
QString baseName() const
Returns the name of the file without the path and without extensions.
void AddParameter(const QString &inputParamName, const QString &appParamName)
This method adds knowledge of a parameter to the application.
const std::vector< QString > & OutputBranches() const
Get the branches this program has as output.
Namespace for ISIS/Bullet specific routines.
PipelineParameter & GetInputParameter(int branch)
This gets the input parameter for the specified branch.
Command Line and Xml loader, validation, and access.
void SetInputParameter(const QString &inputParamName, bool supportsVirtualBands)
Set the input parameter for this application and whether or not this application supports the virtual...
void SetOutputParameter(const QString &outputParamName, const QString &outNameModifier, const QString &outFileExtension="cub")
Set the output parameter for this application and it's naming convention.
bool WasEntered(const QString ¶mName) const
Returns a true if the parameter has a value, and false if it does not.
QString GetRealLastOutput(bool skipOne=false)
This method is used to calculate the value for CustomParameterValue::LastOutput.
std::vector< QString > TemporaryFiles()
This method returns a list of the temporary files generated by this program.
QString CalculateInputFile(int branch)
This method calculates the input file for the specified branch.