4 * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.
7 * Mark Larkin Dec 12 2005.
8 * This provides the implementation of the interactive menu functions.
10 * 15-5-07: Added changes to clustering algorithm choice in function phylogenticTreeMenu
11 * Added iteration to the multipleAlignMenu function.
23 #include "InteractiveMenu.h"
29 InteractiveMenu::InteractiveMenu()
33 clustalObj = new Clustal();
36 secStructOutputTxt[0] = string("Secondary Structure");
37 secStructOutputTxt[1] = string("Gap Penalty Mask");
38 secStructOutputTxt[2] = string("Structure and Penalty Mask");
39 secStructOutputTxt[3] = string("None");
43 cerr<<"The memory heap is exhausted. The program must terminate now\n";
47 /* Initialise the menu structs */
48 matrixMenu.noptions = 5;
49 strcpy(matrixMenu.opt[AABLOSUM].title, "BLOSUM series");
50 strcpy(matrixMenu.opt[AABLOSUM].string, "blosum");
51 strcpy(matrixMenu.opt[AAPAM].title, "PAM series");
52 strcpy(matrixMenu.opt[AAPAM].string, "pam");
53 strcpy(matrixMenu.opt[AAGONNET].title, "Gonnet series");
54 strcpy(matrixMenu.opt[AAGONNET].string, "gonnet");
55 strcpy(matrixMenu.opt[AAIDENTITY].title, "Identity matrix");
56 strcpy(matrixMenu.opt[AAIDENTITY].string, "id");
57 strcpy(matrixMenu.opt[AAUSERDEFINED].title, "User defined");
58 strcpy(matrixMenu.opt[AAUSERDEFINED].string, "");
60 dnaMatrixMenu.noptions = 3;
61 strcpy(dnaMatrixMenu.opt[DNAIUB].title, "IUB");
62 strcpy(dnaMatrixMenu.opt[DNAIUB].string, "iub");
63 strcpy(dnaMatrixMenu.opt[DNACLUSTALW].title, "CLUSTALW(1.6)");
64 strcpy(dnaMatrixMenu.opt[DNACLUSTALW].string, "clustalw");
65 strcpy(dnaMatrixMenu.opt[DNAUSERDEFINED].title, "User defined");
66 strcpy(dnaMatrixMenu.opt[DNAUSERDEFINED].string, "");
68 pwMatrixMenu.noptions = 5;
69 strcpy(pwMatrixMenu.opt[PWAABLOSUM].title, "BLOSUM 30");
70 strcpy(pwMatrixMenu.opt[PWAABLOSUM].string, "blosum");
71 strcpy(pwMatrixMenu.opt[PWAAPAM].title, "PAM 350");
72 strcpy(pwMatrixMenu.opt[PWAAPAM].string, "pam");
73 strcpy(pwMatrixMenu.opt[PWAAGONNET].title, "Gonnet 250");
74 strcpy(pwMatrixMenu.opt[PWAAGONNET].string, "gonnet");
75 strcpy(pwMatrixMenu.opt[PWAAIDENTITY].title, "Identity matrix");
76 strcpy(pwMatrixMenu.opt[PWAAIDENTITY].string, "id");
77 strcpy(pwMatrixMenu.opt[PWAAUSER].title, "User defined");
78 strcpy(pwMatrixMenu.opt[PWAAUSER].string, "");
82 InteractiveMenu::~InteractiveMenu()
87 void InteractiveMenu::mainMenu()
93 cout<<" **************************************************************\n";
94 cout<<" ******** CLUSTAL "
95 << userParameters->getRevisionLevel()
96 <<" Multiple Sequence Alignments ********\n";
97 cout<<" **************************************************************\n";
100 cout<<" 1. Sequence Input From Disc\n";
101 cout<<" 2. Multiple Alignments\n";
102 cout<<" 3. Profile / Structure Alignments\n";
103 cout<<" 4. Phylogenetic trees\n\n";
104 cout<<" S. Execute a system command\n";
106 cout<<" X. EXIT (leave program)\n\n\n";
108 choice = utilityObject->getChoice(string("Your choice"));
110 string offendingSeq; // unused here
111 switch (toupper(choice))
114 clustalObj->sequenceInput(false, &offendingSeq);
123 phylogeneticTreeMenu();
130 clustalObj->getHelp('1');
137 cout<<"\n\nUnrecognised Command\n\n";
142 void InteractiveMenu::multipleAlignMenu()
148 cout<<"****** MULTIPLE ALIGNMENT MENU ******\n\n\n";
150 cout<<" 1. Do complete multiple alignment now "
151 <<(!userParameters->getQuickPairAlign() ? "Slow/Accurate" : "Fast/Approximate")
153 cout<<" 2. Produce guide tree file only\n";
154 cout<<" 3. Do alignment using old guide tree file\n\n";
155 cout<<" 4. Toggle Slow/Fast pairwise alignments = "
156 <<((!userParameters->getQuickPairAlign()) ? "SLOW" : "FAST")
158 cout<<" 5. Pairwise alignment parameters\n";
159 cout<<" 6. Multiple alignment parameters\n\n";
160 cout<<" 7. Reset gaps before alignment?";
162 if (userParameters->getResetAlignmentsNew())
171 cout<<" 8. Toggle screen display = "
172 <<((!userParameters->getShowAlign()) ? "OFF" : "ON")
174 cout<<" 9. Output format options\n";
175 cout<<" I. Iteration = ";
177 if(userParameters->getDoRemoveFirstIteration() == ALIGNMENT)
179 cout << "ALIGNMENT\n\n";
181 else if(userParameters->getDoRemoveFirstIteration() == TREE)
190 cout<<" S. Execute a system command\n";
192 cout<<" or press [RETURN] to go back to main menu\n\n\n";
194 choice = utilityObject->getChoice(string("Your choice"));
200 switch (toupper(choice))
203 clustalObj->align(&phylipName);
206 clustalObj->doGuideTreeOnly(&phylipName);
209 clustalObj->doAlignUseOldTree(&phylipName);
212 userParameters->toggleQuickPairAlign();
221 userParameters->toggleResetAlignmentsNew();
222 if (userParameters->getResetAlignmentsNew() == true)
224 userParameters->setResetAlignmentsAll(false);
228 userParameters->toggleShowAlign();
241 clustalObj->getHelp('2');
248 fprintf(stdout, "\n\nUnrecognised Command\n\n");
254 void InteractiveMenu::profileAlignMenu(void)
260 cout<<"****** PROFILE AND STRUCTURE ALIGNMENT MENU ******\n\n\n";
262 cout<<" 1. Input 1st. profile ";
264 if (!userParameters->getProfile1Empty())
270 cout<<" 2. Input 2nd. profile/sequences ";
272 if (!userParameters->getProfile2Empty())
278 cout<<" 3. Align 2nd. profile to 1st. profile\n";
280 cout<<" 4. Align sequences to 1st. profile "
281 <<((!userParameters->getQuickPairAlign())
282 ? "(Slow/Accurate)\n\n" : "(Fast/Approximate)\n\n");
284 cout<<" 5. Toggle Slow/Fast pairwise alignments = "
285 <<((!userParameters->getQuickPairAlign())
286 ? "SLOW\n\n" : "FAST\n\n");
288 cout<<" 6. Pairwise alignment parameters\n";
289 cout<<" 7. Multiple alignment parameters\n\n";
291 cout<<" 8. Toggle screen display = "
292 <<((!userParameters->getShowAlign()) ? "OFF\n" : "ON\n");
294 cout<<" 9. Output format options\n";
295 cout<<" 0. Secondary structure options\n\n";
296 cout<<" S. Execute a system command\n";
298 cout<<" or press [RETURN] to go back to main menu\n\n\n";
300 choice = utilityObject->getChoice(string("Your choice"));
306 switch (toupper(choice))
309 clustalObj->profile1Input();
312 clustalObj->profile2Input();
315 clustalObj->profileAlign(&p1TreeName, &p2TreeName);
318 /* align new sequences to profile 1 */
319 clustalObj->sequencesAlignToProfile(&phylipName);
322 userParameters->toggleQuickPairAlign();
331 userParameters->toggleShowAlign();
344 clustalObj->getHelp('6');
351 cout<<"\n\nUnrecognised Command\n\n";
357 void InteractiveMenu::ssOptionsMenu()
363 cout<<" ********* SECONDARY STRUCTURE OPTIONS *********\n\n\n";
365 cout<<" 1. Use profile 1 secondary structure / penalty mask ";
366 if (userParameters->getUseSS1())
375 cout<<" 2. Use profile 2 secondary structure / penalty mask ";
376 if (userParameters->getUseSS2())
385 cout<<" 3. Output in alignment ";
386 cout<<"= "<< secStructOutputTxt[userParameters->getOutputStructPenalties()] <<"\n\n";
388 cout<<" 4. Helix gap penalty : "
389 <<userParameters->getHelixPenalty()<<"\n";
390 cout<<" 5. Strand gap penalty : "
391 <<userParameters->getStrandPenalty()<<"\n";
392 cout<<" 6. Loop gap penalty : "
393 <<userParameters->getLoopPenalty()<<"\n";
394 cout<<" 7. Secondary structure terminal penalty : "
395 <<userParameters->getHelixEndPenalty()<<"\n";
396 cout<<" 8. Helix terminal positions within : "
397 <<userParameters->getHelixEndMinus()
399 <<userParameters->getHelixEndPlus()<<"\n";
400 cout<<" 9. Strand terminal positions within : "
401 <<userParameters->getStrandEndMinus()
403 <<userParameters->getStrandEndPlus()<<"\n\n\n";
404 cout<<" H. HELP\n\n\n";
406 choice = utilityObject->getChoice(string("Enter number (or [RETURN] to exit)"));
412 switch (toupper(choice))
415 userParameters->toggleUseSS1();
418 userParameters->toggleUseSS2();
421 userParameters->setOutputStructPenalties(secStrOutputOptions());
424 cout<<"Helix Penalty Currently: "
425 << userParameters->getHelixPenalty()<<"\n";
426 userParameters->setHelixPenalty(utilityObject->getInt("Enter number",
427 1,9, userParameters->getHelixPenalty()));
430 cout<<"Strand Gap Penalty Currently: "
431 << userParameters->getStrandPenalty() <<"\n";
432 userParameters->setStrandPenalty(utilityObject->getInt("Enter number",
433 1,9, userParameters->getStrandPenalty()));
436 cout<<"Loop Gap Penalty Currently: "
437 << userParameters->getLoopPenalty() <<"\n";
438 userParameters->setLoopPenalty(utilityObject->getInt("Enter number",
439 1, 9, userParameters->getLoopPenalty()));
442 cout<<"Secondary Structure Terminal Penalty Currently: "
443 << userParameters->getHelixEndPenalty() <<"\n";
444 userParameters->setHelixEndPenalty(utilityObject->getInt("Enter number",
445 1, 9,userParameters->getHelixEndPenalty()));
446 userParameters->setStrandEndPenalty(userParameters->getHelixEndPenalty());
449 cout<<"Helix Terminal Positions Currently: \n";
450 cout<<" within helix: "
451 << userParameters->getHelixEndMinus()
452 << " outside helix: "
453 << userParameters->getHelixEndPlus() <<"\n";
455 userParameters->setHelixEndMinus(utilityObject->getInt(
456 "Enter number of residues within helix",
457 0, 3, userParameters->getHelixEndMinus()));
458 userParameters->setHelixEndPlus(utilityObject->getInt(
459 "Enter number of residues outside helix", 0, 3,
460 userParameters->getHelixEndPlus()));
463 cout<<"Strand Terminal Positions Currently: \n";
464 cout<<" within strand: "
465 << userParameters->getStrandEndMinus()
466 << " outside strand: "
467 << userParameters->getStrandEndPlus() <<"\n";
468 userParameters->setStrandEndMinus(utilityObject->getInt(
469 "Enter number of residues within strand", 0, 3,
470 userParameters->getStrandEndMinus()));
471 userParameters->setStrandEndPlus(utilityObject->getInt(
472 "Enter number of residues outside strand", 0, 3,
473 userParameters->getStrandEndPlus()));
477 clustalObj->getHelp('B');
480 cout<<"\n\nUnrecognised Command\n\n";
485 int InteractiveMenu::secStrOutputOptions()
491 cout<<" ********* Secondary Structure Output Menu *********\n\n\n";
493 cout<<" 1. "<< secStructOutputTxt[0] <<"\n";
494 cout<<" 2. "<< secStructOutputTxt[1] <<"\n";
495 cout<<" 3. "<< secStructOutputTxt[2] <<"\n";
496 cout<<" 4. "<< secStructOutputTxt[3] <<"\n";
497 cout<<" H. HELP\n\n";
498 cout<<" -- Current output is "
499 << secStructOutputTxt[userParameters->getOutputStructPenalties()];
502 choice = utilityObject->getChoice(string("Enter number (or [RETURN] to exit)"));
505 return (userParameters->getOutputStructPenalties());;
508 switch (toupper(choice))
520 clustalObj->getHelp('C');
526 cout<< "\n\nUnrecognised Command\n\n";
532 void InteractiveMenu::phylogeneticTreeMenu()
538 cout<<"****** PHYLOGENETIC TREE MENU ******\n\n\n";
540 cout<<" 1. Input an alignment\n";
541 cout<<" 2. Exclude positions with gaps? ";
543 if (userParameters->getTossGaps())
552 cout<<" 3. Correct for multiple substitutions? ";
554 if (userParameters->getKimura())
563 cout<<" 4. Draw tree now\n";
564 cout<<" 5. Bootstrap tree\n";
565 cout<<" 6. Output format options\n";
566 cout<<" 7. Clustering algorithm = "; // Mark change 15-5-2007
567 if(userParameters->getClusterAlgorithm() == NJ)
575 cout<<" S. Execute a system command\n";
577 cout<<" or press [RETURN] to go back to main menu\n\n\n";
579 choice = utilityObject->getChoice(string("Your choice"));
585 string offendingSeq; // unused here
586 switch (toupper(choice))
589 clustalObj->sequenceInput(false, &offendingSeq);
592 userParameters->toggleTossGaps();
595 userParameters->toggleKimura();
598 clustalObj->phylogeneticTree(&phylipName, &clustalName, &distName,
599 &nexusName, "amenu.pim");
602 clustalObj->bootstrapTree(&phylipName, &clustalName, &nexusName);
605 treeFormatOptionsMenu();
608 clusteringAlgorithmMenu();
615 clustalObj->getHelp('7');
622 cout<<"\n\nUnrecognised Command\n\n";
628 void InteractiveMenu::treeFormatOptionsMenu()
634 cout<<" ****** Format of Phylogenetic Tree Output ******\n\n\n";
635 cout<<" 1. Toggle CLUSTAL format tree output = "
636 << ((!userParameters->getOutputTreeClustal()) ? "OFF" : "ON")<<"\n";
637 cout<<" 2. Toggle Phylip format tree output = "
638 << ((!userParameters->getOutputTreePhylip()) ? "OFF" : "ON")<<"\n";
639 cout<<" 3. Toggle Phylip distance matrix output = "
640 << ((!userParameters->getOutputTreeDistances()) ? "OFF" : "ON")<<"\n";
641 cout<<" 4. Toggle Nexus format tree output = "
642 << ((!userParameters->getOutputTreeNexus()) ? "OFF" : "ON")<<"\n\n";
643 cout<<" 5. Toggle Phylip bootstrap positions = "
644 <<((userParameters->getBootstrapFormat() == BS_NODE_LABELS) ? "NODE LABELS" :
645 "BRANCH LABELS") <<"\n\n\n";
646 cout<<" H. HELP\n\n\n";
648 choice = utilityObject->getChoice(string("Enter number (or [RETURN] to exit)"));
653 switch (toupper(choice))
656 userParameters->toggleOutputTreeClustal();
659 userParameters->toggleOutputTreePhylip();
662 userParameters->toggleOutputTreeDistances();
665 userParameters->toggleOutputTreeNexus();
668 userParameters->toggleBootstrapFormat();
672 clustalObj->getHelp('0');
675 cout<< "\n\nUnrecognised Command\n\n";
682 void InteractiveMenu::formatOptionsMenu()
689 cout<<" ********* Format of Alignment Output *********\n\n\n";
690 cout<<" F. Toggle FASTA format output = "
691 << ((!userParameters->getOutputFasta()) ? "OFF" : "ON") <<"\n\n";
692 cout<<" 1. Toggle CLUSTAL format output = "
693 << ((!userParameters->getOutputClustal()) ? "OFF" : "ON") <<"\n";
694 cout<<" 2. Toggle NBRF/PIR format output = "
695 << ((!userParameters->getOutputNbrf()) ? "OFF" : "ON") << "\n";
696 cout<<" 3. Toggle GCG/MSF format output = "
697 << ((!userParameters->getOutputGCG()) ? "OFF" : "ON") << "\n";
698 cout<<" 4. Toggle PHYLIP format output = "
699 << ((!userParameters->getOutputPhylip()) ? "OFF" : "ON") << "\n";
700 cout<<" 5. Toggle NEXUS format output = "
701 << ((!userParameters->getOutputNexus()) ? "OFF" : "ON") << "\n";
702 cout<<" 6. Toggle GDE format output = "
703 << ((!userParameters->getOutputGde()) ? "OFF" : "ON") << "\n\n";
704 cout<<" 7. Toggle GDE output case = "
705 << ((!userParameters->getLowercase()) ? "UPPER" : "LOWER") << "\n";
707 cout<<" 8. Toggle CLUSTALW sequence numbers = "
708 << ((!userParameters->getClSeqNumbers()) ? "OFF" : "ON") << "\n";
709 cout<<" 9. Toggle output order = "
710 << ((userParameters->getOutputOrder() == 0) ? "INPUT FILE" : "ALIGNED")
713 cout<<" 0. Create alignment output file(s) now?\n\n";
714 cout<<" T. Toggle parameter output = "
715 << ((!userParameters->getSaveParameters()) ? "OFF" : "ON") << "\n";
716 cout<<" R. Toggle sequence range numbers = "
717 <<((!userParameters->getSeqRange()) ? "OFF" : "ON") << "\n\n";
719 cout<<" H. HELP\n\n\n";
721 choice = utilityObject->getChoice(string("Enter number (or [RETURN] to exit)"));
726 switch (toupper(choice))
729 userParameters->toggleOutputClustal();
732 userParameters->toggleOutputNbrf();
735 userParameters->toggleOutputGCG();
738 userParameters->toggleOutputPhylip();
741 userParameters->toggleOutputNexus();
744 userParameters->toggleOutputGde();
747 userParameters->toggleLowercase();
750 userParameters->toggleClSeqNumbers();
753 userParameters->toggleOutputOrder();
756 userParameters->toggleOutputFasta();
759 userParameters->toggleSeqRange();
762 clustalObj->outputNow();
765 userParameters->toggleSaveParameters();
769 clustalObj->getHelp('5');
772 cout<<"\n\nUnrecognised Command\n\n";
778 void InteractiveMenu::pairwiseMenu()
780 if (userParameters->getDNAFlag())
782 userParameters->setPWParamToDNA();
786 userParameters->setPWParamToProtein();
793 cout<<" ********* PAIRWISE ALIGNMENT PARAMETERS *********\n\n\n";
795 cout<<" Slow/Accurate alignments:\n\n";
797 cout<<" 1. Gap Open Penalty : "
798 << fixed << setprecision(2) << userParameters->getPWGapOpen() << "\n";
799 cout<<" 2. Gap Extension Penalty : "
800 << fixed << setprecision(2) << userParameters->getPWGapExtend() << "\n";
801 cout<< " 3. Protein weight matrix :"
802 << matrixMenu.opt[subMatrix->getPWMatrixNum() - 1].title
804 cout<<" 4. DNA weight matrix :"
805 << dnaMatrixMenu.opt[subMatrix->getPWDNAMatrixNum() - 1].title
808 cout<<" Fast/Approximate alignments:\n\n";
810 cout<<" 5. Gap penalty :"
811 << userParameters->getWindowGap() << "\n";
812 cout<<" 6. K-tuple (word) size :"
813 << userParameters->getKtup() << "\n";
814 cout<<" 7. No. of top diagonals :"
815 << userParameters->getSignif() << "\n";
816 cout<<" 8. Window size :"
817 << userParameters->getWindow() << "\n\n";
819 cout<<" 9. Toggle Slow/Fast pairwise alignments ";
820 if (userParameters->getQuickPairAlign())
830 cout<<" H. HELP\n\n\n";
831 choice = utilityObject->getChoice(string("Enter number (or [RETURN] to exit)"));
834 if (userParameters->getDNAFlag())
836 userParameters->setPWDNAParam();
840 userParameters->setPWProteinParam();
847 switch (toupper(choice))
850 cout<<"Gap Open Penalty Currently: "
851 << userParameters->getPWGapOpen() << "\n";
852 userParameters->setPWGapOpen(
853 (float)utilityObject->getReal("Enter number", (double)0.0,
854 (double)100.0, (double)userParameters->getPWGapOpen()));
857 cout<<"Gap Extension Penalty Currently: "
858 << userParameters->getPWGapExtend() << "\n";
859 userParameters->setPWGapExtend(
860 (float)utilityObject->getReal("Enter number", (double)0.0,
861 (double)10.0, (double)userParameters->getPWGapExtend()));
864 readMatrix(Protein, Pairwise, pwMatrixMenu);
867 readMatrix(DNA, Pairwise, dnaMatrixMenu);
870 cout<<"Gap Penalty Currently: "
871 << userParameters->getWindowGap() << "\n";
872 userParameters->setWindowGap(
873 utilityObject->getInt("Enter number", 1, 500,
874 userParameters->getWindowGap()));
877 cout<<"K-tuple Currently: "
878 << userParameters->getKtup() << "\n";
879 if (userParameters->getDNAFlag())
881 int _ktup = utilityObject->getInt("Enter number", 1, 4,
882 userParameters->getKtup());
883 userParameters->setKtup(_ktup);
885 userParameters->setDNAKtup(_ktup);
886 userParameters->setWindowGap(_ktup + 4);
887 userParameters->setDNAWindowGap(_ktup + 4);
892 int _ktup = utilityObject->getInt("Enter number", 1, 2,
893 userParameters->getKtup());
894 userParameters->setKtup(_ktup);
896 userParameters->setAAKtup(_ktup);
897 userParameters->setWindowGap(_ktup + 3);
898 userParameters->setAAWindowGap(_ktup + 3);
903 cout<<"Top diagonals Currently: "
904 << userParameters->getSignif() << "\n";
905 userParameters->setSignif(
906 utilityObject->getInt("Enter number", 1, 50,
907 userParameters->getSignif()));
910 cout<<"Window size Currently: "
911 << userParameters->getWindow() << "\n";
912 userParameters->setWindow(
913 utilityObject->getInt("Enter number", 1, 50,
914 userParameters->getWindow()));
917 userParameters->toggleQuickPairAlign();
921 clustalObj->getHelp('3');
924 cout<< "\n\nUnrecognised Command\n\n";
930 void InteractiveMenu::multiMenu()
932 if (userParameters->getDNAFlag())
934 userParameters->setDNAMultiGap();
938 userParameters->setProtMultiGap();
944 cout<<"\n\n\n ********* MULTIPLE ALIGNMENT PARAMETERS *********\n\n\n";
945 cout<<" 1. Gap Opening Penalty :"
946 << fixed << setprecision(2) << userParameters->getGapOpen() << "\n";
947 cout<<" 2. Gap Extension Penalty :"
948 << fixed << setprecision(2) << userParameters->getGapExtend() << "\n";
950 cout<<" 3. Delay divergent sequences :"
951 << userParameters->getDivergenceCutoff() << " %\n\n";
953 cout<<" 4. DNA Transitions Weight :"
954 << fixed << setprecision(2) << userParameters->getTransitionWeight() << "\n\n";
955 cout<<" 5. Protein weight matrix :"
956 << matrixMenu.opt[subMatrix->getMatrixNum() - 1].title
958 cout<<" 6. DNA weight matrix :"
959 << dnaMatrixMenu.opt[subMatrix->getDNAMatrixNum() - 1].title
961 cout<<" 7. Use negative matrix :"
962 << ((!userParameters->getUseNegMatrix()) ? "OFF" : "ON") << "\n\n";
963 cout<<" 8. Protein Gap Parameters\n\n";
964 cout<<" H. HELP\n\n\n";
966 choice = utilityObject->getChoice(string("Enter number (or [RETURN] to exit)"));
969 if (userParameters->getDNAFlag())
971 //userParameters->setDNAMultiGap();
972 userParameters->setDNAGapOpen(userParameters->getGapOpen());
973 userParameters->setDNAGapExtend(userParameters->getGapExtend());
977 //userParameters->setProtMultiGap();
978 userParameters->setAAGapOpen(userParameters->getGapOpen());
979 userParameters->setAAGapExtend(userParameters->getGapExtend());
985 switch (toupper(choice))
988 cout<<"Gap Opening Penalty Currently: "
989 << userParameters->getGapOpen() << "\n";
990 userParameters->setGapOpen(
991 (float)utilityObject->getReal("Enter number", (double)0.0,
992 (double)100.0, (double)userParameters->getGapOpen()));
995 cout<<"Gap Extension Penalty Currently: "
996 << userParameters->getGapExtend() << "\n";
997 userParameters->setGapExtend(
998 (float)utilityObject->getReal("Enter number", (double)0.0,
999 (double)10.0, (double)userParameters->getGapExtend()));
1002 cout<<"Min Identity Currently: "
1003 << userParameters->getDivergenceCutoff() << "\n";
1004 userParameters->setDivergenceCutoff(
1005 utilityObject->getInt("Enter number", 0, 100,
1006 userParameters->getDivergenceCutoff()));
1009 cout<<"Transition Weight Currently: "
1010 << userParameters->getTransitionWeight() << "\n";
1011 userParameters->setTransitionWeight(
1012 (float)utilityObject->getReal("Enter number", (double)0.0,
1014 (double)userParameters->getTransitionWeight()));
1017 readMatrix(Protein, MultipleAlign, matrixMenu);
1020 readMatrix(DNA, MultipleAlign, dnaMatrixMenu);
1023 userParameters->toggleUseNegMatrix();
1030 //clustalObj->getHelp('4');
1033 cout<< "\n\nUnrecognised Command\n\n";
1039 void InteractiveMenu::gapPenaltiesMenu()
1045 cout<< "\n\n\n ********* PROTEIN GAP PARAMETERS *********\n\n\n\n";
1046 cout<<" 1. Toggle Residue-Specific Penalties :"
1047 << ((userParameters->getNoPrefPenalties()) ? "OFF" : "ON") << "\n\n";
1048 cout<<" 2. Toggle Hydrophilic Penalties :"
1049 << ((userParameters->getNoHydPenalties()) ? "OFF" : "ON") << "\n";
1050 cout<<" 3. Hydrophilic Residues :"
1051 << userParameters->getHydResidues() << "\n\n";
1052 cout<<" 4. Gap Separation Distance :"
1053 << userParameters->getGapDist() << "\n";
1054 cout<<" 5. Toggle End Gap Separation :"
1055 << ((!userParameters->getUseEndGaps()) ? "OFF" : "ON") << "\n\n";
1056 cout<<" H. HELP\n\n\n";
1058 choice = utilityObject->getChoice(string("Enter number (or [RETURN] to exit)"));
1064 switch (toupper(choice))
1067 userParameters->toggleNoPrefPenalties();
1070 userParameters->toggleNoHydPenalties();
1073 cout<<"Hydrophilic Residues Currently: "
1074 << userParameters->getHydResidues() << "\n";
1076 utilityObject->getStr(string("Enter residues (or [RETURN] to quit)"), lin1);
1077 if (lin1.size() > 0)
1079 userParameters->setHydResidues(lin1);
1083 cout<<"Gap Separation Distance Currently: "
1084 << userParameters->getGapDist() << "\n";
1085 userParameters->setGapDist(
1086 utilityObject->getInt("Enter number", 0, 100,
1087 userParameters->getGapDist()));
1090 userParameters->toggleUseEndGaps();
1094 clustalObj->getHelp('A');
1097 cout<< "\n\nUnrecognised Command\n\n";
1104 * This function displays the menu for selecting the weight matrix to use.
1105 * It is used for both the protein and DNA menu for pairwise and Multiple alignment.
1106 * This is why it requires the MatMenu struct.
1108 int InteractiveMenu::readMatrix(int alignResidueType, int alignType, MatMenu menu)
1110 static char userFile[FILENAMELEN + 1];
1113 int matn; // Used to show which is the current matrix.
1115 if(alignResidueType == Protein)
1117 strcpy(title, "PROTEIN");
1121 strcpy(title, "DNA");
1127 cout<<"\n\n\n ********* "<< title <<" WEIGHT MATRIX MENU *********\n\n\n";
1129 // Find out what the currently selected matrix is.
1130 matn = subMatrix->getMatrixNumForMenu(alignResidueType, alignType);
1132 for (i = 0; i < menu.noptions; i++)
1134 cout<< " " << i + 1 << ". " << menu.opt[i].title << "\n";
1137 cout<<" H. HELP\n\n";
1138 cout<<" -- Current matrix is the "
1139 << menu.opt[matn -1].title << " ";
1141 if (matn == menu.noptions)
1143 cout<<"(file = "<< userFile <<")";;
1147 choice = utilityObject->getChoice(string("Enter number (or [RETURN] to exit)"));
1153 option = toupper(choice) - '0';
1154 // Select the matrix series to be using
1155 if (option > 0 && option < menu.noptions)
1157 subMatrix->setCurrentNameAndNum(string(menu.opt[i - 1].string), option,
1158 alignResidueType, alignType);
1160 else if (option == menu.noptions) // Read in a User defined matrix.
1162 // NOTE this will be changed to deal with matrix series.
1163 if (subMatrix->getUserMatFromFile(userFile, alignResidueType, alignType))
1165 subMatrix->setCurrentNameAndNum(userFile, option,
1166 alignResidueType, alignType);
1170 switch (toupper(choice))
1174 clustalObj->getHelp('8');
1177 cout<< "\n\nUnrecognised Command\n\n";
1183 void InteractiveMenu::doSystem()
1186 utilityObject->getStr(string("\n\nEnter system command"), lin1);
1188 if (lin1.size() > 0)
1190 system(lin1.c_str());
1195 void InteractiveMenu::clusteringAlgorithmMenu()
1197 string currentAlgorithm = "";
1198 cout<<"****** CLUSTERING ALGORITHM MENU ******\n\n\n";
1201 if(userParameters->getClusterAlgorithm() == NJ)
1203 currentAlgorithm = "Neighbour Joining";
1207 currentAlgorithm = "UPGMA";
1211 cout<<" ****** Clustering Algorithms ******\n\n\n";
1212 cout<<" 1. Neighbour Joining \n";
1213 cout<<" 2. UPGMA \n";
1214 cout << "-- Current algorithm is "<< currentAlgorithm << " --\n\n\n";
1217 choice = utilityObject->getChoice(string("Enter number (or [RETURN] to exit)"));
1222 switch (toupper(choice))
1225 userParameters->setClusterAlgorithm(NJ);
1228 userParameters->setClusterAlgorithm(UPGMA);
1231 cout<< "\n\nUnrecognised Command\n\n";
1237 void InteractiveMenu::iterationMenu()
1239 string currentIteration = "";
1240 cout<<"****** ITERATION MENU ******\n\n\n";
1243 if(userParameters->getDoRemoveFirstIteration() == ALIGNMENT)
1245 currentIteration = "Alignment iteration";
1247 else if(userParameters->getDoRemoveFirstIteration() == TREE)
1249 currentIteration = "Tree based iteration";
1253 currentIteration = "None";
1257 cout<<" ****** Iteration Choices ******\n\n\n";
1259 cout<<" 2. Tree based iteration (iterates each profile alignment step) \n";
1260 cout<<" 3. Alignment iteration (iterates final alignment only) \n\n";
1261 cout << "-- Current selection is "<< currentIteration << " --\n\n\n";
1264 choice = utilityObject->getChoice(string("Enter number (or [RETURN] to exit)"));
1269 switch (toupper(choice))
1272 userParameters->setDoRemoveFirstIteration(NONE);
1275 userParameters->setDoRemoveFirstIteration(TREE);
1278 userParameters->setDoRemoveFirstIteration(ALIGNMENT);
1281 cout<< "\n\nUnrecognised Command\n\n";