next sect //$myRes .= $str."\n" if( $flag == 1 ); if( $flag == 1 ) $myRes .= $str ; //."\n"; //$flag = 1 if( $flag == 0 && $str =~ /\[($mySect)\]/ ); if( $flag == 0 && preg_match( "/\[(". $mySect. ")\]/", $str ) ) $flag = 1; } return $myRes; } #================================================================= # Create mapHash, such as $mapHash{ $tmpName } = $oldName, # where $tmpName = seq0001, $oldName - initial use given name. # Here sequences names are justified to the maximal length. #================================================================= function f_makeHash( $myInp ) { //= $map //my( $myInp ) = @_; //@arr = split( /\n/, $myInp ); $arr = preg_split( "/\n/", $myInp ); $myHash = Array(); //%myHash = (); $maxLen = 0; //foreach $str ( @arr ) { for( $i = 0; $i < count($arr); ++$i ) { $str = $arr[$i]; if( empty( $str ) ) continue; //+if( $i == 0 ) //+ echo "str=" . $str . "
\n"; $str2 = split( "[\r\n]", $str, 2 ); // *** //continue; //@_arr = split( /\s+/, $str ); $_arr = preg_split( "/\s+/", $str2[0], 2 ); //$_arr = split( "[ +]", $str, 2 ); if( empty( $_arr[ 0 ] ) ) continue; // <-------------------- //$myHash{ $_arr[ 0 ] } = substr( $_arr[ 1 ], 0, 20 ); $myHash[ $_arr[ 0 ] ] = substr( $_arr[ 1 ], 0, 20 ); //+echo "***". $_arr[0]. "=". $_arr[1] . "
\n"; //$maxLen = length( $_arr[ 1 ] ) if( $maxLen < length( $_arr[ 1 ] ) ); if( $maxLen < strlen( $_arr[ 1 ] ) ) $maxLen = strlen( $_arr[ 1 ] ) ; } //foreach $key ( keys %myHash ) { reset( $myHash ); while( list( $key, $value ) = each( $myHash ) ) { //for( $i = length( $myHash{ $key } ); $i < $maxLen; $i++ ) { // $myHash{ $key } .= " "; //} for( $i = strlen( $value ); $i < $maxLen; $i++ ) { $value .= " "; } $myHash[ $key ] = $value; } return $myHash; //%myHash; } #================================================================= # Print warnins is exist #================================================================= function f_prnWarn() { // ??????? /** my( $myWar ) = @_; if( $myWar !~ /^[\s]+$/) { print ""; @aWar = split( /\n/, $myWar ); foreach $wStr ( @aWar ) { @_ar = split( /[\s]+/, $wStr, 2 ); print $_ar[ 1 ]."
"; } print "
"; return 1; } **/ return 0; } #================================================================= # Substitute all tmpName with old ( initial, user ) names. #================================================================= function f_substName( $myAli, $myHash ) { //my( $myAli ) = @_; //#$myAli = emphGap( $myAli ); //foreach $name ( keys %mapHash ) { while( list( $name, $oldName ) = each( $myHash ) ) { //$oldName = $mapHash{ $name }; //$myAli =~ s/$name/$oldName/g; //+echo $name . "=". $oldName . "
\n"; if( empty( $name ) ) continue; // <------------------ //-$myAli = preg_replace( "/".$name."/", "/".$oldName."/", $myAli ); $myAli = str_replace( $name, $oldName, $myAli ); } return $myAli; } #================================================================= # Emphasize inserted gaps with red color. #================================================================= function f_emphGap() { /** my( $myAli ) = @_; $shift = 8; $pLen = 50; $begEmp = ""; $endEmp = ""; @aAli = split( /\n/, $myAli ); if( @aAli[ 0 ] =~ /^([\w]+[\s]+)/ ) { $shift = length( $1 ); } if( @aAli[ 0 ] =~ /\s([\S]+)$/ ) { $pLen = length( $1 ); } @aNum = (); $num = 0; $numSeq = 0; foreach $tStr ( @aAli ) { $numSeq = $num if( $numSeq == 0 && length( $tStr ) < $shift ); $aNum[ $num++ ] = $shift; } @aGap = split( /\n+/, $gap ); #print "numSeq $numSeq\n"; foreach $tStr ( @aGap ) { @insPar = split( /[\s]+/, $tStr ); $_numStr = substr( $insPar[ 0 ], 3 ); $_begIns = $insPar[ 1 ]; $numStr = ( $numSeq + 1 )*int( $_begIns/$pLen ) + $_numStr - 1; $begIns = $_begIns - $pLen*int( $_begIns/$pLen ) + $aNum[ $numStr ]; $lenIns = $insPar[ 2 ]; while( $lenIns > 0 ) { $insStr = $aAli[ $numStr ]; $delta = length( substr( $insStr, $begIns, $lenIns ) ); $aAli[ $numStr ] = substr( $insStr, 0, $begIns ).$begEmp. substr( $insStr, $begIns, $lenIns ).$endEmp. substr( $insStr, $begIns + $lenIns ); $aNum[ $numStr ] += length( $begEmp ) + length( $endEmp ); $lenIns -= $delta; $numStr += $numSeq + 1; $begIns = $shift; } } $myAli = ""; foreach $tStr ( @aAli ) { $myAli .= $tStr."\n"; } return $myAli; **/ } function f_subsCont() { /** my( $myOldStr, $myNewStr ) = @_; $response =~ s/$myOldStr/$myNewStr/g; **/ } #_________________________________________ bsp errors function f_outBspErrors( $error ) { print "
$error
\n"; print "

