Index by: file name | procedure name | procedure call | annotation
gscope_circo.tcl (annotations | original source)

#rR gscope_circo.tcl
#rR All for Circular Code ...


proc HideRandomData {} {
    #rR I moved all random data to have less files in the directory
    #rR To bring them back simply
    #rR   cd RandomData
    #rR   mv * ../

    NousAllonsAuBoulot [RepertoireDuGenome]
    file mkdir RandomData
    set LesDeplaces {}
    foreach CC [CirCode ListOf Index] {
	if {$CC=="00"} { continue }
	set LesRandom [lsort [glob -nocomplain "${CC}_*"]]
	foreach Random $LesRandom {
	    file rename $Random "RandomData/$Random"
	    lappend LesDeplaces $Random
	}
    }
    OnRevientDuBoulot
    return $LesDeplaces
}

proc DecortiqueBlastRnaDomain {{FichierBlast ""} {FichierHits ""}} {
    #rR on cherche les domaines équivalents aux domaines de Ecoli 

    if {$FichierBlast==""} { set FichierBlast "[RepSil]/Ecoli_SSU_domain_5P.blast" }
    set FichierFasta "[RepSil]/BacSSU_Best_WithoutEmpty_NoGap"

    if {$FichierHits==""} {
	set FichierHits $FichierBlast
	regsub {.blast$} $FichierHits "" FichierHits
	append FichierHits ".hits"
    }

    set Current ""
    set OnAttendSegAli 1
    set OnAttendLeProchainChevron 0
    set DebutQuery ""
    set DebutSbjct ""
    foreach Ligne [LesLignesDuFichier $FichierBlast] {
	set YaDatabase [regexp {^ +Database:} $Ligne]
	set Access ""
	if {[regexp {^>([^ ]+)} $Ligne Match Access] || $YaDatabase } {
	    set OnAttendLeProchainChevron 0
	    if {$Current!=""} {
		set Hit "$Current $DebutQuery $FinQuery $DebutSbjct $FinSbjct"
		#Espionne $Hit
		lappend LesHits $Hit
	    }
	    if {$YaDatabase} { break }
	    set Current $Access
	    set DebutQuery ""
	    set DebutSbjct ""
	    set OnAttendSegAli 0
	    continue
	}
	if { $OnAttendSegAli } { continue }
	if {[regexp "^ Score =" $Ligne] && $DebutQuery!=""} {
	    #Espionne $Ligne ************* $DebutQuery
	    set OnAttendLeProchainChevron 1
	}
	if {$OnAttendLeProchainChevron} { continue }
	if {[regexp {Query:? +([0-9]+) +[^ ]+ +([0-9]+) *$} $Ligne Match DQ FQ]} {
	    #Espionne $Ligne $DQ $FQ
	    if {$DebutQuery==""} { set DebutQuery $DQ }
	    set FinQuery $FQ
	} 
	if {[regexp {Sbjct:? +([0-9]+) +[^ ]+ +([0-9]+) *$} $Ligne Match DS FS]} {
	    #Espionne $Ligne $DS $FS
	    if {$DebutSbjct==""} { set DebutSbjct $DS } 
	    set FinSbjct $FS
	} 
    }
    set LaSortie {}
    foreach Hit $LesHits {
        lassign [split $Hit " "] Access DQ FQ DS FS
        set Tfa [LaSequenceDuTFAs $FichierFasta $Access]
        set Seq [QueLaSequenceDuTexteTFA $Tfa]
        set SeqDomain [string range $Seq $DS-1 $FS-1]
        lappend LaSortie "$Hit $SeqDomain"
    }
    set S [SauveLesLignes $LaSortie dans $FichierHits]
    return $S
}


proc ColiDomain {{Qui ""} {Quoi ""}} {
    global ColiDomain
    if {[info exists ColiDomain($Qui,$Quoi)]} { return $ColiDomain($Qui,$Quoi) }
    if {[info exists ColiDomain("EstCharge")]} { return "" }
    set ColiDomain("EstCharge") 1
    set D "5P"      ; lappend ColiDomain(SSU,ListOfDomain) $D ; set ColiDomain($D,limits) "1-559"
    set D "Central" ; lappend ColiDomain(SSU,ListOfDomain) $D ; set ColiDomain($D,limits) "560-920"
    set D "3PM"     ; lappend ColiDomain(SSU,ListOfDomain) $D ; set ColiDomain($D,limits) "921-1398"
    set D "3Pm"     ; lappend ColiDomain(SSU,ListOfDomain) $D ; set ColiDomain($D,limits) "921-1398"
    
    foreach Domain $ColiDomain(SSU,ListOfDomain) {
        set ColiDomain($Domain,SU) "SSU"
    }
    set D "I"       ; lappend ColiDomain(LSU,ListOfDomain) $D ; set ColiDomain($D,limits) "1-561"
    set D "II"      ; lappend ColiDomain(LSU,ListOfDomain) $D ; set ColiDomain($D,limits) "587-1250"
    set D "III"     ; lappend ColiDomain(LSU,ListOfDomain) $D ; set ColiDomain($D,limits) "1271-1647"
    set D "IV"      ; lappend ColiDomain(LSU,ListOfDomain) $D ; set ColiDomain($D,limits) "1679-1989"
    set D "V"       ; lappend ColiDomain(LSU,ListOfDomain) $D ; set ColiDomain($D,limits) "2058-2610"
    set D "VI"      ; lappend ColiDomain(LSU,ListOfDomain) $D ; set ColiDomain($D,limits) "2626-2895"
    foreach Domain $ColiDomain(LSU,ListOfDomain) {
        set ColiDomain($Domain,SU) "LSU"
    }
    set ColiDomain(ListOf,Domain) [concat $ColiDomain(SSU,ListOfDomain) $ColiDomain(LSU,ListOfDomain)]
    foreach Domain $ColiDomain(ListOf,Domain) {
        set Limits $ColiDomain($Domain,limits)
        lassign [split $Limits "-"] Start Stop
        set ColiDomain($Domain,Start) $Start
        set ColiDomain($Domain,Stop)  $Stop
    }
    foreach SU [list SSU LSU] {
	set SeqTotale [QueLaSequenceDuFichierTFA "[RepSil]/Escherichia_coli_${SU}.tfa"]
	set SeqShift  "n$SeqTotale"
	foreach Domain $ColiDomain($SU,ListOfDomain) {
	    set Seq [string range $SeqShift $ColiDomain($Domain,Start) $ColiDomain($Domain,Stop)]
	    set ColiDomain($Domain,Seq) $Seq
	}
    }
    return [ColiDomain $Qui $Quoi]
}

proc RepSil {} {
    return "/home/ripp/3d/sil"
}

proc RepSilva {} {
    return "/home/gopal/Silva/DeSilva"
    return "/genomics/link/ARN/DeSilva"
}

proc CreeBanqueBlastFromSilva {} {
    set LeTfa {}
    foreach {Access SeqGap} [LesLignesDuFichier "[RepSilva]/BacSSU_Best_WithoutEmpty.fasta"] {
        regsub -all {[\-\.]} $SeqGap "" Seq
        #Espionne [string length $SeqGap] [string length $Seq]
        lappend LeTfa $Access $Seq
    }
    
    return [SauveLesLignes $LeTfa dans "[RepSil]/BacSSU_Best_WithoutEmpty_NoGap.tfa"]
}

proc BlastColiDomains {} {
    set SU SSU
    foreach Domain [ColiDomain $SU ListOfDomain] {
        set Seq [ColiDomain $Domain Seq]
        set Limits [ColiDomain $Domain limits]
        set Tfa [SequenceFormatTFA $Seq "Ecoli_${SU}_domain_$Domain $Limits" "nucbrut"]
        set Fic "[RepSil]/Ecoli_${SU}_domain_$Domain.tfa"
        set Banque "[RepSil]/BacSSU_Best_WithoutEmpty_NoGap"
        Sauve $Tfa dans $Fic
        set Out $Fic
        regsub {\.tfa$} $Out "" Out
        append Out ".blast"
        exec blastall -p blastn -i $Fic -d $Banque -F F -v 20000 -b 20000 -o $Out
        Espionne $Out
    }
}

proc TestColi {} {
    set SeqGap [QueLaSequenceDuTFAs "[RepSilva]/BacSSU_Best_WithoutEmpty.fasta" "JQ512962.1.1537"]
    regsub -all {[\-\.]} $SeqGap "" Seq
    Espionne [string length $SeqGap] [string length $Seq]
    Espionne $Seq
    set SeqGapAli [FromMacsim /home/ripp/3d/ali/SSU_rRNA_alignment.xml Sequences Escherichia_coli]
    regsub -all {[\-\.]} $SeqGapAli "" SeqAli
    Espionne $SeqAli
    Espionne [string length $SeqGapAli] [string length $SeqAli]
}

proc CreateColiSeqs {} {
    set SeqGapAli [FromMacsim "/home/ripp/3d/ali/SSU_rRNA_alignment.xml" Sequences Escherichia_coli]
    regsub -all {[\-\.]} $SeqGapAli "" SeqAli
    Espionne $SeqAli
    Espionne [string length $SeqGapAli] [string length $SeqAli]
    set Tfa [SequenceFormatTFA $SeqAli "Eschericia_coli_SSU from SSU_rRNA_alignment" "nucbrut"]
    lappend LesFichiersCrees [Sauve $Tfa dans "[RepSil]/Escherichia_coli_SSU.tfa"]
    set SeqGapAli [FromMacsim "/home/ripp/3d/ali/LSU_rRNA_alignment.xml" Sequences Escherichia_coli]
    regsub -all {[\-\.]} $SeqGapAli "" SeqAli
    Espionne $SeqAli
    Espionne [string length $SeqGapAli] [string length $SeqAli]
    set Tfa [SequenceFormatTFA $SeqAli "Eschericia_coli_LSU from LSU_rRNA_alignment" "nucbrut"]
    lappend LesFichiersCrees [Sauve $Tfa dans "[RepSil]/Escherichia_coli_LSU.tfa"]
    return $LesFichiersCrees
}

proc RemoveEmptyPiliers Qui {
    set FichierGros  "[RepSilva]/${Qui}_Best.fasta"
    set FichierPetit "[RepSilva]/${Qui}_Best_WithoutEmpty.fasta"
    set Cumul(0) 0
    set PremiereFois 1
    set LesI {}
    foreach {Access Sequence} [LesLignesDuFichier $FichierGros] {
        set Sequence [string map {. -} $Sequence]
        set I 0
        foreach C [split $Sequence ""] {
            if {$PremiereFois} { lappend LesI $I }
            #Espionne $C
            if {$C ne "-"} {
                #Espionne autre $C
                incr Nb($I)
                lappend Owner($I) $Access
            }
            incr I
        }
        set PremiereFois 0
    }
    Espionne Imax $I
    foreach I $LesI {
        if { [info exists Nb($I)]} {
            incr Cumul($Nb($I))
            continue
        }
        incr Cumul(0)
        #Espionne empty $I
    }
    foreach N [lsort -integer -decreasing [array names Cumul]] {
        Espionne $N $Cumul($N)
    }
    Espionne [llength $LesI] columns
    Espionne $Cumul(0) empty colums
    Espionne [llength [array names Nb]] non empty colums
    
    if { ! [OuiOuNon "Ok to create the alignment without empty Piliers ? "]} { return "Ok I stopped" }
    set LeNouveau {}
    foreach {Access Sequence} [LesLignesDuFichier $FichierGros] {
        lappend LeNouveau $Access
        set I 0
        set LesI {}
        set NewSeq ""
        foreach C [split $Sequence ""] {
            if {[info exists Nb($I)]} {
                append NewSeq $C
            }
            incr I
        }
        lappend LeNouveau $NewSeq
    }
    SauveLesLignes $LeNouveau dans $FichierPetit
    
    return hopla
}

proc FastaFromBestSilva {{Qui ""}} {
    JeMeSignale
    if {[regexp {All(.SU)} $Qui Match SU]} {
        set LaSortie {}
        lappend LaSortie [FastaFromBestSilva "Arc$SU"]
        lappend LaSortie [FastaFromBestSilva "Bac$SU"]
        lappend LaSortie [FastaFromBestSilva "Euk$SU"]
        return $LaSortie
    }
    if { ! [regexp {(Arc|Bac|Euk)(.SU)} $Qui Match Dom SU] } { return "(Arc|Bac|Euk)(.SU) est necessaire" }
    set FichierFasta   "[RepSilva]/${SU}_Original.fasta"
    set FichierAccess  "[RepSilva]/${Dom}${SU}_Best.access"
    set FichierNouveau "[RepSilva]/${Dom}${SU}_Best.fasta"
    Espionne FichierNouveau $FichierNouveau
    if {[file exists $FichierNouveau]} {
        if {[OuiOuNonMemo "Do I keep existing files" 1]} {
            return "$FichierNouveau already exists"
        }
        file delete $FichierNouveau
    }
    foreach Ligne [LesLignesDuFichier $FichierAccess] {
        scan $Ligne "%s" Access
        set Use($Access) 1
    }
    Espionne [lrange [array names Use] 0 10]
    Espionne [llength [array names Use]] access lus
    set Canal [open $FichierFasta "r"]
    set Save 0
    set I -1
    while {[gets $Canal Ligne]>-1} {
        if {[regexp {^(>[^ ]+) } $Ligne Match Access]} {
            if {[incr I]%10000==0} { Espionne $Access $I }
            if {$Save} { AppendAuFichier $FichierNouveau $Sequence }
            set Sequence ""
            set Save 0
            if {[info exists Use($Access)]} {
                #Espionne info exists Use($Access) [info exists Use($Access)]
                set Save 1
                AppendAuFichier $FichierNouveau $Ligne
            }
            continue
        }
        if {$Save} { append Sequence $Ligne }
    }
    if {$Save} { AppendAuFichier $FichierNouveau $Sequence }
    return $FichierNouveau
    
    
    
    #SauveLesLignes $LeTfa dans $FichierNouveau
    #set LesAccess [LaSequenceDuTFAs $FichierFasta "LaListeDesAccess"]
    return hihi
}

proc BestSilva {{Qui ""}} {
    #rR grep " Archaea;" SU_Original.access > ArcSU.access 
    #rR grep " Bacteria;" SU_Original.access > BacSU.access 
    #rR grep " Eukaryiota;" SU_Original.access > EukSU.access 
    
    if {[regexp {All(.SU)} $Qui Match SU]} {
        set LaSortie {}
        lappend LaSortie [BestSilva "Arc$SU"]
        lappend LaSortie [BestSilva "Bac$SU"]
        lappend LaSortie [BestSilva "Euk$SU"]
        return $LaSortie
    }
    set LeChoix {}
    set LesLignes [LesLignesDuFichier "[RepSilva]/${Qui}.access"]
    set LesLignes [lrange $LesLignes 0 end]
    foreach Ligne $LesLignes {
        if { ! [regexp "LSU" $Qui] && ! [regexp {\.1\.} $Ligne]} { continue }
        #Espionne $Ligne
        set iSpace [string first " " $Ligne]
        set ADF [string range $Ligne 0 $iSpace-1]
        set Tax [string range $Ligne $iSpace+1 end]
        set LesNoeuds [split $Tax ";"]
        set Last [lindex $LesNoeuds end]
        set E ""
        scan $Last "%s %s" G E
        if {$E==""} { continue }
        set GE "$G $E"
        lappend LesGE $GE
        lappend LesLignesDeGE($GE) $Ligne
        lappend LesLignesDeG($G)   $Ligne
        lappend LesGEDeG($G)       $GE
        lappend LesTaxDeGE($GE)    $Tax
        lappend LesTaxDeG($G)      $Tax
        lappend LesG $G
    }
    Espionne [llength $LesG] G not unique
    set LesGE [lsort -unique $LesGE]
    set LesG  [lsort -unique $LesG ]
    Espionne [llength $LesG] G
    set MaxIdemG  2
    set MaxIdemGE 2
    if {$Qui=="ArcSSU"} { set MaxIdemG 9999 ; set MaxIdemGE 9999 } 
    if {$Qui=="BacSSU"} { set MaxIdemG 2    ; set MaxIdemGE 2 } 
    if {$Qui=="EukSSU"} { set MaxIdemG 2    ; set MaxIdemGE 2 } 
    set LesGEok {}
    foreach G $LesG {
        set LesGEDeG($G) [lsort -unique $LesGEDeG($G)]
        set L [llength $LesGEDeG($G)]
        #Espionne $G $L
        lappend LesL $L
        lappend GDeL($L) $G
        if {$L<=$MaxIdemG} {
            LConcat LesGEok $LesGEDeG($G)
        } else {
            LConcat LesGEok [lrange $LesGEDeG($G) 0 $MaxIdemGE-1]
        }
    }
    set LesL [lsort -unique -decreasing -integer $LesL]
    foreach L $LesL {
        #Espionne $L $GDeL($L)
    }
    Espionne [llength $LesGEok] GEok
    foreach GE $LesGEok {
        set L [llength $LesLignesDeGE($GE)]
        if {$L<3} {
            LConcat LeChoix $LesLignesDeGE($GE)
        } else {
            set M [expr $L/2]
            lappend LeChoix [lindex $LesLignesDeGE($GE) 0] [lindex $LesLignesDeGE($GE) $M] [lindex $LesLignesDeGE($GE) end]
        }
        set Tax [lindex $LesTaxDeGE($GE) 0]
        #Espionne $Tax
        set Dom [string range $Tax 0 2]
        incr Nb($Dom)
        incr Nb($Dom,lines) $L
    }
    Espionne [llength $LeChoix]
    parray Nb
    SauveLesLignes $LeChoix dans "[RepSilva]/${Qui}_Best.access"
    return $Qui
    return $LesGEok
}

proc AllCodonsOrdered {} {
    set LesX {}
    set LesY {}
    foreach Codon [AllCodons] {
        if { [IsX0 $Codon] } { lappend LesX $Codon } else { lappend LesY $Codon }
    }
    return [concat $LesX $LesY]
}

proc CoFreqPourTousPourRandom {} {
    global EspionneNon
    set EspionneNon 1
    foreach Index [lrange [CirCode ListOf Index] 0 end] {
        CoFreq Reset
        IsX0 Reset
        CirCode DefaultCirCode $Index
        set CF [CoFreqPourTous]
        lappend LaSortie $CF 
    }
    return $LaSortie
}

proc CoFreqPourTous {} {
    
    set AllOrgs [concat [CoFreq ListOf Org] "All"]
    
    set DejaEntete 0 
    foreach Frame [list 0 1 2 A] {
        foreach Y [list L S] {
            set SumPCX($Frame,$Y) 0 ; set NbX($Frame,$Y) 0
            set SumPCR($Frame,$Y) 0 ; set NbR($Frame,$Y) 0
            lappend LaLigne $Y
            foreach Org $AllOrgs {
                set NiceOrg [string range $Org 0 2]
                #Espionne $Frame $Y $Org
                set LaLigne {}
                lappend LaLigne $Frame $Y $NiceOrg
                #lappend LaLigne [format "%-30s" $Org]
                set LaLigneEntete $LaLigne
                foreach Codon [AllCodonsOrdered] {
                    if {[IsX0 $Codon]} {
                        set NiceCodon [string toupper $Codon]
                    } else {
                        set NiceCodon [string tolower $Codon]
                    }
                    lappend LaLigneEntete $NiceCodon
                }
                if { ! $DejaEntete } {
                    Espionne [join $LaLigneEntete " "]
                    set DejaEntete 1
                }
                foreach Codon [AllCodons] {
                    set PC [CoFreq $Org-$Y-$Frame-PC $Codon]
                    set NicePC [format "%3.1f" $PC]
                    lappend LaLigne $NicePC
                    #incr PCof($Org,$Y,$Frame,$Codon) $PC
                    if {[IsX0 $Codon]} {
                        set SumPCX($Frame,$Y) [expr $SumPCX($Frame,$Y) + $PC]
                        incr NbX($Frame,$Y)
                    } else {
                        set SumPCR($Frame,$Y) [expr $SumPCR($Frame,$Y) + $PC]
                        incr NbR($Frame,$Y)
                    }
                }
                Espionne [join $LaLigne " "]
            }
            Espionne
        }
        Espionne
    }
    Espionne
    set LaLigne {}
    lappend LaLigne A . All
    set LaLigneEntete {}
    lappend LaLigneEntete " " " " "   "
    foreach Codon [AllCodonsOrdered] {
        if {[IsX0 $Codon]} {
            set NiceCodon [string toupper $Codon]
        } else {
            set NiceCodon [string tolower $Codon]
        }
        lappend LaLigneEntete $NiceCodon
    }
    Espionne [join $LaLigneEntete " "]
    foreach Codon [AllCodonsOrdered] {
        #incr PCof($Org,$Y,$Frame,$Codon) $PC
        set PC [expr ([CoFreq All-L-A-PC $Codon]+[CoFreq All-S-A-PC $Codon])/2]
        lappend LaLigne [format "%3.1f" $PC]
    }
    Espionne [join $LaLigne " "]
    
    set MoyPCX [expr ($SumPCX(A,L)+$SumPCX(A,S))/($NbX(A,L)+$NbX(A,S))]
    set MoyPCR [expr ($SumPCR(A,L)+$SumPCR(A,S))/($NbR(A,L)+$NbR(A,S))]
    return [format "%-3s  X : %5.3f  nonX : %5.3f %s" [CirCode DefaultCirCode] $MoyPCX $MoyPCR [CirCode]]
}

proc CoFreq {{Qui ""} {Quoi ""}} {
    global CoFreq
    if {$Qui=="Reset"} {
        if {[info exists CoFreq]} { unset CoFreq }
        return
    }
    if {$Qui=="" && $Quoi==""} { set Qui "Help" }
    if {[info exists CoFreq($Qui,$Quoi)]} { return $CoFreq($Qui,$Quoi) }
    if {[info exists CoFreq("EstCharge")]} {
        if {[regexp {\-PC$} $Qui]} { return 0.0 } 
        return ""
    }
    set CoFreq("EstCharge") 1
    
    set LesOrgs [FromRnaAli ListOf Org]
    set CoFreq(ListOf,Org) $LesOrgs
    foreach Org $LesOrgs {
        foreach Y [list L S] {
            set Seq [FromRnaAli $Org $Y SeqNoGap]
            set NC0 0
            set NC1 0
            set NC2 0
            set LaSeq [split $Seq ""]
            foreach Frame [list 0 1 2] {
                set LaSeq [lrange [split $Seq ""] $Frame end]
                foreach {A B C} $LaSeq {
                    set C "$A$B$C"
                    if {$C==""} { break }
                    lappend CoFreq($Org-$Y-$Frame,Codons) $C ; incr CoFreq($Org-$Y-$Frame,$C)
                    lappend CoFreq($Org-$Y-A,Codons)      $C ; incr CoFreq($Org-$Y-A,$C)
                    lappend CoFreq(All-$Y-$Frame,Codons)  $C ; incr CoFreq(All-$Y-$Frame,$C)
                    lappend CoFreq(All-$Y-A,Codons)       $C ; incr CoFreq(All-$Y-A,$C)
                }
                set CoFreq($Org-$Y-$Frame,NC) [llength $CoFreq($Org-$Y-$Frame,Codons)]
                set CoFreq(All-$Y-$Frame,NC)  [llength $CoFreq(All-$Y-$Frame,Codons)]
            }
            
            set CoFreq($Org-$Y-A,NC) [llength $CoFreq($Org-$Y-A,Codons)]
            set CoFreq(All-$Y-A,NC)  [llength $CoFreq(All-$Y-A,Codons)]
            
            foreach Codon [AllCodons] {
                if { ! [info exists CoFreq($Org-$Y-A,$Codon)]} { set CoFreq($Org-$Y-A,$Codon) 0 }
                set CoFreq($Org-$Y-A-PC,$Codon) [format "%3.1f" [expr (100.*$CoFreq($Org-$Y-A,$Codon))/$CoFreq($Org-$Y-A,NC)]]
            }
            foreach Frame [list 0 1 2] {
                foreach Codon [AllCodons] {
                    if { ! [info exists CoFreq($Org-$Y-$Frame,$Codon)]} { set CoFreq($Org-$Y-$Frame,$Codon) 0 }
                    set CoFreq($Org-$Y-$Frame-PC,$Codon) [format "%3.1f" [expr (100.*$CoFreq($Org-$Y-$Frame,$Codon))/$CoFreq($Org-$Y-$Frame,NC)]]
                }
            }
        }
    }
    
    
    
    if {0} {
        foreach Org $LesOrgs {
            foreach Y [list L S] {
                set Seq [FromRnaAli $Org $Y SeqNoGap]
                set NC0 0
                set NC1 0
                set NC2 0
                set LaSeq [split $Seq ""]
                foreach A [lrange $LaSeq 0 end-2] B [lrange $LaSeq 1 end-1] C [lrange $LaSeq 2 end] D [lrange $LaSeq 3 end] E [lrange $LaSeq 4 end] {
                    set C0 "$A$B$C"
                    set C1 "$B$C$D"
                    set C2 "$C$D$E"
                    if {$C!=""} { lappend CoFreq($Org-$Y-0,Codons) $C0 ; incr NC0 ; lappend CoFreq($Org-$Y-A,Codons) $C0 ; incr NC}
                    if {$D!=""} { lappend CoFreq($Org-$Y-1,Codons) $C1 ; incr NC1 ; lappend CoFreq($Org-$Y-A,Codons) $C1 ; incr NC}
                    if {$E!=""} { lappend CoFreq($Org-$Y-2,Codons) $C2 ; incr NC2 ; lappend CoFreq($Org-$Y-A,Codons) $C2 ; incr NC}
                    incr CoFreq($Org-$Y-0,$C0)
                    incr CoFreq($Org-$Y-1,$C1)
                    incr CoFreq($Org-$Y-2,$C2)
                    incr CoFreq($Org-$Y-A,$C0)
                    incr CoFreq($Org-$Y-A,$C1)
                    incr CoFreq($Org-$Y-A,$C2)
                    if {$C!=""} { lappend CoFreq(All-$Y-0,Codons) $C0 ; incr NC0All ; lappend CoFreq(All-$Y-A,Codons) $C0 }
                    if {$D!=""} { lappend CoFreq(All-$Y-1,Codons) $C1 ; incr NC1All ; lappend CoFreq(All-$Y-A,Codons) $C1 }
                    if {$E!=""} { lappend CoFreq(All-$Y-2,Codons) $C2 ; incr NC2All ; lappend CoFreq(All-$Y-A,Codons) $C2 }
                    incr CoFreq(All-$Y-0,$C0)
                    incr CoFreq(All-$Y-1,$C1)
                    incr CoFreq(All-$Y-2,$C2)
                    incr CoFreq(All-$Y-A,$C0)
                    incr CoFreq(All-$Y-A,$C1)
                    incr CoFreq(All-$Y-A,$C2)
                }
                set CoFreq($Org-$Y-A,Codons) [lsort -unique $CoFreq($Org-$Y-A,Codons)]
                set CoFreq($Org-$Y-A,NC) $NC
                foreach Codon $CoFreq($Org-$Y-A,Codons) {
                    if { ! [info exists CoFreq($Org-$Y-A,$Codon)]} { set CoFreq($Org-$Y-A,$Codon) 0 }
                    set CoFreq($Org-$Y-A-PC,$Codon) [expr (100.*$CoFreq($Org-$Y-A,$Codon))/$CoFreq($Org-$Y-A,NC)]
                }
                foreach Frame [list 0 1 2] {
                    set CoFreq($Org-$Y-$Frame,Codons) [lsort -unique $CoFreq($Org-$Y-$Frame,Codons)]
                    set CoFreq($Org-$Y-0,NC) $NC0
                    set CoFreq($Org-$Y-1,NC) $NC1
                    set CoFreq($Org-$Y-2,NC) $NC2
                    foreach Codon $CoFreq($Org-$Y-$Frame,Codons) {
                        if { ! [info exists CoFreq($Org-$Y-$Frame,$Codon)]} { set CoFreq($Org-$Y-$Frame,$Codon) 0 }
                        set CoFreq($Org-$Y-$Frame-PC,$Codon) [expr (100.*$CoFreq($Org-$Y-$Frame,$Codon))/$CoFreq($Org-$Y-$Frame,NC)]
                    }
                }
                set CoFreq(All-$Y-0,NCAll) $NC0All
                set CoFreq(All-$Y-1,NCAll) $NC1All
                set CoFreq(All-$Y-2,NCAll) $NC2All
                set CoFreq(All-$Y-A,NCAll) [llength $CoFreq(All-$Y-A,Codons)]
            }
        }
    }
    
    foreach Y [list L S] {
        set CoFreq(All-$Y-A,Codons) [lsort -unique $CoFreq(All-$Y-A,Codons)]
        foreach Codon $CoFreq(All-$Y-A,Codons) {
            if { ! [info exists CoFreq(All-$Y-A,$Codon)]} { set CoFreq(All-$Y-A,$Codon) 0 }
            set CoFreq(All-$Y-A-PC,$Codon) [format "%3.1f" [expr (100.*$CoFreq(All-$Y-A,$Codon))/$CoFreq(All-$Y-A,NC)]]
        }
        foreach Frame [list 0 1 2 A] {
            set CoFreq(All-$Y-$Frame,Codons) [lsort -unique $CoFreq(All-$Y-$Frame,Codons)]
            foreach Codon $CoFreq(All-$Y-$Frame,Codons) {
                if { ! [info exists CoFreq(All-$Y-${Frame},$Codon)]} { set CoFreq(All-$Y-${Frame},$Codon) 0 }
                set CoFreq(All-$Y-$Frame-PC,$Codon) [format "%3.1f" [expr (100.*$CoFreq(All-$Y-$Frame,$Codon))/$CoFreq(All-$Y-$Frame,NC)]]
            }
        }
    }
    return [CoFreq $Qui $Quoi]
}

proc CountXMotifsForAll {{Liste ""}} {
    if {$Liste==""} { set Liste [list BorbuCDS EcoliCDS JoyScCDS Pabyssi MAMA MmusCDS MGS] }
    foreach Org $Liste {
        #Espionne [YCodeFor $Org "GetClosest216"]; continue
        set Closest [lindex [YCodeFor $Org "GetClosest216"] 0]
        set CCClosest [expr 1000+$Closest]
        
        set LesCC {}
        set LesValeurs {}
        foreach CC [list "" TOP20 $CCClosest MFC 20 50 92] {
            lappend LesCC $CC
            set Commande "tcsh -c \"setgscoperr $Org -qq ; gscope puts CountXMotifs $CC\""
            #Espionne $Commande
            set Reponse [eval exec $Commande]
            lassign $Reponse R E
            lappend LesValeurs $R
        }
        #????????????????????? I421-I433
        set Yori  [eval exec "tcsh -c \"setgscoperr $Org -qq ; gscope puts YCodeFor - GetMFC\""]
        set Top20 [eval exec "tcsh -c \"setgscoperr $Org -qq ; gscope puts YCodeFor - Top20\""]
        #Espionne $E $LesValeurs
        set Message [format "%6d : %6d / %6d / %6d / %6d / %6d / %6d / %6d %-10s Top20 : %s  MFC : %s" $E {*}$LesValeurs $Org $Top20 $Yori]
        Espionne $Message
        lappend LaSortie $Message
    }
    return $LaSortie
}

proc CountXMotifs {{CC ""}} {
    
    if {$CC!=""} { CirCode DefaultCirCode $CC }
    
    set NbTotal 0
    set TotalExpectation 0
    set TotalSeqLength   0
    foreach Nom [ListeDesPABs] {
        foreach Fic [glob -nocomplain "[RepertoireDuGenome]/nuctfa/$Nom*"] {
            set Nb 0
            set Seq [QueLaSequenceDuFichierTFA $Fic]
            set SeqLength [string length $Seq]
            incr TotalSeqLength $SeqLength
            set LesX [XMotifs $Seq]
            set Expectation [expr ($SeqLength/3 - 11)*(20./61)*(19./61)*(18./61)*(17./61)]
            set TotalExpectation [expr $TotalExpectation+$Expectation]
            foreach {LC Hits} $LesX {
                incr Nb [llength $Hits]
            }
            incr NbTotal $Nb
        }
    }
    set TotalExpectation [expr round($TotalExpectation)]
    set TotalExpectationGenome [expr round(($TotalSeqLength/3 - 11)*(20./61)*(19./61)*(18./61)*(17./61))]
    #Espionne [format "%-8s %6d %s %6d %s %6d" [file tail [RepertoireDuGenome]] $NbTotal TotalExpectation $TotalExpectation "... and for the genome" $TotalExpectationGenome]
    return "$NbTotal $TotalExpectation"
}

proc YCodeFor {{Org ""} {GetWhat ""}} {
    if {$Org=="" || $Org=="-"} { set Org [file tail [RepertoireDuGenome]] }
    set MfcFile "/home/ripp/3d/MoreFrequentCodonsSamples.txt"
    set LesLignes [LesLignesDuFichier $MfcFile]
    set i [lsearch $LesLignes "/genomics/link/$Org/nuctfa"]
    if {$i<0 && [regexp {^Joy} $Org]} {
        set i [lsearch $LesLignes "/genomics/link/Joy/$Org/nuctfa"]
    }
    if {$i<0} {	
        set i [lsearch $LesLignes "$Org"]
    }
    if {$i<0} {	
        set MfcFile "/home/ripp/3d/MoreFrequentCodonsMGS.txt"
        set LesLignes [LesLignesDuFichier $MfcFile]
        set i [lsearch $LesLignes "$Org"]
    }
    set LesInfos [lrange $LesLignes $i+1 $i+11]
    lassign $LesInfos C0 C1 C2 Bidon X0 X1 X2 S0 S1 S2 Top
    set Top20 [lrange [split $Top " "] 1 20]
    set TOP20 [string toupper $Top20]
    if {$GetWhat=="Top20"} { return $Top20 }
    if {$GetWhat=="TOP20"} { return $TOP20 }
    
    set LesY0 [lrange [split $C0 " "] 2 end]
    set LesY1 [lrange [split $C1 " "] 2 end]
    set LesY2 [lrange [split $C2 " "] 2 end]
    regsub -all { +} $S0 " " S0
    regsub -all { +} $S1 " " S1
    regsub -all { +} $S2 " " S2
    foreach x0 [split $X0 " "] x1 [split $X1 " "] x2 [split $X2 " "] s0 [split $S0 " "]  s1 [split $S1 " "]  s2 [split $S2 " "] {
        if {$x0==0} { continue }
        if {$s0=="%"} { set n0 $x0; set n1 $x1; set n2 $x2; continue }
        if {$x0=="///"} { continue }
        if {$x0!="..."} { set Codon $x0 }
        if {$x1!="..."} { set Codon $x1 }
        if {$x2!="..."} { set Codon $x2 }
        set FC0($Codon) $s0
        set FC1($Codon) $s1
        set FC2($Codon) $s2
    }
    set LesY {}
    foreach Y $LesY0 {
        set Yoriginal $Y
        set Y [string toupper $Y]
        if {$Y=="AAA" || $Y=="CCC" || $Y=="GGG" || $Y=="TTT"} { continue }
        lappend LesYoriginaux $Yoriginal
        lappend LesY $Y
        set IsY($Y) 1
    }
    set MaxN 0
    foreach Index [C216 ListOf Index] {
        set N 0
        foreach Codon [C216 $Index] {
            if {[info exists IsY($Codon)]} { incr N }
        }
        set MaxN [Maxi $N $MaxN]
        lappend IndexOf($N) $Index
        #Espionne $N $Index
    }
    #Espionne $MaxN $IndexOf($MaxN)
    if {$GetWhat=="GetClosest216"} { return $IndexOf($MaxN) }
    if {$GetWhat=="GetMFC"}        { return $LesYoriginaux }
    return $LesY
}

proc MoreFrequentCodonsPourMGS {} {
    NousAllonsAuBoulot "/genomics/link/MGS"
    set RepData "DataMoreFrequentCodons"
    file mkdir $RepData
    set LesRep [lsort [glob "nuctfa_*"]]
    set LaSortie {}
    foreach Rep $LesRep {
        regsub "nuctfa_" $Rep "" Organism
        set Stats [MoreFrequentCodons $Rep "$RepData/Data_MGS_$Organism.txt" $Organism]
        LConcat LaSortie $Stats
        EspionneL $Stats
    }
    set Bilan [SauveLesLignes $LaSortie dans "/home/ripp/3d/MoreFrequentCodonsMGS.txt"] 
    OnRevientDuBoulot
    return $Bilan
}

proc MoreFrequentCodonsPourTous {} {
    set LesProjets [list MGS MAMA EcoliCDS BorbuCDS Pabyssi Aful Mjan Joy/JoyDhCDS Joy/JoyKcCDS Joy/JoyKlCDS Joy/JoyLeCDS Joy/JoyMgCDS Joy/JoyScCDS Joy/JoySpCDS Joy/JoySsCDS Joy/JoyYlCDS]
    set LaSortie {}
    foreach Projet $LesProjets {
        set Stats [MoreFrequentCodons "/genomics/link/$Projet/nuctfa"]
        LConcat LaSortie $Stats
        EspionneL $Stats
    }
    set AllTogether [MoreFrequentCodons $LesProjets]
    LConcat LaSortie $Stats
    #return $AllTogether
    return [SauveLesLignes $LaSortie dans "/home/ripp/3d/MoreFrequentCodonsSamples.txt"] 
}

proc MoreFrequentCodonsPourJoy {} {
    set LesProjets [lrange [lsort [glob "/genomics/link/Joy/*CDS"]] 0 end]
    set LaSortie {}
    foreach Projet $LesProjets {
        set Stats [MoreFrequentCodons "$Projet/nuctfa"]
        LConcat LaSortie $Stats
        EspionneL $Stats
    }
    set AllTogether [MoreFrequentCodons $LesProjets]
    LConcat LaSortie $AllTogether
    #return $AllTogether
    return [SauveLesLignes $LaSortie dans "/home/ripp/3d/MoreFrequentCodonsJoy.txt"] 
}

proc XCodons {Frame} {
    foreach Codon [CirCode] {
        set Codon1 "[string range $Codon 1 end][string index $Codon 0]"
        set Codon2 "[string range $Codon1 1 end][string index $Codon1 0]"
        lappend Frame0 $Codon
        lappend Frame1 $Codon1
        lappend Frame2 $Codon2
    }
    return [set Frame$Frame]
}