Format of Your alignment is invalid

\n"; //+prnWarn( $error ); print "

Example of correct format:

            |<------ The same number of symbols inside each parts ------>| 
   SeqName1  TCAGTTTTTGGGGTGTGGGTATCGGAATGTGTGGTAGGTGATGTGTGTGTGTATGGGGGA
   SeqName2  ----TTTTTGGGGTGTGGGTATCGGAATGTGTGGTAGGTGATGTGTGTGTGTATGGGGGA
   SeqName3  TCAGTTT|TGGGGTGTGGG---CGGAATGTGTGATAGGTGATGTGTGTGTG---------
   SeqName4  TCAGTTTTTGGGGTGTGGGTATCGGAAT--GTGGTAGATGATGTGTGTGTGTATGGGGGA
   SeqName5  TCAGTTTTTGGGGTGTGGGTATCGGAATGTGTGGTAGGTGATGTGTGTGTGTATGGGGGA

   SeqName1  ATGGTTGGATGGGGGAATGATGTGTGTATGGGTGAGGAAAATCG
   SeqName2  ATGGTTGGATGGGGGAATGATGTGTGTATGGGTG----------
   SeqName3  ATGGTTGGATGGGGGAATGATGTGTGTATGGGTGAGGAAAATCG
   SeqName4  ATGGTTGGATGGGGGAATGATGTGTGTATGGGTGAGGAAAATCG
   SeqName5  ATGGTTGGATGGGGGAATGATGTGTGTATGGGTGAGGAAAATCG
   
"; print "

Most important rules and more typical errors:

1. Different sequences should have different names.
2. Empty symbols aren't advisory inside sequences names.
3. Several blanks are advisory between sequence and its name.
4. Empty lines aren't advisory inside parts of alignment.
5. Advisory gap symbol is '-'.
6. Beginning and finishing gaps are advisory.
"; } function f_getParserAlign( $ALIGN, $PARSER, $PARSERIN, $PARSEROUT ) { $fp = fopen( $PARSERIN, "w" ); // fputs( $fp, $ALIGN ); fclose( $fp ); $prog = "$PARSER < $PARSERIN > $PARSEROUT"; //+echo "*** parser call = " . $prog . "
\n"; system( $prog ); // $ALIGN <= from $PARSEROUT $ali_arr = file( $PARSEROUT ); //echo "
";
 //for( $i = 0; $i < count( $ali_arr ); ++$i ) {
 //   echo $ali_arr[$i];
 //}
 //echo "
\n"; $alip = f_getSect( $ali_arr, "align" ); //"align|sequence" ); //+echo "
***\n$alip 
\n"; $error = f_getSect( $ali_arr, "errors" ); $map = f_getSect( $ali_arr, "map" ); if( !empty($error) && strlen( $error ) > 2 ) { //include "bsp_err.inc"; f_outBspErrors( $error ); exit; // -------------------------------------> errors in bsp output } $mapHash = f_makeHash ( $map ); $ALIGN2 = f_substName( $alip, $mapHash ); //-$alip = f_substName( $alip, $mapHash ); // *tst //echo "
***\n$ALIGN 
\n"; return $ALIGN2; } ?>