proc MoreFrequentCodons {{RepNucTfa ""} {FichierData ""} {Organism ""}} {
    
    if {$RepNucTfa==""} {
        set RepNucTfa "[RepertoireDuGenome]/nuctfa"
        if {$Organims==""} { set Organism [NotreOS] }
    } else {
        if {$Organism==""} { set Organism [file tail [file dirname $RepNucTfa]] }
    }
    #Espionne $Organism
    if {$FichierData==""} {
        set FichierData "/home/ripp/3d/Data_$Organism.txt"
        regsub -all " " $FichierData "_" FichierData
    }
    
    
    if {$RepNucTfa=="All"} {
        set Organism "All"
        set LesNucTfa [lsort [concat \
                                  [glob /genomics/link/MAMA/nuctfa/*] \
                                  [glob /genomics/link/EcoliCDS/nuctfa/*] \
                                  [glob /genomics/link/Joy/Joy*CDS/nuctfa/*] \
                                 ]]
    } elseif {[llength $RepNucTfa]>1} {
        set Organism [join $RepNucTfa " "]
        set LesNucTfa {}
        foreach Projet $RepNucTfa {
            LConcat LesNucTfa [glob /genomics/link/$Projet/nuctfa/*]
        }
    } elseif {$RepNucTfa=="AllJoy"} {
        set Organism "AllJoy"
        set LesNucTfa [lsort [concat \
                                  [glob /genomics/link/Joy/Joy*CDS/nuctfa/*] \
                                 ]]
    } else {
        set LesNucTfa [lsort [glob -nocomplain "$RepNucTfa/*"]]
    }
    foreach Codon [AllCodons] {
        set TotNb(0,$Codon) 0
        set TotNb(1,$Codon) 0
        set TotNb(2,$Codon) 0
        set TotNb($Codon)   0
        #if {$Codon=="AAA" || $Codon=="CCC" || $Codon=="GGG" || $Codon=="TTT"} { continue }
        lappend LesCodons $Codon
    }
    set TotMes(0) {}
    set TotMes(1) {}
    set TotMes(2) {}
    set LesData {}
    foreach FicNuc $LesNucTfa {
        set Nom [file tail $FicNuc]
        if {[regexp {^(TROU|TRNA|rRNA|ncRNA)} $Nom]} { continue }
        foreach Codon [AllCodons] {
            set Nb(0,$Codon) 0
            set Nb(1,$Codon) 0
            set Nb(2,$Codon) 0
            set Nb($Codon)   0
        }
        set Mes(0) {}
        set Mes(1) {}
        set Mes(2) {}
        set Seq [QueLaSequenceDuFichierTFA $FicNuc]
        set Seq [string toupper $Seq]
        regsub {^(ATG|TTG|GTG)} $Seq "" Seq
        regsub {(TAA|TAG|TGA)$} $Seq "" Seq
        foreach {A B C} [split $Seq ""] {
            set Codon "$A$B$C"
            lappend MesCodons(0) $Codon
            incr Nb(0,$Codon)
            incr Nb($Codon)
            incr TotNb(0,$Codon)
            incr TotNb($Codon)
        }
        foreach {A B C} [split [string range $Seq 1 end-2] ""] {
            set Codon "$A$B$C"
            lappend MesCodons(1) $Codon
            incr Nb(1,$Codon)
            incr Nb($Codon)
            incr TotNb(1,$Codon)
            incr TotNb($Codon)
        }
        foreach {A B C} [split [string range $Seq 2 end-1] ""] {
            set Codon "$A$B$C"
            lappend MesCodons(2) $Codon
            incr Nb(2,$Codon)
            incr Nb($Codon)
            incr TotNb(2,$Codon)
            incr TotNb($Codon)
        }
        
        set LesDataParSeq {}
        set Count 0
        foreach Codon [AllCodons] {
            
            lappend LesDataParSeq $Codon $Nb($Codon) $Nb(0,$Codon) $Nb(1,$Codon) $Nb(2,$Codon)
            incr Count $Nb($Codon)
            
            if {$Nb($Codon)==0} {
                set Pc(0,$Codon) 0
                set Pc(1,$Codon) 0
                set Pc(2,$Codon) 0
            } else {
                set Pc(0,$Codon) [expr (100*$Nb(0,$Codon))/$Nb($Codon)] 
                set Pc(1,$Codon) [expr (100*$Nb(1,$Codon))/$Nb($Codon)] 
                set Pc(2,$Codon) [expr (100*$Nb(2,$Codon))/$Nb($Codon)] 
            }
            if {$Nb(0,$Codon)> $Nb(1,$Codon) && $Nb(0,$Codon)> $Nb(2,$Codon)} {
                lappend Mes(0) $Codon
                continue
            }
            if {$Nb(1,$Codon)>=$Nb(0,$Codon) && $Nb(1,$Codon)> $Nb(2,$Codon)} {
                lappend Mes(1) $Codon
                continue
            }
            if {$Nb(2,$Codon)>=$Nb(0,$Codon) && $Nb(2,$Codon)>=$Nb(1,$Codon)} {
                lappend Mes(2) $Codon
                continue
            }
        }	
        lappend LesData "$Nom $Count [join $LesDataParSeq { }]"
        
        #lappend LaSortie "$Nom"
        #lappend LaSortie "0 [llength $Mes(0)] $Mes(0)
        #lappend LaSortie "1 [llength $Mes(1)] $Mes(1)
        #lappend LaSortie "2 [llength $Mes(2)] $Mes(2)
        
        #rR Fin boucle sur Nom
    }
    
    foreach Codon $LesCodons {
	if {$TotNb($Codon)==0} {
	    set TotPc(0,$Codon) 0
	    set TotPc(1,$Codon) 0
	    set TotPc(2,$Codon) 0
	    set TotPx(0,$Codon) 0.
	    set TotPx(1,$Codon) 0.
	    set TotPx(2,$Codon) 0.
	} else {
	    set TotPc(0,$Codon) [expr (100*$TotNb(0,$Codon))/$TotNb($Codon)] 
	    set TotPc(1,$Codon) [expr (100*$TotNb(1,$Codon))/$TotNb($Codon)] 
	    set TotPc(2,$Codon) [expr (100*$TotNb(2,$Codon))/$TotNb($Codon)]
	    set TotPx(0,$Codon) [expr (100.*$TotNb(0,$Codon))/$TotNb($Codon)] 
	    set TotPx(1,$Codon) [expr (100.*$TotNb(1,$Codon))/$TotNb($Codon)] 
	    set TotPx(2,$Codon) [expr (100.*$TotNb(2,$Codon))/$TotNb($Codon)]
	} 
	if {$TotNb(0,$Codon)> $TotNb(1,$Codon) && $TotNb(0,$Codon)> $TotNb(2,$Codon)} {
	    set IsFrame(0,$Codon) 1
	    if { ! [IsX0 $Codon]} { set Codon [string tolower $Codon]}
	    lappend TotMes(0) $Codon
	    continue
	}
	if {$TotNb(1,$Codon)>=$TotNb(0,$Codon) && $TotNb(1,$Codon)> $TotNb(2,$Codon)} {
	    set IsFrame(1,$Codon) 1
	    if { ! [IsX0 $Codon]} { set Codon [string tolower $Codon] }
	    lappend TotMes(1) $Codon
	    continue
	}
	if {$TotNb(2,$Codon)>=$TotNb(0,$Codon) && $TotNb(2,$Codon)>=$TotNb(1,$Codon)} {
	    set IsFrame(2,$Codon) 1
	    if { ! [IsX0 $Codon]} { set Codon [string tolower $Codon] }
	    lappend TotMes(2) $Codon
	    continue
	}
    }

    set LesD {}
    foreach FrameCodon [array names TotPx "0,*"] {
	#Espionne $FrameCodon
	regsub {0\,} $FrameCodon "" Codon
	set N0 $TotPx(0,$Codon)
	set N1 $TotPx(1,$Codon)
	set N2 $TotPx(2,$Codon)
	set D [expr $N0-[Maxi $N1 $N2]]
	lappend LesD $D
	lappend LesCodonsDe($D) $Codon
    }
    set LesD [lsort -unique -real -decreasing $LesD]
    set Top60 {}
    foreach N $LesD {
	foreach Codon $LesCodonsDe($N) {
	    if { ! [regexp {[ATGC]{3}} $Codon] } { continue }
	    #Espionne $N $Codon
	    lappend Top64 $Codon
	    if {$Codon=="AAA" || $Codon=="CCC" || $Codon=="GGG" || $Codon=="TTT"} { continue }
	    lappend TOP60 $Codon
	}
    }
    set Top60 {}
    foreach Codon $TOP60 {
	if { ! [IsX0 $Codon]} { set Codon [string tolower $Codon] }
	lappend Top60 $Codon
    }
    set Top20 [lrange $Top60 0 19]

    lappend LaSortie ""
    lappend LaSortie $Organism
    lappend LaSortie "0 [llength $TotMes(0)] $TotMes(0)"
    lappend LaSortie "1 [llength $TotMes(1)] $TotMes(1)"
    lappend LaSortie "2 [llength $TotMes(2)] $TotMes(2)"
    lappend LaSortie ""
    foreach Frame [list 0 1 2] {
	set LesT {}
	foreach Codon [XCodons 0] {
	    set T "..."
	    if {[info exists IsFrame($Frame,$Codon)]} { set T $Codon }
	    lappend LesT $T
	}
	lappend LesT "///"
	foreach Codon [XCodons 1] {
	    set T "..."
	    if {[info exists IsFrame($Frame,$Codon)]} { set T $Codon }
	    lappend LesT $T
	}
	lappend LesT "///"
	foreach Codon [XCodons 2] {
	    set T "..."
	    if {[info exists IsFrame($Frame,$Codon)]} { set T $Codon }
	    lappend LesT $T
	}
	lappend LesT "///"
	foreach Codon [list AAA CCC GGG TTT] {
	    set T "..."
	    if {[info exists IsFrame($Frame,$Codon)]} { set T $Codon }
	    lappend LesT $T
	}
	lappend LaSortie "$Frame [llength $TotMes($Frame)] [join $LesT { }]" 
    }
    foreach Frame [list 0 1 2] {
        set LesT {}
        foreach Codon [XCodons 0] {
            set T [format "%3d" $TotPc($Frame,$Codon)]
            lappend LesT $T
        }
        lappend LesT "///"
        foreach Codon [XCodons 1] {
            set T [format "%3d" $TotPc($Frame,$Codon)]
            lappend LesT $T
        }
        lappend LesT "///"
        foreach Codon [XCodons 2] {
            set T [format "%3d" $TotPc($Frame,$Codon)]
            lappend LesT $T
        }
        lappend LesT "///"
        foreach Codon [list AAA CCC GGG TTT] {
            set T [format "%3d" $TotPc($Frame,$Codon)]
            lappend LesT $T
        }
        lappend LaSortie "$Frame  % [join $LesT { }]"
    }
    lappend LaSortie "Tp20 [join $Top20 { }] 21-60 [join [lrange $Top60 20 end] { }]"
    #SauveLesLignes $LesData dans $FichierData
    return $LaSortie

}

proc TunnelThermus {} {
    set LesT [list 15-37 52-76 84-100 445-520 562-590 669-690 735-760 765-811 1247-1292 1307-1341 1601-1620 1764-1790 1935-1945 2005-2020 2046-2075 2435-2458 2490-2512 2546-2560 2570-2620]
    foreach T $LesT {
	lassign [split $T "-"] D F
	set LesDestin [OverlapRna L $D $F Thermus_thermophilus "" "GetLimits"]
	regsub " " $LesDestin "-" LesDestin
	lappend LaSortie $LesDestin
    }
    return "[join $LesT {  }]   Escherichia_coli\n[join $LaSortie {  }]    Thermus_thermophilus"
 }

proc A2M {{Qui ""}} {
    global A2M
    if {[info exists A2M($Qui)]} { return $A2M($Qui) }
    if {[info exists A2M("EstCharge")]} { return "" }
    set A2M("EstCharge") 1
    foreach Y [list S L] {
	set LesStart {}
	foreach A [RnaMotif ListOf ${Y}Id] {
	    set Start [RnaMotif $A Start]
	    lappend AduStart($Start) $A
	    lappend LesStart $Start
	}
	set I 0
	foreach Start [lsort -integer $LesStart] {
	    incr I
	    set M M$I
	    set A $AduStart($Start)
	    if {[regexp {[a-z]} $A]} {
		set M [string tolower $M]
		lappend A2M(ma) [format "%-3s %-3s" $M $A]
		lappend A2M(am) [format "%-3s %-3s" $A $M]
		lappend A2M(lesm) $M
		lappend A2M(lesa) $A
	    } else {
		lappend A2M(MA) [format "%-3s %-3s" $M $A]
		lappend A2M(AM) [format "%-3s %-3s" $A $M]
		lappend A2M(lesM) $M
		lappend A2M(lesA) $A
	    }
	    set A2M($A) $M
	    set A2M($M) $A
	}
    }
    set A2M(lesm) [lsort -dictionary $A2M(lesm)]
    set A2M(lesM) [lsort -dictionary $A2M(lesM)]
    set A2M(lesa) [lsort -dictionary $A2M(lesa)]
    set A2M(lesA) [lsort -dictionary $A2M(lesA)]
    foreach K [list am ma AM MA] {
	set A2M($K) [lsort -dictionary $A2M($K)]
    }
    foreach A $A2M(lesa) {
	set M $A2M($A)
	lappend L1 [format "%-3s" $A]
	lappend L2 [format "%-3s" $M]
    }
    lappend L1 "   "
    lappend L2 "   "
    foreach A $A2M(lesA) {
	set M $A2M($A)
	lappend L1 [format "%-3s" $A]
	lappend L2 [format "%-3s" $M]
    }
    set A2M(horiA) "[join $L1 { }]\n[join $L2 { }]"
    
    set L1 {}
    set L2 {}

    foreach M $A2M(lesm) {
	set A $A2M($M)
	lappend L1 [format "%-3s" $M]
	lappend L2 [format "%-3s" $A]
    }
    lappend L1 "   "
    lappend L2 "   "
    foreach M $A2M(lesM) {
	set A $A2M($M)
	lappend L1 [format "%-3s" $M]
	lappend L2 [format "%-3s" $A]
    }
    set A2M(horiM) "[join $L1 { }]\n[join $L2 { }]"
    
    return [A2M $Qui]
}

proc AllAboutMoreFrequentCodonsMGS {} {
    set LaSortie {}
    lappend LaSortie "see <span class='QaGaction' onclick='\$(\"#MFCMGS\").toggle();'>Stats about More Frequent Codon in Frames for MGS</span>"
    lappend LaSortie "<div id='MFCMGS' style='display:inline-block; border:black solid 1px; padding:1em;'>"
    lappend LaSortie [ContenuDuFichier "/home/ripp/3d/MoreFrequentCodonsMGS.txt"]
    lappend LaSortie "</div>"
    return [join $LaSortie "\n"]
}

proc AllAboutMoreFrequentCodonsJoy {} {
    set LaSortie {}
    lappend LaSortie "see <span class='QaGaction' onclick='\$(\"#MFCJOY\").toggle();'>Stats about More Frequent Codon in Frames for Joy (Johan's yeasts)</span>"
    lappend LaSortie "<div id='MFCJOY' style='display:inline-block; border:black solid 1px; padding:1em;'>"
    lappend LaSortie [ContenuDuFichier "/home/ripp/3d/MoreFrequentCodonsJoy.txt"]
    lappend LaSortie "</div>"
    return [join $LaSortie "\n"]
}

proc AllAboutMoreFrequentCodons {} {
    set LaSortie {}
    lappend LaSortie "see <span class='QaGaction' onclick='\$(\"#MFC\").toggle();'>Stats about More Frequent Codon in Frames</span>"
    lappend LaSortie "<div id='MFC' style='display:inline-block; border:black solid 1px; padding:1em;'>"
    lappend LaSortie [ContenuDuFichier "/home/ripp/3d/MoreFrequentCodonsSamples.txt"]
    lappend LaSortie "</div>"
    return [join $LaSortie "\n"]
}

proc AllAboutCif {} {
    set LaSortie {}
    lappend LaSortie "see <span class='QaGaction' onclick='\$(\"#CifKey\").toggle();'>simple Cif keys</span>"
    lappend LaSortie "<div id='CifKey' style='display:inline-block; border:black solid 1px; padding:1em;'>"
    foreach Key [Cif ListOf Key] {
	set Action "Cif $Key"
	lappend LaSortie "<span class='QaGaction' onclick='QaGaction(\"$Action\");'>$Action</span>"
    }
    lappend LaSortie "</div>"
    lappend LaSortie "see <span class='QaGaction' onclick='\$(\"#CifLoopKey\").toggle();'>Loop Cif keys</span>"
    lappend LaSortie "<div id='CifLoopKey' style='display:inline-block; border:black solid 1px; padding:1em;'>"
    foreach Key [Cif ListOf LoopKey] {
	set Action "Cif $Key"
	lappend LaSortie "<span class='QaGaction' onclick='QaGaction(\"$Action\");'>$Action</span>"
    }
    lappend LaSortie "</div>"
    return [join $LaSortie "\n"]
    foreach Id [Cif _entity.id] Desc [Cif _entity.pdbx_description] Strand [Cif _entity_poly.pdbx_strand_id] {
	lappend LaSortie [format "%2d %-5s  %s" $Id $Strand $Desc]
    }
    return $LaSortie
}

proc Cif {{Qui ""} {Quoi ""}} {
    global Cif
    if {$Quoi==""} { set Quoi "Value" }
    if {[info exists Cif($Qui,$Quoi)]} { return $Cif($Qui,$Quoi) }
    if {[info exists Cif("EstCharge")]} {
	if {[regexp {^[0-9]+$} $Quoi]} {
	    if {[info exists Cif($Qui,Value)]} {
		return [lindex $Cif($Qui,Value) $Quoi-1]
	    }
	}
	if {$Qui=="All"} {
	    set LesLignes {}
	    foreach Key $Cif(ListOf,Key) {
		lappend LesLignes "$Key : $Cif($Key,Value)"
	    }
	    return [join $LesLignes "\n"]
	}
	if {$Quoi=="All"} {
	    set Qui [join $Cif($Qui,ListOfKey) ","]
	}
	if {[regexp {,} $Qui]} {
	    set LesQui [split $Qui ","]
	    set First [lindex $LesQui 0]
	    set Loop $Cif($First,Loop)
	    set LesLignes {}
	    foreach I [NombresEntre 1 [llength $Cif($First,Value)]] {
		Espionne $LesQui $I $Loop 
		set LaLigne {}
		foreach Q $LesQui {
		    lappend LaLigne [lindex $Cif($Q,Value) $I-1]
		}
		set Ligne [join $LaLigne " "]
		lappend LesLignes $Ligne
	    }
	    return [join $LesLignes "\n"]
	}
	return ""
    }
    set Cif("EstCharge") 1
    set LesLignes [LesLignesDuFichier "/home/ripp/3d/4w2f-assembly1.cif"]
    set Loop -1
    set InLoop 0
    set InLoopValues 0
    set MaxATOM 100
    foreach Ligne $LesLignes {
	if {[regexp "^ATOM" $Ligne]} { if {[incr MaxATOM -1] == 0 }  break }         ; ####################################################################
        set First [string index $Ligne 0]
        if {$First=="#"} { continue }
	if {0 && $Loop==5} { Espionne $Ligne }
	#if {[regexp "^_entity_src_gen.pdbx_alt_source_flag" $Ligne]} { break }
	set Ligne [string trim $Ligne]
	set PreviousLigne $Ligne
	if {[regexp {^loop_} $Ligne]} {
	    set InLoopValues 0
	    set InLoop 1
	    incr Loop
	    lappend Cif(ListOf,Loop) $Loop
	    continue
	}
	if {$InLoop && $First=="_"} {
	    #Espionne ********************\n$Ligne\n$InLoopValues
	    if {$InLoopValues} {
		set InLoopValues 0
		set InLoop 0
	    } else {
		scan $Ligne "%s" Key
		lappend Cif($Loop,ListOfKey) $Key
		continue
	    }
	}
	if {$InLoop && $First!="_"} {
	    set InLoopValues 1
	    lappend Cif($Loop,ListOfLines) $Ligne
	    continue
	}
	#Espionne Ligne $Ligne
	if {$First=="_"} {
	    set InLoop 0
	    set InLoopValues 0
	    scan $Ligne "%s" Key
	    lappend Cif(ListOf,Key) $Key
	    regsub "$Key +" $Ligne "" Value
	    set Cif($Key,Value) $Value
	    #Espionne $Key $Value
	}
	continue
    }
    foreach Key $Cif(ListOf,Key) {
	lappend Cif(ListOf,CifKey) "Cif $Key"
    }
    set Cif(ListOf,CifLoopKey) {}
    foreach Loop $Cif(ListOf,Loop) {
	foreach Key $Cif($Loop,ListOfKey) {
	    if { ! [info exists Cif($Loop,KeyClass)]} {
		regsub {\..+$} $Key "" KeyClass
		regsub {^_} $KeyClass "" KeyClass
		set Cif($Loop,KeyClass) $KeyClass
		set Cif($KeyClass,Loop) $Loop
		lappend Cif(ListOf,KeyClass) $KeyClass
	    }
	    lappend Cif(ListOf,LoopKey)     $Key
	    lappend Cif(ListOf,CifLoopKey) "Cif $Key"
	    set Cif($Key,Loop)     $Loop
	    set Cif($Key,KeyClass) $KeyClass
	    lappend Cif($KeyClass,ListOfKey) $Key
	}
	if { ! [info exists Cif($Loop,ListOfLines)]} { break }
	#Espionne Loop $Loop
	#EspionneL $Cif($Loop,ListOfKey)
	#Espionne Fin Keys loop $Loop
	set Lines $Cif($Loop,ListOfLines)
	#EspionneL $Lines
	set InSC 0
	set iKey -1
	foreach Line $Lines {
	    if {$InSC && [string index $Line 0]!=";"} {
		append CurrentValue $Line
		continue
	    }
	    if {[string index $Line 0]==";"} {
		if { ! $InSC } {
		    set InSC 1
		    set Info [string range $Line 1 end]
		    set CurrentValue $Info
		} else {
		    incr iKey
		    set Key [lindex $Cif($Loop,ListOfKey) $iKey]
		    set InSC 0
		    lappend Cif($Key,Value) $CurrentValue
		    if {$iKey==[llength $Cif($Loop,ListOfKey)]-1} { set iKey -1 }
		}
		continue
	    }
	    set InDQ 0
	    set InSQ 0
	    set CurrentValue ""
	    set PreviousC " "
	    foreach C [split $Line ""] {
		#Espionne $CurrentValue
		if { ! $InDQ && $C=="\""} {
		    set InDQ 1
		    set PreviousC $C
		    continue
		}
		if {$InDQ && $C=="\""} {
		    set InDQ 0
		    set PreviousC $C
		    continue
		}
		if {$InDQ && $C!="\""} {
		    set InDQ 1
		    append CurrentValue $C
		    set PreviousC $C
		    continue
		}
		if {$InSQ && $C=="'"} {
		    set InSQ 0
		    set PreviousC $C
		    continue
		}
		if {$InSQ && $C!="'"} {
		    set InSQ 1
		    append CurrentValue $C
		    set PreviousC $C
		    continue
		}
		if { ! $InDQ && ! $InSQ && $C=="'"} {
		    set InSQ 1
		    set PreviousC $C
		    continue
		}
		if {$PreviousC==" " && $C==" "} {
		    continue
		}  
		if {$PreviousC!=" " && ($C==" " || $C==";")} {
		    #Espionne =$PreviousC=$C=$CurrentValue
		    incr iKey
		    set Key [lindex $Cif($Loop,ListOfKey) $iKey]
		    #Espionne Loop $Loop iKey $iKey Key $Key $CurrentValue
		    lappend Cif($Key,Value) $CurrentValue
		    set CurrentValue ""
		    set PreviousC $C
		    if {$iKey==[llength $Cif($Loop,ListOfKey)]-1} { set iKey -1 }
		    continue
		}
		append CurrentValue $C
		set PreviousC $C		
	    }
	    if {$CurrentValue!=""} {
		incr iKey
		set Key [lindex $Cif($Loop,ListOfKey) $iKey]
		lappend Cif($Key,Value) $CurrentValue
		set CurrentValue ""
		if {$iKey==[llength $Cif($Loop,ListOfKey)]-1} { set iKey -1 }
	    }
	}
    }
    set Cif(ListOf,CifLoopKey) [join $Cif(ListOf,CifLoopKey) "\n"]
    set Cif(ListOf,AllKey) [concat $Cif(ListOf,Key) $Cif(ListOf,LoopKey)]
    return [Cif $Qui $Quoi]
}

proc PmlFromColiTo {Z {Action ""} {FicDestin ""} {FicSource ""}} {
    if {$Action==""} { set Action "GetText" }
    if {$FicSource==""} { set FicSource "motif_coli_numeros_coli.pml" }
    if {$FicDestin==""} { set FicDestin "motif_$Z.pml" }
    set LeNew {}

    lappend LeNew "#XMotifs for SSU and LSU adapted from the Escherichia_coli numbering for $Z"
    lappend LeNew ""
    lappend LeNew "set ignore_case, off"
    lappend LeNew ""
    foreach Y [list S L] {
	set YSU  "${Y}SU"
	set XYSU  "X$YSU"
	lappend LeNew ""
	lappend LeNew "#$XYSU"
	if {$Z=="Thermus_thermophilus" && $Y=="S"} {
	    lappend LeNew "create $XYSU, (${Y}SU and resi [JoinedRnaMotifsFor Escherichia_coli $Y Brut])"
	} else {
	    lappend LeNew "create $XYSU, (${Y}SU and resi [JoinedRnaMotifsFor $Z $Y Brut])"
	}
	lappend LeNew ""
	foreach Motif [RnaMotif ListOf ${Y}Id] {
	    set D [RnaMotif $Motif Start]
	    set F [RnaMotif $Motif End]
	    set LesDestin [OverlapRna $Y $D $F $Z "" "GetLimits"] 
	    lassign $LesDestin DDestin FDestin
	    if {$Z=="Thermus_thermophilus" && $Y=="S"} {
		set New "create $Motif, ($XYSU and resi $D-$F)"
	    } else {
		set New "create $Motif, ($XYSU and resi $DDestin-$FDestin)"
	    }
	    lappend LeNew $New
	}
	lappend LeNew ""
	foreach Motif [RnaMotif ListOf ${Y}Id] {
	    lappend LeNew "create ${Motif}p, byres (CIFname_prot within 5A of $Motif)"
	}
    }
    if {$Action=="GetText"} { return [join $LeNew "\n"] }
    return [SauveLesLignes $LeNew dans $FicDestin]
}

proc Pml {{QuiZ ""} {Qui ""} {Quoi}} {
    global Pml
    if {$QuiZ=="" && $Qui=="" && $Quoi==""} { set Qui "Help" }
    if {[info exists Pml($QuiZ,$Qui,$Quoi)]} { return $Pml($QuiZ,$Qui,$Quoi) }
    if {[info exists Pml("EstCharge")]} { return "" }
    set Pml("EstCharge") 1

    foreach Z [FromRnaAli ListOf Org] {
	foreach Y [RiboNomme ListOf Y] {
	    foreach M [RiboNomme $Y ListOfMotif] {
		set D [RnaMotif $M ${Y}Start]
		set F [RnaMotif $M End]
		set DFEc "$D-$F"
		lappend LesDFEc $DFEc
		set LesDestin [OverlapRna $Y $D $F $Z "" "GetLimits"]
		lassign $LesDestin DDestin FDestin
		set Pml($Z,Create,$M) "create $M, ($Pml($Z,$Y,))"
		lappend LesDF "$DDestin-$FDestin"
	    }
	}
    }
    return [Pml $Qui $Quoi]
    
}

proc FromCif {{Qui ""} {Quoi ""}} {
    global FromCif
    if {$Qui=="" && $Quoi==""} { set Qui "Help" }
    if {[info exists FromCif($Qui,$Quoi)]} { return $FromCif($Qui,$Quoi) }
    if {[info exists FromCif("EstCharge")]} {
	if {[regexp {^I([0-9]+)\-I([0-9]+)$} $Quoi Match a b]} {
	    if {[info exists FromCif($Qui,Seq)]} {
		return [string range "n$FromCif($Qui,Seq)" $a $b]
	    } else {
		return ""
	    }
	}
	if {[regexp {^([0-9]+[A-Z]*)\-([0-9]+[A-Z]*)$} $Quoi Match a b]} {
	    if {[info exists FromCif($Qui,Seq)] && [info exists FromCif($Qui-TargetI,$a)] && [info exists FromCif($Qui-TargetI,$b)]} {
		set a $FromCif($Qui-TargetI,$a)
		set b $FromCif($Qui-TargetI,$b)		
		return [string range "n$FromCif($Qui,Seq)" $a $b]
	    } else {
		return ""
	    }
	}
	return ""
    }
    set FromCif("EstCharge") 1

    set ChainOfSU(S) "AA" ; set SUOfChain(AA) "S" 
    set ChainOfSU(L) "BA" ; set SUOfChain(BA) "L"
    set LesChain [array names SUOfChain]
    set LesSU    [array names ChainOfSU]
    set FromCif(ListOf,SU) $LesSU

    set CurrentAlpha ""
    set previous_label_seq_id ""
    set previous_auth_seq_id ""
    set I 0
    set FromCif(Filename,) "/home/ripp/3d/4w2f.cif"
    foreach Ligne [LesLignesDuFichier $FromCif(Filename,)] {
        if { ! [regexp "^ATOM" $Ligne]} { continue }
        regsub -all { +} $Ligne " " Ligne
        
	lassign [split $Ligne " "] group_PDB id type_symbol label_atom_id label_alt_id label_comp_id label_asym_id label_entity_id label_seq_id pdbx_PDB_ins_code Cartn_x Cartn_y Cartn_z occupancy B_iso_or_equiv pdbx_formal_charge auth_seq_id auth_comp_id auth_asym_id auth_atom_id pdbx_PDB_model_num
	
	#rR Attention on remplace le U par des T ******************************
	if {$label_comp_id=="U"} { set label_comp_id "T" }
	if {$auth_comp_id =="U"} { set auth_comp_id  "T" }

	#rR on en traite que les chain choisis ci-dessus **********************
	set Chain $auth_asym_id
        if {[lsearch -exact $LesChain $Chain]<0} { set I 0 ; continue }
        if {$label_seq_id==$previous_label_seq_id} { continue }
	incr I
	set SU $SUOfChain($Chain)
	set FromCif($SU,Chain) $Chain
	set FromCif($Chain,SU) $SU
	set previous_label_seq_id $label_seq_id
        set NewSeqId $auth_seq_id
        if {$auth_seq_id==$previous_auth_seq_id} {
            set CurrentAlpha [NextALPHA $CurrentAlpha]
            set NewSeqId $auth_seq_id$CurrentAlpha
        } else {
            set CurrentAlpha ""
        }
        set previous_auth_seq_id $auth_seq_id
        if {$label_seq_id!=$NewSeqId} {
	    #Espionne $SU $label_seq_id!=$NewSeqId
        }
	lappend FromCif($SU-Reference,ListOfPos)  $label_seq_id
	lappend FromCif($SU-Target,ListOfPos)     $NewSeqId
	set     FromCif($SU-Reference,$NewSeqId)  $label_seq_id 
	set     FromCif($SU-Target,$label_seq_id) $NewSeqId
	set     FromCif($SU-ReferenceSeq,$label_seq_id)  $label_comp_id 
	append  FromCif($SU-Reference,Seq)               $label_comp_id
	append  FromCif($SU-Target,Seq)                  $auth_comp_id
	set     FromCif($SU-TargetSeq,$NewSeqId)         $auth_comp_id
	set     FromCif($SU-TargetSeq,I$I)               $auth_comp_id
	set     FromCif($SU-Target,I$I)                  $NewSeqId
	set     FromCif($SU-TargetI,$NewSeqId)           $I
	lappend FromCif($SU-Target,ListOfI)              $I
    }
    set     FromCif(S,Seq) $FromCif(S-Target,Seq)
    set     FromCif(L,Seq) $FromCif(L-Target,Seq)
    set     FromCif(S,Length) [string length $FromCif(S,Seq)]
    set     FromCif(L,Length) [string length $FromCif(L,Seq)]

    lappend FromCif(Help,) "FromCif S-Reference ListOfPos"
    lappend FromCif(Help,) "FromCif S-Target    ListOfPos"
    lappend FromCif(Help,) "FromCif S-Target    186"
    lappend FromCif(Help,) "FromCif S-Reference 189C"
    lappend FromCif(Help,) "FromCif S-Target    I421"
    lappend FromCif(Help,) "FromCif S-Target    ListOfI"
    lappend FromCif(Help,) "FromCif L-Reference ListOfPos"
    lappend FromCif(Help,) "FromCif L-Target    ListOfPos"
    lappend FromCif(Help,) "FromCif L-Target    222"
    lappend FromCif(Help,) "FromCif L-Reference 333"
    lappend FromCif(Help,) "FromCif L-Target    I421"
    lappend FromCif(Help,) "FromCif L-Target    ListOfI"
    lappend FromCif(Help,) "FromCif S-Reference Seq"
    lappend FromCif(Help,) "FromCif S-Target    Seq"
    lappend FromCif(Help,) "FromCif S           Seq"
    lappend FromCif(Help,) "FromCif S           I421-I433    attention avec I "
    lappend FromCif(Help,) "FromCif S           186-189F     attention sans I"
    lappend FromCif(Help,) "FromCif S           Length"
    lappend FromCif(Help,) "FromCif L           Length"
    set FromCif(Help,) [join $FromCif(Help,) "\n"]

    return [FromCif $Qui $Quoi]
}

proc RiboRec {Root {Ident ""}} {
    global RiboNomme
    set Espace [string repeat "   " $Ident]
    set Desc $RiboNomme($Root,Description)
    set Chain ""
    if {[info exists RiboNomme($Root,Chain)]} { set Chain "$RiboNomme($Root,Chain)" }
    lappend RiboNomme(RecursiveListOf,Item) [format "%-15s : %-2s  %s" $Espace$Root $Chain $Desc]
    if { ! [info exists RiboNomme($Root,ListOfItem)]} { return }
    foreach Item $RiboNomme($Root,ListOfItem) {
	RiboRec $Item [expr $Ident+1]
    }
    return
}

proc RiboNomme {{Qui ""} {Quoi ""}} {
    global RiboNomme
    if {$Qui=="" && $Quoi==""} { set Qui "Help" }
    if {[info exists RiboNomme($Qui,$Quoi)]} { return $RiboNomme($Qui,$Quoi) }
    if {[info exists RiboNomme("EstCharge")]} { return "" }
    set RiboNomme("EstCharge") 1

    set ListItemDesc [list \
			  SSU           "Small Sub Unit"         \
			  LSU           "Large Sub Unit"         \
			  mRNA          "messenger RNA"          \
			  SSU_rRNAs     "rRNA list from SSU"     \
			  SSU_proteins  "proteins list from SSU" \
			  LSU_rRNAs     "rRNA list from SSU"     \
			  LSU_proteins  "protein list from SSU"  \
			  tRNAs         "tRNA list"              \
			 ]

    foreach {Item Desc} $ListItemDesc {
	lappend RiboNomme(ListOf,Description) $Desc
	set RiboNomme($Item,Description) $Desc 
	set RiboNomme($Desc,Item)        $Item
	if { ! [regexp "_" $Item]} { lappend RiboNomme(ListOf,Item) $Item }
    } 

    set RiboNomme(SSU,ListOfItem)       [list SSU_rRNAs SSU_proteins] 
    set RiboNomme(LSU,ListOfItem)       [list LSU_rRNAs LSU_proteins]

    foreach Id [Cif _entity.id] {
	set Desc  [Cif _entity.pdbx_description $Id]
	set Chain [Cif _entity_poly.pdbx_strand_id $Id]
	Espionne $Desc
	set Item ""
	if {$Item=="" && [regexp -nocase {Protein ([A-Z0-9]+)} $Desc Match Item]} {
	    set Y [string index $Item 0]
	    lappend RiboNomme(${Y}SU_proteins,ListOfItem) $Item
	}
	if {$Item=="" && [regexp -nocase {mRNA} $Desc]} {
	    set Item "mrna"
	}
	if {$Item=="" && [regexp -nocase {tRNA} $Desc]} {
	    if {[regexp {A/P\-site} $Desc]} {
		set Item "trnaA"
		regsub {/P} $Desc "" DescA
		set ChainA $Chain
		if {[regexp "," $Chain]} { lassign [split $Chain ","] ChainA ChainP } 
		set RiboNomme($Item,Chain)          $ChainA
		set RiboNomme($Item,Description)    $DescA
		set RiboNomme($DescA,Item)          $Item
		lappend RiboNomme(tRNAs,ListOfItem) $Item
		set Chain $ChainP
		set Item "trnaP"
		regsub {A/} $Desc "" Desc
		lappend RiboNomme(tRNAs,ListOfItem) $Item
	    } elseif {[regexp {E-site tRNA} $Desc]} {
		set Item "trnaE"
		lappend RiboNomme(tRNAs,ListOfItem) $Item		
	    }
	}
	if {$Item=="" && [regexp -nocase {RNA} $Desc]} {
	    set Y ""
	    if {[regexp {1.S} $Desc ]} { set Y S ; set Item "SSU_rRNA" }
	    if {[regexp {2.S} $Desc ]} { set Y L ; set Item "LSU_rRNA" }
	    if {[regexp {5S}  $Desc ]} { set Y L ; set Item "5S_rRNA"  }
	    if {$Y!=""} {
		lappend RiboNomme(${Y}SU_rRNAs,ListOfItem) $Item
	    }
	}
	if {$Item==""} { continue}
	Espionne $Item
	set RiboNomme($Item,Chain)       $Chain
	set RiboNomme($Item,Description) $Desc
	set RiboNomme($Desc,Item)        $Item	    
    }

    foreach Item [RnaMotif ListOf SId] {
	set Desc "X motif $Item from $RiboNomme(SSU_rRNA,Description)"
	set RiboNomme($Item,Description) $Desc
	set RiboNomme($Desc,Item)        $Item
	lappend RiboNomme(SSU_rRNA,ListOfItem) $Item
    }

    foreach Item [RnaMotif ListOf LId] {
	set Desc "X motif $Item from $RiboNomme(LSU_rRNA,Description)"
	set RiboNomme($Item,Description) $Desc
	set RiboNomme($Desc,Item)        $Item
	lappend RiboNomme(LSU_rRNA,ListOfItem) $Item
    }

    set RiboNomme(RecursiveListOf,Item) {}
    set Ident 0
    foreach Item $RiboNomme(ListOf,Item) {
	RiboRec $Item $Ident
    }
    set RiboNomme(RecursiveListOf,Item) [join $RiboNomme(RecursiveListOf,Item) "\n"]


    set RiboNomme(ListOf,SU) [list "LSU" "SSU"]
    set RiboNomme(SSU,Description) "SmallSubUnit_16S_Ribosomal_RNA"
    set RiboNomme(LSU,Description) "LargeSubUnit_23S_Ribosomal_RNA"

    set RiboNomme(mRNA,Description) "mRNA"

    foreach Id [RnaMotif ListOf Id] {
	set SU "[RnaMotif $Id SU]SU"
	set RiboNomme($Id,Description) "Motif $Id in $SU"
	lappend RiboNomme(All,ListOfMotif) $Id
	lappend RiboNomme(${SU},ListOfMotif) $Id
    }
    foreach K [array names RiboNomme] {
	lassign [split $K ","] A B
	if {[regexp " " $A]} { set A "\"$A\"" }
	if {[regexp " " $B]} { set B "\"$B\"" }
	lappend LeHelp "$A $B"
    }
    set RiboNomme(Help,) [join $LeHelp "\n"]
    return [RiboNomme $Qui $Quoi]
}

proc RnaMotif {{Qui ""} {Quoi ""}} {
    global RnaMotif
    if {[info exists RnaMotif($Qui,$Quoi)]} { return $RnaMotif($Qui,$Quoi) }
    if {[info exists RnaMotif("EstCharge")]} {
	if {$Qui=="" && $Quoi==""} {
	    lappend LesPossibles "RnaMotif ListOf Id  RnaMotif ListOf LId  RnaMotif ListOf SId "
	    lappend LesPossibles "$RnaMotif(ListOf,Id)"
	    set LesK {}
	    foreach K [list Id Start End Length Card Domain Helix XMotif Codons] {
		lappend LesK "RnaMotif m1 $K"
	    }
	    lappend LesPossibles [join $LesK "  "]
	    lappend LesPossibles "RnaMotif L ListOfStartEnd  RnaMotif S ListOfStartEnd" 
	    lappend LesPossibles "RnaMotif L Content  RnaMotif S Content  RnaMotif All Content"
	    regsub -all "," $LesPossibles " " LesPossibles
	    return [join $LesPossibles "\n"]
	}
    }
    set RnaMotif("EstCharge") 1
    set Rep "/home/ripp/3d"
    set Fic "$Rep/EcoliRnaMotifs.txt"
    set LeTout {}
    set LeSSU {}
    set LeLSU {} 
    set RnaMotif(ListOf,Header) "Id Start End XMotif Length Codons Card Domain Helix XMotif Codons"
    set LesLignes [LesLignesDuFichier $Fic]
    foreach Ligne $LesLignes {
	set SU ""
	if {[regexp {^[A-Z]} $Ligne]} {
	    lappend LeLSU $Ligne
	    set SU L
	}
	if {[regexp {^[a-z]} $Ligne]} {
	    lappend LeSSU $Ligne
	    set SU S
	}
	set Ligne [string trim $Ligne "\t "]
	regsub -all {\t+} $Ligne "\t" Ligne
	if {$Ligne==""} { continue }
	set LesMots [lrange [concat [split $Ligne "\t"] [list "-" "-" "-"]] 0 8]
	lassign $LesMots Id Start End XMotif Length Codons Card Domain Helix
	regsub -all -nocase {[^ATGC\,]} $Codons "" Codons
	set LesCodons [split $Codons ","]
	#Espionne $Id $Start $End $Length $Card $Domain $Helix $XMotif $LesCodons
	set RnaMotif($Id,Id)     $Id
	set RnaMotif($Id,Start)  $Start
	set RnaMotif($Id,End)    $End
	set RnaMotif($Id,Length) $Length
	set RnaMotif($Id,Card)   $Card
	set RnaMotif($Id,Domain) $Domain
	set RnaMotif($Id,Helix)  $Helix
	set RnaMotif($Id,XMotif) $XMotif
	set RnaMotif($Id,Codons) $LesCodons
	set RnaMotif($Id,SU)     $SU

	regsub -all {[^ATGC]} $XMotif "" XMotifConserve
	set RnaMotif($Id,XMotifConserve) $XMotifConserve
	if {[string length $XMotifConserve]!=$Length} { FaireLire "length $XMotifConserve!=$Length $Ligne" }

	lappend RnaMotif(ListOf,Id) $Id
	if {[regexp {[A-Z]} $Id]} {
	    set Y L
	    lappend RnaMotif(ListOf,LId) $Id
	} else {
	    set Y S
	    lappend RnaMotif(ListOf,SId) $Id
	}
	lappend RnaMotif($Y,ListOfStartEnd) "$Start-$End"
    }
    set RnaMotif(L,ListOfStartEnd) [join $RnaMotif(L,ListOfStartEnd) "+"]
    set RnaMotif(S,ListOfStartEnd) [join $RnaMotif(S,ListOfStartEnd) "+"]

    set RnaMotif(L,Content)   [join $LeLSU "\n"]
    set RnaMotif(S,Content)   [join $LeSSU "\n"]
    set RnaMotif(All,Content) [join $LesLignes "\n"]
    
    return [RnaMotif $Qui $Quoi]
}

proc SeeSeqs {} {
    Espionne [string range [FromRnaAli Escherichia_coli         L Seq] 0 80] Escherichia_coli
    Espionne [string range [FromRnaAli Saccharomyces_cerevisiae L Seq] 0 80] Saccharomyces_cerevisia
    exit
}

proc SeeRnaMotifs {Z} {
    foreach Id [RnaMotif ListOf Id] {
	if {[regexp {[a-z]} $Id]} { set Y "S" } else {  set Y "L" }
	set D [RnaMotif $Id Start]
	set F [RnaMotif $Id End]
	set M [RnaMotif $Id XMotif] ; regsub -all "," $M "" M
	lappend LaSortie ""
	lappend LaSortie "$Id $D $F [RnaMotif $Id XMotif]"
	lappend LaSortie [OverlapRna $Y $D $F $Z]
    }
    return [join $LaSortie "\n"]
}

proc JoinedRnaMotifsFor {Z Y {Brut ""}} {
    foreach Id [RnaMotif ListOf ${Y}Id] {
	set D [RnaMotif $Id Start]
	set F [RnaMotif $Id End]
	set DFEc "$D-$F"
	lappend LesDFEc $DFEc
	set LesDestin [OverlapRna $Y $D $F $Z "" "GetLimits"]
	lassign $LesDestin DDestin FDestin
	lappend LesDF "$DDestin-$FDestin"
    }
    #Espionne [join $LesDFEc "+"] Ec
    if {$Brut!=""} { return [join $LesDF +] }
    return [format "%s %-30s %s" $Y $Z [join $LesDF +]]
} 

proc OverlapRna {{Z ""} {LocDSource ""} {LocFSource ""} {Destin ""} {Source ""} {GetWhat ""}} {
    if {$Source==""} { set Source "Escherichia_coli" }
    set GloD [FromRnaAli $Source $Z GloOfLoc$LocDSource]
    set GloF [FromRnaAli $Source $Z GloOfLoc$LocFSource]
    set SeqSource [FromRnaAli $Source $Z SeqNoGap]
    set SeqDestin [FromRnaAli $Destin $Z SeqNoGap]
    set GCourant $GloD
    while true {
	set LocDDestin [FromRnaAli $Destin $Z LocOfGlo$GCourant]
	if {$LocDDestin!=-1} { break }
	incr GCourant
	if {$GCourant>$GloF} { break }
    }
    set GCourant $GloF
    while true {
	set LocFDestin [FromRnaAli $Destin $Z LocOfGlo$GCourant]
	if {$LocFDestin!=-1} { break }
	incr GCourant -1
	if {$GCourant<$GloD} { break }
    }
    if {$GetWhat=="GetLimits"} { return "$LocDDestin $LocFDestin" } 
    set MotifDestin [string range "n$SeqDestin" $LocDDestin $LocFDestin]
    set MotifSource [string range "n$SeqSource" $LocDSource $LocFSource]
    return "$MotifSource $LocDSource $LocFSource $Source\n$MotifDestin $LocDDestin $LocFDestin $Destin\n"
}

proc FromRnaAli {{Qui ""} {Quoi ""} {Quid ""}} {
    global FromRnaAli
    if {[info exists FromRnaAli($Qui,$Quoi,$Quid)]} { return $FromRnaAli($Qui,$Quoi,$Quid) }
    if {[info exists FromRnaAli("EstCharge")]} { return "" }
    set FromRnaAli("EstCharge") 1
    set Rep "~/3d/ali"
    set FromRnaAli(L,Filename,) "$Rep/LSU_rRNA_alignment.xml"
    set FromRnaAli(S,Filename,) "$Rep/SSU_rRNA_alignment.xml"
    
    set G 0
    set L 0

    set FromRnaAli(ListOf,Org,) [FromMacsim $FromRnaAli(L,Filename,) ListOfNames] 

    #set FromRnaAli(ListOf,Org,) [list "Escherichia_coli" "Thermus_thermophilus" "Haloarcula_marismortui" "Saccharomyces_cerevisiae"] 
    foreach Z $FromRnaAli(ListOf,Org,) {
	foreach Y [list L S] {
	    set Seq [FromMacsim $FromRnaAli($Y,Filename,) Sequences $Z] 
	    #Espionne $Seq
	    regsub -all {\.} $Seq "" SeqNoGap
	    set FromRnaAli($Z,$Y,Seq)      $Seq
	    set FromRnaAli($Z,$Y,SeqNoGap) $SeqNoGap
	    set L 0
	    set G 0
	    set LocNumbering ""
	    set Skip -1
	    foreach X [split $Seq ""] {
		incr G
		lappend FromRnaAli($Z,$Y,ListOfGlo) $G
		if {$X!="."} {
		    incr L
		    if {$L%10==1} {
			set Skip [string length "$L"]
			append LocNumbering "$L"
		    }
		    lappend FromRnaAli($Z,$Y,ListOfLoc) $L
		    set FromRnaAli($Z,$Y,LocOfGlo$G) $L
		    set FromRnaAli($Z,$Y,GloOfLoc$L) $G
		} else {
		    set FromRnaAli($Z,$Y,LocOfGlo$G) -1
		}
		if {[incr Skip -1]<0} { append LocNumbering "." }
	    }
	    set FromRnaAli($Z,$Y,LocNumbering) $LocNumbering
	    set FromRnaAli($Z,$Y,Length) [lindex $FromRnaAli($Z,$Y,ListOfLoc) end]
	    lappend FromRnaAli(ListOf,All,Length) "$Z $Y $FromRnaAli($Z,$Y,Length)" 
	}
    }
    return [FromRnaAli $Qui $Quoi $Quid]
}


proc SupprimeDoublonsDansTFAs {{Rep ""} {RepSortie ""}} {
    if {$Rep==""} { set Rep "tfasdescopains" }
    if {$RepSortie==""} {
	set RepSortie "${Rep}SansDoublons"
    }
    if { ! [regexp "^/" $RepSortie]} { set RepSortie "[RepertoireDuGenome]/$RepSortie" }
    file mkdir $RepSortie
    foreach Nom [ListeDesPABs] {
	set Fic [GscopeFile $Nom $Rep]
	if {[FileAbsent $Fic]} { continue }
	set EnteteCourante ""
	set LeTFAs {}
	set YaDoublon 0
	foreach Ligne [concat [LesLignesDuFichier $Fic] ">CESTFINI"] {
	    if { ! [regexp {>} $Ligne]} { lappend MesLignes $Ligne ; continue } 
	    if {$EnteteCourante!=""} {
		scan $EnteteCourante "%s" AccessCourant
		if {[info exists DejaVu($AccessCourant)]} {
		    Espionne $Nom $EnteteCourante
		    set YaDoublon 1
		} else {
		    if {$MesLignes!={}} {
			lappend LeTFAs [join $MesLignes "\n"]
		    }
		    set DejaVu($AccessCourant) 1
		}
	    }
	    set EnteteCourante $Ligne
	    set AccessCourant ""
	    set MesLignes [list $Ligne]
	    if {$Ligne==">CESTFINI"} { break }
	}
	if {$YaDoublon && $LeTFAs!={}} { 
	    set Nouveau "$RepSortie/$Nom"
	    Espionne $Nouveau
	    SauveLesLignes $LeTFAs dans $Nouveau
	    lappend LesNouveaux $Nouveau 
	} 
    }
    return $LesNouveaux
}

proc MGSCreateAllNuctfaForEachOrganism {} {
    set LesNuctfa {}
    foreach Nom [ListeDesPABs] {
	foreach Homo [MRna $Nom ListOfHomo] {
	    #if {[info exists DejaVuHomo($Homo)]} { continue }
	    #set DejaVuHomo($Homo) 1
	    set OS [GeneQuid UniprotData $Homo OS]
	    if {$OS==""} {
		set GE $Homo
	    } else {
		scan $OS "%s %s" G E
		set GE "${G}_$E"
	    }
	    #Espionne =$OS=
	    #if {[info exists DejaVu($GE)]} { FaireLire "$Nom Deja vu $Homo $GE / $OS / $DejaVu($GE) /" }
	    #set DejaVu($GE) "$OS $Homo"
	    set Rep "[RepertoireDuGenome]/nuctfa_$GE"
	    file mkdir $Rep
	    set N "${Nom}_$Homo"
	    set Seq [MRna $Homo nuc]
	    set Tfa [SequenceFormatTFA $Seq $N "nucbrut"]
	    lappend LesNuctfa [Sauve $Tfa dans "$Rep/$N"]
	}
    }
    return $LesNuctfa
}

proc MGSCreateAllNuctfa {} {
    foreach Nom [ListeDesPABs] {
	foreach Homo [MRna $Nom ListOfHomo] {
	    set N "${Nom}_$Homo"
	    set Seq [MRna $Homo nuc]
	    set Tfa [SequenceFormatTFA $Seq $N "nucbrut"]
	    lappend LesNuctfa [Sauve $Tfa dans "[RepertoireDuGenome]/nuctfa/$N"]
	}
    }
    return $LesNuctfa
}

proc MGSLaTotale {} {
    #rR setgscoperr MGS     ;# to create le /genomicvs/link/MGS
    #rR cxg
    #rR mkdir DeJulie
    #rR cp /from/somewhere/ListOfAccess.txt DeJulie/
    #rR cp -R /from/somewhere/orthologs     DeJulie/
    #rR gscope     ; # it will create the gscope project. 
    #rR            ; # answer Yes to the squestion from a file with Access
    #rR            ; # and select the  DeJulie/ListOfAccess.txt
    #rR            ; # create only sequences.
    #rR then run this proc (MGSLaTotale) ;-)

    MGSAccessMrna
    CreateAccessMRnaPourTous
    MGSCreateDatabase                     ; #rR uses MRna which stores in memory and write a memo file to the disk (to go faster in future)
    
    file mkdir "[RepertoireDuGenome]/banques"
    CreateBlastDatabaseWithTfasDesCopains CreateLink
    BlastPPourTous
    DbClustalPourTous "" "tfasdescopains"
    LeonEtMacsimsPourTous
    FaireLire "Please \n mv msf msfProt\n and create the link\n ln -s mspProt msf"
    CreateNucAliFromProtAliMGSPourTous
    MGSConvertToRsfAndMacsimPourTous
}

proc CompareMDScore {} {
    set SN 0.0
    set SY 0.0
    foreach NN [LesLignesDuFichier [Fiches "md_scoresAnchorsNo"]] NY [LesLignesDuFichier [Fiches "md_scoresAnchorsYes"]]  {
	scan $NN "%s %f" Nom N
	scan $NY "%s %f" Nom Y
	Espionne [format "%4.2f %4.2f %7.3f" $N $Y [expr $Y-$N]]
	set SN [expr $SN + $N]
	set SY [expr $SY + $Y]
    }

    Espionne [expr $SN/82] [expr $SY/82]
    exit
}

proc MGSConvertToRsfAndMacsimPourTousAllRandoms {} {
    set LesCc [CirCode ListOf Index]
    set LesDone {}
    foreach Cc $LesCc {
	if {$Cc=="00"} { continue }
	if {[FileExists "[RepertoireDuGenome]/rsfNucX$Cc"]} { continue }
	Espionne "running $Cc"
	MGSConvertToRsfAndMacsimPourTous $Cc
	lappend LesDone $Cc
    }
    return "I did MGSConvertToRsfAndMacsimPourTousAllRandoms for $LesDone." 
}


proc MGSConvertToRsfAndMacsimPourTous {{Cc ""}} {

    if {$Cc!=""} { CirCode "DefaultCirCode" $Cc }
    if {$Cc=="00"} { set Cc "" }

    file mkdir "[RepertoireDuGenome]/msfNuc"
    file mkdir "[RepertoireDuGenome]/msfProt"

    file mkdir "[RepertoireDuGenome]/rsfNuc"
    file mkdir "[RepertoireDuGenome]/rsfProt"

    file mkdir "[RepertoireDuGenome]/rsfNucX$Cc"
    file mkdir "[RepertoireDuGenome]/rsfProtX$Cc"

    file mkdir "[RepertoireDuGenome]/macsimXmlNucX$Cc"
    file mkdir "[RepertoireDuGenome]/macsimXmlProtX$Cc"

    set LesRsf {}
    foreach Nom [ListeDesPABs] {
	set FichierMsf  [GscopeFile $Nom "msfNuc"]
	set FichierRsf  [GscopeFile $Nom "rsfNuc"]
	set FichierRsfX [GscopeFile $Nom "rsfNucX$Cc"]
	set FichierXmlX [GscopeFile $Nom "macsimXmlNucX$Cc"]
	if {[FileAbsent $FichierRsf]} {
	    exec clustalw $FichierMsf -convert -output=RSF -outfile=$FichierRsf
	    Espionne $FichierRsf
	}
	#rR Cc peut etre un random code sinon c'est le X normal
	if {[FileAbsent $FichierRsfX]} {
	    XMotifsFromRsf $FichierRsf $FichierRsfX "ForceEmpty" "ForceEmpty" "Frame"
	    Espionne $FichierRsfX
	}
	if {[FileAbsent $FichierXmlX]} {
	    exec clustalw $FichierRsfX -convert -output=macsim -outfile=$FichierXmlX
	    Espionne $FichierXmlX
	}
	lappend LesRsf $FichierRsfX
    }
    return $LesRsf
}

proc CreateNucAliFromProtAliMGSPourTous {{Keep ""}} {
    set LesR {}
    foreach Nom [ListeDesPABs] {
	if {$Keep=="Keep" && [file exists [GscopeFile $Nom "nucalitfa"]]} { continue }
	set R [CreateNucAliFromProtAliMGS $Nom]
	Espionne $Nom $R
    }
    return $LesR
}

proc CreateNucAliFromProtAliMGS Nom {
    file mkdir "[RepertoireDuGenome]/nucalitfa"
    file mkdir "[RepertoireDuGenome]/msfNuc"
    file mkdir "[RepertoireDuGenome]/msfNuc3"
    file mkdir "[RepertoireDuGenome]/msfNucProt3"
    set FichierMsfProt [GscopeFile $Nom msfProt]
    if {[FileAbsent $FichierMsfProt]} { return "" }

    set MsfProt [ContenuDuFichier $FichierMsfProt]
    if {[regexp "^NoSequencesToAlign" $MsfProt]} { return "" }

    set FichierMsfTfa [TmpFile].tfa
    exec clustalw $FichierMsfProt -convert -output=FASTA -outfile=$FichierMsfTfa
    set LeMsfTfaNuc {}
    foreach Access [LaSequenceDuTFAs $FichierMsfTfa "LaListeDesAccess"] {
	set SeqProtTfa [QueLaSequenceDuTexteTFA [MRna $Access prottfa]]
	set SeqNucTfa  [QueLaSequenceDuTexteTFA [MRna $Access nuctfa]]
	Espionne $Nom $Access [expr [string length $SeqProtTfa]*3] [string length $SeqNucTfa]
	if {$SeqNucTfa==""} { Espionne "$Access est vide" ; continue }
	set I -1
	foreach P [split $SeqProtTfa ""] {a b c} [split $SeqNucTfa ""] {
	    incr I
	    set Codon "$a$b$c"
	    set CodonEn($I) $Codon
	    #Espionne $Access $I $P [AAduCodon $Codon] $Codon
	}
	set TfaProt [LaSequenceDuTFAs $FichierMsfTfa $Access]
	set SeqProt [QueLaSequenceDuTexteTFA $TfaProt]
	set LaSeqNucAlignee {}
	set I -1
	foreach A [split $SeqProt ""] {
	    if {$A=="-" || $A=="."} { lappend LaSeqNucAlignee "---" ; continue }
	    incr I
	    #Espionne $I $A 
	    set Codon [string toupper $CodonEn($I)]
	    lappend LaSeqNucAlignee $Codon
	}
	lappend LeMsfTfaNuc ">$Access"
	lappend LeMsfTfaNuc [join $LaSeqNucAlignee ""]
    }

    set FichierNucAliTfa [SauveLesLignes $LeMsfTfaNuc dans [GscopeFile $Nom "nucalitfa"]]
    set FichierMsfNuc [GscopeFile $Nom "msfNuc"]
    exec clustalw $FichierNucAliTfa -convert -output=gscope -outfile=$FichierMsfNuc
    MsfOnOneLine $Nom msfNuc msfNuc3     "" ShowCodons
    MsfOnOneLine $Nom msfNuc msfNucProt3 "" ShowCodons
    return $FichierMsfNuc
}

proc AddMRna {Nom AccessCopain AccessMrna SeqNuc SeqProt} {
    if {$SeqProt==""} { Espionne $AccessMrna; FaireLire "$Nom SeqProt est vide. Je l'oublie."; return ""}
    global MRna
    set AC [ExtraitInfo $Nom "AC:"]
    incr MRna($Nom,NbOk)
    incr MRna(NbOk,)
    lappend MRna(ListOf,Nom) $Nom
    lappend MRna(ListOf,AccessMRna) $AccessMrna
    lappend MRna($Nom,ListOfHomo) $AccessCopain
    set MRna($AccessCopain,AccessMRna) $AccessMrna
    set MRna($AccessCopain,nuctfa)  [SequenceFormatTFA $SeqNuc "$AccessCopain $AccessMrna mrna homolog to $Nom $AC" "nucbrut"]
    set MRna($AccessCopain,prottfa) [SequenceFormatTFA $SeqProt "$AccessCopain $AccessCopain prot homolog to $Nom $AC"]
    return ""
}

proc MRna {{Qui ""} {Quoi ""}} {
    global MRna
    if {[info exists MRna($Qui,$Quoi)]} { return $MRna($Qui,$Quoi) }
    if {[info exists MRna("EstCharge")]} {
	if {$Quoi=="nuc" && [info exists MRna($Qui,nuctfa)]} {
	    return [QueLaSequenceDuTexteTFA $MRna($Qui,nuctfa)]
	}
	return ""
    }
    set MRna("EstCharge") 1
    set FichierMemo [Fiches "MRnaMGS"]
    if {[file exists $FichierMemo]} {
	array set MRna [ContenuDuFichier $FichierMemo]
	return [MRna $Qui $Quoi]
    }
    foreach Nom [ListeDesPABs] {
	set MRna($Nom,ListOfHomo) {}
	set MRna($Nom,NbOk) 0
	foreach Ligne [LesLignesDuFichier [GscopeFile $Nom "AccessMrna"]] {
	    lassign [split $Ligne " "] Moi AccessCopain AccessRefseq AccessEmbl
	    set FichierTFAs [GscopeFile $Nom tfasdescopains]
	    set ProtTfa [LaSequenceDuTFAs $FichierTFAs $AccessCopain]
	    set ProtTFull [QueLaSequenceDuTexteTFA $ProtTfa]

	    set NucR [QueLaSequenceDuTexteTFA [MGSMrna $AccessRefseq]]
	    set NucE [QueLaSequenceDuTexteTFA [MGSMrna $AccessEmbl]]
	    
	    set ProtRFull [SeqNucToSeqPro $NucR]
	    set ProtEFull [SeqNucToSeqPro $NucE]

	    set ProtT [string range $ProtTFull 1 end]
	    set ProtR [string range $ProtRFull 1 end-1]
	    set ProtE [string range $ProtEFull 1 end-1]
	    if {$ProtT!="" && [string equal $ProtT $ProtR] && [string equal $ProtR $ProtE]} {
		AddMRna $Nom $AccessCopain $AccessRefseq $NucR $ProtTFull
		continue
		Espionne T=R=E
	    } elseif {$ProtT!="" && [string equal $ProtT $ProtR]} {
		AddMRna $Nom $AccessCopain $AccessRefseq $NucR $ProtTFull
		continue
		Espionne T=R 
	    } elseif {$ProtT!="" && [string equal $ProtT $ProtE]} {
		AddMRna $Nom $AccessCopain $AccessEmbl $NucE $ProtTFull
		continue
		Espionne T=E
	    } elseif {0 && $ProtR!="" && [string equal $ProtR $ProtE]} {
		Espionne R=E
	    } else {
		set NbSameR 0
		set N 0
		foreach T [split $ProtT ""] R [split $ProtR ""] {
		    incr N
		    if {$T==$R} { incr NbSameR }
		}
		if {$NbSameR>$N/2} {
		    AddMRna $Nom $AccessCopain $AccessRefseq $NucR $ProtTFull
		    continue
		}

		set NbSameE 0
		set N 0
		foreach T [split $ProtT ""] E [split $ProtE ""] {
		    incr N
		    if {$T==$E} { incr NbSameE }
		}
		if {$NbSameE>$N/2} {
		    AddMRna $Nom $AccessCopain $AccessEmbl $NucE $ProtTFull
		    continue
		}
		incr MRna(NbKo)
		incr MRna($Nom,NbKo)
		continue
		Espionne "Nothing for $Nom $AccessCopain"
		#Espionne SameR $NbSameR / $N
		#Espionne SameE $NbSameE / $N
	    }
	    Espionne ProtT [string range $ProtT 0 200]
	    Espionne ProtR [string range $ProtR 0 200]
	    Espionne ProtE [string range $ProtE 0 200]
	    Espionne $Nom
	}
	lappend MRna(Stat,) "$Nom $MRna($Nom,NbOk)"
	set MRna($Nom,ListOfHomo) [lsort -unique $MRna($Nom,ListOfHomo)]
	Sauve [array get MRna] dans $FichierMemo
    }
    return [MRna $Qui $Quoi]
}

proc MGSMrna {{Qui ""} {Quoi ""}} {
    #rR On stocke tous les Mrna Refseq et Embl dans les repertoires
    global MGSMrna
    if {[info exists MGSMrna($Qui,$Quoi)]} { return $MGSMrna($Qui,$Quoi) }
    if {[info exists MGSMrna("EstCharge")]} { return "" }
    set MGSMrna("EstCharge") 1
    
    set RepRefSeqMrna     "[RepertoireDuGenome]/RefseqMrna"
    set RepEmblMrna       "[RepertoireDuGenome]/EmblMrna"
    foreach Nom [ListeDesPABs] {
	set FR "$RepRefSeqMrna/$Nom"
	set FE "$RepEmblMrna/$Nom"
	if {[FileExists $FR]} {
	    set SeqCourant {}
	    foreach Ligne [concat [LesLignesDuFichier $FR] "CEstFini"] {
		set Ligne [string trim $Ligne]
		if {$Ligne==""} { continue }
		if {[regexp ">" $Ligne] && ! [regexp {\|(XM_[^_]+)_} $Ligne]} { FaireLire "Attention $Ligne" }
		if {$Ligne=="CEstFini" || [regexp {\|(XM_[^_]+)_} $Ligne Match AR]} {
		    if {$SeqCourant!={}} {
			set MGSMrna($ARCourant,) [join $SeqCourant "\n"]
			lappend MGSMrna(ListOf,Refseq) $AR
			if {$Ligne=="CEstFini"} { break }		    
			set SeqCourant {}
		    }
		    set ARCourant $AR
		}
		lappend SeqCourant $Ligne
	    }
	}
	if {[FileExists $FE]} {
	    set SeqCourant {}
	    foreach Ligne [concat [LesLignesDuFichier $FE] "CEstFini"] {
		set Ligne [string trim $Ligne]
		if {$Ligne==""} { continue }
		if {[regexp ">" $Ligne] && ! [regexp {cds_([^_]+)_} $Ligne]} { FaireLire "Attention $Ligne" }
		if {$Ligne=="CEstFini" || [regexp {cds_([^_]+)_} $Ligne Match AE]} {
		    if {$SeqCourant!={}} {
			set MGSMrna($AECourant,) [join $SeqCourant "\n"]
			lappend MGSMrna(ListOf,Embl) $AE
			if {$Ligne=="CEstFini"} { break }		    
			set SeqCourant {}
		    }
		    set AECourant $AE
		}
		lappend SeqCourant $Ligne
	    }
	}
    }
    return [MGSMrna $Qui $Quoi]
}

proc MGSCreateDatabase {{Liste ""}} {
    set RepProttfaCopains "[RepertoireDuGenome]/tfasdescopains"
    set RepNuctfaCopains  "[RepertoireDuGenome]/tfasdescopainsNuc"
    set RepRefSeqMrna     "[RepertoireDuGenome]/RefseqMrna"
    set RepEmblMrna       "[RepertoireDuGenome]/EmblMrna"
    file mkdir "[RepertoireDuGenome]/AccessMrna"
    file mkdir $RepProttfaCopains
    file mkdir $RepNuctfaCopains
    file mkdir $RepRefSeqMrna
    file mkdir $RepEmblMrna

    if {$Liste==""} { set Liste [ListeDesPABs] }

    foreach Nom $Liste {
	Espionne $Nom
	set LeTFA {}
	set LesAccessRefseq {}
	set LesAccessEmbl {}
	set FichierAllRefseq "$RepRefSeqMrna/$Nom"
	set FichierAllEmbl   "$RepEmblMrna/$Nom"
	foreach Ligne [LesLignesDuFichier [GscopeFile $Nom "AccessMrna"]] {
	    lassign [split $Ligne " "] A Cop AccessRefseq AccessEmbl
	    if {[info exists DejaVu($Nom,$Cop)]} { continue }
	    set DejaVu($Nom,$Cop) 1
	    #rR we get the protein sequence
	    set ProtEmbl [GeneQuid UniprotData $Cop]
	    if {$ProtEmbl==""} { continue }
	    set ProtTfa  [SequenceFormatTFA $ProtEmbl $Cop "embl"]
	    #Espionne $Ligne
	    #Espionne $ProtTfa
	    lappend LeTFA $ProtTfa
	    if {$AccessRefseq!="-"} { lappend LesAccessRefseq $AccessRefseq }
	    if {$AccessEmbl  !="-"} { lappend LesAccessEmbl   $AccessEmbl   }
	}
	if {1} {
	    SauveLesLignes $LeTFA dans "$RepProttfaCopains/$Nom"
	}
	if {[FileAbsent $FichierAllRefseq]} {
	    set AllRefseq [eFetchREST "nucleotide" $LesAccessRefseq "cds"]
	    SauveLesLignes $AllRefseq dans $FichierAllRefseq
	    set AllEmbl   [eFetchREST "nucleotide" $LesAccessEmbl   "cds"]
	    SauveLesLignes $AllEmbl   dans $FichierAllEmbl
	}
    }
    return 
}

proc CreateAccessMRnaPourTous {} {
    #rR to copy AccessMrnaOri/P12345.mgs  to  AccessMrna/MGS99 
    #rR .. and add AC: P12345 in infos/MGS99
    file mkdir "[RepertoireDuGenome]/AccessMrna"
    set LesFichiersCrees {}
    foreach Nom [ListeDesPABs] AccessFile [lsort [glob -nocomplain "[RepertoireDuGenome]/AccessMrnaOri/*"]] {
	set Access [file tail $AccessFile]
	regsub {.mgs} $Access "" Access
	if {1} {
	    set Embl [ContenuDuFichier [GscopeFile $Nom protembl]]
	    if { ! [regexp "AC   $Access" $Embl]} { Espionne $Embl; FaireLire "$Nom $Access" } 
	    InformeSansDemander $Nom "AC: $Access"
	    file copy $AccessFile "[RepertoireDuGenome]/AccessMrna/$Nom"
	    lappend LesFichiersCrees "[RepertoireDuGenome]/AccessMrna/$Nom"
	}
    }
    return $LesFichiersCrees
}

proc MGSAccessMrna {{RepOrthologs ""} {Racine ""}} {
    if {$RepOrthologs==""} { set RepOrthologs "[RepertoireDuGenome]/DeJulie/orthologs" }
    if { ! [regexp {^/} $RepOrthologs]} { set RepOrthologs "[RepertoireDuGenome]/$RepOrthologs" }
    FaireLire "Do not run again"
    set RepSortie "[RepertoireDuGenome]/AccessMrnaOri"
    file mkdir $RepSortie
    NousAllonsAuBoulot $RepOrthologs
    if {$Racine!=""} {
	set LesTxtFile [lsort [glob -nocomplain $Racine*]]
    } else {
	set LesTxtFile [lsort [glob -nocomplain "*.txt"]]
    }
    set LesQuery {}
    foreach TxtFile $LesTxtFile {
	set Query [file tail $TxtFile]
	regsub {.oi.txt} $Query "" Query
	Espionne $Query
	lappend LesQuery $Query
	set LaSortie {}
	#rR on rajoute la Quey
	set LesLignes [LesLignesDuFichier $TxtFile]
	set LesLignes [concat [list $Query] $LesLignes]
	
	foreach Ligne $LesLignes {
	    set Access $Ligne
	    regsub {,.+} $Access "" Access
	    set Texte [GeneQuid UniprotData $Access]
	    #Espionne
	    #Espionne $TxtFile $Ligne
	    #Espionne $Texte
	    set Refseq ""
	    set Embl ""
	    foreach Info [split $Texte "\n"] {
		if { ! [regexp {^DR   } $Info]} { continue }
		if {$Embl==""   && [regexp {^DR   EMBL} $Info]} { set Embl $Info } 
		if {$Refseq=="" && [regexp {^DR   RefSeq} $Info]} { set Refseq $Info }
		if {$Refseq!="" && $Embl!=""} { break }
	    }
	    #Espionne $Refseq
	    #Espionne $Embl
	    set Xm "-"
	    set Em "-"
	    if {$Xm=="-"} { regexp {XM_[0-9]+\.[0-9]} $Refseq Xm }
	    if {$Em=="-"} {
		set LesMots [split $Embl ";"]
		foreach Mot [lrange $LesMots 1 end] {
		    #Espionne = $Mot =
		    set Mot [string trim $Mot { -.}]
		    if {$Mot!="" && $Mot!="Genomic_DNA" && $Mot!="EMBL"} { set Em $Mot ; break }
		}
	    }
	    set Message "$Query $Access $Xm $Em"
	    #Espionne $Message
	    lappend LaSortie $Message
	}
	lappend LesFichiers [SauveLesLignes $LaSortie dans "$RepSortie/$Query.mgs"]
    }
    OnRevientDuBoulot
    SauveLesLignes $LesQuery dans "$RepOrthologs/ListOfAccess.txt"
    return $LesFichiers
}


proc Rna16SC216 {{With ""} {Start ""} {Stop ""}} {
    if {$Start==""} { set Start 0 }
    if {$Stop ==""} { set Stop  end }
    if {$With=="With216"}       { set With216      1 } else { set With216 0 }
    if {$With=="With216NoStop"} { set With216NoStop 1 } else { set With216NoStop 0 }
    global IsX0
    set SeqOrigin [QueLaSequenceDuFichierTFA [GscopeFile "rRNA-16S" nuctfa]]
    set LeTFA {}
    if {$With216} {
	set LesI [C216 ListOf Index]
    } elseif {$With216NoStop} {
	set LesI [C216 ListOf IndexNoStop]
    } else {
	set LesI [CirCode ListOf Index]
    }
    foreach I $LesI {
	set Seq [string tolower $SeqOrigin]
	regsub {^0} $I "" II
	set Access [format "Code%3.3d" $II]
	if {$With216 || $With216NoStop } { 
	    set CC [expr $I+1000]
	} else {
	    set CC $I
	}
	if {[CirCode $CC]==""} { continue }
	CirCode DefaultCirCode $CC
	if {[info exists IsX0]} { unset IsX0 }
	array set A [TENRR $Seq]
	foreach K [array names A] {
	    lassign split $K "," L C B E
	    foreach DF $A($K) {
		lassign $DF D F
		incr D -1
		incr F -1
		set Motif [string range "$Seq" $D $F]
		set Motif [string toupper $Motif]
		set Seq [string replace $Seq $D $F $Motif]
	    }
	}
	regsub -all {[a-z]} $Seq "-" Seq 
	Espionne $CC [string range $Seq $Start $Stop]
	lappend LeTFA [SequenceFormatTFA $Seq $Access "nucbrut"]
    }
    return [SauveLesLignes $LeTFA dans $With.tfa]
    return $LeTFA
}

proc AllCodons {} {
    set LesCodons {}
    foreach a [list A C G T] {
	foreach b [list A C G T] {
	    foreach c [list A C G T] {
		lappend LesCodons "$a$b$c"
	    }
	}
    }
    return $LesCodons
}

proc TestAllFreCo {} {
    global FreCo
    set ListOfCodon [FreCo "" ListOfCodon]
    Espionne $ListOfCodon
    set LesI {}
    foreach I [lrange [C216 ListOf Index] 0 end] {
	Espionne $I
	set X [C216 $I]
	if {[regexp TAA|TGA|TAG $X]} { continue }
	FreCo $I
	lappend LesI $I
    }
    Espionne $LesI
    set iCodon 0
    foreach Codon $ListOfCodon {
	incr iCodon
	set LaLigne [list $Codon]
	foreach I $LesI {
	    if {$FreCo($Codon,$I)} {
		if {$I==[C216 CirCode I]} {
		    set Z "O"
		} else {
		    set Z "X"
		}
		incr M($I) $iCodon
	    } else {
		set Z " "
	    }	    
	    lappend LaLigne $Z
	}
	set Ligne [join $LaLigne " "]
	Espionne $Ligne
    }
    foreach I $LesI {
	Espionne $I $M($I)
    }
    return 
}

proc TestFreCo {} {
    foreach I [C216 ListOf Index] {
	set X [C216 $I]
	if {[regexp TAA|TGA|TAG $X]} { continue }
	Espionne
	Espionne
	Espionne
	Espionne
	Espionne $X

	set R [FreCo $I]
	EspionneL $R
    }
}

proc BadCodon {Codon} {
    lassign [split $Codon ""] a b c
    if {$a==$b && $b==$c} { return 1 }
    if {$Codon=="ATA" || $Codon=="TAT" | $Codon=="CGC" | $Codon=="CGC" } { return 1 }
    return 0
}

proc FreCo {{iX ""} {GetWhat ""}} {
    global FreCo
    if {$iX==""} {
	set X [CirCode]
    } else {
	set X [C216 $iX]
    }
    foreach Codon $X {
	set InX($Codon) 1
    }
    foreach Codon [AllCodons] {
	if { ! [info exists InX($Codon)]} { set InX($Codon) 0 }
    }
    foreach Nom [ListeDesPABs] {
	set Seq [QueLaSequenceDuFichierTFA [GscopeFile $Nom "nuctfa"]]
	set Seq [string toupper $Seq]
	foreach {a b c} [split $Seq ""] {
	    set Codon "$a$b$c"
	    incr Cumul($Codon)
	}
    }
    set LesCumuls {}
    foreach Codon [AllCodons] {
	lappend LesCumuls $Cumul($Codon)
	lappend LesCodonsDe($Cumul($Codon)) $Codon
    }
    set LesCumuls [lsort -decreasing -integer $LesCumuls]
    set ListOfCodon {}
    foreach Cu $LesCumuls {
	LConcat ListOfCodon $LesCodonsDe($Cu)
    }
    foreach Cu $LesCumuls {
	foreach Codon $ListOfCodon {
	    #if {[BadCodon $Codon]} { continue }
	    set Message "$Codon $Cu"
	    if { $InX($Codon) } {
		append Message " X"
		set FreCo($Codon,$iX) 1
	    } else {
		set FreCo($Codon,$iX) 0
	    }
	    lappend LaSortie $Message
	} 
    }
    if {$GetWhat=="ListOfCodon"} { return $ListOfCodon }
    return $LaSortie
}

proc TestC216 {} {
    foreach I [C216 ListOf Index] {
	set X [C216 $I]
	if {[regexp TAA|TGA|TAG $X]} { continue }
	DiBase $X $I
    }
}

proc C216 {{Qui ""} {Quoi ""}} {
    global C216
    if {[info exists C216($Qui,$Quoi)]}  { return $C216($Qui,$Quoi) }
    if {[info exists C216("EstCharge")]} { return "" }
    set C216("EstCharge") 1
    set Fichier "/home/ripp/atelier/Codes216.txt"
    set I 0
    set C216(ListOf,Index) {}
    set C216(ListOf,IndexNoStop) {}
    set LeTout {}
    foreach Ligne [LesLignesDuFichier $Fichier] {
	incr I
	set LesCodons [split [string trim $Ligne] " "]
	set C216($I,) $LesCodons
	lappend LeTout [join $LesCodons " "]
	lappend C216(ListOf,Index) $I
	if {$Ligne==[CirCode]} { set C216(CirCode,I) $I }
	if { ! [regexp "TAA|TAG|TGA" $Ligne]} { lappend C216(ListOf,IndexNoStop) $I }
    }
    set C216(CirCode,All) $LeTout
    return [C216 $Qui $Quoi]
}

proc DiBase {{X ""} {I ""}} {
    if {$X==""} { set X [CirCode] }
    #Espionne $X
    if {0} {
	regsub -all A $X a X
	regsub -all C $X c X
	regsub -all G $X g X
	regsub -all T $X t X
	
	regsub -all a $X A X
	regsub -all t $X C X
	regsub -all c $X T X
	regsub -all g $X G X
    }
    foreach Codon $X {
	lassign [split $Codon ""] a b c
	incr Compte($a) 
	incr Compte($b) 
	incr Compte($c) 
	set G [string range $Codon 0 1]
	set D [string range $Codon 1 2]
	lappend LesDiBaG $G
	lappend LesDiBaD $D
	lappend LesDiBaX $G $D
    }
    set LesDiBaG [lsort $LesDiBaG]
    set LesDiBaD [lsort $LesDiBaD]
    set LesDiBaX [lsort $LesDiBaX]
    set LesDiBaGU [lsort -unique $LesDiBaG]
    set LesDiBaDU [lsort -unique $LesDiBaD]
    set LesDiBaXU [lsort -unique $LesDiBaX]
    foreach LoD [list LesDiBaG LesDiBaD LesDiBaX LesDiBaGU LesDiBaDU LesDiBaXU] {
	set Liste [set $LoD]
	Espionne [llength $Liste] $Liste $LoD Longueur
	foreach DiBa $Liste {
	    incr Ya($LoD,$DiBa)
	}
    }
    foreach a [list A C G T] {
	foreach b [list A C G T] {
	    set DiBa "$a$b"
	    lappend L1 $DiBa
	    foreach LoD [list LesDiBaG LesDiBaD LesDiBaX LesDiBaGU LesDiBaDU LesDiBaXU] {
		if {[info exists Ya($LoD,$DiBa)]} {
		    lappend LigneDe($LoD) $DiBa
		} else {
		    set Missing($LoD) $DiBa
		    lappend LigneDe($LoD) ".."
		}
	    }
	}
    }
    #Espionne
    #Espionne $L1
    foreach LoD [list LesDiBaG LesDiBaD LesDiBaX LesDiBaGU LesDiBaDU LesDiBaXU] {
	#if {[info exists Missing($LoD)]} { Espionne Missing $Missing($LoD) $LoD }
	set LiN {}
	foreach DiBa $L1 {
	    if {[info exists Ya($LoD,$DiBa)]} {
		lappend LiN ".$Ya($LoD,$DiBa)"
	    } else {
		lappend LiN ".."
		lappend LesManquants($LoD,$X,$I) $DiBa
	    }
	}
	#Espionne $LiN $LoD
    }
    #Espionne Manque $LesManquants(LesDiBaXU)
    #Espionne
    #Espionne $L1
    foreach LoD [list LesDiBaG LesDiBaD LesDiBaX LesDiBaGU LesDiBaDU LesDiBaXU] {
	#Espionne $LigneDe($LoD) $LoD
    }
    foreach a [list A C G T] {
	#Espionne Compte $a $Compte($a)
    }
    parray LesManquants
    return ""
}

proc CircoData {} {
    set CircoProjects [list MAMA JoyDhCDS  JoyKcCDS  JoyKlCDS  JoyLeCDS	JoyMgCDS  JoyScCDS  JoySpCDS  JoySsCDS	JoyYlCDS]
    foreach P $CircoProjects {
	set FicBornes "/genomics/link/$P/fiches/bornesdespabs"
	set Last [lindex [LesLignesDuFichier $FicBornes] end]
	if { ! [regexp {[^0-9]+([0-9]+) } $Last Match LastNumber]} { FaireLire "wrong line $Last"; exit }
	Espionne $P $LastNumber
	set NbGenes($P) $LastNumber
	if { ! [regexp "Joy" $P]} { continue }
	regsub CDS $P Chr PChr
	foreach FicTfa [lsort [glob "/genomics/link/$PChr/nuctfa/Joy*Chr*"]] {
	    set Chr [file tail $FicTfa]
	    set ChrLen [string length [QueLaSequenceDuFichierTFA $FicTfa]]
	    Espionne $Chr $ChrLen
	}
    }
    exit
}


proc li {} {
    set LI "00 01 02 03 04 05 06 07 08 09 10 11 12 13 100 101 1000"
    set LI [lsort -dictionary $LI]
    Espionne $LI
    exit
}

proc MutateNucAliTfa {{NewDir ""}} {
    #rR Run it with setgscoperr MAMA
    if {$NewDir==""} { set NewDir "[RepertoireDuGenome]/nucalitfamut" }
    file mkdir $NewDir
    foreach Nom [ListeDesPABs] {
	set NewFile "$NewDir/$Nom"
	if {[FileExists $NewFile]} { continue }
	set Fic [GscopeFile $Nom nucalitfa]
	if {[FileAbsent $Fic]} { continue }
	set LeNew {}
	foreach Ligne [LesLignesDuFichier $Fic] {
	    if {[regexp "^>" $Ligne]} { lappend LeNew $Ligne; continue }
	    set NewLine ""
	    foreach {a b c} [split $Ligne ""] {
		set Codon "$a$b$c"
		#Espionne $Codon
		set AA [AAduCodon $Codon]
		if { ! [regexp  -nocase {[ACDEFGHIKLMNPQRSTVWY]} $AA]} { append NewLine $Codon ; continue }
		set LesPossibles [CodonsDuAA $AA]
		if {[set L [llength $LesPossibles]]<2} { append NewLine $Codon ; continue }
		set R [expr int(rand()*$L)]
		set NewCodon [lindex $LesPossibles $R]
		append NewLine $NewCodon
		#Espionne $Codon $AA $NewCodon $R/$L $LesPossibles
	    }
	    lappend LeNew $NewLine
	}
	Espionne $Nom
	SauveLesLignes $LeNew dans "$NewDir/$Nom"
    }
    return "Ok"
}

proc ReferenceOrg {} {
    set ReferenceOrg "hg38"
    if {[OnTraite JoyScCDS]} { set ReferenceOrg "JoyScCDS" }
    if {[OnTraite MUMU]}     { set ReferenceOrg "mm10" }
    return $ReferenceOrg
}

proc HtmlForAllCodonMatrix {{Frame ""} {Norm ""}} {
    set Tabulated 0
    if {[regexp -nocase tab $Norm]} {
	set Tabulated 1
	regsub -nocase tab $Norm "" Norm
    }
    if {$Frame==""} { set Frame 3 }
    set AllCodons [CodonMatrix ListOfAll Codon]
    set LesAAs {}
    foreach Codon $AllCodons {
	lappend LesAAs [AAduCodon $Codon] 
    }
    lappend LaSortie ". . ...       [join $LesAAs {       }]"
    lappend LaSortie ". . ...     [join $AllCodons {     }]"
    foreach CI $AllCodons {
	set TheResults {}
	foreach CJ $AllCodons {
	    set Somme 0
	    set N 0
	    set LesCV {}
	    foreach CC [AllCoMa ListOf CC] {
		if {[set V [AllCoMa $CI $CJ $Frame $CC]]!=""} {
		    incr N
		    set Somme [expr $Somme+$V]
		    lappend LesCV "$CC:$V" 
		}
	    }
	    set Titre [join $LesCV "     "]
	    set Moyenne 0
	    if {$N!=0} { set Moyenne [expr $Somme/$N] }
	    set Nice [format "%7d" $Moyenne]
	    lappend TheResults "<span title='$Titre'>$Nice</span>"
	}
	set IsX "."
	lappend LaSortie "[AAduCodon $CI] $IsX $CI [join $TheResults { }]"
    }
    set Sortie [join $LaSortie "\n"]
    if {$Tabulated} {
	regsub -all { +} $Sortie "\t" Sortie
    }
    set Html "<pre>\n$Sortie\n</pre>"
    return $Html
}

proc AllCoMa {{Qui ""} {Quoi ""} {Frame ""} {CirCode ""}} {
    #rR Here we load all CodonMatrix array in one big array AllCoMa.
    global AllCoMa
    set Qui  [string toupper $Qui]
    set Quoi [string toupper $Quoi]
    if {[info exists AllCoMa($Frame,$Qui,$Quoi,$CirCode)]} { return $AllCoMa($Frame,$Qui,$Quoi,$CirCode) }
    if {[info exists AllCoMa("EstCharge")]} {
	if {$CirCode==""} {
	    set LeR {}
	    foreach CC [lrange [CirCode ListOf Index] 1 end] {
		lappend LeH [format "%-6s" $CC]
		lappend LeR [format "%-6s" [AllCoMa $Qui $Quoi $Frame $CC]]
	    }
	    return [join $LeH " "]\n[join $LeR " "]
	}
	return ""
    }
    set AllCoMa("EstCharge") 1
    set AllCoMa(LISTOF,CC) [CirCode ListOf Index]
    foreach CC [CirCode ListOf Index] {
	set CodonMatrixFile [CodonMatrixFileHuman $CC]
	if {[FileAbsent $CodonMatrixFile]} { continue }
	set CM [ContenuDuFichier $CodonMatrixFile]
	foreach {K V} $CM {
            if {[regexp "AAC,AAG" $K]} { Espionne $K $V }
	    set AllCoMa($K,$CC) $V
	}
    }
    return [AllCoMa $Qui $Quoi $Frame $CirCode]
}

proc CreateAllImagesForAllPdfTypes {} {
    set LesImagesCreees {} 
    foreach PdfType [PossibleFichesGraphPdfTypes] {
        lappend $LesImagesCreees [CreateAllImagesFor $PdfType]
    }
    set ImagesCreees [join $LesImagesCreees "\n"]
    return "<pre>$LesImagesCreees</pre>"
}

proc PossibleFichesGraphPdfTypes {} {
    set LesPossibles [glob -nocomplain "[RepertoireDuGenome]/*_FichesGraph/*.pdf"]
    set LesTypes {}
    foreach Possible $LesPossibles {
        lappend LesTypes [file tail $Possible]
    }
    set LesTypes [lsort -unique $LesTypes]
    return $LesTypes
}

proc CreateAllImagesFor {{PdfName ""}} {
    if {$PdfName==""} {
        set LesTypes [PossibleFichesGraphPdfTypes]
        set PdfName [ChoixParmi $LesTypes]
        if {$PdfName==""} { return "" }
    }
    regsub {.pdf$} $PdfName "" PdfName
    set LesPdf [lsort -dictionary [glob -nocomplain "[RepertoireDuGenome]/*_FichesGraph/$PdfName.pdf"]]
    if {$LesPdf=={}} { return "" }
    file mkdir "[RepertoireDuGenome]/AllImages"
    set ImageDir "[RepertoireDuGenome]/AllImages/$PdfName"
    file mkdir $ImageDir
    set LesImagesCreees {}
    foreach Pdf $LesPdf {
        Espionne $Pdf
        set DirName [file dirname $Pdf]
        set DirQueue [file tail $DirName]
        if { ! [regexp {^[0-9]+_} $DirQueue CCU]} { FaireLire "No CirCodeUnderscore 00_ in $Pdf" }
        set ImageFile "$ImageDir/$CCU$PdfName.png"
        exec convert -background white -flatten $Pdf $ImageFile
        Espionne $ImageFile
        lappend LesImagesCreees $ImageFile
    }
    set Titre [file tail $ImageDir]
    NousAllonsAuBoulot $ImageDir
    LogWscope "exec Photorama $Titre"
    exec Photorama $Titre
    OnRevientDuBoulot
    return [join $LesImagesCreees "\n"]
} 

proc TestCC1 {} {
    Espionne [PrintCodonMatrix 0 NormColumn 03]
    Espionne [PrintCodonMatrix 0 NormColumn 04]
    Espionne [PrintCodonMatrix 0 NormColumn 03]
    Espionne [PrintCodonMatrix 0 NormColumn 04]
    exit
}

proc TestCC2 {} {
    global CodonMatrix
    CodonMatrix
    parray CodonMatrix
    exit
}

proc TestCC3 {} {
    puts [CirCode DefaultCirCode]
    CirCode DefaultCirCode 22
    puts [CirCode DefaultCirCode]
    exit
}

proc X0MotifsFeaturesDir {{CC ""}} {
    if {$CC==""} { set CC [CirCode "DefaultCirCode"] }
    return "[RepertoireDuGenome]/${CC}_X0MotifsFeatures"
}

proc X1MotifsFeaturesDir {{CC ""}} {
    if {$CC==""} { set CC [CirCode "DefaultCirCode"] }
    return "[RepertoireDuGenome]/${CC}_X1MotifsFeatures"
}

proc X2MotifsFeaturesDir {{CC ""}} {
    if {$CC==""} { set CC [CirCode "DefaultCirCode"] }
    return "[RepertoireDuGenome]/${CC}_X2MotifsFeatures"
}

proc MacsimRsfDir {{CC ""}} {
    if {$CC==""} { set CC [CirCode "DefaultCirCode"] }
    return "[RepertoireDuGenome]/${CC}_macsimRsf"
}

proc MacsimXmlDir {{CC ""}} {
    if {$CC==""} { set CC [CirCode "DefaultCirCode"] }
    return "[RepertoireDuGenome]/${CC}_macsimXml"
}

proc SumOfPairsDir {{CC ""}} {
    if {$CC==""} { set CC [CirCode "DefaultCirCode"] }
    return "[RepertoireDuGenome]/${CC}_SumOfPairs"
}

proc SumOfPairsForCodonsDir {} {
    set CC [CirCode "DefaultCirCode"]
    return "[RepertoireDuGenome]/${CC}_SumOfPairsForCodons"
}

proc SumOfPairsForCodonsHumanDir {} {
    set CC [CirCode "DefaultCirCode"]
    return "[RepertoireDuGenome]/${CC}_SumOfPairsForCodonsHuman"
}

proc FichesGraphDir {} {
    set CC [CirCode "DefaultCirCode"]
    return "[RepertoireDuGenome]/${CC}_FichesGraph"
}

proc CodonMatrixFile {{CC ""}} {
    if {$CC==""} { set CC [CirCode "DefaultCirCode"] }
    return "[RepertoireDuGenome]/${CC}_CodonMatrix.txt"
}

proc CodonMatrixFileHuman {{CC ""}} {
    if {$CC==""} { set CC [CirCode "DefaultCirCode"] }
    return "[RepertoireDuGenome]/${CC}_CodonMatrixHuman.txt"
}

proc AllInMotifFile {{CC ""}} {
    if {$CC==""} { set CC [CirCode "DefaultCirCode"] }
    return "[RepertoireDuGenome]/${CC}_AllInMotif.txt"
}

proc PossiblesOrganismsInStartFile {FichierStart} {
    set LesOrganismesPossibles {}
    foreach Ligne [LesLignesDuFicher $FichierStart] {
	if {[regexp {>[^_]+_([^_]+)_} $Ligne Match Org]} {
	    if {[info exists DejaVu($Org)]} { break }
	    set DejaVu($Org) 1
	    lappend LesOrganismesPossibles $Org
	}
    }
    return $LesOrganismesPossibles
}

proc CreateMAMAsProject {{NewName ""} {FichierStart ""} {Prefixe ""} {Reference ""}} {
    #rR This has to be run with 
    #rR setgscoperr Zero
    #rR gscope CreateMAMAsProject MAMI /home/ripp/circo/knownCanonical.exonNuc.fa mami
    #rR gscope CreateMAMAsProject MUMU /home/ripp/circo/knownCanonical.exonNuc.fa MUMU mm10

    #rR then setgscoperr MAMI
    #rR      gscope CompleteMAMAsProject

    while {$NewName==""} {
	FaireLire "Please give the name of the project to create"
	set NewName [Entre "MMMM"]
	if {[regexp -nocase {^[a-z][a-z0-9_]+$} $NewName]} { break } 
	FaireLire "Please give a better name"
	set NewName ""
    }

    if {$Prefixe==""} { 
	FaireLire "please give a prefix"
	set Prefixe [Entre $NewName]
    }

    while {[FileAbsent $FichierStart] && $FichierStart!="UseNucAliTfa"} {
	FaireLire "Please help me to find knownCanonical.exonNuc.fa"
	set FichierStart [ButineArborescence "All" "."]
	if {$FichierStart==""} {
	    if {[OuiOuNon "I'll stop"]} { exit }
	}
    }

    set IndexReference 0        ; #rR for hg38 
    if {$Reference!=""} {
	set IndexReference [lsearch -exact [WantedOrganisms] $Reference]
	if {$IndexReference<0} {
	    FaireLire "I cannot find $Reference in [WantedOrganisms]"
	    exit
	}
	set ReferenceTaxId 99999999
	if {$Reference=="hg38"} { set ReferenceTaxId 9606 }
	if {$Reference=="mm10"} { set ReferenceTaxId 10090 }
	if {$ReferenceTaxId=="99999999"} {
	    FaireLire "Please give the TaxId of $Reference"
	    set ReferenceTaxId [Entre]
	}
    }


    set RepGstock "/gstock/$NewName"
    file mkdir $RepGstock
    set Link "/genomics/link/$NewName"

    if {[file exists $Link]} {
	if { ! [OuiOuNon "$Link already exists. Can I use it ?"]}  { exit }
    } else {
	exec ln -s $RepGstock $Link
    } 
    if {1} {
	file mkdir "$Link/nucalitfa"
	if {$FichierStart!="UseNucAliTfa"} { CreateNucAliTfa $FichierStart "$Link/nucalitfa" $Prefixe }
	CreateNucAndProtTfaAndMsfFromNucAliTfaPourTous $Link $Prefixe $IndexReference
	NousAllonsAuBoulot $Link
	exec ln -s msfNuc3 msf
	OnRevientDuBoulot
	file mkdir "$Link/beton"
	file mkdir "$Link/fiches"
	set FNum "5.5d"
	set Premier 1
	set DernierPAB  [lindex [lsort [glob $Link/nuctfa/$Prefixe*]] end]
	set Dernier [llength [glob $Link/nuctfa/$Prefixe*]]
	if { ! [regexp {[^0-9]([0-9]+)$} $DernierPAB Match Dernier]} { FaireLire "Wrong list of PABs" } 
	CreeBornesDesPABsTroisGradins $Premier $Dernier $Prefixe "" "" $FNum $Link
	CreeFichierMiniConfig $Prefixe $FNum "Collection of mrna" "" "" $ReferenceTaxId $Link
	AppendAuFichier "$Link/beton/miniconfig" "OnTraiteLike CircularCode"
	set Message "You can now run \nsetgscoperr $NewName\ngscope CompleteMAMAsProject\n"
	FaireLire $Message
	Espionne $Message
    }

    return $Message
}

proc CompleteMAMAsProject {} {
    #rR to run after CreateMAMAsProject NewName /home/ripp/circo/knownCanonical.exonNuc.fa NewPrefixe
    #rR setgscoperr NewNAME
    #rR gscope puts CompleteMAMAsProject

    file mkdir "[RepertoireDuGenome]/banques"
    NousAllonsAuBoulot "[RepertoireDuGenome]/banques"
    catch {exec ln -s /genomics/link/EHomsa/banques/AllProttfa blastpdatabase}
    OnRevientDuBoulot
    file mkdir "[RepertoireDuGenome]/blastp"
    Sauve "-v 10\n-b 10\n-F F\n-e 1.e-10" dans "[RepertoireDuGenome]/blastp/BlastParameters.txt"

    #return "Please run BlastPPourTous"
    BlastPPourTous

    InformeEHomsaReferencePourTous
    InformeChromoLocPourTous
    CompleteMAMAsStatistics
}

proc CompleteMAMAsStatisticsForAll {{Start ""} {Stop ""} {Reverse "" }} {
    global CodonMatrix
    set LesRandom [CirCode ListOf Index]
    if {$Start==""} { set Start 0 }
    if {$Stop ==""} { set Stop end }
    set LesRandom [lrange $LesRandom $Start $Stop] 

    if {[string equal -nocase "Reverse" $Reverse]} { set LesRandom [lreverse $LesRandom] }
    foreach Random $LesRandom {
	#if {0 && [file exists [SumOfPairsDir $Random]]} { Espionne [SumOfPairsDir $Random] already exists. I skip. ;  continue }
	CompleteMAMAsStatistics $Random "Force" 
    }
    return
}

proc CompleteMAMAsStatistics {{Random ""} {Ask ""}} {
    JeMeSignale
    if {$Ask==""} { set Ask "Ask" }
    set Ask [string equal -nocase $Ask "Ask"]

    if {$Random!=""} { 
	CirCode DefaultCirCode $Random
	Espionne [CirCode DefaultCirCode] [CirCode] 
	if { $Ask &&  ! [OuiOuNon "Are you shure you want to run CompleteMAMAsStatistics with CirCode [CirCode DefaultCirCode]\n[CirCode]"]} { return }
    }

    #rR This MUST be done !!! Otherwize we cumulate 
    global CodonMatrix
    global CodonMatrixHuman
    global IsX0
    if {[info exists CodonMatrix]}      { unset CodonMatrix }
    if {[info exists CodonMatrixHuman]} { unset CodonMatrixHuman }
    if {[info exists IsX0]}             { unset IsX0 }

    #CreateMacsimsWithMotifsX

    #CalculSumOfPairsForCodonsAndCodonMatrix
    #return 
    set NbNew    [CalculSumOfPairsForBases]
    set Modified [StatistiquesXMotifs $NbNew]
    CreateRplots
    
    #if {[OnTraite JoyScCDS]} { return }

    CalculSumOfPairsForCodonsAndCodonMatrix
    StatisticsForCodons
}

proc StatisticsForCodons {} {
    #rR To do !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}

proc CircoDir {} {
    set Rep "/home/ripp/circo"
    return $Rep
}

proc WantedOrganism {{Org ""}} {
    return [expr [lsearch [WantedOrganisms] $Org]>=0]
}

proc WantedOrganisms {} {
    if {[OnTraite MAMA Like]} { return [list hg38 tupBel1 mm10 canFam3] }
    if {[OnTraite MUMU Like]} { return [list hg38 mm10] }
    if {[OnTraite JoyScCDS]} { return [JoyGenome ListOf JoyCDS] }
    set LesOrgs [list hg38 mm10]
    #set LesOrgs [list hg38 tupBel1 mm10 canFam3]
    #set LesOrgs [list hg38 panTro4 panPan1 gorGor3 ponAbe2 nomLeu3 rheMac3 macFas5 papAnu2 chlSab2 nasLar1 rhiRox1 calJac3 saiBol1 tarSyr2 micMur1 otoGar3 tupBel1 mm10 canFam3]
    return $LesOrgs
}

proc CreateNucAliTfa {Fichier Rep Prefixe} {
    #set Fichier "$Rep/48.fa"
    #set Fichier "$Rep/20000.fa"
    set LesAccess {}
    set PreviousIsEmpty 0
    set LesLignesExon {}
    set NbOrg 20
    foreach Ligne [concat [LesLignesDuFichier $Fichier] [list ""]] {
	#rR Access1 Exon1 Org1 Entete
	#rR Access1 Exon1 Org1 Seq
	#rR Access1 Exon1 Org2 Entete
	#rR Access1 Exon1 Org2 Seq
	#rR ligne vide
	#rR Access1 Exon2 Org1 Entete
	#rR Access1 Exon2 Org1 Seq
	#rR Access1 Exon2 Org2 Entete
	#rR Access1 Exon2 Org2 Seq
	#rR ligne vide
	#rR Access2 Exon1 Org1 Entete
	#rR Access2 Exon1 Org1 Seq
	#rR Access2 Exon1 Org2 Entete
	#rR Access2 Exon1 Org2 Seq
	#rR ligne vide
	#rR Access2 Exon2 Org1 Entete
	#rR Access2 Exon2 Org1 Seq
	#rR Access2 Exon2 Org2 Entete
	#rR Access2 Exon2 Org2 Seq
	#rR ligne vide
	#rR Access3 ... etc.
	#Espionne = $Ligne =
	#Espionne $PreviousIsEmpty
	if {$Ligne!=""} {
	    set PreviousIsEmpty 0
	    lappend LesLignesExon $Ligne
	} else {
	    #rR Ligne is empty
	    if {$PreviousIsEmpty} { continue }

	    foreach {Entete SeqExon} $LesLignesExon {
		incr IemeOrg
		set Localisation "" 
		lassign [split $Entete " "] AOIN Long X Y Localisation
		lassign [split $AOIN "_"] Access Org IemeExon NbExons 

		if { ! [WantedOrganism $Org] } { continue } 

		regsub ">" $Access "" Access
		set NbExonsDe($Access) $NbExons
		if { ! [info exists DejaVuAccess($Access)]} { set DejaVuAccess($Access) 1 ; lappend LesAccess $Access }
		if { ! [info exists SeqDe($Access,$Org)]} { set SeqDe($Access,$Org) "" }
		append SeqDe($Access,$Org) $SeqExon
		lappend LesInfosDe($Access,$Org) $Localisation
		if { ! [info exists DejaPrisCetOrg($Org)]}  { set DejaPrisCetOrg($Org) 1 ; lappend LesOrgs $Org }
	    }
	    set LesLignesExon {}
	    set PreviousIsEmpty 1
	}
    }

    #rR on a tout lu et stocké
    set N 0
    foreach Access $LesAccess {
	incr N
	set NomAli [format "%s%5.5d" $Prefixe $N]
	set FicAli "$Rep/$NomAli"
	set LesES {}
	if {[info exists DejaVuLOrg]} { unset DejaVuLOrg }
	foreach Org $LesOrgs {
	    if {[info exists DejaVuLOrg($Org)]} { break }
	    set DejaVuLOrg($Org) 1
	    set Seq $SeqDe($Access,$Org)
	    set NbExons $NbExonsDe($Access)
	    set Entete ">${Access}_$Org $NbExons exons localisation : [join $LesInfosDe($Access,$Org) ,]"
	    lappend LesES $Entete $Seq
	}
	set LesTFAsAlignes {}
	foreach {Entete Seq} $LesES {
	    set LesDebDeSequence [regexp -all -indices -inline {\-[^-]} "-$Seq-"]
	    set LesFinDeSequence [regexp -all -indices -inline {[^-]-}  "-$Seq-"]

	    foreach DS $LesDebDeSequence {
		lassign $DS D0 D1
		set Mo [expr {$D0%3}]
		if {$Mo==0} { continue }
		if {$Mo==1} { set Seq [string replace $Seq $D0-1 $D0-1 "n"] }
		if {$Mo==2} { set Seq [string replace $Seq $D0-2 $D0-1 "nn"] }
	    } 
	    foreach FS $LesFinDeSequence {
		lassign $FS F0 F1
		set Mo [expr {$F0%3}]
		if {$Mo==0} { continue }
		if {$Mo==1} { set Seq [string replace $Seq $F0 $F0+1 "nn"] }
		if {$Mo==2} { set Seq [string replace $Seq $F0 $F0   "n"] }
	    }
	    set S ""
	    foreach {a b c} [split $Seq ""] {
		append S "[string totitle $a$b$c]"
	    }
	    #Espionne $S
	    
	    set TFA [SequenceFormatTFA $Seq $Entete nucbrut]
	    lappend LesTFAsAlignes $TFA
	}
	set FA [SauveLesLignes $LesTFAsAlignes dans $FicAli]
	Espionne $FA
    }
    Espionne $LesAccess
    return "Ok, I created $N $Prefixe ... up to $NomAli"
}

proc LongueurTotale {Org} {
    set TO 0
    set TN 0
    set NbN 0
    foreach Nom [ListeDesPABs] {
	set SeqO [MAMAsSeqOld $Nom $Org nuc nogap]
	set SeqN [MAMAsSeq    $Nom $Org nuc nogap]
	set LO [string length $SeqO]
	set LN [string length $SeqN]
	if {$SeqO ne $SeqN} {
	    set SeqNsansN [string trimright $SeqN "n"]
	    if {$SeqO eq $SeqNsansN} {
		incr NbN
	    } else {
		Espionne "$SeqO\n$SeqNsansN\n$SeqN"
	    }
	}
	incr TO $LO
	incr TN $LN
    }
    return "$TO $TN $NbN"
}

proc CompareX {} {
    set FAv [RepertoireDuGenome]/fiches/OLD/RatioXMotifspanTro4
    set FAp [RepertoireDuGenome]/fiches/RatioXMotifspanTro4
    foreach Avant [LesLignesDuFichier $FAv] Apres [LesLignesDuFichier $FAp] {
	if {$Avant==$Apres} { continue } 
	Espionne 
	Espionne "$Avant\n$Apres"
    }
}


proc InformeChromoLocPourTous {{Qui ""} {Quoi ""}} {
    foreach Nom [ListeDesPABs] {
	set Entete [EnteteDuFichierTFA [GscopeFile $Nom nuctfa]]
	lassign [split $Entete " "] Access NbExons ExEx Lolo DD ChromoLocs
	if { ! [regexp {>([^_]+)_(.+)$} $Access Match Access Org]} { FaireLire "Wrong access $Entete" }
	set MinLoc 0
	set MaxLoc 0
	foreach Loc [split $ChromoLocs ","] {
	    if { ! [regexp {^([^\:]+)\:([0-9]+)\-([0-9]+)([\-\+])$} $Loc Match Chr Deb Fin Sens] } { FaireLire "Wrong loc =$Loc=" } 
	    if {$MinLoc==0} { set MinLoc $Deb }
	    set MaxLoc $Fin
	}
	InformeSansDemander $Nom "=Access: $Access\n=Chromo: $Chr\n=NbExons: $NbExons\n=ChromoSens: $Sens\n=ChromoCover: $MinLoc $MaxLoc\n=ChromoLocalisation: $ChromoLocs"
    }
    return ""
}

proc ChromoCount {} {
    foreach Chr [OnChro ListOf Chr] {
	Espionne [format "%6d %s" [OnChro $Chr NbGenes] $Chr]
    }
}

proc OnChro {{Qui ""} {Quoi ""}} {
    global OnChro
    if {[info exists OnChro($Qui,$Quoi)]} { return $OnChro($Qui,$Quoi) }
    if {[info exists OnChro("EstCharge")]} { return "" }
    set OnChro("EstCharge") 1
    
    foreach Nom [lrange [ListeDesPABs] 0 end] {
	set Chr [ExtraitInfo $Nom "Chromo:"]
	lappend LesChr $Chr
	scan [ExtraitInfo $Nom "ChromoCover:"] "%d %d" Mi Ma
	set Long [expr $Ma-$Mi]
	set OnChro($Nom,Chr)    $Chr
	set OnChro($Nom,Start)  $Mi
	set OnChro($Nom,End)    $Ma
	set OnChro($Nom,Length) $Long
	if { ! [info exists OnChro($Chr,Min)]} { set OnChro($Chr,Min) $Mi }
	if { ! [info exists OnChro($Chr,Max)]} { set OnChro($Chr,Max) $Mi }
	set OnChro($Chr,Min)    [Mini $OnChro($Chr,Min) $Mi]
	set OnChro($Chr,Max)    [Maxi $OnChro($Chr,Max) $Ma]
	lappend OnChro($Chr,ListOfGenes) $Nom
    }
    set LesChr [lsort -unique $LesChr]
    set OnChro(ListOf,Chr) $LesChr
    foreach Chr $LesChr {
	set MinC $OnChro($Chr,Min)
	set MaxC $OnChro($Chr,Max)
	foreach Nom $OnChro($Chr,ListOfGenes) {
	    set PosRel [expr (100.*($OnChro($Nom,Start)-$MinC))/$MaxC]
	    set OnChro($Nom,PosRel) $PosRel
	}
	set OnChro($Chr,NbGenes) [llength $OnChro($Chr,ListOfGenes)]
    }
    return [OnChro $Qui $Quoi]
	
}


proc SumOfPairsForCodonsAndCodonMatrix {Pilier Frame} {
    global CodonMatrix
    set SumPairs 0
    set NbElements 0
    set Taille [llength $Pilier]
    for {set i 0} {$i<$Taille} {incr i} {
	incr NbElements 
	for {set j [expr {$i+1}]} {$j<$Taille} {incr j} {
	    set Codon1 [string toupper [lindex $Pilier $i]]
	    set Codon2 [string toupper [lindex $Pilier $j]]
	    if { ! [regexp {[\-N]} $Codon1$Codon2]} {
		if {$Codon1 eq $Codon2} {
		    incr SumPairs 1
		    if { ! [info exists CodonMatrix($Frame,$Codon1,$Codon1)] } { set CodonMatrix($Frame,$Codon1,$Codon1) 0 }
		    incr CodonMatrix($Frame,$Codon1,$Codon1)
		    incr CodonMatrix($Frame,COUNT,EQUAL)
		} else {
		    lassign [lsort [list $Codon1 $Codon2]] C1 C2
		    if { ! [info exists CodonMatrix($Frame,$C1,$C2)] } { set CodonMatrix($Frame,$C1,$C2) 0 }
		    incr CodonMatrix($Frame,$C1,$C2)
		    incr CodonMatrix($Frame,COUNT,SUBSTITUTION)
		    set CodonMatrix($Frame,$C2,$C1) $CodonMatrix($Frame,$C1,$C2)
		}
	    }
	} 
    }
    return "$SumPairs $NbElements"
}

proc SPCandCMforReference {Pilier Frame Caller} {
    #JeMeSignale
    global CodonMatrixHuman
    set SumPairs 0
    set NbElements 1
    set Taille [llength $Pilier]
    for {set j 1} {$j<$Taille} {incr j} {
        #rR carefull we incr here also 
        incr NbElements
        set Codon1 [string toupper [lindex $Pilier 0]]
        set Codon2 [string toupper [lindex $Pilier $j]]
        if { ! [regexp {[\-N]} $Codon1$Codon2] } {
            if {$Codon1 eq $Codon2} {
                incr SumPairs 1
                if { ! [info exists CodonMatrixHuman($Frame,$Codon1,$Codon1)] } { set CodonMatrixHuman($Frame,$Codon1,$Codon1) 0 }
                incr CodonMatrixHuman($Frame,$Codon1,$Codon1)
                incr CodonMatrixHuman($Frame,COUNT,EQUAL)
            } else {
                if { ! [info exists CodonMatrixHuman($Frame,$Codon1,$Codon2)] } { set CodonMatrixHuman($Frame,$Codon1,$Codon2) 0 }
                incr CodonMatrixHuman($Frame,$Codon1,$Codon2)
                incr CodonMatrixHuman($Frame,COUNT,SUBSTITUTION)
            }
        }
    } 
    return "$SumPairs $NbElements"
}

proc OLD_SPCandCMforReference {Pilier Frame Caller} {
    #JeMeSignale
    global CodonMatrixHuman
    set SumPairs 0
    set NbElements 0
    set Taille [llength $Pilier]
    for {set i 0} {$i<1} {incr i} {                     ; #rR we use only the first line !!!!!!!!!!!!!!
	incr NbElements
	for {set j [expr {$i+1}]} {$j<$Taille} {incr j} {
	    #rR carefull we incr here also 
	    incr NbElements
	    set Codon1 [string toupper [lindex $Pilier $i]]
	    set Codon2 [string toupper [lindex $Pilier $j]]
	    if { ! [regexp {[\-N]} $Codon1$Codon2]} {
		if {$Codon1 eq $Codon2} {
		    incr SumPairs 1
		    if { ! [info exists CodonMatrixHuman($Frame,$Codon1,$Codon1)] } { set CodonMatrixHuman($Frame,$Codon1,$Codon1) 0 }
		    incr CodonMatrixHuman($Frame,$Codon1,$Codon1)
		    incr CodonMatrixHuman($Frame,COUNT,EQUAL)
		} else {
		    lassign [lsort [list $Codon1 $Codon2]] C1 C2
		    if { ! [info exists CodonMatrixHuman($Frame,$C1,$C2)] } { set CodonMatrixHuman($Frame,$C1,$C2) 0 }
		    incr CodonMatrixHuman($Frame,$C1,$C2)
		    incr CodonMatrixHuman($Frame,COUNT,SUBSTITUTION)
		    set  CodonMatrixHuman($Frame,$C2,$C1) $CodonMatrixHuman($Frame,$C1,$C2)
		}
	    }
	} 
    }
    return "$SumPairs $NbElements"
}

proc CalculSumOfPairsForCodonsAndCodonMatrix {{Liste ""} {Save ""}} {
    #rR Here we calculate 2 times several things ... :
    #rR   1/ for the original SumOfPairs
    #rR   2/ and the one starting from the ReferenceOrg (ie hg38 or JoyScCDS) and comparing only changes to it. 
    #rR We create a file for each Nom 
    #rR   and calculate CodonMatrices : CodonMatrix.txt and CodonMatrixHuman.txt ... 
    #rR   both can be used (but not simultaneously) by the proc CodonMatrix depending on the lines commented or not 
    #rR     #array set CodonMatrix [ContenuDuFichier [CodonMatrixFile]]
    #rR     array set CodonMatrix [ContenuDuFichier [CodonMatrixFileHuman]]
    #rR MAYBE we have to write two procs : CodonMatrix and CodonMatrixHuman !!!!!!!!!!!!!!!!!!!
    #rR the array CodonMatrix      is cumulated in the proc SumOfPairsForCodonsAndCodonMatrix 
    #rR the array CodonMatrixHuman is cumulated in the proc SPCandCMforReference 
    #rR    these procs receive as arguments the Pilier PilierMotif or  PilierHuman and PilierMotifHuman respectively 
    #rR ATTENTION ATTENTION since 2018/03/07 CodonMatrixHuman is NO MORE a symmetric matrix
    #rR                     the diagonal is the count of nb of EQUALity and other the count of mutations (both starting from ReferenceOrg)  
     
    global CodonMatrix
    global CodonMatrixHuman
    global IsX0
    if {[info exists CodonMatrix]}      { unset CodonMatrix }
    if {[info exists CodonMatrixHuman]} { unset CodonMatrixHuman }
    if {[info exists IsX0]}             { unset IsX0 }

    set ReferenceOrg [ReferenceOrg]
    set IndexReferenceOrg [lsearch -exact [WantedOrganisms] $ReferenceOrg]

    #rR Caution : this must be run in one shot because we cumulate CodonMatrix for all when doing SumOfPairs
    #Position NbMotF0 SumMotF0 RatioSumMot/Div NbMotF1 SumMotF1 RatioSumMotF1/Div NbMotF2 SumMotF2 RatioSumMotF2/Div NbTotalMot NbLinesParticipant SumPairs RatioSumPairs/Div

    if {$Save=="AddToCodonMatrix"} {
	set Save 1
	array set CodonMatrix [ContenuDuFichier [CodonMatrixFile]]
    }

    if {$Save==""} { set Save 1 }

    set RepSPC [SumOfPairsForCodonsDir]              ; #rR this depends on CirCode CC : CC_SumOfPairsForCodons
    file mkdir $RepSPC
    set RepSPCHuman [SumOfPairsForCodonsHumanDir]    ; #rR this depends on CirCode CC : CC_SumOfPairsForCodonsHuman
    file mkdir $RepSPCHuman

    if {$Liste==""} { set Liste [lrange [ListeDesPABs] 0 end] }

    set SpyEvery 20
    set SpyCount -1
    foreach Nom $Liste {
	if {                   0 &&                [file exists "$RepSPC/$Nom"]} { continue }
	if {                   0 &&                [PasTouche $Nom]} { continue }
	if {([incr SpyCount]%$SpyEvery)==0} { Espionne [CirCode "DefaultCirCode"] $Nom }
	set LesLignesSumOfPairs {}
	set LesLignesSumOfPairsHuman {}
	set LongueurSequence 0
	if {[info exists LesDFDu]                 } { unset LesDFDu }                   ;#rR Debut et Fin from ...
	if {[info exists SequenceDu]              } { unset SequenceDu }
	if {[info exists LesPositionsFrame]       } { unset LesPositionsFrame }
	if {[info exists LesPositionsMotifs]      } { unset LesPositionsMotifs }
	if {[info exists LesPositionsSansTirets]  } { unset LesPositionsSansTirets }
	if {[info exists InMotif]                 } { unset InMotif }

	#rR unset all Pilier
	if {[info exists Pilier]                  } { unset Pilier }                   ; #rR See below more explanations
	if {[info exists PilierMotif]             } { unset PilierMotif }
	if {[info exists PilierHuman]             } { unset PilierHuman }
	if {[info exists PilierMotifHuman]        } { unset PilierMotifHuman }

	set LesAccess [MAMAsSeq $Nom listof org]

        if {$LesAccess=={}} { continue }    ; #rR 

	foreach Access $LesAccess {
	    set SequenceDu($Access) [string toupper [MAMAsSeq $Nom $Access nuc gap]]
	}
	foreach Access $LesAccess {
	    set SequenceNonGap [string toupper [MAMAsSeq $Nom $Access nuc nogap]]
	    foreach Frame [list 0 1 2] {
		set LesPositionsMotifs($Frame,$Access) {}
		set LesPositionsSansTirets($Frame,$Access) {}
		set XMotifsSequence [XMotifs $SequenceNonGap $Frame]
		set LesDFDu($Frame,$Access) {}
		foreach {K V} $XMotifsSequence {
		    foreach DF $V {
			lappend LesDFDu($Frame,$Access) $DF
		    }
		}
		if {$LesDFDu($Frame,$Access)=={}} { continue }
		set LesDFDu($Frame,$Access) [lsort -integer -index 0 $LesDFDu($Frame,$Access)]
		foreach DF $LesDFDu($Frame,$Access) {
		    lassign $DF D F
		    incr F 2
		    set DG [PositionsLocalesVersGlobales $SequenceDu($Access) $D]
		    set FG [PositionsLocalesVersGlobales $SequenceDu($Access) $F]
		    for {set i $DG} {$i<=$FG} {incr i 3} {
			lappend LesPositionsMotifs($Frame,$Access) $i
		    }
		}
		foreach P $LesPositionsMotifs($Frame,$Access) {
		    set Codon [string range $SequenceDu($Access) $P $P+2]
		    if { ! [regexp {\-} $Codon]} {
			lappend LesPositionsSansTirets($Frame,$Access) $P
			set InMotif($Frame,$Access,$P) 1
		    }
		}
	    }
	}
	
	foreach {K V} [array get InMotif] {
	    set AllInMotif($Nom,$K) $V
	}

	foreach Frame [list 0 1 2] {
	    foreach Access $LesAccess {
		LConcat LesPositionsFrame($Frame) $LesPositionsSansTirets($Frame,$Access)
	    }
	    set LesPositionsFrame($Frame) [lsort -integer -increasing $LesPositionsFrame($Frame)]
	}
	set LongueurSequence [string length $SequenceDu($Access)]
	for {set i 0} {$i<=$LongueurSequence} {incr i 3} {
	    #rR Réinitialisation de tous les piliers
	    set Pilier($i) {}                        ; #rR Tous les codons non vides d'une colonne
	    set PilierMotif(0,$i) {}                 ; #rR Tous les codons qui sont dans un motif en frame 0
	    set PilierMotif(1,$i) {}                 ; #rR Tous les codons qui sont dans un motif en frame 1
	    set PilierMotif(2,$i) {}                 ; #rR Tous les codons qui sont dans un motif en frame 2
	    set PilierHuman($i) {}                   ; #rR Tous les codons d'une colonne où Human est présent
	    set PilierMotifHuman(0,$i) {}            ; #rR Tous les codons d'une colonne où Human est présent et est dans un motif en frame 0
	    set PilierMotifHuman(1,$i) {}            ; #rR Tous les codons d'une colonne où Human est présent et est dans un motif en frame 1 
	    set PilierMotifHuman(2,$i) {}            ; #rR Tous les codons d'une colonne où Human est présent et est dans un motif en frame 2
	    set HumanIsThere 0
	    if {[lindex $LesAccess $IndexReferenceOrg]==$ReferenceOrg} { set HumanIsThere 1 }      ; #rR problem ???
            if {$HumanIsThere} {
                #rR First we initialise with the ReferenceOrg
		set CodonOfFrame(0) [string range $SequenceDu($ReferenceOrg) $i   $i+2]
		set CodonOfFrame(1) [string range $SequenceDu($ReferenceOrg) $i-2 $i]
		set CodonOfFrame(2) [string range $SequenceDu($ReferenceOrg) $i-1 $i+1]
		set Codon $CodonOfFrame(0)
		#rR 20180202 i changed to have exactly 3 bases
		if {[regexp {^[ATGC]{3}$} $Codon]} { lappend Pilier($i) $Codon }
		if {[regexp {^[ATGC]{3}$} $Codon]} { lappend PilierHuman($i) $Codon }
		foreach Frame [list 0 1 2] {
		    if {[info exists InMotif($Frame,$ReferenceOrg,$i)]} {
			#Espionne $Frame $ReferenceOrg $i $CodonOfFrame($Frame) $PilierMotif($Frame,$i)
			lappend PilierMotif($Frame,$i) $CodonOfFrame($Frame)
		    }
		}
		foreach Frame [list 0 1 2] {
                    #rR It's should work because ReferenceOrg is the first
		    if {[info exists InMotif($Frame,$ReferenceOrg,$i)] && [regexp {^[ATGC]{3}$} $CodonOfFrame($Frame)]} {
                        lappend PilierMotifHuman($Frame,$i) $CodonOfFrame($Frame)
		    }
                }
            }
            foreach Access $LesAccess {
                #rR Now we can cumulate but not for ReferenceOrg
                if {$Access==$ReferenceOrg} { continue }
		set CodonOfFrame(0) [string range $SequenceDu($Access) $i   $i+2]
		set CodonOfFrame(1) [string range $SequenceDu($Access) $i-2 $i]
		set CodonOfFrame(2) [string range $SequenceDu($Access) $i-1 $i+1]
		set Codon $CodonOfFrame(0)
		if {[regexp {^[ATGC]{3}$} $Codon]} { lappend Pilier($i) $Codon }
		if {[regexp {^[ATGC]{3}$} $Codon]} { lappend PilierHuman($i) $Codon }
		foreach Frame [list 0 1 2] {
		    if {[info exists InMotif($Frame,$Access,$i)]} {
			#Espionne $Frame $Access $i $CodonOfFrame($Frame) $PilierMotif($Frame,$i)
			lappend PilierMotif($Frame,$i) $CodonOfFrame($Frame)
		    }
		}
		foreach Frame [list 0 1 2] {
                    #rR is not empty if ReferenceOrg was there.
		    if {$PilierMotifHuman($Frame,$i)!={}} {
			if {[regexp {^[ATGC]{3}$} $CodonOfFrame($Frame)]} { lappend PilierMotifHuman($Frame,$i) $CodonOfFrame($Frame) }
		    }
		}
	    }
        }
	#rR All Pilier... are now calculated and the ReferenceOrg is the first in each Pilier... 

        for {set i 0} {$i<=$LongueurSequence} {incr i 3} {
            #rR 2018/03/09 10:00 I remove the test for frame 1 and 2  ... We have to run again 00 01 02 03 04 05
            if {( ! [info exists Pilier($i)] || [llength $Pilier($i)]<2) || ([OnTraite SubMAMA Like] && [info exists InMotif(0,$ReferenceOrg,$i)]) } {
		set NbLignes [llength $Pilier($i)]
		set SommeDesPairs 0
		set RatioSommeNbLignes 0
	    } else {
		lassign [SumOfPairsForCodonsAndCodonMatrix $Pilier($i) 3] SommeDesPairs NbLignes
		set Diviseur [expr {($NbLignes*($NbLignes-1))/2}]
		set RatioSommeNbLignes [expr {1.0*$SommeDesPairs/$Diviseur}]
	    }
	    foreach Frame [list 0 1 2] {
		if { ! [info exists PilierMotif($Frame,$i)] || [llength $PilierMotif($Frame,$i)]<2} {
		    set NbrOfMotifs($Frame) 0
		    set SumOfMotifs($Frame) 0
		    set RatioMotifs($Frame) 0
		} else {
		    #Espionne hourrahhourrahhourrahhourrahhourrahhourrahhourrahhourrahhourrahhourrahhourrahhourrahhourrahhourrah
		    #Espionne $Frame $i $PilierMotif($Frame,$i)
		    lassign [SumOfPairsForCodonsAndCodonMatrix $PilierMotif($Frame,$i) $Frame] SumOfMotifs($Frame) NbrOfMotifs($Frame)
		    set Diviseur [expr {($NbrOfMotifs($Frame)*($NbrOfMotifs($Frame)-1))/2}]
		    set RatioMotifs($Frame) [expr {1.0*$SumOfMotifs(0)/$Diviseur}]
		}
	    }
            
            set LesColonnes {}
            lappend LesColonnes [expr {$i+1}]
	    foreach Frame [list 0 1 2] {
		lappend LesColonnes $NbrOfMotifs($Frame)
		lappend LesColonnes $SumOfMotifs($Frame)
		lappend LesColonnes $RatioMotifs($Frame)
	    }
            lappend LesColonnes [expr {$NbrOfMotifs(0)+$NbrOfMotifs(1)+$NbrOfMotifs(2)}]
            lappend LesColonnes $NbLignes
            lappend LesColonnes $SommeDesPairs
            lappend LesColonnes $RatioSommeNbLignes
	    set LineSumPairs [join $LesColonnes "\t"]
	    lappend LesLignesSumOfPairs $LineSumPairs
            
	    #rR Human Human Human Human Human Human Human Human Human Human Human Human Human Human Human Human Human
	    #rR Human Human Human Human Human Human Human Human Human Human Human Human Human Human Human Human Human
	    #rR Human Human Human Human Human Human Human Human Human Human Human Human Human Human Human Human Human
            
            #rR 2018/03/09 10:00 I remove the test for frame 1 and 2  ... We have to run again 00 01 02 03 04 05
	    if {( ! [info exists PilierHuman($i)] || [llength $PilierHuman($i)]<2) || ([OnTraite SubMAMA Like] && [info exists InMotif(0,$ReferenceOrg,$i)]) } {
		set NbLignesHuman [llength $PilierHuman($i)]
		set SommeDesPairsHuman 0
		set RatioSommeNbLignesHuman 0
	    } else {
                set SN [SPCandCMforReference $PilierHuman($i) 3 "AllFor$i"]
		lassign $SN SommeDesPairsHuman NbLignesHuman
		set Diviseur [expr {($NbLignesHuman*($NbLignesHuman-1))/2}]
		set RatioSommeNbLignesHuman [expr {1.0*$SommeDesPairsHuman /$Diviseur}]
	    }
            foreach Frame [list 0 1 2] {
                if { ! [info exists PilierMotifHuman($Frame,$i)] || [llength $PilierMotifHuman($Frame,$i)]<2 } {
                    set NbrOfMotifsHuman($Frame) 0
                    set SumOfMotifsHuman($Frame) 0
		    set RatioMotifsHuman($Frame) 0
                } else {
                    set SN [SPCandCMforReference $PilierMotifHuman($Frame,$i) $Frame "MotifFor$i"]
                    lassign $SN SumOfMotifsHuman($Frame) NbrOfMotifsHuman($Frame)
		    set Diviseur [expr {($NbrOfMotifsHuman($Frame)*($NbrOfMotifsHuman($Frame)-1))/2}]
		    set RatioMotifsHuman($Frame) [expr {(1.0*$SumOfMotifsHuman($Frame))/$Diviseur}]
                }
            }
	    set LesColonnes {}
            lappend LesColonnes [expr {$i+1}]
	    foreach Frame [list 0 1 2] {
		lappend LesColonnes $NbrOfMotifsHuman($Frame)
		lappend LesColonnes $SumOfMotifsHuman($Frame)
		lappend LesColonnes $RatioMotifsHuman($Frame)
	    }
            lappend LesColonnes [expr {$NbrOfMotifsHuman(0)+$NbrOfMotifsHuman(1)+$NbrOfMotifsHuman(2)}]
            lappend LesColonnes $NbLignesHuman
            lappend LesColonnes $SommeDesPairsHuman
            lappend LesColonnes $RatioSommeNbLignesHuman
            set LineSumPairsHuman [join $LesColonnes "\t"]
	    lappend LesLignesSumOfPairsHuman $LineSumPairsHuman
            
	}
	if {$Save} { SauveLesLignes $LesLignesSumOfPairs      dans "$RepSPC/$Nom" }
	if {$Save} { SauveLesLignes $LesLignesSumOfPairsHuman dans "$RepSPCHuman/$Nom" }
	#FinPasTouche $Nom
    }
    Sauve [array get CodonMatrix]      in [CodonMatrixFile]
    Sauve [array get CodonMatrixHuman] in [CodonMatrixFileHuman]
    #Sauve [array get AllInMotif]       in [AllInMotifFile]
}

proc AllInMotif {{Qui ""} {Quoi ""}} {
    global AllInMotif
    if {[info exists AllInMotif($Qui,$Quoi)]} { return $AllInMotif($Qui,$Quoi) }
    if {[info exists AllInMotif("EstCharge")]} { return "" }
    array set AllInMotif [ContenuDuFichier [AllInMotifFile]]

    set Qui  [string toupper $Qui]
    set Quoi [string toupper $Quoi]

    foreach {K V} [array get AllInMotif] {
	lassign [split $K ","] Nom Frame Access Position
	#Espionne  $K $Nom $Frame $Access $Position
	set NOM    [string toupper $Nom]
	set ACCESS [string toupper $Access]
	lappend AllInMotif(LISTOF,NOM)                    $Nom
	lappend AllInMotif($NOM,LISTOFACCESS)             $Access
	lappend AllInMotif($NOM,LISTOFFRAME)              $Frame
	lappend AllInMotif($NOM-$Frame,LISTOFPOS)         "$Position $Access"
	lappend AllInMotif($NOM-$ACCESS-$Frame,LISTOFPOS) $Position
    }
    set AllInMotif(LISTOF,NOM) [lsort -unique $AllInMotif(LISTOF,NOM)]
    foreach Nom $AllInMotif(LISTOF,NOM) {
	set AllInMotif($NOM,LISTOFACCESS) [lsort -unique $AllInMotif($NOM,LISTOFACCESS)]
	set AllInMotif($NOM,LISTOFFRAME)  [lsort -unique $AllInMotif($NOM,LISTOFFRAME)]
	foreach Access $AllInMotif($NOM,LISTOFACCESS) {
	    set ACCESS [string toupper $Access]
	    foreach Frame $AllInMotif($NOM,LISTOFFRAME) {
		set AllInMotif($NOM-$ACCESS-$Frame,LISTOFPOS) [lsort -integer $AllInMotif($NOM-$ACCESS-$Frame,LISTOFPOS)]
	    }
	}
	foreach Frame $AllInMotif($NOM,LISTOFFRAME) {
	    #Espionne $NOM-$Frame,
	    #Espionne $AllInMotif($NOM-$Frame,LISTOFPOS)
	    set AllInMotif($NOM-$Frame,LISTOFPOS) [lsort -integer -index 0 $AllInMotif($NOM-$Frame,LISTOFPOS)]
	    #Espionne $AllInMotif($NOM-$Frame,LISTOFPOS)
	}
    }
    set AllInMotif("EstCharge") 1
    return [AllInMotif $Qui $Quoi]
}


proc AddFeatures {Nom FichierXml args} {
    #rR 20180329 I changed the order CC FeaturesDirs
    #rR Est appele par ordali uniquement 
    global TabSF
    #CreeLesPiliers
    #RunOrdali
    if {$args!={}} {
	set CC [lindex $args 0]
	set args [lrange $args 1 end]
    }
    set FeaturesDirs $args
    if {$FeaturesDirs==""} { set FeaturesDirs [list [X0MotifsFeaturesDir $CC] [X1MotifsFeaturesDir $CC] [X2MotifsFeaturesDir $CC]] }
    foreach FeaturesDir $FeaturesDirs {
	array unset TabSF "*,$FeaturesDir"
	ReadRawFeatureFile $FeaturesDir/$Nom
    }
    SauveLAlignement XML $FichierXml
    exit
}

proc CreateMacsimsWithMotifsXForAll {{LesRandom ""}} {
    if {$LesRandom==""} { set LesRandom [CirCode ListOf Index] }
    #set LesRandom [list 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30]
    foreach Random $LesRandom {
        Espionne $Random
        CirCode "DefaultCirCode" $Random
        set PatName "CreateMacsimsWithMotifsX_$Random"
        if {[PasTouche $PatName]} { continue }
        #rR il faudra enlever la ligne suivante
	if {[file exists [MacsimXmlDir]]} { Espionne [MacsimXmlDir] already exists. I skip. ; FinPasTouche $PatName ; continue }
	CreateMacsimsWithMotifsX
        lappend LesRandomFait $Random
        FinPasTouche $PatName
    }
    return $LesRandomFait
}

proc CreateMacsimsWithMotifsX {{Liste ""} {NbCodons ""} {Cardinality ""}} {
    #rR 2019/10/02 j'ai rajouté NbCondos et Cardinality pour Johan
    #rR On change touts les noms de directories pour ces specific

    set NbCodons 3
    set Cardinality 1

    set Specific "$NbCodons$Cardinality"
    set MacsimXmlDir "[MacsimXmlDir]$Specific"
    set MacsimRsfDir "[MacsimRsfDir]$Specific"
    set Couleur(0) "yellow"
    set Couleur(1) "orange"
    set Couleur(2) "red"
    file mkdir $MacsimXmlDir
    file mkdir $MacsimRsfDir
    if {$Liste==""} { set Liste [lrange [ListeDesPABs] 0 end] }
    foreach Nom $Liste {
	Espionne $Nom
	set FichierMsf       [GscopeFile $Nom msf]
	set FichierMacsimXml "$MacsimXmlDir/$Nom"
	if {[FileAbsent $FichierMsf]      } { continue }
	if {[FileExists $FichierMacsimXml]} { continue }
	foreach Frame [list 0 1 2] {
	    set Dir "[X${Frame}MotifsFeaturesDir]$Specific"
	    set FeaturesDir($Frame) $Dir
	    file mkdir $Dir
	    set LesLignesFeatures($Frame) [list "FEATURE X${Frame}Motifs"]
	}
	set LesAccess {}

	if {[info exists LesDFDu]   } { unset LesDFDu }
	if {[info exists SequenceDu]} { unset SequenceDu }
	if {[info exists KduDF]     } { unset KduDF }

	set F [GscopeFile $Nom nucalitfa]
	foreach Ligne [LesLignesDuFichier $F] {
	    if {[regexp {>} $Ligne]} {
		set Entete $Ligne
		lassign [split $Entete " "] Access
		regsub ">" $Access "" Access
		lappend LesAccess $Access
		if { ! [info exists SequenceDu($Access)]} { set SequenceDu($Access) "" }
	    } else {
		append SequenceDu($Access) $Ligne
	    }
	}
	foreach Access $LesAccess {
	    set SequenceNonGap ""
	    regsub -all {\-} $SequenceDu($Access) "" SequenceNonGap
	    foreach Frame [list 0 1 2] {
		set SequenceNonGapDeLaFrame [string range $SequenceNonGap $Frame end]
		#rR Rajout de NbCodon et Cardinality
		set XMotifsSequence [XMotifs $SequenceNonGapDeLaFrame 0 $NbCodons $Cardinality]
		set LesDFDu($Frame,$Access) {}
		foreach {K V} $XMotifsSequence {
		    foreach DF $V {
			lappend LesDFDu($Frame,$Access) $DF
			set KduDF($Frame,$Access,$DF) $K
		    }
		}
	    }
	}
	set FeaturesDirs {}
	foreach Access $LesAccess {
	    foreach Frame [list 0 1 2] {
		set LesDFDu($Frame,$Access) [lsort -integer -index 0 $LesDFDu($Frame,$Access)]
		foreach DF $LesDFDu($Frame,$Access) {
		    lassign $DF D F
		    incr F 2
		    incr D $Frame
		    incr F $Frame
		    incr D 1
		    incr F 1
		    regsub "," $KduDF($Frame,$Access,$DF) ";" KduDF($Frame,$Access,$DF)
		    set LigneFeature "$Access;LOCAL;$D;$F;$Couleur($Frame);$KduDF($Frame,$Access,$DF)"
		    lappend LesLignesFeatures($Frame) $LigneFeature
		}
		SauveLesLignes $LesLignesFeatures($Frame) dans "$FeaturesDir($Frame)/$Nom"
		lappend FeaturesDirs $FeaturesDir($Frame)
	    }
	}
	set FeaturesDirs [lsort -unique $FeaturesDirs]
	set Commande "ordali $FichierMsf -batch 1 -exe AddFeatures $Nom $FichierMacsimXml [CirCode DefaultCirCode] $FeaturesDirs"
	Espionne $Commande
	if {[catch { exec {*}$Commande } Message]} {
	    Warne "Something went wrong with \n$Commande\n I'll skip... Please fix the probleme and do it again later"
	}
    }
}

proc MAMAsSeq {{Nom ""} {Org ""} {NucOrProt ""} {Gap ""}} {
    set FicNucAliTfa  [GscopeFile $Nom "nucalitfa"]
    global MAMAsSeq
    #rR MAMAsSeq MAMA00001 listof org       ;# returns all organisms
    #rR MAMAsSeq MAMA00001 listof access    ;# returns all access
    #rR MAMAsSeq MAMA00001 hg38 header      ;# returns the header of the TFA file
    #rR MAMAsSeq MAMA00001 hg38             ;# returns sequence nuc  of hg38 non gap
    #rR MAMAsSeq MAMA00001 hg38 nuc         ;# returns sequence nuc  of hg38 non gap (same as above)
    #rR MAMAsSeq MAMA00001 hg38 prot        ;# returns sequence prot of hg38 non gap
    #rR MAMAsSeq MAMA00001 hg38 nuc gap     ;# returns sequence nuc  of hg38 with gaps
    #rR MAMAsSeq MAMA00001 hg38 prot gap    ;# returns sequence prot of hg38 with gaps
    #rR MAMAsSeq MAMA00001 all              ;# returns all sequences nuc non gap
    #rR MAMAsSeq MAMA00001 all nuc          ;# returns all sequences nuc non gap
    #rR MAMAsSeq MAMA00001 all prot         ;# returns all sequences prot non gap
    #rR MAMAsSeq MAMA00001 all nuc gap      ;# returns all sequences nuc  with gaps
    #rR MAMAsSeq MAMA00001 all prot gap     ;# returns all sequences prot with gaps
    #rR MAMAsSeq MAMA00001 canFam3 ...   returns what is asked for canFam3 instead of hg38 !
    #rR Fin Help
    if {$Nom==""} { 
	foreach Ligne [split [info body MAMAsSeq] "\n"] {
	    if { ! [regexp "#rR" $Ligne]} { continue }
	    if {[regexp "Fin Help" $Ligne]} { break }
	    lappend LeHelp [string trim $Ligne]
	}
	return [join $LeHelp "\n"]
    }

    if {$Nom=="Unset"} {
	if {[info exists MAMAsSeq]} { unset MAMAsSeq }
	return ""
    }
    set Gap       [string tolower $Gap]
    set NucOrProt [string tolower $NucOrProt]
    if {$Gap =="nogap"} { set Gap "" }
    if {$NucOrProt==""} { set NucOrProt "nuc" }
    if {$Org      ==""} { set Org [ReferenceOrg] }
    if {[info exists MAMAsSeq($Nom,$Org,$NucOrProt,$Gap)]} { return $MAMAsSeq($Nom,$Org,$NucOrProt,$Gap) }
    if {[info exists MAMAsSeq($Nom,"EstCharge")]} { return "" }
    set MAMAsSeq($Nom,"EstCharge") 1
    if {[FileAbsent $FicNucAliTfa]} { return "" }
    foreach {Access} [LaSequenceDuTFAs $FicNucAliTfa "LaListeDesAccess"] {
	set OrgaLu ""
	if {$OrgaLu==""} { regexp {(Joy[A-Z][a-z]CDS)[0-9]+} $Access Match OrgaLu }
	if {$OrgaLu==""} { regexp {_([^ ]+)$}                $Access Match OrgaLu }
	if {$OrgaLu==""} { continue }
	set TFA [LaSequenceDuTFAs $FicNucAliTfa $Access]
	set Entete [EnteteDuTexteTFA $TFA]
	set SeqNucGap [QueLaSequenceDuTexteTFA $TFA]
	#if {[regexp rhiRox1 $Access]} { Espionne $SeqNucGap }
	regsub -all {\-} $SeqNucGap "" SeqNuc
	set MAMAsSeq($Nom,$OrgaLu,header,)  $Entete
	set MAMAsSeq($Nom,$OrgaLu,nuc,gap) $SeqNucGap
	set MAMAsSeq($Nom,$OrgaLu,nuc,)    $SeqNuc
	lappend MAMAsSeq($Nom,all,nuc,gap) $SeqNucGap
	lappend MAMAsSeq($Nom,all,nuc,)    $SeqNuc
	lappend MAMAsSeq($Nom,listof,access,) $Access
	lappend MAMAsSeq($Nom,listof,org,)    $OrgaLu
    }
    set FicProtAliTfa [GscopeFile $Nom "protalitfa"]
    if {[FileAbsent $FicProtAliTfa]} { return "" }
    foreach {Access} [LaSequenceDuTFAs $FicProtAliTfa "LaListeDesAccess"] {
	set OrgaLu ""
	if {$OrgaLu==""} { regexp {(Joy[A-Z][a-z]CDS)[0-9]+} $Access Match OrgaLu }
	if {$OrgaLu==""} { regexp {_([^ ]+)$}                $Access Match OrgaLu }
	if {$OrgaLu==""} { continue }
	set TFA [LaSequenceDuTFAs $FicProtAliTfa $Access]
	set Entete [EnteteDuTexteTFA $TFA]
	set SeqProtGap [QueLaSequenceDuTexteTFA $TFA]
	regsub -all {\-} $SeqProtGap "" SeqProt
	set MAMAsSeq($Nom,$OrgaLu,prot,gap) $SeqProtGap
	set MAMAsSeq($Nom,$OrgaLu,prot,)    $SeqProt
	lappend MAMAsSeq($Nom,all,prot,gap) $SeqProtGap
	lappend MAMAsSeq($Nom,all,prot,)    $SeqProt
    }
    return [MAMAsSeq $Nom $Org $NucOrProt $Gap]
}


proc MAMAsOrg {{Qui ""}} {
    set LesOrgs [list hg38 panTro4 panPan1 gorGor3 ponAbe2 nomLeu3 rheMac3 macFas5 papAnu2 chlSab2 nasLar1 rhiRox1 calJac3 saiBol1 tarSyr2 micMur1 otoGar3 tupBel1 mm10 canFam3]
    if {$Qui=="GetList"} { return $LesOrgs }
    return [ChoixParmi $LesOrgs]    
}

proc ColumnsOfCodonsInXMotifsPourTous {{Frame ""} {NbCodons ""} {Cardinality ""} {RefOrg ""}} {
    foreach Nom [ListeDesPABs] {
	set FichierMsf [GscopeFile $Nom msf]
	if {[FileAbsent $FichierMsf]} { continue }
	set NbCops 0
	foreach Ligne [LesLignesDuFichier $FichierMsf] {
	    if {[regexp "^//" $Ligne]} { break }
	    if {[regexp "Name:" $Ligne]} { incr NbCops }
	}
	set Product  [ExtraitInfo $Nom "product:"]
	set LocusTag [ExtraitInfo $Nom "locus_tag"]
	set Ligne [format "%2d %-10s %-8s" $NbCops $LocusTag [MDScore $Nom]]
	append Ligne [ColumnsOfCodonsInXMotifs $Nom $Frame $NbCodons $Cardinality $RefOrg]
	if {$Ligne==""} { continue }
	if { ! [regexp {:  0} $Ligne ]} { append Ligne " $Product" }
	Espionne $Ligne
	AppendAuFichier [Fiches "tous.txt"] $Ligne
    }
    return Bravo
}

proc ColumnsOfCodonsInXMotifs {Nom {Frame ""} {NbCodons ""} {Cardinality ""} {RefOrg ""}} {
    #rR Attention 31 en dur !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    if {$NbCodons==""} { set NbCodons 3 }
    if {$Cardinality==""} { set Cardinality 1 }
    #rR Attention 31 en dur !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    if {$RefOrg==""} { set RefOrg [PreFixe] }
    if {$Frame==""} { set Frame 0 }
    set FicMsf [GscopeFile $Nom "msf"]
    set LesPositions {}
    set FeaturesDir [X${Frame}MotifsFeaturesDir]$NbCodons$Cardinality
    set FeaturesFile "$FeaturesDir/$Nom"
    if {[FileAbsent $FeaturesFile]} { return "" }
    set IemeMotif 0
    set ListOfMotif {}
    foreach Ligne [lrange [LesLignesDuFichier $FeaturesFile] 1 end] {
	lassign [split $Ligne ";"] Access LOCAL DL FL Couleur L C
	set DG [PositionDansMSF "Global" $FicMsf $DL $Access]
	set FG [PositionDansMSF "Global" $FicMsf $FL $Access]
	lappend LesPositions "$Access $DL $FL $DG $FG"
	if {[regexp "^$RefOrg" $Access]} {
	    incr IemeMotif
	    lappend ListOfMotif $IemeMotif
	    set LocalStart($IemeMotif)  $DL
	    set LocalStop($IemeMotif)   $FL
	    set GlobalStart($IemeMotif) $DG
	    set GlobalStop($IemeMotif)  $FG
	}	
	foreach G [NombresEntre $DG $FG] {
	    lappend LesJaunesDe($G) $Access
	}
    }
    foreach IemeMotif $ListOfMotif {
	set M 0
	foreach G [NombresEntre $GlobalStart($IemeMotif) $GlobalStop($IemeMotif)] {
	    set M [Maxi $M [llength $LesJaunesDe($G)]]
	}
	lappend LesM $M
	incr Histo($M)
    }
    foreach M [NombresEntre 9 1 -1] {
	if { ! [info exists Histo($M)]} { set N " 0" } else { set N [format "%2d" $Histo($M)] }
	lappend LeMessage $N
    }
    set Message [join $LeMessage "  "]
    return "$Nom : $Message"

}

proc InformeColumnsOfCodonsInXMotifs {} {
    foreach Ligne [LesLignesDuFichier [Fiches "ColumnsOfCodonsInXMotifs.txt"]] {
	Espionne $Ligne
	lassign [LesMotsDeLaLigne $Ligne] NbCops Product MDScore Nom pp N9 N8 N7 N6 N5 N4 N3 N2 N1
	InformeSansDemander $Nom "=NbCops: $NbCops"
	InformeSansDemander $Nom "=NbMotifs: $N9 $N8 $N7 $N6 $N5 $N4 $N3 $N2 $N1"
	if {$N9!=0} { InformeSansDemander $Nom "=WithXColumn: yes" }
    }
    return 
}

proc InformeNbXMotifsPourTous {} {
    set LaSortie {}
    foreach Nom [ListeDesPABs] {
	set Les31 [XMotifs $Nom 0 3 1]
	set Les41 [XMotifs $Nom 0 4 1]
	set Les44 [XMotifs $Nom 0 4 4]
	set N31 [expr [llength $Les31]/2]
	set N41 [expr [llength $Les41]/2]
	set N44 [expr [llength $Les44]/2]
	set Ligne [format "%s %2d %2d %2d" $Nom $N31 $N41 $N44]
	Espionne $Ligne
	continue
	InformeSansDemander $Nom "=NbXMotifs31: $N31"
	InformeSansDemander $Nom "=NbXMotifs41: $N41"
	InformeSansDemander $Nom "=NbXMotifs44: $N44"
	lappend LaSortie $Ligne
    }
    return $LaSortie
}

proc InformeEHomsaReferencePourTous {} {
    file mkdir "[RepertoireDuGenome]/infos"
    set RepInfoEHomsa "[GscopeDatabaseDir EHomsa]/infos"
    set LesInformes {}
    foreach Nom [ListeDesPABs] {
	set FicBlast [GscopeFile $Nom blastp]
	if {[FileAbsent $FicBlast]} { continue }
	set n [DecortiqueBlast $FicBlast "" "" Query lBanqueId]
	if {$n==0} { continue }
	set Ref [lindex $lBanqueId 0]
	set LesInfosEHomsa [LesLignesDuFichier $RepInfoEHomsa/$Ref]
	set LesInfos [lrange $LesInfosEHomsa 1 end]
	set Infos [join $LesInfos "\n"]
	InformeSansDemander $Nom $Infos
	lappend LesInformes $Nom
    }
    return $LesInformes
}

proc MsfOnOneLine {Nom InDir OutDir {AliTfaDir ""} {ShowCodons ""} {DoNotUnSet ""}} {
    #rR on convertit un msf en s'aidant de l'entete d'un msf normal et éventuellemtn de l'alignement pris dans nucalitfa ou protalitfa
    #rR et on crée un msf sur une ligne en gardant les majuscules miniscules de nucalitfa ou protalitfa
    set ShowCodons [string equal -nocase $ShowCodons "ShowCodons"]

    set Mixe 0
    if {[regexp "NucProt" $OutDir]} { set Mixe 1 }
    
    set FicAliTfa ""
    if {$AliTfaDir!=""} {
	if {[regexp "/" $AliTfaDir]} {
	    set FicAliTfa $AliTfaDir
	} else {
	    set FicAliTfa [GscopeFile $Nom $AliTfaDir]
	}
    }
    if {[FileAbsent $FicAliTfa]} { set FicAliTfa "" }

    set LeMsf {}
    set OnAttendSlashSlash 1
    set OnAttendLAlignement 0
    set OnEstDansLAlignement 0
    set LesAccessSpace {}
    foreach Ligne [LesLignesDuFichier "$InDir/$Nom"] {
	if {$OnAttendSlashSlash} {
	    lappend LeMsf $Ligne
	    if {$Ligne!="//"} { continue }
	    set OnAttendSlashSlash 0
	    set OnAttendLAlignement 1
	    continue
	}
	if {$OnAttendLAlignement} {
	    if {$Ligne==""} {
		lappend LeMsf $Ligne
		continue
	    }
	    set OnAttendLAlignement 0
	    set OnEstDansLAlignement 1
	}
	if {$Ligne==""} { continue }
	if { ! [regexp -nocase {^([^ ]+ +)([^ ].*$)} $Ligne Match AccessSpace Seq]} { FaireLire "Wrong $Ligne" }
	lappend LesAccessSpace $AccessSpace
	append SeqDe($AccessSpace) $Seq
    }
    foreach AccessSpace [ListeSansDoublon $LesAccessSpace] {
	set Access [string trim $AccessSpace]
	set Seq $SeqDe($AccessSpace)
	if {$FicAliTfa!=""} { set Seq [QueLaSequenceDuTexteTFA [LaSequenceDuTFAs $FicAliTfa $Access]] }
	regsub -all " " $Seq "" Seq
	if {$ShowCodons} {
	    set LesCodons {}
	    foreach {a b c} [split $Seq ""] {
		set Codon "$a$b$c"
		set P [AAduCodon $Codon]
		if {$P=="X"} { set P "." }
		if {$Mixe} {
		    lappend LesCodons "[string tolower $Codon]$P"
		} else {
		    lappend LesCodons "$a$b$c"
		}
	    }
	    set Seq [join $LesCodons " "]
	}
	lappend LeMsf "$AccessSpace$Seq"
    }
    if {$FicAliTfa!="" && $DoNotUnSet!="DoNotUnSet"} { LaSequenceDuTFAs $FicAliTfa "UnSet" } 
    lappend LeMsf ""
    set F [SauveLesLignes $LeMsf dans "$OutDir/$Nom"]
    return $F
}

proc CreateNucAndProtTfaAndMsfFromNucAliTfaPourTous {Rep Prefixe {IndexReference ""}} {
    #rR Doit être exécuter par setgscoperr Zero car le projet Rep n'existe pas encore
    set RepNAT "$Rep/nucalitfa"
    Espionne $RepNAT
    
    file mkdir "$Rep/nuctfa"
    file mkdir "$Rep/prottfa"
    file mkdir "$Rep/protalitfa"
    file mkdir "$Rep/msfNuc"
    file mkdir "$Rep/msfNuc3"
    file mkdir "$Rep/msfProt"
    file mkdir "$Rep/msfProt3"

    set N 0
    foreach Fichier [lsort [glob $RepNAT/$Prefixe*]] {
	set Nom [file tail $Fichier]
	if {[file exists "$RepNAT/msfProt3/$Nom"]} { continue }
	if {[PasTouche $Nom]} { continue }
	Espionne $Nom
	CreateNucAndProtTfaAndMsfFromNucAliTfa $Nom $Rep $IndexReference
	FinPasTouche $Nom
	incr N
    }
    Espionne "CreateNucAndProtTfaAndMsfFromNucAliTfaPourTous en a fait $N"
    return $N
}

proc CreateProtAliTfaFromNucAliTfaForJoyPourTous {} {
    set LesR {}
    foreach Nom [ListeDesPABs] {
	set R [CreateProtAliTfaFromNucAliTfaForJoy $Nom]
	#Espionne $Nom $R
    }
    return Bravo
}

proc CreateProtAliTfaFromNucAliTfaForJoy Nom {
    set FicNucAliTfa  [GscopeFile $Nom "nucalitfa"]
    set FicProtAliTfa [GscopeFile $Nom "protalitfa"]
    if {[FileAbsent $FicNucAliTfa]} { return "" }
    set LeTFAsPro {}
    foreach Access [LaSequenceDuTFAs $FicNucAliTfa "LaListeDesAccess"] {
	set TFA [LaSequenceDuTFAs $FicNucAliTfa $Access]
	set Entete [EnteteDuTexteTFA $TFA]
	set Seq [QueLaSequenceDuTexteTFA $TFA]
	set SeqPro "" 
	foreach {a b c} [split $Seq ""] {
	    set Codon "$a$b$c"
	    set A [AAduCodon $Codon]
	    if {$A=="X"} { set A "-" }
	    if {$A=="*"} { set A "X" }
	    if {[regexp {[a-z]} $A]} { set A [string tolower $A] }
	    append SeqPro $A
	}
	lappend LeTFAsPro $Entete $SeqPro
    }
    return [SauveLesLignes $LeTFAsPro dans $FicProtAliTfa]
}

proc CreateNucAliFromProtAliPourTous {} {
    set LesR {}
    foreach Nom [ListeDesPABs] {
	set R [CreateNucAliFromProtAli $Nom]
	#Espionne $Nom $R
    }
    return Bravo
}

proc CreateNucAliFromProtAli Nom {
    set FichierMsfProt [GscopeFile $Nom msfProt]
    if {[FileAbsent $FichierMsfProt]} { return "" }

    set MsfProt [ContenuDuFichier $FichierMsfProt]
    if {[regexp "^NoSequencesToAlign" $MsfProt]} { return "" }

    set FichierMsfTfa [TmpFile].tfa
    exec clustalw $FichierMsfProt -convert -output=FASTA -outfile=$FichierMsfTfa
    set LeMsfTfaNuc {}
    foreach Access [LaSequenceDuTFAs $FichierMsfTfa "LaListeDesAccess"] {
	regsub {CDS[0-9]+$} $Access CDS Science
	set SeqProtTfa [QueLaSequenceDuFichierTFA "[JoyDir]/$Science/prottfa/$Access"]
	set SeqNucTfa  [QueLaSequenceDuFichierTFA "[JoyDir]/$Science/nuctfa/$Access"]
	Espionne $Nom $Access [expr [string length $SeqProtTfa]*3] [string length $SeqNucTfa]
	set I -1
	foreach P [split $SeqProtTfa ""] {a b c} [split $SeqNucTfa ""] {
	    incr I
	    set Codon "$a$b$c"
	    set CodonEn($I) $Codon
	    #Espionne $Access $I $P [AAduCodon $Codon] $Codon
	}
	set TfaProt [LaSequenceDuTFAs $FichierMsfTfa $Access]
	set SeqProt [QueLaSequenceDuTexteTFA $TfaProt]
	set LaSeqNucAlignee {}
	set I -1
	foreach A [split $SeqProt ""] {
	    if {$A=="-" || $A=="."} { lappend LaSeqNucAlignee "---" ; continue }
	    incr I
	    #Espionne $I $A 
	    set Codon [string toupper $CodonEn($I)]
	    lappend LaSeqNucAlignee $Codon
	}
	lappend LeMsfTfaNuc ">$Access"
	lappend LeMsfTfaNuc [join $LaSeqNucAlignee ""]
    }
    set FichierNucAliTfa [SauveLesLignes $LeMsfTfaNuc dans [GscopeFile $Nom "nucalitfa"]]
    set FichierMsfNuc [GscopeFile $Nom "msfNuc"]
    exec clustalw $FichierNucAliTfa -convert -output=gscope -outfile=$FichierMsfNuc
    MsfOnOneLine $Nom msfNuc msfNuc3     "" ShowCodons
    MsfOnOneLine $Nom msfNuc msfNucProt3 "" ShowCodons
    return $FichierMsfNuc
}

proc ReRunConvertWithClustalwPourTous {} {
    foreach Nom [ListeDesPABs] {
        Espionne $Nom
        ReRunConvertWithClustalw $Nom
    }
    return "Bravo"
}
proc ReRunConvertWithClustalw {Nom} {
    #rR Voir plus bas la bonne procedure .. 
    #rR Celle -ni ne fait que relander les création de msf et macsims

    set Rep [RepertoireDuGenome]

    set FicNucTfa      "$Rep/nuctfa/$Nom"
    set FicNucAliTfa   "$Rep/nucalitfa/$Nom"
    set FicProtAliTfa  "$Rep/protalitfa/$Nom"
    set FicProtTfa     "$Rep/prottfa/$Nom"
    set FicMsfNuc      "$Rep/msfNuc/$Nom"
    set FicMsfNuc3     "$Rep/msfNuc3/$Nom"
    set FicMsfProt     "$Rep/msfProt/$Nom"
    set FicMsfProt3    "$Rep/msfProt3/$Nom"

    if {[FileAbsent $FicNucAliTfa]} { return "" }

    exec clustalw $FicNucAliTfa -convert -output=gscope -outfile=$FicMsfNuc
    set FN [MsfOnOneLine $Nom "$Rep/msfNuc" "$Rep/msfNuc3" "nucalitfa" "ShowCodons"]

    exec clustalw $FicProtAliTfa -convert -output=gscope -outfile=$FicMsfProt
    set FP [MsfOnOneLine $Nom "$Rep/msfProt" "$Rep/msfProt3" "protalitfa" "" "DoNotUnset"]

    return [list $FicMsfNuc $FN $FicMsfProt $FP]
}

proc CreateNucAndProtTfaAndMsfFromNucAliTfa {Nom Rep {IndexReference ""}} {
    #rR Doit être exécuter par setgscoperr Zero car le projet Rep n'existe pas encore
    #rR on a les alignements nucleotidiques en FASTA aligné. On crée des msf avec une ligne par access
    #rR On garde les majuscules-miniscules
    set FicNucTfa      "$Rep/nuctfa/$Nom"
    set FicNucAliTfa   "$Rep/nucalitfa/$Nom"
    set FicProtAliTfa  "$Rep/protalitfa/$Nom"
    set FicProtTfa     "$Rep/prottfa/$Nom"
    set FicMsfNuc      "$Rep/msfNuc/$Nom"
    set FicMsfNuc3     "$Rep/msfNuc3/$Nom"
    set FicMsfProt     "$Rep/msfProt/$Nom"
    set FicMsfProt3    "$Rep/msfProt3/$Nom"

    if {$IndexReference==""} { set IndexReference 0 }

    set LesAccess [LaSequenceDuTFAs $FicNucAliTfa "LaListeDesAccess"]
    set AccessReference [lindex $LesAccess $IndexReference]
    set TFA [LaSequenceDuTFAs $FicNucAliTfa $AccessReference]

    set EnteteHs [EnteteDuTexteTFA $TFA]
    set SeqNucHs [QueLaSequenceDuTexteTFA $TFA]
    
    regsub -all -nocase {[^a-z]} $SeqNucHs "" SeqNucHsNonGap
    Sauve [SequenceFormatTFA $SeqNucHsNonGap $EnteteHs "nucbrut"] dans $FicNucTfa
    set SeqProHs ""
    foreach {a b c} [split $SeqNucHsNonGap ""] {
	set Codon "$a$b$c"
	set A [AAduCodon $Codon]
	if {$A=="*"} { set A "X" }
	append SeqProHs $A
    }
    
    Sauve [SequenceFormatTFA $SeqProHs $EnteteHs "protbrut"] dans $FicProtTfa

    set LeTFAsPro {}
    foreach Access $LesAccess {
	set TFA [LaSequenceDuTFAs $FicNucAliTfa $Access]
	set Entete [EnteteDuTexteTFA $TFA]
	set Seq [QueLaSequenceDuTexteTFA $TFA]
	set SeqPro "" 
	foreach {a b c} [split $Seq ""] {
	    set Codon "$a$b$c"
	    set A [AAduCodon $Codon]
	    if {$A=="X"} { set A "-" }
	    if {$A=="*"} { set A "X" }
	    if {[regexp {[a-z]} $A]} { set A [string tolower $A] }
	    append SeqPro $A
	}
	lappend LeTFAsPro $Entete $SeqPro
    }
    SauveLesLignes $LeTFAsPro dans $FicProtAliTfa

    exec clustalw $FicNucAliTfa -convert -output=gscope -outfile=$FicMsfNuc
    set FN [MsfOnOneLine $Nom "$Rep/msfNuc" "$Rep/msfNuc3" "nucalitfa" "ShowCodons"]
    
    exec clustalw $FicProtAliTfa -convert -output=gscope -outfile=$FicMsfProt
    set FP [MsfOnOneLine $Nom "$Rep/msfProt" "$Rep/msfProt3" "protalitfa" "" "DoNotUnset"]

    LaSequenceDuTFAs $FicNucAliTfa UnSet

    return [list $FicNucTfa $FicProtTfa $FicMsfNuc $FN $FicMsfProt $FP]    
}

proc ExtractFromExonNuc {Access {Fichier ""}} {
    #rR used to get only a subset of knowCanonical
    set TestAcc ">${Access}_"
    set FinAccess [expr [string length $TestAcc] - 1]
    if {$Fichier==""} { set Fichier "/home/ripp/circo/$Access.tfa" }
    set LeMorceau {}
    set DejaVu 0
    set OnAttend 1 
    set OnAttendLaFin 0
    foreach Ligne [LesLignesDuFichier /home/ripp/circo/knownCanonical.exonNuc.fa] {
	if {$Ligne!=""} {
	    if {$OnAttendLaFin && [string index $Ligne 0 ]==">" && [string range $Ligne 0 $FinAccess] ne $TestAcc} { break }
	    if {$OnAttend                                       && [string range $Ligne 0 $FinAccess] ne $TestAcc} { continue }
	    if {$OnAttend                                       && [string range $Ligne 0 $FinAccess] eq $TestAcc} {
		set OnAttend 0
		set OnAttendLaFin 1
		set LeMorceau [list $Ligne]
		continue
	    }
	}
	if {$OnAttend} { continue }
	lappend LeMorceau $Ligne
    }
    return [SauveLesLignes $LeMorceau dans $Fichier]
}

proc ShowXMotifs {Nom {Frame ""} {N ""} {C ""}} {
    set LesCouples {}
    foreach {K V} [XMotifs $Nom $Frame $N $C] {
	Espionne "$K $V"
	foreach Couple $V {
	    Espionne $Couple
	    lappend LesCouples $Couple
	    set LC([lindex $Couple 0]) $K
	}
    }
    set LesCouples [lsort -integer -index 0 $LesCouples]
    set Seq [string tolower [QueLaSequenceDuFichierTFA [GscopeFile $Nom nuctfa]]]
    set LesDF {}
    foreach Couple $LesCouples {
	lassign $Couple D F
	incr F 2
	lappend LesDF $D $F
    }
    Espionne $LesDF
    set LesAvant [lrange [concat [list -1] $LesDF] 0 end-1]
    set LesApres $LesDF
    Espionne $LesAvant
    Espionne $LesApres
    set Rule [string repeat ".  " [expr ([string length $Seq]+2)/3]]
    set SeQ ""
    set Reg ""
    foreach {AvD AvF} $LesAvant {ApD ApF} $LesApres {
	append SeQ [string range $Seq $AvD+1 $AvF-1] 
	append SeQ [string toupper [string range $Seq $ApD $ApF]]
	append Reg [string repeat " " [expr $AvF-$AvD-1]]
	set Info "$LC($ApD)"
	append Reg $Info
	append Reg [string repeat "." [expr 1 + $ApF - $ApD - [string length $Info]]]
		    
    }
    if {[info exists ApF]} { append SeQ [string range $Seq $ApF+1 end] }
    Affiche "$Rule\n$SeQ\n$Reg" "GrandeLargeur"
}

proc Karim {NomOuSeq {Frame ""} {NbCodons ""} {Cardinality ""}} {
    if {$NbCodons==""}    { set NbCodons 4 }
    if {$Cardinality==""} { set Cardinality 4 }
    if {$Frame==""} { set Frame 0 }
    if {[EstUnPAB $NomOuSeq]} {
	set Seq [QueLaSequenceDuFichierTFA [GscopeFile $NomOuSeq nuctfa]]
    } elseif {[file exists $NomOuSeq]} {
	set Seq [QueLaSequenceDuFichierTFA $NomOuSeq]
    } else {
	set Seq $NomOuSeq
    }
    ################## no no no set Seq [string range $Seq $Frame end]
    set Seq [string toupper $Seq]
    append Seq "AAAAAA"

    set DeleteMe 1
    set Fasta "[TmpFile].tfa"
    Sauve [SequenceFormatTFA $Seq "ForKarim" "nucbrut"] dans $Fasta

    set R [exec java -jar /home/julie/NetBeansProjects/CircularCode/dist/CircularCode.jar -seq $Fasta -window $NbCodons -unique $Cardinality]
    #set R [exec java -jar /home/ripp/karim/cc.jar -seq $Fasta -window $NbCodons -unique $Cardinality]
    if {$DeleteMe} { file delete $Fasta }
    set LesHits {}
    foreach Ligne [split $R "\n"] {
	if { ! [regexp {^([^\,]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+)$} $Ligne Match S D F L Fr C]} { continue }
	if {$Fr!=$Frame} { continue }
	set LesCodons [split $S " "]
	incr D -1
	incr F -3
	incr D -$Frame
	incr F -$Frame
	lappend LesHits [list $D $F $LesCodons]
    }
    foreach Hit $LesHits {
	lassign $Hit D F LesCodons
	set Long [expr {($F-$D)/3+1}]
	if {$Long<$NbCodons} { continue }
	set Card [llength [lsort -unique $LesCodons]]
	if {$Card<$Cardinality} { continue }
	lappend Result($Long,$Card) [list [expr $D + $Frame] [expr $F + $Frame]]
    }
    #parray Result
    #Espionne [array get Result]
    return [array get Result]    
}

proc XMotifs {NomOuSeq {Frame ""} {NbCodons ""} {Cardinality ""}} {
    #rR returns the array Result  with Result(length,card) containing the list os (startFirstCodon,StartLastCodon)
    if {$NbCodons==""}    { set NbCodons 4 }
    if {$Cardinality==""} { set Cardinality 4 }
    if {$Frame==""} { set Frame 0 }

    set FicNuc [GscopeFile $NomOuSeq nuctfa]
    if {[file exists $FicNuc]} {
	set Seq [QueLaSequenceDuFichierTFA $FicNuc]
    } else {
	set Seq $NomOuSeq
    }
    set Seq [string range $Seq $Frame end]
    set Seq [string toupper $Seq]
    append Seq "NNNNNN"
    set I -3
    set D ""
    set F ""
    set LesHits {}
    set LesCodons {}
    foreach {a b c} [split $Seq {}] {
	incr I 3
	set Codon "$a$b$c"
	if {[IsX0 $Codon]} {
	    if {$D==""} { set D $I }
	    set F $I
	    lappend LesCodons $Codon 
	} else {
	    if {$D==""} { continue }
	    lappend LesHits [list $D $F $LesCodons]
	    set D ""
	    set LesCodons {}
	}
    }
    foreach Hit $LesHits {
	lassign $Hit D F LesCodons
	set Long [expr {($F-$D)/3+1}]
	if {$Long<$NbCodons} { continue }
	set Card [llength [lsort -unique $LesCodons]]
	if {$Card<$Cardinality} { continue }
	lappend Result($Long,$Card) [list [expr $D + $Frame] [expr $F + $Frame]]
    }
    #parray Result
    #Espionne [array get Result]
    return [array get Result]
}

proc IsX0 {Codon} {
    #rR you can get the list of codon from CirCode or X0 or IsX0 (CirCode is the best manner)
    global IsX0
    if {$Codon=="Reset"} {
	if {[info exists IsX0]} { unset IsX0 }
	return
    }
    set LesAA {}
    set Codon [string toupper $Codon]
    if {[info exists IsX0($Codon)]} { return $IsX0($Codon) }
    if {[info exists IsX0("EstCharge")]} { return 0 }
    set IsX0("EstCharge") 1
    set LesX0 [CirCode]
    foreach C $LesX0 {
	lappend LesAA [AAduCodon $C]
    }
    foreach X $LesX0 {
	set IsX0($X) 1
    } 
    set IsX0(LISTOFCODONS) $LesX0
    set IsX0(LISTOFAAS)    $LesAA
    return [IsX0 $Codon]
}

proc X0 {{GetWhat ""}} {
    #rR you can get the list of codon from CirCode or X0 or IsX0 (CirCode is the best manner)
    if {$GetWhat==""} { set GetWhat "GetCodons" }
    if {[regexp -nocase "codon" $GetWhat]} { return [CirCode] }
    
    foreach Codon [CirCode] {
	lappend LesAA [AAduCodon $Codon]
    }
    if {[regexp -nocase "NiceA" $GetWhat]} { return [join $LesAA "   "] }
    return $LesAA
}


proc TestRandomCodonMatrix {} {
    Espionne 01 ListOf Codon 0 [RandomCodonMatrix 01 ListOf Codon 0]
    Espionne 02 ListOf Codon 0 [RandomCodonMatrix 02 ListOf Codon 0]
    Espionne RandomCodonMatrix 01 AAC AAT 0 [RandomCodonMatrix 01 AAC AAT 0] RandomCodonMatrix 01 AAC AAT 0
    Espionne RandomCodonMatrix 02 ACT AGG 0 [RandomCodonMatrix 02 ACT AGG 0] RandomCodonMatrix 02 ACT AGG 0
    Espionne 01 ListOf Codon 0 [RandomCodonMatrix 01 ListOf Codon 0]
}

proc RandomCodonMatrix {R {Qui ""} {Quoi ""} {Frame ""}} {
    global CodonMatrix
    global RandomCodonMatrix
    if {[info exists RandomCodonMatrix] && $RandomCodonMatrix!=$R} {
	if {[info exist CodonMatrix]} { unset CodonMatrix }
    }
    set RandomCodonMatrix $R
    CirCode DefaultCirCode $R
    Espionne [CirCode DefaultCirCode] [info exist CodonMatrix]
    return [CodonMatrix $Qui $Quoi $Frame]
}

proc PrintCodonMatrix {Frame {Norm ""} {Random ""}} {
    #rR ATTENTION since 2018/03/07 CodonMatrix is no more a symmetric matrix
    global CodonMatrix   ; #rR I added this global to unset it if we change Random
    global IsX0
    global PreviousRandom

    if {$Random!="" && [info exists PreviousRandom] && $PreviousRandom!=$Random} {
	if {[info exists CodonMatrix]} { unset CodonMatrix }
	if {[info exists IsX0]}        { unset IsX0 }
    }
    set PreviousRandom $Random

    set Tabulated 0
    if {[regexp -nocase tab $Norm]} {
	set Tabulated 1
	regsub -nocase tab $Norm "" Norm
    }
    if {$Random!=""} { CirCode DefaultCirCode $Random }

    set OnlyCirCodeCodons 0 
    if {$OnlyCirCodeCodons} {
	set CodonsFromCirCode [CodonMatrix ListOf Codon $Frame]
    } else {
	set CodonsFromCirCode {}
	foreach Codon [CodonMatrix ListOf Codon $Frame] {
	    if {$Codon ni [CirCode]} { continue }
	    lappend CodonsFromCirCode $Codon
	}
    }
    foreach CI [CodonMatrix ListOfAll Codon $Frame] {
	foreach CJ [CodonMatrix ListOf Codon $Frame] {
	    set V($CI,$CJ) [CodonMatrix $CJ $CI $Norm$Frame] ; #rR Attention CI CJ are exchanged 
            #Espionne $CI $CJ =$V($CI,$CJ)=
            if {$V($CI,$CJ)=="650"} { Espionne $CI $CJ }
	    if {$V($CI,$CJ)==""} { set V($CI,$CJ) 0 } 
	}
    }
    set LesAAs {}
    foreach Codon $CodonsFromCirCode {
	lappend LesAAs [AAduCodon $Codon] 
    }
    lappend LaSortie ". . ...       [join $LesAAs {       }]"
    lappend LaSortie ". . ...     [join $CodonsFromCirCode {     }]"
    ######################################################################### foreach CI [CodonMatrix ListOf Codon $Frame] 
    foreach CI [CodonMatrix ListOfAll Codon] {
	set TheResults {}
	foreach CJ $CodonsFromCirCode {
	    if {$OnlyCirCodeCodons && $CJ ni [CirCode]} { continue }
            set Value 0
            if {[info exists V($CI,$CJ)]} { set Value $V($CI,$CJ) }
	    if {$Norm==""} {
		lappend TheResults [format "%7d" $Value]
	    } else {
		set Value [expr round($Value)]
		lappend TheResults [format "%7d" $Value]
	    }
	}
	set IsX "."
	if {[IsX0 $CI]} { set IsX "X" }
	lappend LaSortie "[AAduCodon $CI] $IsX $CI [join $TheResults { }]"
    }
    set Sortie [join $LaSortie "\n"]
    if {$Tabulated} {
	regsub -all { +} $Sortie "\t" Sortie
    }
    return $Sortie
}

proc PrintBothCodonMatrix {Frame {Norm ""} {Random ""}} {
    set Tabulated 0
    if {[regexp -nocase tab $Norm]} {
	set Tabulated 1
	regsub -nocase tab $Norm "" Norm
    }
    if {$Random!=""} { CirCode DefaultCirCode $Random }
    set OnlyCirCodeCodons 0 
    if {$OnlyCirCodeCodons} {
	set CodonsFromCirCode [CodonMatrix ListOf Codon $Frame]
    } else {
	set CodonsFromCirCode {}
	foreach Codon [CodonMatrix ListOf Codon $Frame] {
	    if {$Codon ni [CirCode]} { continue }
	    lappend CodonsFromCirCode $Codon
	}
    }
    foreach CI [CodonMatrix ListOf Codon $Frame] {
	foreach CJ [CodonMatrix ListOf Codon $Frame] {
	    set V($CI,$CJ) [CodonMatrix $CI $CJ $Norm$Frame]
	    if {$V($CI,$CJ)==""} { set V($CI,$CJ) 0 } 
	}
    }
    set LesAAs {}
    foreach Codon $CodonsFromCirCode {
	lappend AAs [AAduCodon $Codon] 
    }
    lappend LaSortie ". . ...       [join $AAs {       }]"
    lappend LaSortie ". . ...     [join $CodonsFromCirCode {     }]"
    foreach CI [CodonMatrix ListOf Codon $Frame] {
	set TheResults {}
	foreach CJ $CodonsFromCirCode {
	    if {$OnlyCirCodeCodons && $CJ ni [CirCode]} { continue }
	    if {$Norm==""} {
		set Value $V($CI,$CJ)
		lappend TheResults [format "%7d" $Value]
	    } else {
		set Value [expr round(100000*$V($CI,$CJ))]
		lappend TheResults [format "%7d" $Value]
	    }
	}
	set IsX0 "."
	if {[IsX0 $CI]} { set IsX0 "X" }
	lappend LaSortie "[AAduCodon $CI] $IsX0 $CI [join $TheResults { }]"
    }
    set Sortie [join $LaSortie "\n"]
    if {$Tabulated} {
	regsub -all { +} $Sortie "\t" Sortie
    }
    return $Sortie
}

proc CodonMatrixNotModified {{Qui ""} {Quoi ""} {Frame ""}} {
    global CodonMatrix

    set UseDiagonal 1

    set Qui  [string toupper $Qui]
    set Quoi [string toupper $Quoi]
    if {[info exists CodonMatrix($Frame,$Qui,$Quoi)]} { return $CodonMatrix($Frame,$Qui,$Quoi) }
    if {[info exists CodonMatrix("EstCharge")]} {
	if {[info exists CodonMatrix($Frame,$Quoi,$Qui)]} { return $CodonMatrix($Frame,$Quoi,$Qui) }
	return 0
    }
    set CodonMatrix("EstCharge") 1

    set OnlyCirCodeCodons 0 

    #array set CodonMatrix [ContenuDuFichier [CodonMatrixFile]]
    array set CodonMatrix [ContenuDuFichier [CodonMatrixFileHuman]]

    foreach K [array names CodonMatrix] {
	lassign [split $K ","] F C1 C2
	#if {[regexp -nocase {(count|charge|sum|codon|norm|text|list|frame)} $K]} { continue }
	if { ! [regexp -nocase {^[ATGC][ATGC][ATGC]$} $C1]} { continue }
	lappend CodonMatrix(LISTOF,FRAME,) $F
	lappend CodonMatrix($F,LISTOF,CODON) $C1 $C2
    }
    set CodonMatrix(LISTOF,FRAME,) [lsort -unique $CodonMatrix(LISTOF,FRAME,)]
    foreach F $CodonMatrix(LISTOF,FRAME,) {
	set CodonMatrix($F,LISTOF,CODON) [lsort -unique $CodonMatrix($F,LISTOF,CODON)]
	set Lines {}
	set LinesNorm {}
	set LinesNormCirCode {}      ;#rR attention this line was not there before 2018/02/14 
        set LinesNormColumn {}       ;#rR attention this line was not there before 2018/02/14
	set Sum 0
	set SumCirCode 1
	set HowMany 0
	foreach CJ $CodonMatrix($F,LISTOF,CODON) {
	    set SumForColumn($F,$CJ) 0
	    if { ! [IsX0 $CJ] } { continue }
	    foreach CI $CodonMatrix($F,LISTOF,CODON) {
		if {($UseDiagonal || $CJ!=$CI) && [info exists CodonMatrix($F,$CI,$CJ)]} {
		    set V $CodonMatrix($F,$CI,$CJ)
		    incr SumForColumn($F,$CJ) $V
		    incr HowMany
		    incr Sum $V
		    if { $CJ in [CirCode]} { incr SumCirCode $V }
		}
	    }
	}
	foreach CI $CodonMatrix($F,LISTOF,CODON) {
	    set Line {}
	    foreach CJ $CodonMatrix($F,LISTOF,CODON) {
		if { ! [info exists TotalNormColumn($F,$CJ)]} { set TotalNormColumn($F,$CJ) 0 }
		set V 0
		if {[info exists CodonMatrix($F,$CI,$CJ)]} { set V $CodonMatrix($F,$CI,$CJ) }
		if {[info exists CodonMatrix($F,$CJ,$CI)]} { set V $CodonMatrix($F,$CJ,$CI) }
		lappend Line $V	
		set Norm [expr (1.0*$V)/$Sum]
		lappend LineNorm $Norm
		set CodonMatrix(Norm$F,$CI,$CJ) $Norm 

		set NormCirCode [expr (1.0*$V)/$SumCirCode]
		lappend LineNormCirCode $NormCirCode
		set CodonMatrix(NormCirCode$F,$CI,$CJ) $NormCirCode 
		if {$SumForColumn($F,$CJ)==0} {
		    set NormColumn 0
		} else {
		    set NormColumn [expr (0.01*$V)/$SumForColumn($F,$CJ)]
		}
		set TotalNormColumn($F,$CJ) [expr $TotalNormColumn($F,$CJ)+$NormColumn]
		lappend LineNormColumn $NormColumn
		set CodonMatrix(NormColumn$F,$CI,$CJ) $NormColumn 
	    }
	    lappend Lines            [join $Line "\t"]
	    lappend LinesNorm        [join $LineNorm "\t"]
	    lappend LinesNormCirCode [join $LineNormCirCode "\t"]
	    lappend LinesNormColumn  [join $LineNormColumn "\t"]
	}
	foreach CJ $CodonMatrix($F,LISTOF,CODON) {
	    if { ! [IsX0 $CJ] } { continue }
	    #Espionne $F $CJ $TotalNormColumn($F,$CJ) $SumForColumn($F,$CJ)
	}
	    
	set CodonMatrix($F,GET,HOWMANY)     $HowMany
	set CodonMatrix($F,GET,TEXT)        [join $Lines "\n"]
	set CodonMatrix($F,GET,NORM)        [join $LinesNorm "\n"]
	set CodonMatrix($F,GET,NORMCIRCODE) [join $LinesNormCirCode "\n"]
	set CodonMatrix($F,GET,NORMCOLUMN)  [join $LinesNormColumn "\n"]
	set CodonMatrix($F,SUM,SUBSTITUTION) $Sum
	set CodonMatrix($F,SUMCIRCODE,SUBSTITUTION) $SumCirCode
    }
    return [CodonMatrix $Qui $Quoi $Frame]    
}

proc CodonMatrix {{Qui ""} {Quoi ""} {Frame ""}} {
    #rR there is a problem with the defintion of CodonMatrix(LISTOF,CODON) do we use 20 or 57 or 64 ?
    global CodonMatrix

    set Qui  [string toupper $Qui]
    set Quoi [string toupper $Quoi]
    if {[info exists CodonMatrix($Frame,$Qui,$Quoi)]} { return $CodonMatrix($Frame,$Qui,$Quoi) }
    if {[info exists CodonMatrix("EstCharge")]} {
	return 0
    }
    set CodonMatrix("EstCharge") 1

    set OnlyCirCodeCodons 0 

    #array set CodonMatrix [ContenuDuFichier [CodonMatrixFile]]
    array set CodonMatrix [ContenuDuFichier [CodonMatrixFileHuman]]

    foreach K [array names CodonMatrix] {
	lassign [split $K ","] F C1 C2
	#if {[regexp -nocase {(count|charge|sum|codon|norm|text|list|frame)} $K]} { continue }
	if { ! [regexp -nocase {^[ATGC][ATGC][ATGC]$} $C1]} { continue }
	lappend CodonMatrix(LISTOF,FRAME,) $F
	lappend CodonMatrix($F,LISTOFALL,CODON) $C1 $C2
	lappend CodonMatrix(,LISTOFALL,CODON)   $C1 $C2
    }
    set CodonMatrix(,LISTOFALL,CODON) [lsort -unique $CodonMatrix(,LISTOFALL,CODON)]
    set CodonMatrix(LISTOF,FRAME,)    [lsort -unique $CodonMatrix(LISTOF,FRAME,)]
    foreach F $CodonMatrix(LISTOF,FRAME,) {
        if { ! [info exists CodonMatrix($F,LISTOFALL,CODON)]} { set CodonMatrix($F,LISTOFALL,CODON) {} }
	set CodonMatrix($F,LISTOFALL,CODON) [lsort -unique $CodonMatrix($F,LISTOFALL,CODON)]
	set CodonMatrix($F,LISTOF,CODON) [CirCode]
	#Espionne CodonMatrix($F,LISTOF,CODON) [CirCode]
	set Lines {}
	set LinesNorm {}
	set LinesNormCirCode {}
        set LinesNormColumn {}
	set Sum 0
	set SumCirCode 1
	set HowMany 0
        #rR Here ?
	foreach CJ $CodonMatrix($F,LISTOF,CODON) {
	    set SumForColumn($F,$CJ) 0
	    #if { ! [IsX0 $CJ] } { continue }
	    foreach CI $CodonMatrix($F,LISTOFALL,CODON) {
		if {[info exists CodonMatrix($F,$CJ,$CI)]} {
		    set V $CodonMatrix($F,$CJ,$CI)
		    #Espionne $V
		    incr SumForColumn($F,$CJ) $V
		    incr HowMany
		    incr Sum $V
		    #if { $CJ in [CirCode]} { incr SumCirCode $V }
		}
	    }
	    #Espionne $CJ $SumForColumn($F,$CJ)
	}
        #rR Here ?
	foreach CJ $CodonMatrix($F,LISTOF,CODON) {
	    set Line {}
	    foreach CI $CodonMatrix($F,LISTOFALL,CODON) {
		if { ! [info exists TotalNormColumn($F,$CJ)]} { set TotalNormColumn($F,$CJ) 0 }
		set V 0
		if {[info exists CodonMatrix($F,$CJ,$CI)]} { set V $CodonMatrix($F,$CJ,$CI) }
		#if {[info exists CodonMatrix($F,$CJ,$CI)]} { set V $CodonMatrix($F,$CJ,$CI) }
		lappend Line $V	
		set Norm [expr (1.0*$V)/$Sum]
		lappend LineNorm $Norm
		set CodonMatrix(Norm$F,$CI,$CJ) $Norm 

		#set NormCirCode [expr (1.0*$V)/$SumCirCode]
		#lappend LineNormCirCode $NormCirCode
		#set CodonMatrix(NormCirCode$F,$CJ,$CI) $NormCirCode 
		if {$SumForColumn($F,$CJ)==0} {
		    set NormColumn 0
		} else {
		    set NormColumn [expr (1000.0*$V)/$SumForColumn($F,$CJ)]
		}
		set TotalNormColumn($F,$CJ) [expr $TotalNormColumn($F,$CJ)+$NormColumn]
		lappend LineNormColumn $NormColumn
		set CodonMatrix(NormColumn$F,$CJ,$CI) $NormColumn
		#Espionne $SumForColumn($F,$CJ)
	    }
	    lappend Lines            [join $Line "\t"]
	    lappend LinesNorm        [join $LineNorm "\t"]
	    #lappend LinesNormCirCode [join $LineNormCirCode "\t"]
	    lappend LinesNormColumn  [join $LineNormColumn "\t"]
	}
	#foreach CJ $CodonMatrix($F,LISTOF,CODON) {
	    #if { ! [IsX0 $CJ] } { continue }
	    #Espionne $F $CJ $TotalNormColumn($F,$CJ) $SumForColumn($F,$CJ)
	#}
	    
	set CodonMatrix($F,GET,HOWMANY)     $HowMany
	set CodonMatrix($F,GET,TEXT)        [join $Lines "\n"]
	set CodonMatrix($F,GET,NORM)        [join $LinesNorm "\n"]
	#set CodonMatrix($F,GET,NORMCIRCODE) [join $LinesNormCirCode "\n"]
	set CodonMatrix($F,GET,NORMCOLUMN)  [join $LinesNormColumn "\n"]
	set CodonMatrix($F,SUM,SUBSTITUTION) $Sum
	set CodonMatrix($F,SUMCIRCODE,SUBSTITUTION) $SumCirCode
        #set CodonMatrix($F,LISTOF,CODON) [CirCode]                           ;#rR Outside we use only 20 codons
    }
    return [CodonMatrix $Qui $Quoi $Frame]    
}


proc CodonMatrixRaymond {{Qui ""} {Quoi ""} {Frame ""}} {
    #rR there is a problem with the defintion of CodonMatrix(LISTOF,CODON) do we use 20 or 57 or 64 ?
    global CodonMatrix

    set UseDiagonal 1

    set Qui  [string toupper $Qui]
    set Quoi [string toupper $Quoi]
    if {[info exists CodonMatrix($Frame,$Qui,$Quoi)]} { return $CodonMatrix($Frame,$Qui,$Quoi) }
    if {[info exists CodonMatrix("EstCharge")]} {
	return 0
    }
    set CodonMatrix("EstCharge") 1

    set OnlyCirCodeCodons 0 

    #array set CodonMatrix [ContenuDuFichier [CodonMatrixFile]]
    array set CodonMatrix [ContenuDuFichier [CodonMatrixFileHuman]]

    foreach K [array names CodonMatrix] {
	lassign [split $K ","] F C1 C2
	#if {[regexp -nocase {(count|charge|sum|codon|norm|text|list|frame)} $K]} { continue }
	if { ! [regexp -nocase {^[ATGC][ATGC][ATGC]$} $C1]} { continue }
	lappend CodonMatrix(LISTOF,FRAME,) $F
	lappend CodonMatrix($F,LISTOFALL,CODON) $C1 $C2
	lappend CodonMatrix(,LISTOFALL,CODON)   $C1 $C2
    }
    set CodonMatrix(,LISTOFALL,CODON) [lsort -unique $CodonMatrix(,LISTOFALL,CODON)]
    set CodonMatrix(LISTOF,FRAME,)    [lsort -unique $CodonMatrix(LISTOF,FRAME,)]
    foreach F $CodonMatrix(LISTOF,FRAME,) {
        if { ! [info exists CodonMatrix($F,LISTOFALL,CODON)]} { set CodonMatrix($F,LISTOFALL,CODON) {} }
	set CodonMatrix($F,LISTOFALL,CODON) [lsort -unique $CodonMatrix($F,LISTOFALL,CODON)]
	set Lines {}
	set LinesNorm {}
	set LinesNormCirCode {}
        set LinesNormColumn {}
	set Sum 0
	set SumCirCode 1
	set HowMany 0
        #rR Here ?
	foreach CJ $CodonMatrix($F,LISTOFALL,CODON) {
	    set SumForColumn($F,$CJ) 0
	    if { ! [IsX0 $CJ] } { continue }
	    foreach CI $CodonMatrix($F,LISTOFALL,CODON) {
		if {($UseDiagonal || $CJ!=$CI) && [info exists CodonMatrix($F,$CI,$CJ)]} {
		    set V $CodonMatrix($F,$CI,$CJ)
		    incr SumForColumn($F,$CJ) $V
		    incr HowMany
		    incr Sum $V
		    if { $CJ in [CirCode]} { incr SumCirCode $V }
		}
	    }
	}
        #rR Here ?
	foreach CI $CodonMatrix($F,LISTOFALL,CODON) {
	    set Line {}
	    foreach CJ $CodonMatrix($F,LISTOFALL,CODON) {
		if { ! [info exists TotalNormColumn($F,$CJ)]} { set TotalNormColumn($F,$CJ) 0 }
		set V 0
		#if {[info exists CodonMatrix($F,$CI,$CJ)]} { set V $CodonMatrix($F,$CI,$CJ) }
		#if {[info exists CodonMatrix($F,$CJ,$CI)]} { set V $CodonMatrix($F,$CJ,$CI) }
		lappend Line $V	
		set Norm [expr (1.0*$V)/$Sum]
		lappend LineNorm $Norm
		set CodonMatrix(Norm$F,$CI,$CJ) $Norm 

		set NormCirCode [expr (1.0*$V)/$SumCirCode]
		lappend LineNormCirCode $NormCirCode
		set CodonMatrix(NormCirCode$F,$CI,$CJ) $NormCirCode 
		if {$SumForColumn($F,$CJ)==0} {
		    set NormColumn 0
		} else {
		    set NormColumn [expr (0.01*$V)/$SumForColumn($F,$CJ)]
		}
		set TotalNormColumn($F,$CJ) [expr $TotalNormColumn($F,$CJ)+$NormColumn]
		lappend LineNormColumn $NormColumn
		set CodonMatrix(NormColumn$F,$CI,$CJ) $NormColumn 
	    }
	    lappend Lines            [join $Line "\t"]
	    lappend LinesNorm        [join $LineNorm "\t"]
	    lappend LinesNormCirCode [join $LineNormCirCode "\t"]
	    lappend LinesNormColumn  [join $LineNormColumn "\t"]
	}
	foreach CJ $CodonMatrix($F,LISTOFALL,CODON) {
	    if { ! [IsX0 $CJ] } { continue }
	    #Espionne $F $CJ $TotalNormColumn($F,$CJ) $SumForColumn($F,$CJ)
	}
	    
	set CodonMatrix($F,GET,HOWMANY)     $HowMany
	set CodonMatrix($F,GET,TEXT)        [join $Lines "\n"]
	set CodonMatrix($F,GET,NORM)        [join $LinesNorm "\n"]
	set CodonMatrix($F,GET,NORMCIRCODE) [join $LinesNormCirCode "\n"]
	set CodonMatrix($F,GET,NORMCOLUMN)  [join $LinesNormColumn "\n"]
	set CodonMatrix($F,SUM,SUBSTITUTION) $Sum
	set CodonMatrix($F,SUMCIRCODE,SUBSTITUTION) $SumCirCode
        set CodonMatrix($F,LISTOF,CODON) [CirCode]                           ;#rR Outside we use only 20 codons
    }
    return [CodonMatrix $Qui $Quoi $Frame]    
}

proc Sum {F} {
    set Whole 0
    set Sum 0
    set Upper 0
    foreach CI [CodonMatrix LISTOF CODON $F] {
	foreach CJ [CodonMatrix LISTOF CODON $F] {
	    if { ! [IsX0 $CJ] } { continue }
	    set V [CodonMatrix $CI $CJ $F]
	    #Espionne "$CI $CJ $V"
	    incr Whole $V
	    if {[info exists AlreadySeen($CJ,$CI)]} { incr Upper $V ; continue }
	    set  AlreadySeen($CI,$CJ) 1
	    incr Sum $V
	    incr J
	}
	incr I
    }
    return "$Upper $Sum $Whole"
}

proc TestCM {} {
    array set CodonMatrix [ContenuDuFichier "/gl/MAMF/01_CodonMatrix.txt"]
    parray CodonMatrix
    set Sum 0
    foreach K [array names CodonMatrix "0,*"] {
	if {[regexp -nocase count $K]} { continue }
	Espionne $K
	incr Sum $CodonMatrix($K)
    }
    Espionne $Sum
    return $Sum
}

proc TestCodonMatrix {} {
    set T 0
    foreach V [LesMotsDuTexte [CodonMatrix Get Text 0]] {
	incr T $V
    }
    Espionne $T
    Espionne [CodonMatrix Sum Substitution 0]

    set T64 [CodonMatrix Sum Substitution 3]
    set T20 [CodonMatrix Sum Substitution 0]
    set T64_20 [expr ($T64*20)/64]
    set R [expr ($T20*100)/$T64_20]
    Espionne $R
    return 
} 

proc TestCirCode {} {
    Espionne [CirCode]
    Espionne [CirCode DefaultCirCode]
    Espionne [CirCode DefaultCirCode 01]
    Espionne [CirCode]
    Espionne [CirCode DefaultCirCode]
    Espionne [CirCode]
    Espionne [CirCode DefaultCirCode 00]
    Espionne [CirCode DefaultCirCode]
    Espionne [CirCode]
}

proc CirCodeFor {CC {Qui ""} {Quoi ""}} {
    #don't use it !!!
    set Memo [CirCode DefaultCirCode]
    CirCode DefaultCirCode $CC
    Espionne [CirCode DefaultCirCode]
    set Value [CirCode $Qui $Quoi]
    CirCode DefaultCirCode $Memo
    return $Value
}

proc CreeCirCode {} {
    set I 30
    set LaListe {}
    NousAllonsAuBoulot "/gstock"
    foreach Ligne [LesLignesDuFichier /gl/MAMA/70] {
	incr I
	if {[FileAbsent     MAMA$I]} { 	exec ln -s MAMA MAMA$I }
	if {[FileAbsent /gl/MAMA$I]} { 	exec ln -s /gstock/MAMA$I /gl/MAMA$I }
	set Ligne [string trim $Ligne]
	lappend LaListe "    set R($I) \[list $Ligne\]" 
    }
    OnRevientDuBoulot
    return $LaListe
    exit
}

proc CirCode {{Qui ""} {Quoi ""}} {
    #rR Be carefull : if you don't set DefaultCircode it is 00 except if you are in setgscope MAMAxy (01 ... 30)
    #rR  ... and you have to be in the same runing process when you set DefaultCircode
    #rR
    #rR you can get the list of codon from CirCode or X0 or IsX0 (CirCode is the best manner)
    #rR CirCode xy                   returns the corresponding list of codons
    #rR CirCode DefaultCirCode       returns the DefaultCirCode value (ie 00 or 01 ... or 30)
    #rR CirCode DefaultCirCode xy    sets the DefaultCirCode to xy
    #rR CirCode ListOf Codon         from the DefaultCirCode
    #rR CirCode ListOf AA            from the DefaultCirCode (1 letter amino acid)
    #rR CirCode ListOf AA3           from the DefaultCirCode (3 letters amino acid)
    global DefaultCirCode
    set Qui  [string toupper $Qui]
    set Quoi [string toupper $Quoi]

    set R(00) [list AAC AAT ACC ATC ATT CAG CTC CTG GAA GAC GAG GAT GCC GGC GGT GTA GTC GTT TAC TTC]
    set R(01) [list AAC AAT ACA ACT AGG ATA ATT CAA CAG CTC CTG GCC GCG GCT GGC GTA GTC GTT TGC TGT]
    set R(02) [list ACT AGG AGT ATA ATG CAA CAG CCA CCG CTC GAA GAG GCT GGC TAC TAT TCC TCT TGG TTG]
    set R(03) [list AAT ACC AGA ATT CCT CGA CGG CTA CTC CTG GAA GAC GAT GCC GCG GGT GTG TAC TAT TTA]
    set R(04) [list ACC AGA AGG ATA ATC CCG CCT CGC CTA CTC CTG CTT GAA GAT GCA GGA GTA GTG TGT TTA]
    set R(05) [list AAC AAG ACA AGC CCA CGA CTG CTT GAG GCA GCC GGC GTA GTT TAC TAT TCA TCT TGG TGT]
    set R(06) [list AAC ACG AGA AGG ATA CCT CGC CGG CGT CTA CTG GAA GAC GCT GTA TAT TCC TGC TTA TTG]
    set R(07) [list AAT ACT AGT ATC CAA CCT CGA CTG GAC GAG GAT GCA GCG GCT GTA TAC TAT TCC TCG TGG]
    set R(08) [list AAG ACG AGG ATA ATG CAT CCA CGG CGT CTT GAC GCA GCC GCT GGC TAC TAT TCA TTA TTG]
    set R(09) [list AAG ACG ACT AGG AGT ATC CAA CAG CCT CGA CGC CTG CTT GCA GGT GTG GTT TAC TAT TCA]
    set R(10) [list ACC ACT AGA AGT ATG CAG CAT CCA CGC CTT GAA GAT GCA GCT GGA GGC GTA TCT TGT TTC]
    set R(11) [list AAC AAT ACA ACT AGG AGT ATA CAT CGC CTA CTC GAC GCA GCC GGC GTC GTT TGG TGT TTG]
    set R(12) [list AAG ACG ACT AGG ATA CAA CAC CAG CCT CGT CTA GAG GCA GCC GTG GTT TAT TCG TCT TTG]
    set R(13) [list AAC AAT AGA AGC ATT CAG CCT CGC CGG CTA GAC GAT GCC GGC GGT GTA TAT TCA TTC TTG]
    set R(14) [list ACA ACC ACG AGA AGG ATC ATT CAC CAT CCT CGT GAG GCA GGA GGC GTT TGC TGT TTA TTC]
    set R(15) [list AAC ACA ACC AGC AGG ATA CAT CGC CGG CTT GCA GGA GTA GTG TAC TCG TCT TGG TTA TTC]
    set R(16) [list AAC ACC ACG ACT AGA AGG ATA ATC ATG CAA CCG CCT CGT GCG GTG TCG TGG TTA TTC TTG]
    set R(17) [list AAC AAG ACA ACG ACT AGC AGG CAT CGA CTA CTC GAG GGA GTT TCC TCT TGC TGG TTC TTG]
    set R(18) [list AAT ACT AGC AGG ATA ATC ATG CAA CGC CTA CTC GAG GCC GCT GTA GTC GTT TAC TCG TGG]
    set R(19) [list AAC AGA AGG AGT ATA CAG CCA CGA CGG CTA CTG CTT GAC GGA GTC GTT TAT TCC TCG TTC]
    set R(20) [list AAT AGA AGG CAA CAG CCA CGG CTC CTG GAC GCA GCT GTA GTC GTG TAC TAT TCA TTC TTG]
    set R(21) [list AAG ACA ACC ACT ATA ATG ATT CAA CAT CGA CGG CTG CTT GAG GCG GCT GGC GTG TCT TTC]
    set R(22) [list ACA AGG AGT ATG ATT CAT CCG CGA CTC CTT GAA GAC GAG GCA GCG GTA TAC TCT TGC TTC]
    set R(23) [list AAC ACA ACT AGC ATA CAA CAT CCG CTT GAA GAC GCG GCT GGT GTA GTC TCG TCT TGG TGT]
    set R(24) [list ACA AGA AGT ATA ATC CAG CAT CCT CGC CTA CTC GAG GCG GGA GTA TAC TCG TCT TGG TGT]
    set R(25) [list ACG ACT AGG ATC CAA CAG CAT CGA CTG GAT GCC GCG GGT GTA GTC TAC TAT TCA TGC TTA]
    set R(26) [list AAT ATC ATG CAA CAC CAG CAT CGG CGT CTA GAC GAG GCG GGC GTA TAT TCA TCT TGC TGT]
    set R(27) [list ACA ACC ACG AGT ATG CAG CTA CTG GAC GCA GCC GCT GGA GTA GTC GTT TAT TCA TCG TTA]
    set R(28) [list AAC AAT ACA AGG AGT ATC ATT CAA CAC CAG CCG CGG CTG CTT GAT GCG GGT TCG TCT TGT]
    set R(29) [list ACA AGG AGT ATC ATG CCG CGA CTA GAG GCA GCG GGA GTA TAC TCA TCC TCG TCT TTA TTC]
    set R(30) [list AAG AAT ACC ATA ATT CAA CAC CCA CGG CGT CTG GAC GCA GCG GGC GTC GTT TAT TGT TTG]
    set R(31) [list AGA AGC AGG AGT ATA ATG CAA CCG CGA CGT CTA CTT GAT GCA GCC GTA GTT TCC TGC TTC]
    set R(32) [list AAT ACA ACG ATA ATC ATG ATT CAA CGC CGG CTA CTC GAC GCT GGC GGT GTC TCA TGG TGT]
    set R(33) [list ACA AGT ATC ATG CAA CAT CCT CGA CTA CTG CTT GAC GAT GCG GGA GGC GTA GTT TCA TCG]
    set R(34) [list AAT ACA ACT AGG ATA ATC ATG CCG CCT CTA CTT GAA GAT GCC GCT GGA GGC GTC GTG TTC]
    set R(35) [list AAC ACG ACT ATT CAA CAC CGA CTA CTC GAC GCC GCG GCT GGA GGT GTA TAT TGG TGT TTA]
    set R(36) [list AAC AAG ACA ACG AGC ATA ATG CCA CGG CTC CTG GGT GTA GTC GTT TAC TCA TCT TGC TGG]
    set R(37) [list AAT ACC ACT AGC AGT ATG CAA CAC CGG CTC GAG GAT GCC GTA GTC GTG GTT TCA TCG TTA]
    set R(38) [list AAC ACG ACT AGC ATG CAA CAC CCA CTT GAC GCA GGA GGT GTA GTC GTT TCC TGG TGT TTA]
    set R(39) [list AAG ACC ACG AGC AGG ATG ATT CAG CCT CTA CTC CTT GAC GCA GGC GGT TAC TAT TGG TTA]
    set R(40) [list AAG ACA AGT ATA ATC ATG ATT CAG CAT CCA CGG CTC CTG GAC GCA GCG GCT GTC TGT TTG]
    set R(41) [list AAC AAT ACA ACG AGC AGG AGT ATC CAT CGG CTC GCT GGA GTA TAC TCC TGC TGG TTC TTG]
    set R(42) [list AAC ACA ACC ACG ATT CAA CGT CTA CTG CTT GAC GCG GCT GGA GGC GTA TCA TGG TTA TTG]
    set R(43) [list AAC ACC ACT AGA AGG ATA ATC ATG CAG CCA CGG CTT GAC GCT GGC GGT GTC GTT TTA TTC]
    set R(44) [list AAG AAT ACC AGG AGT ATT CAA CAC CAT CGA CTA CTC GCG GTC GTG TAC TCG TGC TGG TTG]
    set R(45) [list AAC AAT ACA ACT AGC AGG ATG CCG CCT CGC CTG GAG GAT GCA GTC TAC TCT TGG TGT TTA]
    set R(46) [list ACG ACT AGA AGC AGT ATA CAA CAG CAT CCG CTT GAC GCC GCG GCT GTC GTT TAT TGG TTA]
    set R(47) [list ACC AGC AGG ATA ATC ATT CAC CAG CCA GAG GAT GCC GGC GTA GTC TCA TCG TGT TTA TTG]
    set R(48) [list AAC AAG ACT AGA AGC ATC CAA CAC CGA CTT GAT GCG GCT GGC GGT TAT TCC TGC TGT TTG]
    set R(49) [list AAG AAT ACC ACG ATG CAA CCG CCT CGA CGT CTA CTT GAA GGA GTA GTG TCG TGC TGT TTC]
    set R(50) [list AAC AAG AGC AGG ATC ATG ATT CAC CAG CAT CCA CCT CTT GAG GAT GCG GCT GGT TGT TTC]
    set R(51) [list AAC AAG AGC AGG CAA CAC CCT GAG GCT GGA GGC GTC GTG TAC TAT TCA TCC TTA TTC TTG]
    set R(52) [list AAC AAG ACG ACT AGT ATT CAC CCA CCT CGG CTC CTT GAG GAT GGA GTA TCA TCG TGG TTG]
    set R(53) [list AAG AAT ACA ACC ACT AGT CAC CCG CGC CGT GAG GCT GGC GGT GTA GTT TAC TAT TCA TGT]
    set R(54) [list AAT ACC AGC AGG ATA CAC CCA CCT CGA CTG GAG GGA GGT GTG GTT TAC TAT TCA TCG TCT]
    set R(55) [list AAC AAG ACC ACT AGA AGC AGT ATA CGA CGT CTC CTG CTT GCA GGC GTA GTC GTG GTT TTC]
    set R(56) [list AAG ACG ACT AGA ATA CAG CAT CCA CGC CGG CGT CTA GCA GCT GGC GTT TAC TGT TTA TTG]
    set R(57) [list AAC AAG ACC ACG ACT AGG AGT ATT CAG CGC CTT GCA GCC GGC GGT GTA TCA TTA TTC TTG]
    set R(58) [list AAC AAG ACA ACT AGA AGC ATG CAC CGC CTG CTT GCT GGA GTA GTT TCA TCC TCG TGG TGT]
    set R(59) [list AAG AAT ACC ACG AGC ATC ATG CGG CTA CTG CTT GAA GCA GCG GTG TAT TCA TCC TCG TTG]
    set R(60) [list AAG ACG AGA AGC AGT ATT CCA CCG CCT CTA GAA GAT GCC GCT GGA GTC TAT TCG TTC TTG]
    set R(61) [list AGA ATC ATG ATT CAA CAC CAT CCG CCT CTT GAA GAG GAT GCA GCG GTC GTG TAC TGC TTG]
    set R(62) [list AAG AAT ATC ATG ATT CAA CCA CCT CTC GAG GAT GCA GCG GCT GGC GTA GTC TCA TCG TTG]
    set R(63) [list ACA AGT ATA ATG CAA CCG CCT CTA CTG GAA GAC GCC GGC GTA GTG GTT TAC TAT TCC TGG]
    set R(64) [list AAC AAG ACG ATA ATG CAA CCA CCT CGA CGC CGG CTA GAG GCT GTC GTT TCG TGT TTA TTG]
    set R(65) [list AAC ACC ACT AGC AGT ATA CAC CAG CAT CGG GAA GCC GCG GTT TAC TGC TGG TGT TTA TTG]
    set R(66) [list ACC AGA AGC AGG AGT ATG ATT CAA CTA CTC GAG GCA GGC GTC GTG TCA TCC TCG TCT TTA]
    set R(67) [list AAC ACA ACG AGC AGG ATA ATC CCA CGC CTG CTT GAT GGC GGT GTC TAC TAT TCG TGG TTA]
    set R(68) [list ACC ACG ACT AGG ATC ATG ATT CAG CAT CCA CCG CGC CTG CTT GAA GAG GAT GGT GTT TAT]
    set R(69) [list AAC AAG ACC AGG ATT CAG CCA CCT CTA CTT GAC GAG GCA GCT GGA GTT TAT TCT TGC TGG]
    set R(70) [list AAT ACC ACG ACT AGA ATT CAT CCG CGC CGT CTC CTG GAA GAC GAG GCG TAT TGG TTA TTG]
    set R(71) [list AAC AAT ACG ACT ATC ATT CAA CCG CCT CGC CGG CTA GAG GAT GCG GGA GGT TAT TCT TTG]
    set R(72) [list AAC ACG ACT AGC ATC CAT CGT CTA GAA GAC GCC GGA GGC GTA GTT TCA TCG TGC TGT TTA]
    set R(73) [list AAC ACG AGG ATT CAC CAG CAT CCA CGA CGG CGT GCA GCT GGA TAC TAT TGG TTA TTC TTG]
    set R(74) [list AAG ATA ATT CAA CAC CGA CGG CGT CTC CTG GAA GAC GAG GAT GTC GTT TAC TCC TGC TTG]
    set R(75) [list AAG AGA AGG ATC ATG CAC CAT CCA CCT GAG GCA GCC GGT GTA GTC TAT TCA TCT TGC TGT]
    set R(76) [list AAG AAT ACT AGA AGG ATT CAC CCT CGC CGT CTA CTC CTT GAG GGA GGC GTA GTG TAC TCT]
    set R(77) [list AAC AAT ACC ACG ACT AGG ATC ATG ATT CAG CGT CTC GAC GCA GGC GGT GTG GTT TAC TTC]
    set R(78) [list AAT ACA AGC ATA ATT CAA CCT CGG CGT CTC CTG CTT GAA GAG GCC GGA GGT GTC TCA TGT]
    set R(79) [list AAT ACA ACC AGA ATA ATG ATT CAG CAT CCT CGT CTG GAT GCA GCC GGC GTC GTG TCG TGT]
    set R(80) [list AAC AAT ACA AGA AGG ATC ATT CAG CAT CGG CTA GAT GCC GCT GGC GTC GTT TCG TCT TGC]
    set R(81) [list AAC AAT ACA ACC AGA ATA ATC ATG CCG CGT CTC GCA GCG GCT GGA GTC GTG TCT TGT TTG]
    set R(82) [list ACC ACG AGC AGT ATA ATC CAA CAG CGT CTA CTC CTG CTT GAC GCG GGA GTA TAT TGG TGT]
    set R(83) [list ACA AGA ATG ATT CAC CAG CCT CGC CTC CTT GAA GAT GCA GCG GCT GGA GTG TAT TCA TTG]
    set R(84) [list AAC AAT ACC ACG AGC AGG CAA CCG CGA CGT CTT GAC GCA GCT GGA GTT TCT TGT TTA TTG]
    set R(85) [list AAC AAT ACA ATA ATC CAG CCG CGT CTG GCA GCT GGA GGC GGT GTA GTC TCA TCT TGC TTA]
    set R(86) [list ACG AGA AGC ATA CAA CAG CCA CCT CGG CGT GAA GCG GGT GTA TCA TCT TGC TTA TTC TTG]
    set R(87) [list ACA ACC ACG ATC ATT CAA CCA CCT CGA GAA GAC GAG GCA GTG GTT TGC TGG TGT TTC TTG]
    set R(88) [list AAC AAG ACC ACT AGC ATC ATG ATT CGA CGC CGG GAT GGC GTC GTG TAC TCA TGG TTA TTC]
    set R(89) [list AAC AAG ACA AGA AGT ATT CAG CCT GAT GCC GGA GGC GGT TAC TCA TCC TCG TGC TGT TTC]
    set R(90) [list AAT ACT AGC AGG ATC ATG CAA CAC CGT CTA GAC GCA GCG GCT GGT GTA GTC TCG TCT TTA]
    set R(91) [list AAT ACC AGT ATC ATG ATT CAG CAT CGC CTA GAA GAC GAG GCG GCT GGT GTT TCA TCC TCG]
    set R(92) [list AAG ACA AGG ATA ATG CAA CCT CGA CGC CGG CTG CTT GAA GAC TCA TCG TCT TGC TGT TTG]
    set R(93) [list AAG AGT ATG ATT CAA CAC CAG CCA CCG CGA CGT GAT GCG GCT GTA GTC TAC TCG TTA TTG]
    set R(94) [list AAC AAG ACC ACG ACT AGT ATT CCA CGC CGT CTG GAA GAC GAG GGT GTA GTT TCC TCT TTG]
    set R(95) [list AAG ACC ACG AGC AGG AGT ATA ATT CCG CGA CGC CGG CTT GAT GCC GTA TAT TCT TGC TTA]
    set R(96) [list AAT ACA ACG AGA AGC CAC CTC CTT GAC GAT GCA GCG GGA GTG TCA TCG TCT TGG TTA TTC]
    set R(97) [list AAC ACT AGA AGG AGT CAA CGA CGG CGT CTA CTC CTT GAA GAT GCG GCT GGC TCT TTA TTC]
    set R(98) [list AAG AAT ACG ATC CAG CCG CGA CGC CTG CTT GAA GAT GCA GCC GTA GTG TCA TCT TTA TTG]
    set R(99) [list AGT ATG CAA CAT CCA CGA CGC CTA CTC GAC GAT GCA GGA GGT GTA GTC TAC TCT TGG TTA]
    set R(100) [list AAT ACC ACG AGA AGT ATA ATC CCA CCG CCT CGA CTA CTG CTT GGA GGC GGT GTG GTT TTA]
    set R(101) [list AAC AAT ATA ATG CAA CCA CCG CCT CGC CGG GAA GAT GGC GGT GTG TAC TCA TGT TTC TTG]
    set R(102) [list ACA ACC AGA ATA ATG ATT CAC CAG CTA CTC CTT GAG GAT GCC GCG GGC GTG TCG TGT TTA]
    set R(103) [list AAC AAT ACC ACT AGA ATC CAC CCG CGA CGG CTG CTT GCA GGA GGC GTA GTT TAT TGT TTG]
    set R(104) [list AAC ACC ACG AGT ATC ATG ATT CAT CCG CTC GAC GAG GAT GCA GGT GTA GTC TAC TCG TTG]
    set R(105) [list AAG AAT ACC AGA AGT ATA CAC CAG CAT CGG CTA CTC GCC GCG GTA GTG GTT TCC TGT TTG]
    set R(106) [list AAC AAT ACC AGC ATA CAA CGA CGG CTT GAC GAG GCT GGC GGT GTC TAT TCA TCG TCT TTG]
    set R(107) [list ACA AGC ATA ATG ATT CAG CCA CGA CGC CGG CGT CTA CTT GAA GGA GGT TCA TCG TCT TGT]
    set R(108) [list AAG AGC AGT ATA ATG CAC CAG CCA CGA CGC CGG CTT GCT GGA GTC TAT TCA TGC TGT TTA]
    set R(109) [list AAC AAT ACG ACT ATC CAA CAG CTC CTT GAA GAG GAT GCG GCT GGC GGT GTT TAT TCC TGC]
    set R(110) [list AAC ACA AGC AGG AGT ATA ATT CCA CCT CTC GAG GCG GCT GGA GGC TCA TCT TGC TGT TTA]

    #rR 20180428 I add the lsort -dictionary
    set ListOfIndex [lsort -dictionary  [array names R]]

    set R(MFC) [YCodeFor]
    if {$Qui=="MFC"} { return $R($Qui) }

    set R(TOP20) [YCodeFor "" TOP20]
    if {$Qui=="TOP20"} { return $R($Qui) }


    set R(111) [list ATC ACC CTC GAC GAG GAT GCC GGC GGT GTC]

    foreach I [C216 ListOf Index] {
	set K [expr $I + 1000]
	set R($K) [C216 $I]
    }

    #rR Use setgscoperr MAMAxy if you want xy to be the default circode
    if { ! [info exists DefaultCirCode]} {
	set DefaultCirCode 00
	foreach CC $ListOfIndex {
	    if {[OnTraite "MAMA$CC"]} { set DefaultCirCode $CC }
	    if {[OnTraite "MUMU$CC"]} { set DefaultCirCode $CC }
	}
    }
    #rR You can see the default CirCode with CirCode DefaultCirCode
    if {$Qui=="DEFAULTCIRCODE"} {

	if {$Quoi=="MFC"} {
	    set DefaultCirCode "MFC"
	    set R($DefaultCirCode) [YCodeFor]
	    IsX0 Reset
	    return $DefaultCirCode
	}

	if {$Quoi=="TOP20"} {
	    set DefaultCirCode "TOP20"
	    set R($DefaultCirCode) [YCodeFor "" TOP20]
	    IsX0 Reset
	    return $DefaultCirCode
	}

	#rR .. and even set it to xy with CirCode DefaultCirCode xy  
	if {[regexp {^[0-9]+$} $Quoi]} {
	    set DefaultCirCode $Quoi
	    IsX0 Reset
	}
	return $DefaultCirCode
    }
    if {[regexp -nocase "DEFAULTCIRCODE" $Qui]} { return $DefaultCirCode }

    if {$Qui==""} { set Qui $DefaultCirCode }

    if {$Qui eq "LISTOF" && $Quoi eq "INDEX"} { return $ListOfIndex }
    
    if {$Qui=="MFC"}   { return $R($Qui) }
    if {$Qui=="TOP20"} { return $R($Qui) }

    if {[regexp {[A-Z]} $Qui]} {
	foreach {K V} [array get R] {
	    foreach Codon $V {
		lappend Codes($Codon) $K
		lappend LesCodons $Codon
		set AA [AAduCodon $Codon]
		lappend Codes($AA) $K
	    }
	}
	set LesCodons [lsort -unique $LesCodons]
	set LesAAs {}
	foreach Codon $LesCodons {
	    lappend LesAAs [AAduCodon $Codon]
	}
	if {$Qui eq "LISTOF" && $Quoi eq "CODON"} { return $LesCodons }
	if {$Qui eq "LISTOF" && $Quoi eq "AA"}    { return $LesAAs }
	if {$Qui eq "LISTOF" && $Quoi eq "AA3"}   { return [join $LesAAs "   "] }
	if {0 && [info exists Codes($Qui)]} { return $Codes($Qui) }
	return ""
    }
    if { ! [info exist R($Qui)]} { return "" }
    if {[string index $Quoi 0]=="P"} {
	set LesP {}
	foreach Codon $R($Qui) {
	    lappend LesP [AAduCodon $Codon]
	}
	if {[regexp 3 $Quoi]} { return [join $LesP "   "] }
	return $LesP
    }
    if {[info exists R($Qui)]} { return $R($Qui) }
    #rR I Add this to get the 216 codes
    if {$Qui>1000} {
	set I [expr $Qui-1000]
	set X [C216 $I]
	return $X
    }
    return ""
}

proc CirCodeProt {{GetWhat ""}} {
    if {$GetWhat==""} { set GetWhat "GetWithPWithX" } 
    set LesLignes {}
    if {[regexp "P" $GetWhat]} {
	foreach I [CirCode ListOf Index] {
	    set LaLigne [list $I]
	    foreach P [CirCode $I P] {
		lappend LaLigne $P
	    }
	    set Ligne [join $LaLigne "   "]
	    lappend LesLignes $Ligne
	}
    }
    if {[regexp "P" $GetWhat] && [regexp "X" $GetWhat]} {
	lappend LesLignes "" 
	lappend LesLignes ""
    }
    if {[regexp "X" $GetWhat]} {
	set LesAAs [list A C D E F G H I K L M N P Q R S T V W Y]
	lappend LesLignes "     [join $LesAAs {   }]"
	foreach I [CirCode ListOf Index] {
	set LesAAsPresents [lsort -unique [CirCode $I P]]
	    set LaLigne [list $I]
	    foreach A $LesAAs {
		if {[lsearch -sorted $LesAAsPresents $A]>=0} {
		    lappend LaLigne "X"
		} else {
		    lappend LaLigne " "
		}
	    }
	    set Ligne [join $LaLigne "   "]
	    lappend LesLignes $Ligne
	}
    }
    return [join $LesLignes "\n"]
}

proc RenameMAMA {} {
    #rR ne sert plus .. c'était pour renommer MAMF en MAMA
    exit
    NousAllonsAuBoulot [RepertoireDuGenome]

    set FilesOnly {}
    lappend FilesOnly "*_SumOfPairs"
    lappend FilesOnly "*_SumOfPairsForCodons"
    lappend FilesOnly "X*MotifsFeatures"
    #lappend FilesOnly "nuctfa"
    #lappend FilesOnly "prottfa"
    #lappend FilesOnly "nucalitfa"
    #lappend FilesOnly "protalitfa"
    #lappend FilesOnly "msfNuc"
    #lappend FilesOnly "msfNuc3"
    #lappend FilesOnly "msfProt"
    #lappend FilesOnly "msfProt3"

    foreach D $FilesOnly {
	set LesR [glob -type d $D]
	foreach R $LesR {
	    Espionne $R
	    NousAllonsAuBoulot $R
	    exec renommeRR MAMF MAMA
	    OnRevientDuBoulot
	}
    }
    OnRevientDuBoulot 
    return 

    set FilesContent {}
    lappend FilesContent "fiches/bornesdespabs"

    NousAllonsAuBoulot "[RepertoireDuGenome]/macsimXml"
    foreach Nom [ListeDesPABs] {
	regsub MAMF $Nom MAMA New 
	file rename $Nom $New
	exec renommeRR MAMF MAMA
    }
    OnRevientDuBoulot
}

proc CirCodeInfo {{Qui ""} {Quoi ""}} {
    return "Wrong"
    #rR Find here all what could be available about CirCode
    global CirCodeInfo
    if {[info exists CirCodeInfo($Qui,$Quoi)]} { return $CirCodeInfo($Qui,$Quoi) }
    if {[info exists CirCodeInfo("EstCharge")]} {
	if {[CirCode $Qui $Quoi]!=""} { return [CirCode $Qui $Quoi] }
	return ""
    }
    set CirCodeInfo("EstCharge") 1
    set CirCodeInfo(P,) [CirCodeProt]
    return [CirCodeInfo $Qui $Quoi]
}
 

Index by: file name | procedure name | procedure call | annotation
File generated 2022-04-05 at 12:55.