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

#fS gscope_olymclade.tcl les OLYMpiades pour les CLADEs
#rR on y fait concourir des clades pour savoir comment ils se comportent dans les blast

proc LesBacteriesDeClaudine {{GetWhat ""}} {
    set Groupe1 {
        "Mycobacterium tuberculosis H37Rv"
        "Helicobacter pylori g27"
        "Deinococcus radiodurans r1"
        "Treponema pallidum ss14"
    }
    set Groupe2 {
        "Escherichia coli atcc8739"
        "Staphylococcus aureus mu50"
        "Streptococcus pneumoniae R6"
        "Thermus thermophilus hb27"
        "Mycoplasma genitalium G-37"
    }
    set LesBons {}
    foreach Clau [concat $Groupe1 $Groupe2] {
        scan $Clau "%s %s %s" G E S
        Espionne
        Espionne $Clau
        set LesPossibles [glob -nocomplain "/genomics/link/OrthoInspector_Proteomes/Bacteria/NotaBene/*${G}_${E}*"]
        if {[llength $LesPossibles]!=1} {
            set LesMeilleurs [glob -nocomplain "/genomics/link/OrthoInspector_Proteomes/Bacteria/NotaBene/*${G}_${E}*${S}*"]
            if {[llength $LesMeilleurs]==1} {
                set LesPossibles $LesMeilleurs
            }
        }
        if {[llength $LesPossibles]!=1} {
            Espionne "***************************************************** lequel je prends parmi les suivants ?"
            foreach Possible $LesPossibles {
                Espionne [file tail $Possible]
            }
        } else {
            Espionne [file tail [lindex $LesPossibles 0]]
        }
        lappend LesBons [lindex $LesPossibles 0]
    }
    foreach Bon $LesBons {
        set N [regexp -all ">" [ContenuDuFichier $Bon]]
        set Queue [file tail $Bon]
        regsub -all "_" $Queue " " Queue
        lappend LesQueues $Queue
        scan $Queue "%s" OI
        Espionne $OI $N
    }
    if {$GetWhat=="GetFiles"} { return $LesBons }
    
    return $LesQueues
}

proc JoyFungi {{FileToCreate ""}} {
    #rR Parmi tous les fungi on veut mettre les JoyOXOS en début puis les autres
    #rR Ceci pour créer un Paraph (Paraphylum) voir plus bas la proc.
    #rR On teste d'abord le OX .. fastoce ... mais si on ne le trouve pas on teste l'OS 
    #rR et par chance il se trouve que les OS des Joy non trouvés n'ont que 2 mots ... et sont uniques dans notre cas :-) 
    set LesFungiOXOS [OiDescendants Fungi OXOS]
    set LesJoyOXOS [JoyCode ListOf OXOS]

    foreach OXOS $LesFungiOXOS {
        set Trouve 0
        if { ! [regexp {^([0-9]+) (.+)$} $OXOS Match OX OS]} { FaireLire "Wrong $OXOS" }
        #rR Je cherche d'abord s'il est un des Joy en OX
        foreach JoyOXOS $LesJoyOXOS {
            if { ! [regexp {^([0-9]+) (.+)$} $JoyOXOS Match JoyOX JoyOS]} { FaireLire "Wrong $JoyOXOS" }
            if {$OX==$JoyOX} {
                lappend LesElus $OXOS
                set Trouve 1
                set OkPour($OS) 1
                break
            }
        }
        if {$Trouve} { continue }
        #rR Je cherche ensuite s'il est un des Joy en OS
        foreach JoyOXOS $LesJoyOXOS {
            if { ! [regexp {^([0-9]+) (.+)$} $JoyOXOS Match JoyOX JoyOS]} { FaireLire "Wrong $JoyOXOS" }
            if {[info exists OkPour($OS)]} { set Trouve 1 ; break }
            if {[regexp "^$JoyOS" $OS]} {
                lappend LesElus $OXOS
                set Trouve 1
                break
            }
        }
        if {$Trouve} { continue }
        lappend LePeuple $OXOS
    }
    set LesJoyFungiOrdonnes {}
    lappend LesJoyFungiOrdonnes "JoysBand"
    LConcat LesJoyFungiOrdonnes $LesElus
    lappend LesJoyFungiOrdonnes "OtherFungi"
    LConcat LesJoyFungiOrdonnes $LePeuple
    if {$FileToCreate!=""} {
        SauveLesLignes $LesJoyFungiOrdonnes dans $FileToCreate
        return $FileToCreate
    }
    return $LesJoyFungiOrdonnes
}

proc OiDescendants {{Node ""} {GetWhat ""}} {
    #rR Attentionon utilise un fichier memo pour aller plus vite ... Penser à l'effacer si changement
    global OiDescendants
    if {$GetWhat==""} { set GetWhat OX }
    set Found 0
    if { ! $Found && [regexp -nocase "OX" $GetWhat] && [regexp -nocase "OS" $GetWhat]} { set Found 1; set GetWhat "OXOS" }
    if { ! $Found && [regexp -nocase "OX" $GetWhat]} { set Found 1; set GetWhat "OX" }
    if { ! $Found && [regexp -nocase "OS" $GetWhat]} { set Found 1; set GetWhat "OS" }
    if { ! $Found && [regexp -nocase "CL" $GetWhat]} { set Found 1; set GetWhat "CL" }
    if {[info exists OiDescendants($Node,$GetWhat)]} { return $OiDescendants($Node,$GetWhat) }
    if {[info exists OiDescendants($Node,Loaded)]} { return "" }
    set OiDescendants($Node,Loaded) 1
    set OiDescendants($Node,File) "[BlastomicsDir]/OiDescendants_$Node.txt"

    if {[file exists $OiDescendants($Node,File)]} {
        array set OiDescendants [ContenuDuFichier $OiDescendants($Node,File)]
        return [OiDescendants $Node $GetWhat]
    }

    set OxNode [Tax $Node "TaxId"]
    set LesClasses {}
    foreach OX [OiCode ListOf OX] {
	if { ! [JeSuisTonAncetre $OxNode $OX]} { continue }
	set Classe [TaxClass $OX Name]
        regsub {^ *; *cellular organisms; *} $Classe "" Classe 
	lappend LesClasses $Classe
	set OxDeLaClasse($Classe) $OX
    }
    set LesClasses [lsort $LesClasses]
    set LesOX {}
    set LesOS {}
    set LesOXOS {}
    foreach Classe $LesClasses {
	set OX $OxDeLaClasse($Classe)
	set OS [Tax $OX "Name"]
	lappend LesOX $OX
	lappend LesOS $OS
        lappend LesOXOS "$OX $OS"
    }
    set OiDescendants($Node,OXOS) $LesOXOS 
    set OiDescendants($Node,OX)   $LesOX 
    set OiDescendants($Node,OS)   $LesOS 
    set OiDescendants($Node,CL)   $LesClasses
    Sauve [array get OiDescendants] dans $OiDescendants($Node,File)
    return [OiDescendants $Node $GetWhat]
}

proc PhylAr {{Qui ""} {Quoi ""}} {
    JeMeSignale
    global PhylAr
    if {[info exists PhylAr($Qui,$Quoi)]} { return $PhylAr($Qui,$Quoi) }
    if {[info exists PhylAr("EstCharge")]} { return "" }
    set PhylAr("EstCharge") 1

    set FichierMemo "/genomics/link/OI/fiches/phylar.txt"
    if {[regexp -nocase "^ReDo_" $Qui]} {
	if {[file exists $FichierMemo]} { file delete $FichierMemo }
	regsub -nocase "^ReDo_" $Qui "" Qui
	unset PhylAr
	return [PhylAr $Qui $Quoi]
    }
    if {[file exists $FichierMemo]} {
	array set PhylAr [ContenuDuFichier $FichierMemo]
	return [PhylAr $Qui $Quoi]
    }

    OiDomain Archaea

    set LesPhyOX [ArClade ListOf AllOX]
    set LesPhyOS [ArClade ListOf AllName]

    foreach OX [OiCode ListOf OX] {
	set OS [OiCode $OX OS]
	lappend PhylAr(ListOf,OX) $OX
	lappend PhylAr(ListOf,OS) $OS
	set PasTrouve 1
	foreach PhyOX $LesPhyOX {
	    set PhyOS [ArClade $PhyOX Name]
	    set PhylAr($PhyOX,PhyOX) $PhyOX
	    set PhylAr($PhyOX,PhyOS) $PhyOS
	    set PhylAr($PhyOS,PhyOX) $PhyOX
	    set PhylAr($PhyOS,PhyOS) $PhyOS

	    if {[JeSuisTonAncetre $PhyOX $OX]} {
		set PhylAr($OX,PhyOX) $PhyOX
		set PhylAr($OX,PhyOS) $PhyOS
		set PhylAr($OS,PhyOX) $PhyOX
		set PhylAr($OS,PhyOS) $PhyOS
		lappend PhylAr($PhyOX,ListOfOX) $OX
		lappend PhylAr($PhyOX,ListOfOS) $OS
		lappend PhylAr($PhyOS,ListOfOX) $OX
		lappend PhylAr($PhyOS,ListOfOS) $OS
		set PasTrouve 0
		break
	    }
	}
	if {$PasTrouve} { FaireLire "Impossible de caser\n$OX $OS"}
	
    }
    set LesPhyOXNonVides {}
    set LesPhyOYNonVides {}
    foreach PhyOX $LesPhyOX PhyOS $LesPhyOS {
	if { ! [info exists PhylAr($PhyOX,ListOfOX)]} { continue }
	lappend LesPhyOXNonVides $PhyOX
	lappend LesPhyOSNonVides $PhyOS
    }
    set PhylAr(ListOf,PhyOX) $LesPhyOXNonVides
    set PhylAr(ListOf,PhyOS) $LesPhyOSNonVides

    Sauve [array get PhylAr] dans $FichierMemo
    return [PhylAr $Qui $Quoi]
}


proc GeneIdWithGoDict {{Bdd ""}} {
}

proc TaxoblaProject {{Qui ""} {Quoi ""}} {
    global TaxoblaProject
    
    set FichierMemo "/genomics/link/OI/fiches/TaxoblaProject.txt"
    if {[regexp -nocase "^ReDo_" $Qui]} {
	if {[file exists $FichierMemo]} { file delete $FichierMemo }
	regsub -nocase "^ReDo_" $Qui "" Qui
	if {[info exists TaxoblaProject]} { unset TaxoblaProject }
	return [TaxoblaProject $Qui $Quoi]
    }
    
    if {[info exists TaxoblaProject($Qui,$Quoi)]} { return $TaxoblaProject($Qui,$Quoi) }
    if {[info exists TaxoblaProject("EstCharge")]} { return "" }
    set TaxoblaProject("EstCharge") 1
    
    if {[file exists $FichierMemo]} {
	array set TaxoblaProject [ContenuDuFichier $FichierMemo]
	return [TaxoblaProject $Qui $Quoi]
    }
    
    set LesRepExistants [glob -nocomplain "/genomics/link/*/taxobla"]
    foreach RepT $LesRepExistants {
	set Rep [file dirname $RepT]
	set LesProttfa [lsort [glob -nocomplain "$Rep/prottfa/*"]]
	if { [set NbProttfa [llength $LesProttfa]] < 10} { continue }
	set LesTaxobla [lsort [glob -nocomplain "$Rep/taxobla/*"]]
	set Projet [file tail $Rep]
	if { [set NbTaxobla [llength $LesTaxobla]] < $NbProttfa } { Espionne "$Projet $NbTaxobla/$NbProttfa" ; continue }
	lappend LesProjets [file tail $Rep]
	set OX [IntegerApres "NotreOX" dans [ContenuDuFichier "$Rep/beton/miniconfig"]]
	set TaxoblaProject($Projet,NS) $NbProttfa
	set TaxoblaProject($Projet,NT) $NbTaxobla
	set TaxoblaProject($Projet,OX) $OX
    }
    set TaxoblaProject(ListOf,Project) [lsort -unique $LesProjets]
    Sauve [array get TaxoblaProject] dans $FichierMemo
    return [TaxoblaProject $Qui $Quoi]
}

proc SshScore {{Query ""} {Subject ""}} {
    #rR SequenceSizeHomologyScore
    set OxQ [OiCode $Query   OX]
    set OxS [OiCode $Subject OX]
    set OiQ [OiCode $Query   OI]
    set OiS [OiCode $Subject OI]
}

proc Paraph {{Kind ""} {Qui ""} {Quoi ""}} {
    #rR Paraph (comme Paraphylum) est une généralisation de CMC ou TTLL ou PhylAr ...
    #rR Les Paraphylum of Kind
    #rR Attentin la même variable Paraph stocke tous les Kind ... est-ce que ça marche en même temps ? ???
    global Paraph

    set Separator " "           ; #rR a faire .. je ne sais pas comment ! 

    regsub -all "_" $Qui " " Qui

    if {[regexp -nocase "Help" $Qui]} {
	lappend LeHelp "Paraph Kind stands for Paraphylum of Kind"
	lappend LeHelp "Paraph ListOf Kind"
	lappend LeHelp "Paraph Kind ListOf Clade"
	lappend LeHelp "Paraph Kind ListOf OX"
	lappend LeHelp "Paraph Kind ListOf OS"
	lappend LeHelp "Paraph Kind 9606 Clade"
	lappend LeHelp "Paraph Kind Homo_sapiens Clade     -> Sarcopterygii     (eh oui !!! on est comme ça !!) "
	lappend LeHelp "Paraph Kind 9606 Clade             -> Sarcopterygii"
	lappend LeHelp "Paraph Kind Sarcopterygii OX       -> 7897 10090 9606 9913 9031 8364 8496 9258 13616 8469 28377"
	lappend LeHelp "Paraph Kind Sarcopterygii OS       -> lists the organism names" 
	lappend LeHelp "Paraph Kind 9606 OX                -> 9606"
	lappend LeHelp "Paraph Kind 9606 OS                -> Homo sapiens"
	lappend LeHelp "Paraph Kind Homo_sapiens OX        -> 9606              (nb : with underscore _ you don't need quotes) "
	lappend LeHelp "Paraph Kind Homo_sapiens OS        -> Homo sapiens"
	lappend LeHelp "Attention some Organims can belong to several Clades"
	lappend LeHelp "Paraph Kind 12345 Clade   may return several hits"
	lappend LeHelp ""
	lappend LeHelp "      Raymond"
	return [join $LeHelp "\n"]
    }

    set FichierCsv  "[BlastomicsDir]/Paraph_$Kind.csv"
    set FichierMemo "[BlastomicsDir]/Paraph_$Kind.txt"       
    if {[regexp -nocase "^ReDo_" $Qui]} {
	if {[file exists $FichierMemo]} { file delete $FichierMemo }
	regsub -nocase "^ReDo_" $Qui "" Qui
	return [Paraph $Kind $Qui $Quoi]
    }

    if {[info exists Paraph($Kind,$Qui,$Quoi)]} { return $Paraph($Kind,$Qui,$Quoi) }
    if {[info exists Paraph($Kind,"EstCharge")]} { return "" }
    set Paraph($Kind,"EstCharge") 1

    #rR Attention si on mémorise il faut faire redo quand il faut
    #rR Mais c'est pas la peine de mémoriser ça va vite ... sauf que j'ai perdu TTLL.csv 
    set OnMemorise 0
    
    if { $OnMemorise && [file exists $FichierMemo]} {
	array set Paraph [ContenuDuFichier $FichierMemo]
	set Paraph($Kind,csv,file) $FichierCsv
	return [Paraph $Qui $Quoi]
    }
    set Paraph($Kind,ListOf,Clade) {}
    foreach Ligne [LesLignesDuFichier $FichierCsv] {
	set A ""
	set B ""
        if {$Separator==";"} {
            lassign [split $Ligne ";"] A B
        } else {
            scan $Ligne "%s" A
            regsub "^$A *" $Ligne "" B
        }
	set A [string trim $A]
	set B [string trim $B]
	if {[regexp -nocase {[A-Z]} $A]} {
	    regsub -all " " $A "" A
	    set Clade $A
	    set Paraph($Kind,$Clade,OX) {}
	    set Paraph($Kind,$Clade,OS) {}
	    lappend Paraph($Kind,ListOf,Clade) $Clade
	    continue
	}
	if {[regexp {^[0-9]+$} $A]} {
	    set B [Tax $A Name]
	    lappend Paraph($Kind,$Clade,OX) $A
	    lappend Paraph($Kind,$Clade,OS) $B
	    lappend Paraph($Kind,$A,Clade) $Clade
	    lappend Paraph($Kind,$B,Clade) $Clade
	    lappend Paraph($Kind,ListOf,OX) $A
	    lappend Paraph($Kind,ListOf,OS) $B
	    set Paraph($Kind,$A,OX) $A
	    set Paraph($Kind,$A,OS) $B
	    set Paraph($Kind,$B,OX) $A
	    set Paraph($Kind,$B,OS) $B
	    continue
	}
    }
    set Paraph($Kind,ListOf,Clade) [lsort -unique $Paraph($Kind,ListOf,Clade)]
    set Paraph($Kind,ListOf,JoinedClade) [join $Paraph($Kind,ListOf,Clade) " "]
    set Paraph($Kind,ListOf,OX)     [lsort -unique $Paraph($Kind,ListOf,OX)]
    set Paraph($Kind,ListOf,OS)     [lsort -unique $Paraph($Kind,ListOf,OS)]
    if {$OnMemorise} { Sauve [array get Paraph] dans $FichierMemo }
    return [Paraph $Kind $Qui $Quoi]
}

proc TTLL {{Qui ""} {Quoi ""}} {
    #rR Les Clades pour les TTLL de Sarah Djeddi
    global TTLL

    regsub -all "_" $Qui " " Qui

    if {[regexp -nocase "Help" $Qui]} {
	lappend LeHelp "TTLL stands for Tubulin Tyrosine Ligase Like (from Sarah)"
	lappend LeHelp "TTLL ListOf Clade"
	lappend LeHelp "TTLL ListOf OX"
	lappend LeHelp "TTLL ListOf OS"
	lappend LeHelp "TTLL 9606 Clade"
	lappend LeHelp "TTLL Homo_sapiens Clade     -> Sarcopterygii     (eh oui !!! on est comme ça !!) "
	lappend LeHelp "TTLL 9606 Clade             -> Sarcopterygii"
	lappend LeHelp "TTLL Sarcopterygii OX       -> 7897 10090 9606 9913 9031 8364 8496 9258 13616 8469 28377"
	lappend LeHelp "TTLL Sarcopterygii OS       -> lists the organism names" 
	lappend LeHelp "TTLL 9606 OX                -> 9606"
	lappend LeHelp "TTLL 9606 OS                -> Homo sapiens"
	lappend LeHelp "TTLL Homo_sapiens OX        -> 9606              (nb : with underscore _ you don't need quotes) "
	lappend LeHelp "TTLL Homo_sapiens OS        -> Homo sapiens"
	lappend LeHelp "Attention some Organims can belong to several Clades"
	lappend LeHelp "TTLL 12345 Clade   may return several hits"
	lappend LeHelp ""
	lappend LeHelp "      Raymond"
	return [join $LeHelp "\n"]
    }

    set FichierCsv "[BlastomicsDbDir]/TTLL.csv"
    set Fichier    "/genomics/link/OI/fiches/TTLL.txt"
    if {[regexp -nocase "^ReDo_" $Qui]} {
	if {[file exists $Fichier]} { file delete $Fichier }
	regsub -nocase "^ReDo_" $Qui "" Qui
	return [TTLL $Qui $Quoi]
    }

    if {[info exists TTLL($Qui,$Quoi)]} { return $TTLL($Qui,$Quoi) }
    if {[info exists TTLL("EstCharge")]} { return "" }
    set TTLL("EstCharge") 1

    set OnMemorise 0                               ; #rR Attention si on mémorise il faut faire redo quand il faut
    if { $OnMemorise && [file exists $Fichier]} {
	array set TTLL [ContenuDuFichier $Fichier]
	set TTLL(csv,file) $FichierCsv
	return [TTLL $Qui $Quoi]
    }
    set TTLL(ListOf,Clade) {}
    foreach Ligne [LesLignesDuFichier $FichierCsv] {
	set A ""
	set B ""
	lassign [split $Ligne ";"] A B
	set A [string trim $A]
	set B [string trim $B]
	if {[regexp -nocase {[A-Z]} $A]} {
	    regsub -all " " $A "" A
	    set Clade $A
	    set TTLL($Clade,OX) {}
	    set TTLL($Clade,OS) {}
	    lappend TTLL(ListOf,Clade) $Clade
	    continue
	}
	if {[regexp {^[0-9]+$} $A]} {
	    set B [Tax $A Name]
	    lappend TTLL($Clade,OX) $A
	    lappend TTLL($Clade,OS) $B
	    lappend TTLL($A,Clade) $Clade
	    lappend TTLL($B,Clade) $Clade
	    lappend TTLL(ListOf,OX) $A
	    lappend TTLL(ListOf,OS) $B
	    set TTLL($A,OX) $A
	    set TTLL($A,OS) $B
	    set TTLL($B,OX) $A
	    set TTLL($B,OS) $B
	    continue
	}
    }
    set TTLL(ListOf,Clade) [lsort -unique $TTLL(ListOf,Clade)]
    set TTLL(ListOf,JoinedClade) [join $TTLL(ListOf,Clade) " "]
    set TTLL(ListOf,OX)     [lsort -unique $TTLL(ListOf,OX)]
    set TTLL(ListOf,OS)     [lsort -unique $TTLL(ListOf,OS)]
    if {$OnMemorise} { Sauve [array get TTLL] dans $Fichier }
    return [TTLL $Qui $Quoi]
}

proc CMC {{Qui ""} {Quoi ""}} {
    #rR Les Clades Multi Ciliés de Audrey
    global CMC

    regsub -all "_" $Qui " " Qui

    if {[regexp -nocase "Help" $Qui]} {
	lappend LeHelp "CMC stands for Clade Multi Cilia (from Audrey)"
	lappend LeHelp "CMC ListOf Clade"
	lappend LeHelp "CMC ListOf OX"
	lappend LeHelp "CMC ListOf OS"
	lappend LeHelp "CMC 9606 Clade"
	lappend LeHelp "CMC Homo_sapiens Clade     -> Sarcopterygii     (eh oui !!! on est comme ça !!) "
	lappend LeHelp "CMC 9606 Clade             -> Sarcopterygii"
	lappend LeHelp "CMC Sarcopterygii OX       -> 7897 10090 9606 9913 9031 8364 8496 9258 13616 8469 28377"
	lappend LeHelp "CMC Sarcopterygii OS       -> lists the organism names" 
	lappend LeHelp "CMC 9606 OX                -> 9606"
	lappend LeHelp "CMC 9606 OS                -> Homo sapiens"
	lappend LeHelp "CMC Homo_sapiens OX        -> 9606              (nb : with underscore _ you don't need quotes) "
	lappend LeHelp "CMC Homo_sapiens OS        -> Homo sapiens"
	lappend LeHelp "Attention some Organims can belong to several Clades"
	lappend LeHelp "CMC 12345 Clade   may return several hits"
	lappend LeHelp ""
	lappend LeHelp "      Raymond"
	return [join $LeHelp "\n"]
    }

    set FichierCsv "/home/defosset/Stage_M2/Groupes_Blastomics_Audrey.csv"
    set Fichier    "/genomics/link/OI/fiches/CladesMultiCilia.txt"
    if {[regexp -nocase "^ReDo_" $Qui]} {
	if {[file exists $Fichier]} { file delete $Fichier }
	regsub -nocase "^ReDo_" $Qui "" Qui
	return [CMC $Qui $Quoi]
    }

    if {[info exists CMC($Qui,$Quoi)]} { return $CMC($Qui,$Quoi) }
    if {[info exists CMC("EstCharge")]} { return "" }
    set CMC("EstCharge") 1

    set OnMemorise 0                               ; #rR Attention si on mémorise il faut faire redo quand il faut
    if { $OnMemorise && [file exists $Fichier]} {
	array set CMC [ContenuDuFichier $Fichier]
	set CMC(csv,file) $FichierCsv
	return [CMC $Qui $Quoi]
    }
    set CMC(ListOf,Clade) {}
    foreach Ligne [LesLignesDuFichier $FichierCsv] {
	set A ""
	set B ""
	lassign [split $Ligne ";"] A B
	set A [string trim $A]
	set B [string trim $B]
	if {[regexp -nocase {[A-Z]} $A]} {
	    set Clade $A
	    set CMC($Clade,OX) {}
	    set CMC($Clade,OS) {}
	    lappend CMC(ListOf,Clade) $Clade
	    continue
	}
	if {[regexp {^[0-9]+$} $A]} {
	    lappend CMC($Clade,OX) $A
	    lappend CMC($Clade,OS) $B
	    lappend CMC($A,Clade) $Clade
	    lappend CMC($B,Clade) $Clade
	    lappend CMC(ListOf,OX) $A
	    lappend CMC(ListOf,OS) $B
	    set CMC($A,OX) $A
	    set CMC($A,OS) $B
	    set CMC($B,OX) $A
	    set CMC($B,OS) $B
	    continue
	}
    }
    set CMC(ListOf,Clade) [lsort -unique $CMC(ListOf,Clade)]
    set CMC(ListOf,JoinedClade) [join $CMC(ListOf,Clade) " "]
    set CMC(ListOf,OX)     [lsort -unique $CMC(ListOf,OX)]
    set CMC(ListOf,OS)     [lsort -unique $CMC(ListOf,OS)]
    if {$OnMemorise} { Sauve [array get CMC] dans $Fichier }
    return [CMC $Qui $Quoi]
}

proc BestGeneId Nom {
    set G [NIAG $Nom G]
    if {$G!=""} { return $G }
}

proc NIAG {{Qui ""} {Quoi ""}} {
    #rR Pour passer du Nom au Id Ac et GeneId et inversement
    global NIAG

    if {[string equal -nocase "Help" $Qui]} {
	lappend LeHelp "NIAG stands for N=Nom I=UniprotId A=Accession G=Geneid"
	lappend LeHelp "NIAG ListOf N"
	lappend LeHelp "NIAG ListOf I"
	lappend LeHelp "NIAG ListOf A"
	lappend LeHelp "NIAG ListOf G"
	lappend LeHelp "NIAG HSAP00001 N     -> HSAP00001"
	lappend LeHelp "NIAG HSAP00001 I     -> 1433B_HUMAN"
	lappend LeHelp "NIAG HSAP00001 A     -> P31946"
	lappend LeHelp "NIAG HSAP00001 G     -> 7529"
	lappend LeHelp "NIAG 7529 N          -> HSAP00001"
	lappend LeHelp "NIAG 7529 I          -> ABCDEF_HUMAN"
	lappend LeHelp "NIAG 7529 A          -> Q12345"
	lappend LeHelp "NIAG 7529 G          -> 12345"
	lappend LeHelp "NIAG 1433B_HUMAN N   -> HSAP00001"
	lappend LeHelp "NIAG 1433B_HUMAN I   -> 1433B_HUMAN"
	lappend LeHelp "etc."
	lappend LeHelp "Attention a few UniprotIds and accession have several hits"
	lappend LeHelp "NIAG ABCDEF_HUMAN Ns    may return several hits (NIAG ABCDEF_HUMAN N  returns only the last one)"
	lappend LeHelp ""
	lappend LeHelp "      Raymond"
	return [join $LeHelp "\n"]
    }

    set Fichier "[RepertoireDuGenome]/fiches/niag.txt"
    if {[regexp -nocase "^ReDo_" $Qui]} {
	if {[file exists $Fichier]} { file delete $Fichier }
	regsub -nocase "^ReDo_" $Qui "" Qui
	return [NIAG $Qui $Quoi]
    }

    if {[info exists NIAG($Qui,$Quoi)]} { return $NIAG($Qui,$Quoi) }
    if {[info exists NIAG("EstCharge")]} { return "" }
    set NIAG("EstCharge") 1

    if {[file exists $Fichier]} {
	array set NIAG [ContenuDuFichier $Fichier]
	set NIAG(Filename,) $Fichier
	return [NIAG $Qui $Quoi]
    }

    set NIAG(ListOf,N) {}
    set NIAG(ListOf,A) {}
    set NIAG(ListOf,I) {}
    set NIAG(ListOf,G) {}
    foreach N [ListeDesPABs] {
	set I [ExtraitInfo $N "Id:"]
	set A [ExtraitInfo $N "Ac:"]
	set NIAG($N,N) $N
	set NIAG($N,I) $I
	set NIAG($N,A) $A
	if {$I!=""} {
	    set     NIAG($I,N)  $N     ; #rR tant pis s'il y a en a plusieurs, on prend le dernier
	    lappend NIAG($I,Ns) $N
	}
	if {$A!=""} {
	    set     NIAG($A,N)  $N     ; #rR tant pis s'il y a en a plusieurs, on prend le dernier
	    lappend NIAG($A,Ns) $N
	}
	lappend NIAG(ListOf,N) $N
	lappend NIAG(ListOf,I) $I
	lappend NIAG(ListOf,A) $A
    }

    set NIAG(ListOf,I) [lsort -unique $NIAG(ListOf,I)]
    set NIAG(ListOf,A) [lsort -unique $NIAG(ListOf,A)]
    set NIAG(ListOf,G) [lsort -unique $NIAG(ListOf,G)]

    #rR Attention là on met les Id puis les AC ... et si on trouve d'abord celui de l'Id tant mieux (car DejaVuCe)
    set LesDemandes [concat $NIAG(ListOf,I) $NIAG(ListOf,A)]
    set Res [IDMapping "ACC+ID" "GENEID" $LesDemandes]
    if {[info exists DejaVuCe]} { unset DejaVuCe }
    foreach X $LesDemandes G $Res {
        scan $G "%s" G
	set N $NIAG($X,N)
        if {[info exists DejaVuCe($N)]} { continue }
        set DejaVuCe($N) 1
	if {[regexp {00$} $N]} { Espionne "$N=$X=$G=" }
	if {$G==""} { continue }
	if {[info exists NIAG($N,G)]} {
	    if { $NIAG($N,G)==$G } { continue }
	    FaireLire "$N=$X=$G!=$NIAG($N,G)"
	}
	set NIAG($N,G) $G
    }

    foreach N $NIAG(ListOf,N) {
	if { ! [info exists NIAG($N,G)]} { continue }
	set G $NIAG($N,G)
	set NIAG($NIAG($N,I),G) $G 
	set NIAG($NIAG($N,A),G) $G
	set NIAG($G,N) $N
	set NIAG($G,I) $I
	set NIAG($G,A) $A
	lappend NIAG(ListOf,G) $G
    }
    set NIAG(ListOf,G) [lsort -unique $NIAG(ListOf,G)]
    Sauve [array get NIAG] dans $Fichier
    return [NIAG $Qui $Quoi]
}

proc ModelOrgaProject {{Qui ""} {Quoi ""}} {
    global MOP

    if {[regexp -nocase "Help" $Qui]} {
	lappend LeHelp "ModelOrgaProject ListOf O"
	lappend LeHelp "ModelOrgaProject ListOf P"
	lappend LeHelp "ModelOrgaProject ListOf OP"
	lappend LeHelp "ModelOrgaProject 9606 P"
	lappend LeHelp "ModelOrgaProject CilioCarta O"
	return [join $LeHelp "\n"]
    }

    if {[info exists MOP($Qui,$Quoi)]} { return $MOP($Qui,$Quoi) }
    if {[info exists MOP("EstCharge")]} { return "" }
    set MOP("EstCharge") 1

    set LaListe {}
    set LesFichierGoNoms [glob -nocomplain "/genomics/link/*/fiches/GoNoms.txt"]
    foreach Fichier $LesFichierGoNoms {
	set RepG [file dirname [file dirname $Fichier]]
	set O [IntegerApres "NotreOX" dans [ContenuDuFichier "$RepG/beton/miniconfig"]]
	if {$O==""} { continue }
	set L [llength [LesLignesDuFichier $Fichier]]
	Espionne "$L $O"
	if {$L<987} { continue }
	set P [file tail [file dirname [file dirname $Fichier]]]
	lappend MOP(ListOf,OP) "$O $P"
	lappend MOP(ListOf,O) $O
	lappend MOP(ListOf,P) $P
	lappend MOP($O,O) $O
	lappend MOP($O,P) $P
	set MOP($P,O) $O
	set MOP($P,P) $P
    }
    set MOP(ListOf,O) [lsort -unique $MOP(ListOf,O)]
    return [ModelOrgaProject $Qui $Quoi]
}

proc MyGOsFromModelOrga {} {
    
}

proc ModelOrgaGeneId {{Mod ""} {Qui ""} {Quoi ""}} {
    global MOGI

    set BackgroundDir "[BlastomicsDir]/data/GO/background"
    if {$Mod=="GetListOfModelTaxId"} {
	set LesTaxId {}
	foreach File [glob -nocomplain "$BackgroundDir/*"] {
	    set TaxId [file tail $File]
	    if {[regexp {[^0-9]} $TaxId]} { continue }
	    lappend LesTaxId $TaxId
	}
	return $LesTaxId
    }

    if { [regexp {[^0-9]} $Mod]} { set Mod [Tax $Mod TaxId] }

    if {[info exists MOGI($Mod,$Qui,$Quoi)]} { return $MOGI($Mod,$Qui,$Quoi) }
    if {[info exists MOGI($Mod,EstCharge)]} { return "" }
    set MOGI($Mod,EstCharge) 1

    set BackgroundFile "$BackgroundDir/$Mod"
    if {[FileAbsent $BackgroundFile]} { return "" }
    set MOGI($Mod,BackgroundFile,) $BackgroundFile
    foreach Ligne [LesLignesDuFichier $BackgroundFile] {
	scan $Ligne "%s %s" A G
	if { ! [regexp {^[0-9]+$} $G]} { continue }
	set MOGI($Mod,$A,)  $G
	set MOGI($Mod,$A,A) $A
	set MOGI($Mod,$A,G) $G
	set MOGI($Mod,$G)   $A
	set MOGI($Mod,$G,A) $A
	set MOGI($Mod,$G,G) $G
	lappend MOGI($Mod,ListOf,A) $A
	lappend MOGI($Mod,ListOf,G) $G
	lappend MOGI($Mod,ListOf,AG) "$A $G"
    }
    return [ModelOrgaGeneId $Mod $Qui $Quoi]
}



proc TestCladeCourant {} {
    Espionne [CladeCourant]
    Espionne [CladeCourant Insecta]
    Espionne [CladeCourant See]
    Espionne [CladeCourant New]
}

proc CladeCourant {{NewValue ""} {Format ""}} {
    JeMeSignale
    global CladeCourant

    if {$Format==""} { set Format "Name" }

    if {$NewValue=="IsSet"} {
	return [info exists CladeCourant]
    }
    if {$NewValue=="UnSet"} {
	if {[info exists CladeCourant]} { unset CladeCourant }
	return ""
    }
    if {$NewValue=="New"} {
	while {$NewValue=="New"} {
	    if {[OnTraite "CilioCarta" "Like"]} {
		set NewValue ""
		break
	    }
	    set NewValue [Entre "Mammalia"]
	    if {[Tax $NewValue]==""} {
		if {[OuiOuNon "Sorry $NewValue does not exist. Do I exit CladeCourant ?"]} { return "" }
		set NewValue "New"
		continue
	    }
	}
    }
    if {$NewValue=="See"} {
	set NewValue ""
	if {[info exists CladeCourant]} { return [FaireLire $CladeCourant] }
	return [FaireLire "Current Clade is not yet set"]
    }
    if {$NewValue!=""} {
	set Value [Tax $NewValue "Name"]
	set CladeCourant $Value
	return [Tax $CladeCourant $Format]
    }
    if {[info exists CladeCourant]} { return [Tax $CladeCourant $Format] }
    if {[OnTraite "CilioCarta" "Like"]} {
	set CladeCourant [SelectClade "One" "UseQds"]
	if {$CladeCourant==""} { set CladeCourant "Fungi" }
    }
    return [CladeCourant "New"]
    return [CladeCourant $CladeCourant $Format]
}

proc RunDeltaDistributionForClade {K {Method ""}} {    
    set Touche [$K find withtag current]
    set LesTags [$K gettags $Touche]
    lassign $LesTags Bidon Clade
    return [DeltaDistributionForClade $Clade {} {} $Method]
}

proc DeltaDistributionForClade {{Clade ""} {Seuil ""} {GetWhat ""} {Method ""} {Criteria ""}} {
    if {$Clade==""} { set Clade [SelectClade] }
    if {$Method==""} { set Method "Average" }
    if {$Criteria==""} { set Criteria "Rank" }

    set NomDeDistri [NomDe "Distri"]

    set EnTest [regexp {^(ripp|scherb)$} [Login]] 
    set EnTest 0

    if {$GetWhat==""}    { set GetWhat "Show" }
    if {$Seuil==""}      { set Seuil 0.001 }

    regsub -all " " $Clade "_" CladeUnderscore
    
    set Echantillonage 100
    
    set LesTaxIdsDuClade [CladeContent $Clade "UseQds" "Without,9606"]
	
    set NbTaxId [llength $LesTaxIdsDuClade]
    
    set Sens "increasing"
    if {[regexp -nocase "Score|DeltaS" $Criteria]} { set Sens "decreasing" }

    set Cadre $Clade
    foreach TaxId $LesTaxIdsDuClade {
	set OS [BilanCilioQds $TaxId "OS_"]
	set MethLogExp [TaxoBla $Cadre $TaxId-$Method LogExp]
	set MethScore  [TaxoBla $Cadre $TaxId-$Method Score]
	set MethRank   [TaxoBla $Cadre $TaxId-$Method Rank]
	set MethDeltaE [TaxoBla $Cadre $TaxId-$Method DeltaE]
	set MethDeltaS [TaxoBla $Cadre $TaxId-$Method DeltaS]
	set MethDeltaR [TaxoBla $Cadre $TaxId-$Method DeltaR]
Espionne "$Cadre $TaxId $Method $MethLogExp/$MethScore/$MethRank/$MethDeltaE/$MethDeltaS/$MethDeltaR"
	if {$MethRank==""} { continue }
	Espionne "$MethRank $OS $TaxId"
	lappend LesTaxIdDuMeth(LogExp,$MethLogExp) $TaxId
	lappend LesTaxIdDuMeth(Score,$MethScore)   $TaxId
	lappend LesTaxIdDuMeth(Rank,$MethRank)     $TaxId
	lappend LesTaxIdDuMeth(DeltaE,$MethDeltaE) $TaxId
	lappend LesTaxIdDuMeth(DeltaS,$MethDeltaS) $TaxId
	lappend LesTaxIdDuMeth(DeltaR,$MethDeltaR) $TaxId
	lappend LesMeth(LogExp) $MethLogExp
	lappend LesMeth(Score)  $MethScore
	lappend LesMeth(Rank)   $MethRank
	lappend LesMeth(DeltaE) $MethDeltaE
	lappend LesMeth(DeltaS) $MethDeltaS
	lappend LesMeth(DeltaR) $MethDeltaR
    }
    set LesMethCriteria [lsort -integer -$Sens $LesMeth($Criteria)]
    set LesTaxIdTries {}
    foreach MRank $LesMethCriteria {
	foreach TaxId $LesTaxIdDuMeth($Criteria,$MRank) {
	    Espionne $TaxId
	    if { ! [info exists DejaVu($TaxId)]} {set DejaVu($TaxId) 1 ; lappend LesTaxIdTries $TaxId }
	    set MethLogExp [TaxoBla $Cadre $TaxId-$Method LogExp]
	    set MethScore  [TaxoBla $Cadre $TaxId-$Method Score]
	    set MethRank   [TaxoBla $Cadre $TaxId-$Method Rank]
	    set MethDeltaE [TaxoBla $Cadre $TaxId-$Method DeltaE]
	    set MethDeltaS [TaxoBla $Cadre $TaxId-$Method DeltaS]
	    set MethDeltaR [TaxoBla $Cadre $TaxId-$Method DeltaR]
	    if {$MethRank==""} { continue }
	    Espionne "[BilanCilioQds $TaxId OS_]=$TaxId=$MethLogExp=$MethScore=$MethRank=$MethDeltaE=$MethDeltaS=$MethDeltaR"
	    Espionne [format "%-45s %-8s %6d %6d %6d %6d %6d %6d" [BilanCilioQds $TaxId "OS_"] $TaxId $MethLogExp $MethScore $MethRank $MethDeltaE $MethDeltaS $MethDeltaR]
	    set LesZonards {}
	    #rR Il faudrait commencer par remplir avec tout ce qui est avant le premier rang pour ne pas en perdre
	    #rR ........... mais il vaut mieux aoir le plus petit et le plus grand ...
	    foreach Ranks [RankSample "ListOfList" $Criteria] {
		set RankZone "[lindex $Ranks 0]-[lindex $Ranks end]"
		if { ! [info exists DejaVu($RankZone)]} { set DejaVu($RankZone) 1; lappend LesRankZones $RankZone }
#		set LesZonards {}
		foreach Rank $Ranks {
		    set ZonardsDuRank [TaxoBla $Cadre $TaxId-$Criteria-$Rank ListOfNom]
		    if {$ZonardsDuRank!=""} { LConcat LesZonards $ZonardsDuRank }
		}
		set NbZonards [llength $LesZonards]
		MemoZonards $NomDeDistri $TaxId-$RankZone $LesZonards set 
	    }
	}
    }
    MemoZonards $NomDeDistri "" "" unique
    set LesBeauxTaxIdTries {}
    set I 0
    foreach TaxId $LesTaxIdTries {
	lappend LesBeauxTaxIdTries "$TaxId [BilanCilioQds $TaxId OS_]"
	set J 0
	foreach RankZone $LesRankZones {
	    set N [llength [MemoZonards $NomDeDistri $TaxId-$RankZone]]
	    set T($I,$J) $N
	    incr J
	}
	incr I
    }
    set LeT [array get T]
    set K [Medals $LesBeauxTaxIdTries $LeT $LesRankZones "" "zonard" $NomDeDistri]

    set Titre "$Clade $Criteria distribution using $Method" 
    regsub ".canvas$" $K "" w
    wm title    $w $Titre
    wm iconname $w $Titre
    set B [BoutonneLaFenetre $w "Average Rank/DeltaR/DeltaE"]
    bind $B <1> "DeltaDistributionForClade $Clade $Seuil Show Average Rank"
    bind $B <2> "DeltaDistributionForClade $Clade $Seuil Show Average DeltaR"
    bind $B <3> "DeltaDistributionForClade $Clade $Seuil Show Average DeltaE"
    $B configure -background "Magenta"
    set B [BoutonneLaFenetre $w "First Rank/DeltaR"]
    bind $B "DeltaDistributionForClade $Clade $Seuil Show First Rank"
    bind $B <2> "DeltaDistributionForClade $Clade $Seuil Show First DeltaR"
    $B configure -background "Magenta"
    return $K
}

proc ShowZonards {K NomDeDistri} {
    set Touche [$K find withtag current]
    set LesTags [$K gettags $Touche]
    lassign $LesTags Distri I J Clade RankZone
    lassign [split $Clade "_"] TaxId 
    set LaSortie {}
    set LesNoms [MemoZonards $NomDeDistri $TaxId-$RankZone ListOfNom]
    foreach Nom $LesNoms {
	set Id [ExtraitInfo $Nom Id]
	set Ac [ExtraitInfo $Nom Ac]
	set ValiGN [ExtraitInfo $Nom ValiGN]
	lappend LesGn $ValiGN
	set ValiDE [ExtraitInfo $Nom ValiDE]
	lappend LaSortie "$Nom\t$Id\t$Ac\t$ValiGN\t$ValiDE"
    }
    set F [AfficheListe "#n°[PreFixe]\n$LaSortie" "AvecFetch" "Hits with at least $Distri for $Clade"]
    set GeneNames [join $LesGn ","]
    set Noms [join $LesNoms ","]
    set B [BoutonneLaFenetre $F "GeneOntology / Show Taxobla"]
    bind $B <1> "GoGetShowFromGeneList $GeneNames"
    bind $B <2> "SeeAby Taxobla \[selection get\]"
    $B configure -background "Magenta"
    set B [BoutonneLaFenetre $F "Homo sapiens Hits/ Info/ GOs"]
    bind $B <1> "ShowHsapHits \[set PagePropre($F)\] Hits"
    bind $B <2> "ShowHsapHits \[set PagePropre($F)\] Info"
    bind $B <3> "ShowHsapHits \[set PagePropre($F)\] GO"
    $B configure -background "Orange"
}

proc ShowHsapHits {LesNoms {Quoi ""} {RefTaxId ""}} {
    JeMeSignale

    set Science "CilioCarta"
    if {[OnTraite OI2017 Like]} { set Science "EHomsa" }

    if {[regexp "\n" $LesNoms]} {
	set LesNomsLus {}
	foreach Ligne [split $LesNoms "\n"] {
	    if {[regexp "^#" $Ligne]} { continue }
	    scan $Ligne "%s" NomLu
	    lappend LesNomsLus $NomLu
	}
	set LesNoms $LesNomsLus
    }
    if {[regexp "," $LesNoms]} { set LesNoms [split $LesNoms ","] }
    if {$Quoi==""} { set Quoi "Info" }
    if {$RefTaxId==""} { set RefTaxID 9606 } 
    set LesHsapGeneNames {}
    set LesHsapInfo {}
    set LesHsap {}
    foreach Nom $LesNoms {
	set FicTaxobla [GscopeFile $Nom "taxobla"]
	if {[FileAbsent $FicTaxobla]} { continue }
	foreach Ligne [LesLignesDuFichier $FicTaxobla] {
	    lassign [split $Ligne "\t"] PN Score TaxId Orga Info
	    set TaxId [string trim $TaxId]
	    if { ! [string equal $RefTaxID $TaxId]} { continue }
	    set Access [string trim [lindex [split $Info " "] 1]]
	    set Hsap [QuestionDeScience $Science "ret RepereBox $Access"]
	    if {$Hsap==""} { continue }
	    set HsapGN [QuestionDeScience $Science "ret BestGN $Hsap"]
	    set HsapDE [QuestionDeScience $Science "ret BestDE $Hsap"]
	    lappend LesHsapGeneNames $HsapGN
	    lappend LesHsapInfo "$Nom first Hsap hit: $Hsap $HsapGN $HsapDE"
	    lappend LesHsap $Hsap
	}
    }
    if {$Quoi=="GO"  } { return [GoGetShowFromGeneList $LesHsapGeneNames] }
    if {$Quoi=="Info"} { return [AfficheListe $LesHsapInfo] }
    return 
}

proc CladesDistribution {{Method ""} {Criteria ""}} {

    if {$Criteria==""} { set Criteria "Rank" }
    if {$Method==""}   { set Method "Average" }
    
    set NomDeClaDistri [NomDe "ClaDistri"]

    foreach Clade [SelectClade "Multiple" "UseQds"] {
	set Cadre $Clade
	set MethCrit [TaxoBla $Cadre $Method $Criteria]
	if {$MethCrit==""} { continue }
	lappend LesCladeDuMethCrit($MethCrit) $Clade
	lappend LesMethCrit $MethCrit
	Espionne "$Clade $MethCrit"
    }
    set Sens "increasing"
    if {[regexp -nocase "Score" $Criteria]} { set Sens "decreasing" }
    set LesMethCrit [lsort -integer -$Sens [set LesMethCrit]]
    set LesCladesTries {}
    foreach MCrit $LesMethCrit {
Espionne "MCrit $MCrit"
	foreach Clade [set LesCladeDuMethCrit($MCrit)] {
	    set Cadre $Clade
	    if { ! [info exists DejaVu($Clade)]} {set DejaVu($Clade) 1 ; lappend LesCladesTries $Clade }
	    set MethCrit [TaxoBla $Cadre $Method $Criteria]
	    Espionne [format "%-18s %6d" $Clade $MethCrit]
	    foreach Crits [RankSample "ListOfList" $Criteria] {
Espionne "$Crits"
		set CritZone "[lindex $Crits 0]-[lindex $Crits end]"
		if { ! [info exists DejaVu($CritZone)]} { set DejaVu($CritZone) 1; lappend LesCritZones $CritZone }
		set LesZonards {}
		foreach Crit $Crits {
		    set ZonardsDuCrit [TaxoBla $Cadre ${Method}$Criteria-$Crit ListOfNom]
		    if {$ZonardsDuCrit!=""} { LConcat LesZonards $ZonardsDuCrit }
		}
		set NbZonards [llength $LesZonards]
		MemoZonards $NomDeClaDistri $Clade-$CritZone $LesZonards set 
	    }
	}
    }
    MemoZonards $NomDeClaDistri "" "" unique
    set I 0
    foreach Clade $LesCladesTries {
	set J 0
	foreach CritZone $LesCritZones {
	    set N [llength [MemoZonards $NomDeClaDistri $Clade-$CritZone]]
	    set T($I,$J) $N
	    incr J
	}
	incr I
    }
    set LeT [array get T]
    set K [Medals $LesCladesTries $LeT $LesCritZones "" "zonard" $NomDeClaDistri]
    regsub ".canvas" $K "" w
    set Titre "CladesDistribution $Method $Criteria"
    wm title    $w $Titre
    wm iconname $w $Titre
    set B [BoutonneLaFenetre $w "Clades Rank Distribution Average/ First"]
    bind $B <1> "CladesDistribution Average"
    bind $B <2> "CladesDistribution First"
    $B configure -background "Magenta"
    set B [BoutonneLaFenetre $w "Clades Score Distribution Average/ First"]
    bind <1> "CladesDistribution Average Score"
    bind $B <2> "CladesDistribution First Score"
    $B configure -background "Magenta"
    set B [BoutonneLaFenetre $w "Clades Expect Distribution Average/ First"]
    bind $B <1> "CladesDistribution Average LogExp"
    bind $B <2> "CladesDistribution First LogExp"
    $B configure -background "Magenta"
    return $K
}


proc MemoZonards {{Qui ""} {Quoi ""} {Valeur ""} {Action ""}} {
    global MemoZonards
    if {$Action==""} { set Action "get" }
    if {$Action=="get"} {
	if {[info exists MemoZonards($Qui,$Quoi)] } { return $MemoZonards($Qui,$Quoi) }
	return ""
    }  
    if {$Action=="Reset"}  { if {[info exists MemoZonards($Qui,$Quoi)] } { unset MemoZonards($Qui,$Quoi) } ; return "" }  
    if {$Action=="set"}    { set     MemoZonards($Qui,$Quoi) $Valeur ; return $MemoZonards($Qui,$Quoi) }  
    if {$Action=="append"} { lappend MemoZonards($Qui,$Quoi) $Valeur ; return $MemoZonards($Qui,$Quoi) }  
    if {$Action=="unique"} {
	foreach {K V} [array get MemoZonards] {
	    set MemoZonards($K) [ListeSansDoublon $V]
	}
    }  
    return ""
}

proc RankSample {{What ""} {Criteria ""}} {
    set Increment 1
    if {$Criteria==""} { set Criteria "Rank" }
    if {$Criteria=="Rank"}   { set RankSample [list 1 2 3 4 5 7 8 9 10 15 20 25 30 35 40 45 50 55 60 70 75 80 90 101] }
    if {$Criteria=="DeltaR"} { set RankSample [concat [list -100] [NombresEntre  -75 50    5] [list   100]] }
    if {$Criteria=="DeltaE"} { set RankSample [concat [list -250] [NombresEntre -220 50    5] [list  -250]] }
    if {$Criteria=="DeltaS"} { set RankSample [concat [list 9000] [NombresEntre 3000  0 -100]             ] ; set Increment -1 }
    if {$Criteria=="Score"}  { set RankSample [concat [list 9000] [NombresEntre 3000  0 -100] [list -3000]] ; set Increment -1 }
    if {$Criteria=="LogExp"} { set RankSample [concat [list -250] [NombresEntre -220  0    5] ] }
    set RankSampleDeb {}
    set RankSampleFin {}
    foreach D [lrange $RankSample 0 end-1] F [lrange $RankSample 1 end] {
	incr F -1
	lappend RankSampleDeb $D
	lappend RankSampleFin $F
    }
    foreach D $RankSampleDeb F $RankSampleFin {
	lappend RankSampleLimits "$D-$F"
    }
    if {$What=="List"} { return $RankSample }
    if {$What=="ListOfList"} {
	set LL {}
	foreach D $RankSampleDeb F $RankSampleFin {
	    lappend LL [NombresEntre $D $F $Increment]
	}
	return $LL
    }
}

proc OlymCladeHelp {{GetWhat ""}} {
    set Texte "
OlymClade permet de comparer et de voir les distributions des positions du premier hit de chaque organisme dans les blastp

Avant tout il faut bien retenir que
1/ l'on part de taxobla qui contient dans l'ordre du blast les positions du premier hit de chaque organisme
   chaque ligne contient séparés par tabulation (et des blancs en fin de valeur, mais a partir de SuiteInfo il n'y a plus de tab)
   expect  score   taxid  OC                                      Suite info
   1e-73   234     88036  Selaginella moellendorffii (strand ...  D8RPE7_SELML D8RPE7 Selaginella moellendorffii Ubiquinol oxidase GN=SELMODRAFT_232012 OS=Selaginella_moellendorffii TAXID=88036 BANK=tr OX=88036 Length = 302
   
2/   
"
    if {$GetWhat=="Show"} { return [Affiche $Texte] }
    return $Texte
}

proc NiceRank {AbsRank MaxPossible} {
    set NiceRank(1) 1
    set NiceRank(2) 2
    set NiceRank(3) 3
    set NiceRank(4) 4
    set NiceRank(5) 5
    set NiceRank(6) 6
    set NiceRank(7) 7
    set NiceRank(8) 8
    set NiceRank(9) 9
    if {[info exists NiceRank(AbsRank)]} { return $NiceRank(AbsRank) }
    set Rank [expr int(($AbsRank-9)*100/$MaxPossible) + 10]
    return $Rank
} 

proc TaxoBla {{Cadre ""} {Qui ""} {Quoi ""}} {
    #rR TaxoBla stocke tout ce qu'il peut pour tous les CladeDistrbution ci-dessus
    #rR En fait Cadre est censé être du style Clade_0.001_FirstOnly_UseExpect
    #rR On peut donc faire l'étude d'un clade dans plusieurs cadres ;)
    #rR attention Expect est le vrai expect ... LogExp = log10($Expect)
    #rR attention Expect est le vrai expect ... LogExp = log10($Expect)
    #rR attention Expect est le vrai expect ... LogExp = log10($Expect)
    #rR attention Expect est le vrai expect ... LogExp = log10($Expect)
    #rR TaxoBla lit les fichiers taxobla où ne figure qu'une fois chaque organisme... 
    #rR     FirstOnly concerne le First d'un Clade ...

    #rR Petite remarque : les Rank et LogExpect sont croissants, les Score sont décroissants
    #rR DeltaE va de -250 à +250
    #rR DeltaS de 3000 à -3000
    #rR DeltaR de -100 à +100

    global TaxoBla
	
    if {[info exists TaxoBla($Cadre,$Qui,$Quoi)]}  { return $TaxoBla($Cadre,$Qui,$Quoi) }
    if {[info exists TaxoBla($Cadre,"EstCharge")]} { return "" }
    if {[regexp {^New_(.+)} $Cadre Match CadreLu]} {
	foreach Name [array names TaxoBla -glob "$CadreLu,*"] {
	    unset TaxoBla($Name)
	}
	set Cadre $CadreLu
	set FichierTaxoBla [Fiches "taxobla_$Cadre.txt"]
	if {[file exists $FichierTaxoBla]} { file delete $FichierTaxoBla }
    }
    set TaxoBla($Cadre,"EstCharge") 1

    set Clade ""
    set Seuil ""
    set SelectMethod ""
    set UseExpect ""
    lassign [split $Cadre "_"] Clade Seuil SelectMethod UseExpect


    if {[OnTraite CilioCarta Like]} {
	set LesTaxId [CladeContent $Clade "UseQds" "Without,[NotreOX]"]
    } elseif {[OnTraite OI2017 Like]} {
	set LesTaxId [CladeContentWithinOi2017 $Clade]
    } else {
	FaireLire "Désolé. Il faut être CilioCarta Like ou OI2017 Like ..."
    }
    set LesOS {}
    foreach TaxId $LesTaxId {
	set OS [join [Tax $TaxId Name] "_"]
	lappend LesOS $OS
    }
    if {$Seuil==""}        { set Seuil 0.001 }  
    if {$SelectMethod==""} { set SelectMethod "FirstOnly" }  
    if {$UseExpect==""}    { set USeExpect "UseExpect" } 

    set TaxoBla($Cadre,Cadre,)        $Cadre
    set TaxoBla($Cadre,ListOf,TaxId)  $LesTaxId
    set TaxoBla($Cadre,ListOf,OS)     $LesOS
    set TaxoBla($Cadre,Seuil,)        $Seuil
    set TaxoBla($Cadre,SelectMethod,) $SelectMethod
    set TaxoBla($Cadre,UseExpect,)    $UseExpect
    set TaxoBla($Cadre,ListOf,DeltaE) {}
    set TaxoBla($Cadre,ListOf,DeltaS) {}
    set TaxoBla($Cadre,ListOf,DeltaR) {}

    set FichierTaxoBla [Fiches "taxobla_$Cadre.txt"]
    set TaxoBla($Cadre,file,) $FichierTaxoBla

    #rR Attention ici on lit le fichier memorisé ... à effacer s'il faut le refaire
    if {[file exists $FichierTaxoBla]} {
	array set TaxoBla [LesLignesDuFichier $FichierTaxoBla]
	return [TaxoBla $Cadre $Qui $Quoi]
    }

    if {$LesTaxId=={}} { return [TaxoBla $Cadre $Qui $Quoi] }

    foreach TaxId $LesTaxId {
	set TaxoBla($Cadre,$TaxId-Sum,LogExp) 0
	set TaxoBla($Cadre,$TaxId-Sum,Score)  0
	set TaxoBla($Cadre,$TaxId-Sum,Rank)   0
	set TaxoBla($Cadre,$TaxId-Sum,DeltaE) 0
	set TaxoBla($Cadre,$TaxId-Sum,DeltaS) 0
	set TaxoBla($Cadre,$TaxId-Sum,DeltaR) 0
    }

    set SumAllLogExp 0
    set SumAllScore  0
    set SumAllRank   0
    set SumAllFirstLogExp 0
    set SumAllFirstScore  0
    set SumAllFirstRank   0
    set SumAllDeltaE 0
    set SumAllDeltaS 0
    set SumAllDeltaR 0
    set NbNom 0
    foreach Nom [ListeDesPABs] {
	set TaxoBla($Cadre,$Nom,ListOfTaxId) {}
	set LesOrgaTrie [LesLignesDuFichier [GscopeFile $Nom "taxobla"]]
	if {$LesOrgaTrie=={}} { continue }
	set LesChoisis {}
	set FirstTaxId ""
	set Ieme 0
	set NbHits 0
	foreach Ligne $LesOrgaTrie {
	    incr Ieme
	    #rR je rappelle que taxobla ne contient qu'une fois chaque organisme
	    lassign [split $Ligne "\t"] Expect Score TaxId OS Reste
	    set TaxId  [string trim $TaxId]
	    if {[lsearch $LesTaxId $TaxId]<0} { continue }	

	    if {$Expect==0.0} { set Expect 1.0e-250 }
	    #if {$Expect >1.0} { set Expect 1.0 }
	    set OS     [string trim $OS]
	    set Reste  [string trim $Reste]
	    
	    set Expect [string trim $Expect]
	    set Score  [expr round([string trim $Score])]
	    set BonSeuil  $Seuil
	    if {[regexp -nocase "^e" $Seuil]} { set BonSeuil "1.0$Seuil" }
	    if {$Expect > $BonSeuil} { break }

	    incr NbHits
	    if { ! [info exists DejaVu($Nom)]} { set DejaVu($Nom) 1 ; lappend TaxoBla($Cadre,ListOf,Nom) $Nom }

	    set LogExp [expr round(log10($Expect))]       ;#rR on passe en log !!!!!!!!!!!!!!!!!
	    set AbsRank $Ieme

	    lappend LesLogExps $LogExp
	    lappend LesScores  $Score
	    lappend TaxoBla($Cadre,$Nom,ListOfTaxId) $TaxId
	    set TaxoBla($Cadre,$Nom-$TaxId,Expect)  $Expect
	    set TaxoBla($Cadre,$Nom-$TaxId,LogExp)  $LogExp
	    set TaxoBla($Cadre,$Nom-$TaxId,Score)   $Score
	    set TaxoBla($Cadre,$Nom-$TaxId,AbsRank) $AbsRank
	    if {$FirstTaxId==""} {
		set FirstTaxId $TaxId
		set FirstLogExp  $LogExp
		set FirstScore   $Score
		set FirstAbsRank $AbsRank
		set TaxoBla($Cadre,$Nom-First,TaxId)   $TaxId
		set TaxoBla($Cadre,$Nom-First,LogExp)  $LogExp
		set TaxoBla($Cadre,$Nom-First,Score)   $Score
		set TaxoBla($Cadre,$Nom-First,AbsRank) $AbsRank
		lappend TaxoBla($Cadre,FirstTaxId-$TaxId,ListOfNom) $Nom
		set TaxoBla($Cadre,$TaxId-First,LogExp) $LogExp
		set TaxoBla($Cadre,$TaxId-First,Score)  $Score
	    }
	    set TaxoBla($Cadre,$TaxId-Sum,LogExp)  [expr $TaxoBla($Cadre,$TaxId-Sum,LogExp)  + $LogExp]
	    set TaxoBla($Cadre,$TaxId-Sum,Score)   [expr $TaxoBla($Cadre,$TaxId-Sum,Score)   + $Score]
	    lappend TaxoBla($Cadre,$TaxId,ListOfNom) $Nom
	}
	set NbHitsInBlast $Ieme
	set TaxoBla($Cadre,$Nom,NbHits) $NbHits
	if {$NbHits==0} { continue}
	incr NbNom
	set SumLogExp 0
	set SumScore 0
	set SumRank 0
	foreach TaxId $TaxoBla($Cadre,$Nom,ListOfTaxId) {
	    #set Rank [expr $TaxoBla($Cadre,$Nom-$TaxId,AbsRank)*100/$NbHitsInBlast]
	    set Rank [NiceRank $TaxoBla($Cadre,$Nom-$TaxId,AbsRank) $NbHitsInBlast]
	    set TaxoBla($Cadre,$Nom-$TaxId,Rank) $Rank
	    if {$TaxId==$FirstTaxId} {
		set TaxoBla($Cadre,$Nom-First,Rank)   $Rank
		set TaxoBla($Cadre,$TaxId-First,Rank) $Rank
		set FirstRank                         $Rank
	    }
	    set SumLogExp [expr $SumLogExp + $TaxoBla($Cadre,$Nom-$TaxId,LogExp)]
	    set SumScore  [expr $SumScore  + $TaxoBla($Cadre,$Nom-$TaxId,Score)]
	    set SumRank   [expr $SumRank   + $TaxoBla($Cadre,$Nom-$TaxId,Rank)]
	}
	set AverageLogExp [expr round($SumLogExp / $NbHits)]
	set AverageScore  [expr round($SumScore / $NbHits)]
	set AverageRank   [expr max(1,round($SumRank / $NbHits))] ;#rR j'ai mis 1 minimum
	#set AverageRank   [expr max(1,[NiceRank $SumRank $NbHits])] ;#rR j'ai mis 1 minimum
	set TaxoBla($Cadre,$Nom-Average,LogExp) $AverageLogExp
	set TaxoBla($Cadre,$Nom-Average,Score)  $AverageScore
	set TaxoBla($Cadre,$Nom-Average,Rank)   $AverageRank
	lappend TaxoBla($Cadre,AverageLogExp-$AverageLogExp,ListOfNom) $Nom
	lappend TaxoBla($Cadre,AverageScore-$AverageScore,ListOfNom)   $Nom
	lappend TaxoBla($Cadre,AverageRank-$AverageRank,ListOfNom)     $Nom
	lappend TaxoBla($Cadre,FirstLogExp-$FirstLogExp,ListOfNom)     $Nom
	lappend TaxoBla($Cadre,FirstScore-$FirstScore,ListOfNom)       $Nom
	lappend TaxoBla($Cadre,FirstRank-$FirstRank,ListOfNom)         $Nom
	set SumDeltaE 0
	set SumDeltaS 0
	set SumDeltaR 0
	foreach TaxId $TaxoBla($Cadre,$Nom,ListOfTaxId) {
	    set DeltaE [expr round($TaxoBla($Cadre,$Nom-$TaxId,LogExp) - $TaxoBla($Cadre,$Nom-Average,LogExp))]
	    set DeltaS [expr round($TaxoBla($Cadre,$Nom-$TaxId,Score)  - $TaxoBla($Cadre,$Nom-Average,Score))]
	    set DeltaR [expr round($TaxoBla($Cadre,$Nom-$TaxId,Rank)   - $TaxoBla($Cadre,$Nom-Average,Rank))]
	    set TaxoBla($Cadre,$TaxId-First,DeltaE) $DeltaE
	    set TaxoBla($Cadre,$TaxId-First,DeltaS) $DeltaS
	    set TaxoBla($Cadre,$TaxId-First,DeltaR) $DeltaR
	    incr SumDeltaE $DeltaE
	    incr SumDeltaS $DeltaS
	    incr SumDeltaR $DeltaR
	    set TaxoBla($Cadre,$Nom-$TaxId,DeltaE) $DeltaE
	    set TaxoBla($Cadre,$Nom-$TaxId,DeltaS) $DeltaS
	    set TaxoBla($Cadre,$Nom-$TaxId,DeltaR) $DeltaR
	    lappend TaxoBla($Cadre,DeltaE-$DeltaE,ListOfNom) $Nom
	    lappend TaxoBla($Cadre,DeltaS-$DeltaS,ListOfNom) $Nom
	    lappend TaxoBla($Cadre,DeltaR-$DeltaR,ListOfNom) $Nom
	    lappend TaxoBla($Cadre,ListOf,DeltaE) $DeltaE
	    lappend TaxoBla($Cadre,ListOf,DeltaS) $DeltaS
	    lappend TaxoBla($Cadre,ListOf,DeltaR) $DeltaR
	    set LogExp $TaxoBla($Cadre,$Nom-$TaxId,LogExp)
	    set Score  $TaxoBla($Cadre,$Nom-$TaxId,Score)
	    set Rank   $TaxoBla($Cadre,$Nom-$TaxId,Rank)
	    lappend TaxoBla($Cadre,ListOf,LogExp) $LogExp
	    lappend TaxoBla($Cadre,ListOf,Score)  $Score
	    lappend TaxoBla($Cadre,ListOf,Rank)   $Rank
	    lappend TaxoBla($Cadre,$TaxId-LogExp-$LogExp,ListOfNom) $Nom
	    lappend TaxoBla($Cadre,$TaxId-Score-$Score,ListOfNom)   $Nom
	    lappend TaxoBla($Cadre,$TaxId-Rank-$Rank,ListOfNom)     $Nom
	    lappend TaxoBla($Cadre,$TaxId-DeltaE-$DeltaE,ListOfNom) $Nom
	    lappend TaxoBla($Cadre,$TaxId-DeltaS-$DeltaS,ListOfNom) $Nom
	    lappend TaxoBla($Cadre,$TaxId-DeltaR-$DeltaR,ListOfNom) $Nom
	    set TaxoBla($Cadre,$TaxId-Sum,Rank)   [expr $TaxoBla($Cadre,$TaxId-Sum,Rank) + $Rank]
	    set TaxoBla($Cadre,$TaxId-Sum,DeltaE) [expr $TaxoBla($Cadre,$TaxId-Sum,DeltaE) + $DeltaE]
	    set TaxoBla($Cadre,$TaxId-Sum,DeltaS) [expr $TaxoBla($Cadre,$TaxId-Sum,DeltaS) + $DeltaS]
	    set TaxoBla($Cadre,$TaxId-Sum,DeltaR) [expr $TaxoBla($Cadre,$TaxId-Sum,DeltaR) + $DeltaR]
	}
	set TaxoBla($Cadre,$Nom-Average,DeltaE) [expr round($SumDeltaE / $NbHits)]
	set TaxoBla($Cadre,$Nom-Average,DeltaS) [expr round($SumDeltaS / $NbHits)]
	set TaxoBla($Cadre,$Nom-Average,DeltaR) [expr round($SumDeltaR / $NbHits)]
	set SumAllLogExp  [expr $SumAllLogExp + $TaxoBla($Cadre,$Nom-Average,LogExp)]
	set SumAllScore   [expr $SumAllScore  + $TaxoBla($Cadre,$Nom-Average,Score)]
	set SumAllRank    [expr $SumAllRank   + $TaxoBla($Cadre,$Nom-Average,Rank)]
	set SumAllDeltaE  [expr $SumAllDeltaE + $TaxoBla($Cadre,$Nom-Average,DeltaE)]
	set SumAllDeltaS  [expr $SumAllDeltaS + $TaxoBla($Cadre,$Nom-Average,DeltaS)]
	set SumAllDeltaR  [expr $SumAllDeltaR + $TaxoBla($Cadre,$Nom-Average,DeltaR)]
	set SumAllFirstLogExp  [expr $SumAllFirstLogExp + $TaxoBla($Cadre,$Nom-First,LogExp)]
	set SumAllFirstScore   [expr $SumAllFirstScore  + $TaxoBla($Cadre,$Nom-First,Score)]
	set SumAllFirstRank    [expr $SumAllFirstRank   + $TaxoBla($Cadre,$Nom-First,Rank)]
    } ;#rR fin de la boucle sur Nom
    set TaxoBla($Cadre,ListOf,LogExp) [lsort -unique -integer -increasing $TaxoBla($Cadre,ListOf,LogExp)]
    set TaxoBla($Cadre,ListOf,Score)  [lsort -unique -integer -decreasing $TaxoBla($Cadre,ListOf,Score)]
    set TaxoBla($Cadre,ListOf,Rank)   [lsort -unique -integer -increasing $TaxoBla($Cadre,ListOf,Rank)]
    set TaxoBla($Cadre,ListOf,DeltaE) [lsort -unique -integer -increasing $TaxoBla($Cadre,ListOf,DeltaE)]
    set TaxoBla($Cadre,ListOf,DeltaS) [lsort -unique -integer -decreasing $TaxoBla($Cadre,ListOf,DeltaS)]
    set TaxoBla($Cadre,ListOf,DeltaR) [lsort -unique -integer -increasing $TaxoBla($Cadre,ListOf,DeltaR)]
    set TaxoBla($Cadre,Average,LogExp) [expr $SumAllLogExp/$NbNom]
    set TaxoBla($Cadre,Average,Score)  [expr $SumAllScore/$NbNom]
    set TaxoBla($Cadre,Average,Rank)   [expr $SumAllRank/$NbNom]
    set TaxoBla($Cadre,Average,DeltaE) [expr $SumAllDeltaE/$NbNom]
    set TaxoBla($Cadre,Average,DeltaS) [expr $SumAllDeltaS/$NbNom]
    set TaxoBla($Cadre,Average,DeltaR) [expr $SumAllDeltaR/$NbNom]
    set TaxoBla($Cadre,First,LogExp)   [expr $SumAllFirstLogExp/$NbNom]
    set TaxoBla($Cadre,First,Score)    [expr $SumAllFirstScore/$NbNom]
    set TaxoBla($Cadre,First,Rank)     [expr $SumAllFirstRank/$NbNom]

    foreach TaxId $LesTaxId {
	if { ! [info exists TaxoBla($Cadre,$TaxId,ListOfNom)]} { continue }
	set N [llength $TaxoBla($Cadre,$TaxId,ListOfNom)]
	set TaxoBla($Cadre,$TaxId-Average,LogExp) [expr $TaxoBla($Cadre,$TaxId-Sum,LogExp)/$N]
	set TaxoBla($Cadre,$TaxId-Average,Score)  [expr $TaxoBla($Cadre,$TaxId-Sum,Score)/$N]
	set TaxoBla($Cadre,$TaxId-Average,Rank)   [expr $TaxoBla($Cadre,$TaxId-Sum,Rank)/$N]   ; set TaxoBla($Cadre,$TaxId-Average,Rank) [expr max(1,$TaxoBla($Cadre,$TaxId-Average,Rank))]
	set TaxoBla($Cadre,$TaxId-Average,DeltaE) [expr $TaxoBla($Cadre,$TaxId-Sum,DeltaE)/$N]
	set TaxoBla($Cadre,$TaxId-Average,DeltaS) [expr $TaxoBla($Cadre,$TaxId-Sum,DeltaS)/$N]
	set TaxoBla($Cadre,$TaxId-Average,DeltaR) [expr $TaxoBla($Cadre,$TaxId-Sum,DeltaR)/$N]
    }


    SauveLesLignes [array get TaxoBla "$Cadre,*"] dans $FichierTaxoBla
    return [TaxoBla $Cadre $Qui $Quoi]
}

proc MemOlym {{Qui ""} {Quoi ""} {Valeur ""}} {
    global MemOlym
    
    set Qui  [string trim $Qui]
    set Quoi [string trim $Quoi]

    if {$Qui=="Reset"} {
	if {[info exists MemOlym]} { unset MemOlym }
	return ""
    }
    
    if {$Valeur==""} {
	if {[info exists MemOlym($Qui,$Quoi)]}  { return $MemOlym($Qui,$Quoi) }
	if {[info exists MemOlym("EstCHarge")]} { return "" }
    }
    set MemOlym("EstCHarge") 1
    lappend MemOlym($Qui,$Quoi) $Valeur
    return [MemOlym $Qui $Quoi]
}

proc LesHitsAvecDelta {Nom LesOrganismesInteressants {Seuil ""} {GetWhat ""} {SelectMethod ""} {UseExpect ""}} {
    if {$UseExpect==""}    { set UseExpect "UseExpect" }
    set UseExp [string equal -nocase "UseExpect" $UseExpect]

    if {$SelectMethod==""} { set SelectMethod "FirstOnly" }	
    if {$GetWhat==""}      { set GetWhat "Show" }
    if {$Seuil==""}        { set Seuil 99999 }

    if {[regexp -nocase "Best"  $SelectMethod]} { set SelectMethode "BestOnly" }
    if {[regexp -nocase "First" $SelectMethod]} { set SelectMethode "FirstOnly" }
    if {[regexp -nocase "Ave"   $SelectMethod]} { set SelectMethode "AboveAverage" }
    if {$LesOrganismesInteressants=={}} { return {} }
    
    set LesOrgaTrie [LesLignesDuFichier [GscopeFile $Nom "taxobla"]]
    if {$LesOrgaTrie=={}} { return {} }
    set LesChoisis {}
    set PremierTaxId ""
    foreach Ligne $LesOrgaTrie {
	#rR je rappelle que taxobla ne contient qu'une fois chaque organisme
	lassign [split $Ligne "\t"] Expect Score TaxId OS Reste
	if {$Expect==0.0} { set Expect 1.0e-250 }
	#		if {$Expect >1.0} { set Expect 1.0 }
	set TaxId  [string trim $TaxId]
	set OS     [string trim $OS]
	set Reste  [string trim $Reste]
	if {[lsearch $LesOrganismesInteressants $TaxId]<0} { continue }	
	
	if {$PremierTaxId==""} { set PremierTaxId $TaxId }
	set Expect [string trim $Expect]
	set Score  [string trim $Score]
	if {$Expect > $Seuil} { break }
	lappend LesExpects $Expect
	lappend LesScores  $Score
	lappend LesChoisis "$Expect\t$Score\t$TaxId\t$OS\t$Reste"
    }
    if {$LesChoisis=={}} { return "" }
    
    if {$UseExp} {
	set LesValeurs $LesExpects
	set LesValeurs [StatisticsFromList $LesValeurs Iterate log10]                          ;#rR passage en log
    } else {
	set LesValeurs $LesScores
    }
    lassign [StatisticsFromList $LesValeurs] MoyenneBidon EcartType Min Max Somme NbValeurs
    set Moyenne [expr $Somme/[llength $LesOrganismesInteressants]]
    
    set LaSortie {}
    foreach Choisi $LesChoisis {
	lassign [split $Choisi "\t"] Expect Score TaxId
	if {$UseExp} {
	    set Valeur $Expect
	    set Valeur [expr log10($Valeur)]                                          ;#rR passage en log
	} else {
	    set Valeur $Score
	}
	set Delta [expr $Valeur-$Moyenne]
	set HitAvecDelta "$Delta\t$Choisi"
	if {$SelectMethod=="FirstOnly" && $TaxId!=$PremierTaxId} { continue }         ;#rR la on choisit de ne garder que le meilleur dans l'ordre du blast
	if {$UseExp} {
	    if {$SelectMethod=="BestOnly"     && $Delta > -10}   { continue }
	    if {$SelectMethod=="AboveAverage" && $Delta > 0}     { continue }
	} else {
	    if {$SelectMethod=="BestOnly"     && $Delta > 100}   { continue }
	    if {$SelectMethod=="AboveAverage" && $Delta > 0}     { continue }
	}
	lappend LaSortie $HitAvecDelta
    }
    
    if {[regexp "/" $GetWhat] || [string equal -nocase "Save" $GetWhat]} {
	set FichierDeltas $GetWhat
	if {[string equal -nocase "Save" $GetWhat]} { set FichierDeltas [GscopeFile $Nom delta] }
	return [SauveLesLignes $LaSortie dans $FichierDeltas]
    }
    if {[string equal -nocase "GetList" $GetWhat]} { return $LaSortie }
    if {[string equal -nocase "GetText" $GetWhat]} { return [join $LaSortie "\n"] }
    return [AfficheListe $LaSortie]
}

proc HistoDelta {{Clade ""} {Seuil ""} {GetWhat ""} {SelectMethod ""} {UseExpect ""}} {
    if {$Clade==""} { set Clade [SelectClade]  }

    set EnTest [regexp {^(ripp|scherb)$} [Login]] 
    #	set EnTest 0

    if {$UseExpect==""}  { set UseExpect "UseScore" }
    set UseExp [string equal -nocase "UseExpect" $UseExpect]

    if {$GetWhat==""}    { set GetWhat "Show" }
    if {$Seuil==""}      { set Seuil 99999 }
    if {$Clade==""}      { set Clade [ReferenceClade] }
    regsub -all " " $Clade "_" CladeUnderscore
    
    set Echantillonage 100
    
    if {[OnTraite CiloCarta Like]} {
	set LesTaxIdsInteressants [QuestionDeScience CilioCarta "ret CladeContent $Clade"]
    } elseif {[OnTraite OI2017 Like]} {
	set LesTaxIdsInteressants [QuestionDeScience OI "ret CladeContentWithinOi2017 $Clade"]
    } else {
	FaireLire "Désolé. Il faut êrte CiloCarta LIke ou OI2017 Like"
    }
    if {[set i [lsearch $LesTaxIdsInteressants 9606]]>=0} {
	set LesTaxIdsInteressants [lreplace $LesTaxIdsInteressants $i $i]
    }
	
    set NbTaxId [llength $LesTaxIdsInteressants]
    
    foreach TaxId $LesTaxIdsInteressants {
	set SommeDesDeltasPour($TaxId) 0.0
	set NbDeltasPour($TaxId) 0
    }
    set LesMeilleurs {}
    set NbNom 0
    foreach Nom [ListeDesPABs] {
    	if {0 && $EnTest && $Nom > "HSAP20193"} { break }
	set LesHitsAvecDelta [LesHitsAvecDelta $Nom $LesTaxIdsInteressants $Seuil "GetList" $SelectMethod $UseExpect]
	if {1 && $NbNom%1000==0} { Espionne $Nom ; EspionneL $LesHitsAvecDelta }
	if {$LesHitsAvecDelta=={}} { continue }
	incr NbNom
	foreach HitAvecDelta $LesHitsAvecDelta {
	    lassign $HitAvecDelta Delta Expect Score TaxId OS Reste
	    regsub -all "\t" $OS " " OS

	    MemOlym $Nom-$TaxId Delta $Delta 
	    MemOlym $Nom-$TaxId Info  $HitAvecDelta 



	    set SommeDesDeltasPour($TaxId) [expr $SommeDesDeltasPour($TaxId)+$Delta]  ;#rR attention ici on additionne des carottes et des navets !!!!!!!! car Nom différents
	    set InfoDu($TaxId) "$OS\t$Reste"
	    incr NbDeltasPour($TaxId)
	    lappend LesDeltasDe($TaxId) $Delta
	    lappend LesNomsDe($TaxId,$Delta) $Nom
	    MemOlym $TaxId-$Delta ListOfNom $Nom
	    MemoDelta $TaxId $Delta $Nom
	    set BeauDelta [format "%6.0f" $Delta]
	    if {$Delta!=$BeauDelta} { MemOlym $TaxId-$BeauDelta ListOfNom $Nom ; MemoDelta $TaxId $Delta $Nom}
	}
    }
    foreach TaxId $LesTaxIdsInteressants {
	if {$NbDeltasPour($TaxId)==0} {
	    set Moyenne -999
	} else {
	    set Moyenne [expr $SommeDesDeltasPour($TaxId)/$NbDeltasPour($TaxId)]
	}
	set MoyenneDesDeltasPour($TaxId) $Moyenne
	lappend LesMoyennesDesDeltas $Moyenne
	lappend LesTaxIdsDeLaMoyenneDesDeltas($Moyenne) $TaxId
    }
    if {$UseExp} {
	set LesMoyennesDesDeltas [lsort -unique -real $LesMoyennesDesDeltas]
    } else {
	set LesMoyennesDesDeltas [lsort -decreasing -unique -real $LesMoyennesDesDeltas]
    }
    set LaSortie [list "# TailleP  NombreDeDelta  Moyenne    TaxId      Nom_de_l'espece "]
    foreach Moyenne $LesMoyennesDesDeltas {
	foreach TaxId $LesTaxIdsDeLaMoyenneDesDeltas($Moyenne) {
	    set BelleMoyenne [format "%6.0f" $Moyenne]
	    if { ! [info exists InfoDu($TaxId)]} { continue }
	    lappend LaSortie "[TailleProteome $TaxId]\t$NbDeltasPour($TaxId)\t$BelleMoyenne\t$TaxId\t$InfoDu($TaxId)\t$Moyenne"
	}
    }
    EspionneL $LaSortie
    set AvecHisto 0
    if {$AvecHisto} {
	set LargeurMax 4000
	set HauteurMax 5000
	set Largeur    3000
	set Hauteur    2000
	set K [UnCanva $LargeurMax $HauteurMax $Largeur $Hauteur]
	global BornesDuGraphe ; set BornesDuGraphe($K) [list -250 0 250 400]
    }
    
    set MinAllDelta  9999999
    set MaxAllDelta -9999999
    set IemeTaxId -1
    foreach TaxId $LesTaxIdsInteressants {
	if { ! [info exists LesDeltasDe($TaxId)]} { continue }
	set OS [Tax $TaxId Name]
	regsub -all " " $OS "_" OSUnderscore
	incr IemeTaxId
	
	set MinAllDelta  9999999
	set MaxAllDelta -9999999
	foreach Delta $LesDeltasDe($TaxId) {
	    set MinAllDelta [Mini $Delta $MinAllDelta]
	    set MaxAllDelta [Maxi $Delta $MaxAllDelta]
	}
    }
    set IntAllDelta [expr ($MaxAllDelta - $MinAllDelta)/$Echantillonage]

    set IemeTaxId -1
    foreach TaxId $LesTaxIdsInteressants {
	if { ! [info exists LesDeltasDe($TaxId)]} { continue }
	set OS [Tax $TaxId Name]
	regsub -all " " $OS "_" OSUnderscore
	incr IemeTaxId
	if {[info exists Cumul]} { unset Cumul }
	
	set MinDelta  9999999
	set MaxDelta -9999999
	foreach Delta $LesDeltasDe($TaxId) {
	    set MinDelta [Mini $Delta $MinDelta]
	    set MaxDelta [Maxi $Delta $MaxDelta]
	}
	set IntDelta [expr ($MaxDelta - $MinDelta)/$Echantillonage]
	
	set MinDeltaDe($TaxId) $MinDelta
	set MaxDeltaDe($TaxId) $MaxDelta
	set IntervalDeltaDe($TaxId) $IntDelta
	
	set MinCase  9999
	set MaxCase -9999
	foreach Delta $LesDeltasDe($TaxId) {
	    if {$IntDelta<0.0000001} {
		set Case 0
	    } else {
		#set Case [expr round(($Delta - $MinDelta)/$IntDelta)]
		set Case [expr round(($Delta - $MinAllDelta)/$IntAllDelta)]
	    }
	    set MinCase [Mini $MinCase $Case]
	    set MaxCase [Maxi $MaxCase $Case]
	    if { ! [info exists Cumul($Case)]} { set Cumul($Case) 0 }
	    incr Cumul($Case)
	    set Tag($Case) $Delta
	    foreach Nom [MemoDelta $TaxId $Delta] {
		set BeauDelta    [format "%6.0f" $Delta]
		set BelleMoyenne [format "%6.0f" $Moyenne]
		MemoInfo $TaxId $Case "$Nom [string trim $BeauDelta] $BelleMoyenne"
	    }
	}
	set LesX {}
	set LesY {}
	set LesTags {}
	set LaDistrib [list "#Delta      Nb       Case         TaxId           OS                                                                     Reference_Clade"]
	set LesBornesDeCases [NombresEntre $MinCase $MaxCase]
	if { ! $UseExp} {
	    set LesBornesDeCases [lreverse $LesBornesDeCases]
	}
	foreach Case $LesBornesDeCases {
	    if { ! [info exists Cumul($Case)]}         { set Cumul($Case) 0 }
	    if {$Cumul($Case)==0} { continue }
	    if { ! [info exists Tag($Case)]}           { set Tag($Case) "0.0" }
	    if { ! [info exists DeltaDeLaCase($Case)]} { set DeltaDeLaCase($Case) "0.0" }
	    set X  [expr $MinAllDelta + $Case*$IntAllDelta]
	    lappend LesX $X
	    lappend LesY $Cumul($Case)
	    lappend LesTags   "[format %6.0f $X]:$Cumul($Case) $OS"
	    lappend LaDistrib "[format %6.0f $X]\t$Cumul($Case)\t$Case\tTaxId:$TaxId\tOS:$OSUnderscore\tReferenceClade:$CladeUnderscore"  
	}
	MemoCase $TaxId LaDistrib $LaDistrib
	if {$AvecHisto} {
	    set Couleur [Nuance [expr 1.0*$IemeTaxId/$NbTaxId]]
	    Graphe $LesX $LesY $K $Couleur "" "" "" "" "HistoDelta" $LesTags "" "BindOnly_oval" $LargeurMax $HauteurMax
	} else {
	    #	    set F [AfficheListe $LaDistrib "AvecCase" $OS]
	    #	    set B [BoutonneLaFenetre $F "ShowHits" "ShowHitsFromTaxoBlast \[selection get\]"]
	    #	    $B configure -background "Magenta"
	}
    }	
	
    if {$GetWhat=="Show"} {
	set F [AfficheListe $LaSortie "" "Delta distribution for $Clade $Seuil $SelectMethod $UseExpect"]
	set B [BoutonneLaFenetre $F "Distribution" "ShowDeltaDistribution \[selection get\]"]
	$B configure -background "Magenta"
    }
    return $LaSortie
}

proc OlymPodium {K} {
    set Touche [$K find withtag current]
    set LesTags [$K gettags $Touche]
    lassign $LesTags Podium I J Clade Header
    if {[regexp {^[0-9]+\-[0-9]+$} $Header]} {
	set LesNoms [OlymStock "CaseRank-$Header" $Clade]
	foreach Nom $LesNoms {
	    set Id [ExtraitInfo $Nom Id]
	    set Ac [ExtraitInfo $Nom Ac]
	    set ValiGN [ExtraitInfo $Nom ValiGN]
	    lappend LesGn $ValiGN
	    set ValiDE [ExtraitInfo $Nom ValiDE]
	    lappend LaSortie "$Nom\t$Id\t$Ac\t$ValiGN\t$ValiDE"
	}
	set F [AfficheListe "#n°HSAP\n$LaSortie" "AvecFetch" "Hits with rank $Header for $Clade"]
	set GeneNames [join $LesGn ","]
	set B [BoutonneLaFenetre $F "GeneOntology" "GoGetShowFromGeneList $GeneNames"]
	$B configure -background "Magenta"
    }	
}

proc OlymMedals {} {
    set LesClades [OlymStock ListOf Clade]
    set LesTaxId  [OlymStock ListOf TaxId]
    set LesCasesRank [CaseRank ListOf]
    set LesHeaders {}
    set LesSensDuTri {}
    lappend LesHeaders    "Rank"         "RankAv"
    lappend LesSensDuTri  "0red-100blue" "0red-100blue"
    
    foreach Case $LesCasesRank {
	lappend LesHeaders $Case
	lappend LesSensDuTri "100red-0blue"
    }
    lappend LesHeaders   "Score"        "ScoreAv"      "Expect"       "ExpectAv"
    lappend LesSensDuTri "100red-0blue" "100red-0blue" "0red-100blue" "0red-100blue"
    foreach Clade $LesClades {
	set MoyRank       [OlymStock $Clade MoyenneRank]
	set MoyScore      [OlymStock $Clade MoyenneScore]
	set MoyExpect     [OlymStock $Clade MoyenneExpect]
	lappend LesCladesDuRank($MoyRank) $Clade 	
	lappend LesRanks $MoyRank	 	
    }
    set LesRanks [lsort -unique -integer $LesRanks]
    set LesCladesRankes {}
    foreach Rank $LesRanks {
	foreach Clade $LesCladesDuRank($Rank) {
	    lappend LesCladesRankes $Clade
	}
    }
    set I -1
    foreach Clade $LesCladesRankes {
	incr I	
	
	set MoyRank       [OlymStock $Clade MoyenneRank]
	set MoyRankGen    [OlymStock Moyenne MoyenneRank]

	set MoyScore      [OlymStock $Clade MoyenneScore]
	set MoyScoreGen   [OlymStock Moyenne MoyenneScore]

	set MoyExpect     [OlymStock $Clade MoyenneExpect]
	set FMoyExpect    [format "%4.2f" $MoyExpect]
	set MoyExpectGen  [OlymStock Moyenne MoyenneExpect]
	set FMoyExpectGen [format "%4.2f" $MoyExpectGen]

	
	set x -1
	set T($I,[incr x]) $MoyRank 
	set T($I,[incr x]) $MoyRankGen 
	foreach Case $LesCasesRank {
	    set LesNoms [OlymStock "CaseRank-$Case" $Clade]
	    set N [llength $LesNoms]
	    set T($I,[incr x]) $N
	}
	

	set T($I,[incr x]) $MoyScore	
	set T($I,[incr x]) $MoyScoreGen	
	set T($I,[incr x]) $FMoyExpect
	set T($I,[incr x]) $FMoyExpectGen		 	
    }	
    return [Medals $LesCladesRankes [array get T] $LesHeaders $LesSensDuTri]
}

proc Medals {{LesTitres ""} {LeT ""} {LesHeaders ""} {LesSensDuTri ""} {TagClick ""} {NomDe ""}} {
    #rR Medals affiche un tableau rectangulaire de lignes I et de colonnes J fournies par le array LeT
    #rR  en début de chaque ligne il y a un titre
    #rR  au dessus de chaque colonne il y a un header
    #rR Quand on clique sur un rectangle on exécute TagClick.
    if {$TagClick==""} { set TagClick "podium" }

    array set T $LeT
    set LesIJ [array names T]

    set LesI {}
    set LesJ {}
    foreach IJ $LesIJ {
	lassign [split $IJ ","] I J
	lappend LesI $I
	lappend LesJ $J
    }
    set LesI [lsort -integer -unique $LesI]
    set LesJ [lsort -integer -unique $LesJ]

    foreach I $LesI {
	foreach J $LesJ {
	    if { ! [info exists T($I,$J)]} { set T($I,$J) 0 }
	}
    }
    set MaxTitreSize -1
    foreach Titre $LesTitres {
	set MaxTitreSize [Maxi $MaxTitreSize [string length $Titre]]
    }

    set K [UnCanva "" 600 1600 600 1600]
    set CRed   0.1
    set CBlue  0.5
    set CSGx [expr $MaxTitreSize*8]
    set CSGy  50
    set W 50
    set Ex 5
    set H 20
    set Ey $Ex
    #set Tx 350
    #set Ty 80
    foreach Header $LesHeaders Sens $LesSensDuTri J $LesJ {
	set HeaderDe($J) $Header
	set SensDuTri($J) $Sens
	set Dx [expr $CSGx + $W*$J + $Ex*$J]
	set Fx [expr $Dx + $W]
	set Cx [expr ($Dx+$Fx)/2]
	if {[regexp {(^-?[0-9]+)\-(-?[0-9]+)$} $Header Match D S F]} { set Header $D }
	$K create text $Cx [expr $CSGy-20] -text $Header -anchor center
    }
    foreach J $LesJ {
	set Min 99999999
	set Max -99999999
	foreach I $LesI {
	    if {$T($I,$J)<$Min } {set Min $T($I,$J)}
	    if {$T($I,$J)>$Max } {set Max $T($I,$J)}
	}
	set ValeurMin($J) $Min
	set ValeurMax($J) $Max
    }	
    foreach Titre $LesTitres I $LesI {
	regsub -all " " $Titre "_" Titre
	set TitreDe($I) $Titre
	set Dy [expr $CSGy + $H*$I + $Ex*$I]
	set Fy [expr $Dy + $H]
	set Cy [expr ($Dy+$Fy)/2]
	$K create text 10 $Cy -text $Titre -anchor w -tags "clade $Titre" 
	foreach J $LesJ {
	    set Dx [expr $CSGx + $W*$J + $Ex*$J]
	    set Fx [expr $Dx + $W]
	    set Cx [expr ($Dx+$Fx)/2]
	    if {$SensDuTri($J)=="0red-100blue"} {
		set Cmin $CRed
		set Cmax $CBlue
	    } else {			
		set Cmin $CBlue
		set Cmax $CRed
	    }
	    if {($ValeurMax($J)-$ValeurMin($J))==0} { 
		set Couleur [Nuance 0.5 $Cmin $Cmax]
	    } else {
		set Couleur [Nuance [expr 1.0*($T($I,$J)-$ValeurMin($J))/($ValeurMax($J)-$ValeurMin($J))] $Cmin $Cmax]
	    }
	    $K create rectangle $Dx $Dy $Fx $Fy -fill $Couleur    -tags "$TagClick $I $J $TitreDe($I) $HeaderDe($J)"
	    $K create text $Cx $Cy -text $T($I,$J) -anchor center -tags "$TagClick $I $J $TitreDe($I) $HeaderDe($J)"
	    
	}
    }
    if {$TagClick=="podium"} {
	$K bind "podium" <1>       "OlymPodium       $K"
	$K bind "clade"  <1>       "RunBlastOutliers $K UseExpect"
	$K bind "clade"  <Shift-1> "RunBlastOutliers $K UseScore"
    } elseif {$TagClick=="zonard"} {
	lassign [split $] Clade 
	$K bind "zonard" <1>       "ShowZonards      $K $NomDe"
	$K bind "clade"  <1>       "RunDeltaDistributionForClade $K"
    } else {
	$K bind "Distri" <1>       "ShowDistriHits   $K"
	$K bind "clade"  <1>       "RunBlastOutliers $K UseExpect"
	$K bind "clade"  <Shift-1> "RunBlastOutliers $K UseScore"
    }
    return $K
}

proc ShowDistriHits K {
    set Touche [$K find withtag current]
    set LesTags [$K gettags $Touche]
    lassign $LesTags Distri I J Clade RepresentativeDelta
Espionne $LesTags
    set TaxId [MemoDistri $I ItsTaxId]
    set Box   [MemoDistri $RepresentativeDelta ItsBox]
Espionne "$TaxId=$Box="

    set LaSortie {}
    foreach Delta [MemoDistri $Box ListOfDelta] {
	set LesNoms [MemOlym $TaxId-$Delta ListOfNom]
Espionne "MemOlym $TaxId-$Delta ListOfNom"
Espionne $LesNoms
	foreach Nom $LesNoms {
	    set Id [ExtraitInfo $Nom Id]
	    set Ac [ExtraitInfo $Nom Ac]
	    set ValiGN [ExtraitInfo $Nom ValiGN]
	    lappend LesGn $ValiGN
	    set ValiDE [ExtraitInfo $Nom ValiDE]
	    lappend LaSortie "$Nom\t$Id\t$Ac\t$ValiGN\t$ValiDE"
	}
    }	
    set F [AfficheListe "#n°HSAP\n$LaSortie" "AvecFetch" "Hits with at least $Distri for $Clade"]
    set GeneNames [join $LesGn ","]
    set B [BoutonneLaFenetre $F "GeneOntology" "GoGetShowFromGeneList $GeneNames"]
    $B configure -background "Magenta"
}

proc RunBlastOutliers {K {UseExpect ""}} {
    set Id [$K find withtag current]Seuil
    set Clade [lindex [$K gettags $Id] 1]
    BlastOutliers $UseExpect $Clade
}

proc NearestColor {rgb} {
    set RGB [split $rgb " "]
    set r [lindex $RGB 0]
    set g [lindex $RGB 1]
    set b [lindex $RGB 2]
    set ListeRGB [Palette listof rgb ]
    set Dmin [expr 255*255*3]
    foreach RGB $ListeRGB {
	set x [lindex $RGB 0]
	set y [lindex $RGB 1]
	set z [lindex $RGB 2]
	set D2 [expr ($r-$x)**2 + ($g-$y)**2 + ($b-$z)**2 ]
	if {$D2<$Dmin} { set Dmin $D2; set NearestRGB $RGB}	
    }		
    return $NearestRGB
}

proc TousLesPremiersDuClade {Nom LesOrganismesInteressants {Seuil ""} {GetWhat ""}} {
    if {$GetWhat==""} { set GetWhat "Show" }
    if {$Seuil==""} { set Seuil 0.001 }

    set LesOrgaTrie [LesLignesDuFichier [GscopeFile $Nom "taxobla"]]
    if {$LesOrgaTrie=={}} { return "The file taxobla/$Nom does not exist" }
    set LaSortie {}
    foreach Ligne $LesOrgaTrie {
	lassign [split $Ligne "\t"] Expect Score TaxId OS Reste
	set TaxId  [string trim $TaxId]
	set OS     [string trim $OS]
	set Reste  [string trim $Reste]
	if {[lsearch $LesOrganismesInteressants $TaxId]<0} { continue }	
	set Expect [string trim $Expect]
	if {$Expect > $Seuil} { break }
	lappend LaSortie $Ligne
    }
    if {$LaSortie=={}} { return "" }

    if {[regexp "/" $GetWhat] || [string equal -nocase "Save" $GetWhat]} {
	set FichierPremiers $GetWhat
	if {[string equal -nocase "Save" $GetWhat]} { set FichierPremiers [GscopeFile $Nom premier] }
	return [SauveLesLignes $LaSortie dans $FichierPremiers]
    }
    if {[string equal -nocase "GetList" $GetWhat]} { return $LaSortie }
    if {[string equal -nocase "GetText" $GetWhat]} { return [join $LaSortie "\n"] }
    return [AfficheListe $LaSortie]
}

proc HistoPremier {{Clade ""} {Seuil ""} {GetWhat ""}} {
    
    if {$GetWhat==""} { set GetWhat "Show" }
    if {$Seuil==""} { set Seuil 0.001 }
    if {$Clade==""} { set Clade [ReferenceClade] }

    if {[OnTraite CiloCarta Like]} {
	set LesTaxIdsInteressants [QuestionDeScience CilioCarta "ret CladeContent $Clade"]
    } elseif {[OnTraite OI2017 Like]} {
	set LesTaxIdsInteressants [QuestionDeScience OI "ret CladeContentWithinOi2017 $Clade"]
    } else {
	FaireLire "Désolé il faut être LioCarta Like ou OI2017 Like"
    }
    set LesMeilleurs {}
    set N 0
    foreach Nom [ListeDesPABs] {
	if {$N%100==0} { Espionne "$N $Nom" }
    	if {$Nom>"HSAP01000"} { break }
	set LesPremiers [TousLesPremiersDuClade $Nom $LesTaxIdsInteressants "" "GetList"]
	if {$LesPremiers=={}} { continue }
	incr N		
	set P [lindex $LesPremiers 0]
	lassign $P PN TaxId OS
	if { ! [info exists Cumul($TaxId)]}	{
	    set Cumul($TaxId) 0
	    lappend LesMeilleurs $TaxId
	} 
	incr Cumul($TaxId)
    }
    
    set LesMeilleurs [lsort -unique $LesMeilleurs]
    foreach Meilleur $LesMeilleurs {
	set C $Cumul($Meilleur)
	lappend LesCumularsDe($C) $Meilleur
    }
    set LesC [array names LesCumularsDe]
    set LesMeilleursTries {}
    foreach C [lsort -decreasing -integer $LesC] {
	LConcat LesMeilleursTries $LesCumularsDe($C)
    }
    foreach Meilleur $LesMeilleursTries {
	lappend LaSortie "$Cumul($Meilleur) $Meilleur [Tax $Meilleur Name]"
    }
    return $LaSortie
    EspionneL $LaSortie

    SauveLesLignes [array get LesCumularsDe] dans "/home/scherb/gscoperso/Cumulars.txt"

    
    set LesC {}
    foreach C [lsort -integer [array names LesCumularsDe]] {
	lappend LesC $C
	lappend LesNC [llength $LesCumularsDe($C)]
    }
    Espionne $LesC
    Espionne $LesNC
    return [Graphe $LesC $LesNC "" "" "" "" "" "" "Histogramme coucou"]

}

proc HistoPremierMemo {{FichierCumulars ""}} {

    if {$FichierCumulars=={}} { set FichierCumulars "/home/scherb/gscoperso/Cumulars.txt" }

    array set LesCumularsDe [LesLignesDuFichier $FichierCumulars]	
    parray LesCumularsDe
    
    set LesC {}
    foreach C [lsort -integer [array names LesCumularsDe]] {
	lappend LesC $C
	lappend LesNC [llength $LesCumularsDe($C)]
    }
    Espionne $LesC
    Espionne $LesNC
    return [Graphe $LesC $LesNC "" "" "" "" "" "" "Histogramme coucou"]

}

proc TailleProteome Qui {
    global TailleProteome

    if {[OnTraite "OI2017" "Like"]} {
	return [OiProteomeSize $Qui]
    }

    if {[info exists TailleProteome($Qui)]} { return $TailleProteome($Qui) }
    if {[info exists TailleProteome("EstCharge")]} { return -1 }
    set TailleProteome("EstCharge") 1
    
    set Fichier "[RepertoireDuGenome]/banques/Proteome201501_TaillesDesOs.txt"
    foreach Ligne [LesLignesDuFichier $Fichier]	{
	if { ! [regexp {^([0-9]+)[ \t].+_([0-9]+)} $Ligne Match Taille TaxId]} { continue }
	set TailleProteome($TaxId) $Taille
    }
    set TailleProteome(9606) 20193   ; #rR dans la banque il y en a 66922
                                       #rR on n'a gardé que les swissprot 
    

    return [TailleProteome $Qui]
}

proc TestMemoDelta {} {
    MemoDelta a b x
    MemoDelta a b y
    MemoDelta a b z

    Espionne [MemoDelta a b]
    Espionne [MemoDelta a r]

    MemoDelta Reset

    MemoDelta a b y
    MemoDelta a b z

    Espionne [MemoDelta a b]
    Espionne [MemoDelta a r]

}

proc MemoDelta {{Qui ""} {Quoi ""} {Valeur ""}} {
    global MemoDelta
    
    set Qui  [string trim $Qui]
    set Quoi [string trim $Quoi]

    if {$Qui=="Reset"} {
	if {[info exists MemoDelta]} { unset MemoDelta }
	return ""
    }
    
    if {$Valeur==""} {
	if {[info exists MemoDelta($Qui,$Quoi)]}  { return $MemoDelta($Qui,$Quoi) }
	if {[info exists MemoDelta("EstCHarge")]} { return "" }
    }
    set MemoDelta("EstCHarge") 1
    lappend MemoDelta($Qui,$Quoi) $Valeur
    return [MemoDelta $Qui $Quoi]
}

proc MemoInfo {{Qui ""} {Quoi ""} {Valeur ""}} {
    global MemoInfo
    
    set Qui  [string trim $Qui]
    set Quoi [string trim $Quoi]

    if {$Qui=="Reset"} {
	if {[info exists MemoInfo]} { unset MemoInfo }
	return ""
    }
    
    if {$Valeur==""} {
	if {[info exists MemoInfo($Qui,$Quoi)]}  { return $MemoInfo($Qui,$Quoi) }
	if {[info exists MemoInfo("EstCHarge")]} { return "" }
    }
    set MemoInfo("EstCHarge") 1
    lappend MemoInfo($Qui,$Quoi) $Valeur
    return [MemoInfo $Qui $Quoi]
}

proc MemoCase {{Qui ""} {Quoi ""} {Valeur ""}} {
    global MemoCase
    
    set Qui  [string trim $Qui]
    set Quoi [string trim $Quoi]
    if {$Qui=="Reset"} {
	if {[info exists MemoCase]} { unset MemoCase }
	return ""
    }
    
    if {$Valeur==""} {
	if {[info exists MemoCase($Qui,$Quoi)]}  { return $MemoCase($Qui,$Quoi) }
	if {[info exists MemoCase("EstCHarge")]} { return "" }
    }
    set MemoCase("EstCHarge") 1
    set MemoCase($Qui,$Quoi) $Valeur
    return [MemoCase $Qui $Quoi]
}

proc MemoDistri {{Qui ""} {Quoi ""} {Valeur ""}} {
    global MemoDistri
    
    set Qui  [string trim $Qui]
    set Quoi [string trim $Quoi]
    if {$Qui=="Reset"} {
	if {[info exists MemoDistri]} { unset MemoDistri }
	return ""
    }
    
    if {$Valeur==""} {
	if {[info exists MemoDistri($Qui,$Quoi)]}  { return $MemoDistri($Qui,$Quoi) }
	if {[info exists MemoDistri("EstCHarge")]} { return "" }
    }
    set MemoDistri("EstCHarge") 1
    lappend MemoDistri($Qui,$Quoi) $Valeur
    return [MemoDistri $Qui $Quoi]
}

proc BlastOutliers {{UseExpect ""} {Clade ""}} {
    return [HistoDelta $Clade "" Show "" $UseExpect]
}

proc ShowDeltaDistributionForClade {{Clade ""} {Seuil ""} {GetWhat ""} {SelectMethod ""} {UseExpect ""}} {
    set LesLignes [HistoDelta $Clade $Seuil "GetList" $SelectMethod $UseExpect]
    set T(Min,Delta)  99999
    set T(Max,Delta) -99999
    foreach Ligne $LesLignes {
	if {[regexp "^#" $Ligne]} { continue }
	regsub -all {[ \t]+} $Ligne " " Ligne
	set LesMots [split [string trim $Ligne] " "]
	lassign $LesMots TailleProteome NbDelta Moyenne TaxId
	set OS [join [lrange $LesMots 4 end] " "]
	set T($TaxId,OS) $OS
	set LaDistrib [MemoCase $TaxId "LaDistrib"]
	lappend T(ListOf,TaxId) $TaxId
	set T($TaxId,MinDelta)  99999
	set T($TaxId,MaxDelta) -99999
	foreach Distri $LaDistrib {
	    if {[regexp "^#" $Distri]} { continue }
	    lassign [split $Distri "\t"] Delta Count Case tid o RefCla
	    regsub -all " " $Delta "" Delta
	    regsub -all " " $Count "" Count
	    regsub -all " " $Case  "" Case
	    regsub "ReferenceClade:" $RefCla "" ReferenceClade
	    Espionne "$Delta $Count $Case"
	    set T($TaxId,$Delta) $Count
	    set T($TaxId,MinDelta) [Mini $T($TaxId,MinDelta) $Delta]
	    set T($TaxId,MaxDelta) [Maxi $T($TaxId,MaxDelta) $Delta]
	    lappend T($Delta,ListOfTaxId) $TaxId
	    lappend T(ListOf,Delta) $Delta
	}
	set T(Min,Delta) [Mini $T(Min,Delta) $T($TaxId,MinDelta)] 
	set T(Max,Delta) [Maxi $T(Max,Delta) $T($TaxId,MaxDelta)] 
    }
    set UseExpect [string equal -nocase $UseExpect "UseExpect"]
    if {$UseExpect} {
	set T(ListOf,Delta) [lsort -integer -decreasing $T(ListOf,Delta)]
    } else {
	set T(ListOf,Delta) [lsort -integer -increasing $T(ListOf,Delta)]
    }
    set LesHeaders {}
    set Box 0
    set LesDelta $T(ListOf,Delta)
    set OnBreak 0
    while {1} {
	set N [llength $LesDelta]
	Espionne $LesDelta
	set Portion [expr $N/3]
	if {$N<12} {
	    set LesCourants $LesDelta
	    set OnBreak 1
	} else {
	    set PortionMoinsUn [expr $Portion-1]
	    set LesCourants [lrange $LesDelta end-$Portion end]
	    set LesDelta    [lrange $LesDelta 0            end-$PortionMoinsUn]
	}
	Espionne "Box $Box : $LesCourants"
	set BoxVide($Box) 1
	foreach D $LesCourants {
	    if {[info exists DejaVu($D)]} { continue }
	    set DejaVu($D) 1
	    foreach TaxId $T($D,ListOfTaxId) {
		set BoxVide($Box) 0
		set BM1 [expr $Box - 1]		
		if { ! [info exists CumulParBox($BM1,$TaxId)]} { set CumulParBox($BM1,$TaxId) 0 }
		if { ! [info exists CumulParBox($Box,$TaxId)]} { set CumulParBox($Box,$TaxId) $CumulParBox($BM1,$TaxId) }
		incr CumulParBox($Box,$TaxId) $T($TaxId,$D)
		Espionne "incr CumulParBox($Box,$TaxId) $T($TaxId,$D) > $CumulParBox($Box,$TaxId)"
	    }
	    MemoDistri $Box ListOfDelta $D 
	}
	if { ! $BoxVide($Box) } {
	    set Delta [lindex $LesCourants 0]
	    MemoDistri $Delta ItsBox $Box
	    lappend LesHeaders $Delta 
	}
	if {$OnBreak} { break }
	incr Box
    }
    set MaxBox $Box

    set I 0
    foreach TaxId $T(ListOf,TaxId) {
	set Box 0
	set LaLigne {}
	foreach Box [NombresEntre 0 $MaxBox] {
	    if {$BoxVide($Box)} { continue }
	    if { ! [info exists CumulParBox($Box,$TaxId)]} { set CumulParBox($Box,$TaxId) 0 }
	    lappend LaLigne [format "%7d" $CumulParBox($Box,$TaxId)]
	    set W($I,$Box) $CumulParBox($Box,$TaxId)
	    incr Box
	}
	Espionne "[format %-30s $T($TaxId,OS)] [join $LaLigne { }]" 
	lappend LesTitres $T($TaxId,OS)
	MemoDistri $I ItsTaxId $TaxId
	incr I
    }
    set NbBox [expr $MaxBox + 1]
    if {$UseExpect} {
	set LesSensDuTri [string repeat "100red-0blue" $NbBox]
    } else {
	set LesSensDuTri [string repeat "0blue-100red" $NbBox]
    }
    set LeW [array get W]
    return [Medals $LesTitres $LeW $LesHeaders $LesSensDuTri "Distri"]
} 
				     

proc ShowDeltaDistribution {Selection} {
    
    set LesFenetres {}
    foreach Sel [split $Selection "\n"] {
	if {[regexp "^#" $Sel]} { continue }
	regsub -all {[ \t]+} $Sel " " Sel
	set Sel [string trim $Sel]
	set TaxId [lindex [split $Sel " "] 3]
	set LaDistrib [MemoCase $TaxId "LaDistrib"]
	if {$LaDistrib==""} { continue }
	regsub -all {[ \t]+} $Sel " " SelPourTitre
	set F [AfficheListe $LaDistrib "AvecCase" "Delta distribution concerning $SelPourTitre"]
	set B [BoutonneLaFenetre $F "ShowHits" "ShowHitsFromTaxoBlast \[selection get\]"]
	$B configure -background "Magenta"
	lappend LesFenetres $F
    }
    return $LesFenetres
}

proc ShowHitsFromTaxoBlast {Selection} {
    
    set LaSortie [list "#[PreFixe]  EcartMoy   Moyenne  Id                 VaLign          Valide                                                 NumeroDuTaxId                                              OS                                      Reference"]                                                                                                                                                   
    set LesGn    {}
    foreach Sel [split $Selection "\n"] {
	if {[regexp "^#" $Sel]} { continue }
	regsub -all {[ \t]+} $Sel " " Sel
	lassign [split [string trim $Sel] " "] Delta N Case
	
	set TaxId [StringApres "TaxId:"          dans $Sel]
	set OS    [StringApres "OS:"             dans $Sel]
	set Clade [StringApres "ReferenceClade:" dans $Sel]
	
	set LesAccess {}
	foreach Info [MemoInfo $TaxId $Case] {
	    scan $Info "%s" Nom
	    set Id [ExtraitInfo $Nom Id]
	    set Ac [ExtraitInfo $Nom Ac]
	    set ValiGN [ExtraitInfo $Nom ValiGN]
	    lappend LesGn $ValiGN
	    set ValiDE [ExtraitInfo $Nom ValiDE]
	    lappend LaSortie $Info\t$Id\t$Ac\t$ValiGN\t$ValiDE\tTaxId:$TaxId\tOS:$OS\tReferenceClade:$Clade
	}
    }
    set LaSortie [lsort -unique $LaSortie]
    set GeneNames [join $LesGn ","]
    set F [AfficheListe $LaSortie "" "$TaxId [TaxClass $TaxId Name Reverse]"]
    set B [BoutonneLaFenetre $F "GeneOntology" "GoGetShowFromGeneList $GeneNames"]
    $B configure -background "Magenta"
    set B [BoutonneLaFenetre $F "Outliers" "OutliersFromSelection \[selection get\]"]
    $B configure -background "Magenta"
    return $F   
}

proc OutliersFromSelection Selection {
    foreach Sel [split $Selection "\n"] {
	if {[regexp "^#" $Sel]} { continue }
	scan $Sel "%s" Nom
	set TaxId [StringApres "TaxId:"          dans $Sel]
	set OS    [StringApres "OS:"             dans $Sel]
	set Clade [StringApres "ReferenceClade:" dans $Sel]
	set Seuil ""
	lappend LesFenetres [OutlierOrganismInBlast $Nom $TaxId $Clade $Seuil "Show"]
    }
    return $LesFenetres
}

proc GoGetShowFromGeneListWithNom LesNoms {
    set Noms [join $LesGn ","]
    set LesGnGO [GoGetFromGeneList $GeneNames "GOacc,name" "" "\t"]
    foreach GnGO $LesGnGO {
	if {[regexp {^([^=]+)=(.*)$} $GnGO Match Gn GOsPropres]} {
	    set GOs $GOsPropres
	    lappend LesGenesEtLeursGOs "\n$Gn *************"
	}
	foreach GO [split $GOs "\t"] {
	    lassign $GO GoAcc GoName
	    lappend LesGoAcc  $GoAcc
	    lappend LesGoName $GoName
	    set GoAccName "$GoAcc $GoName"
	    lappend LesGenesEtLeursGOs "$Gn $GoAccName"
	    lappend LesGenesDu($GoAccName) $Gn
	    set LesGenesDu($GoAccName) [lsort -unique $LesGenesDu($GoAccName)]
	}
    }
    set LesNombres {}
    set LesGOsEtLeursGenes [list "#GeneCount GO                                     Genes"]
    foreach {GoAccName Genes} [array get LesGenesDu] {
	set Nombre [llength $Genes]
	lappend LesNombres $Nombre
	lappend LesGoDeLaLongueur($Nombre) $GoAccName
    }
    set LesNombres [lsort -integer -unique -decreasing $LesNombres]
    foreach Nombre $LesNombres {
	foreach GoAccName $LesGoDeLaLongueur($Nombre) {
	    lappend LesGOsEtLeursGenes " $Nombre $GoAccName"
	    set Genes [join $LesGenesDu($GoAccName)	" "]			
	    set TexteAAfficher $Genes
	    while {[string length $TexteAAfficher]>80} {
		set Debut          [string range $TexteAAfficher 0 79]			
		set iDBlanc        [string last " " $Debut]
		set BonDebut       [string range $TexteAAfficher 0          $iDBlanc-1]
		set TexteAAfficher [string range $TexteAAfficher $iDBlanc+1 end]
		lappend LesGOsEtLeursGenes "[string repeat { } 40] $BonDebut"
	    }
	    if {$TexteAAfficher != ""} {
		lappend LesGOsEtLeursGenes "[string repeat { } 40] $TexteAAfficher"
	    }
	}
    }	
    set LesFenetres {}
    #set F [AfficheListe $LesGenesEtLeursGOs "GrandeLargeur" "Genes With their GOs"]
    lappend LesFenetres [AfficheListe $LesGOsEtLeursGenes "GrandeLargeur" "GOs with their genes"]
    return $LesFenetres
}

proc GoGetShowFromGeneList LesGn {
    set GeneNames [join $LesGn ","]
    set LesGnGO [GoGetFromGeneList $GeneNames "GOacc,name" "" "\t"]
    foreach GnGO $LesGnGO {
	if {[regexp {^([^=]+)=(.*)$} $GnGO Match Gn GOsPropres]} {
	    set GOs $GOsPropres
	    lappend LesGenesEtLeursGOs "\n$Gn *************"
	}
	foreach GO [split $GOs "\t"] {
	    lassign $GO GoAcc GoName
	    lappend LesGoAcc  $GoAcc
	    lappend LesGoName $GoName
	    set GoAccName "$GoAcc $GoName"
	    lappend LesGenesEtLeursGOs "$Gn $GoAccName"
	    lappend LesGenesDu($GoAccName) $Gn
	    set LesGenesDu($GoAccName) [lsort -unique $LesGenesDu($GoAccName)]
	}
    }
    set LesNombres {}
    set LesGOsEtLeursGenes [list "#GeneCount GO                                     Genes"]
    foreach {GoAccName Genes} [array get LesGenesDu] {
	set Nombre [llength $Genes]
	lappend LesNombres $Nombre
	lappend LesGoDeLaLongueur($Nombre) $GoAccName
    }
    set LesNombres [lsort -integer -unique -decreasing $LesNombres]
    foreach Nombre $LesNombres {
	foreach GoAccName $LesGoDeLaLongueur($Nombre) {
	    lappend LesGOsEtLeursGenes " $Nombre $GoAccName"
	    set Genes [join $LesGenesDu($GoAccName)	" "]			
	    set TexteAAfficher $Genes
	    while {[string length $TexteAAfficher]>80} {
		set Debut          [string range $TexteAAfficher 0 79]			
		set iDBlanc        [string last " " $Debut]
		set BonDebut       [string range $TexteAAfficher 0          $iDBlanc-1]
		set TexteAAfficher [string range $TexteAAfficher $iDBlanc+1 end]
		lappend LesGOsEtLeursGenes "[string repeat { } 40] $BonDebut"
	    }
	    if {$TexteAAfficher != ""} {
		lappend LesGOsEtLeursGenes "[string repeat { } 40] $TexteAAfficher"
	    }
	}
    }	
    set LesFenetres {}
    #set F [AfficheListe $LesGenesEtLeursGOs "GrandeLargeur" "Genes With their GOs"]
    lappend LesFenetres [AfficheListe $LesGOsEtLeursGenes "GrandeLargeur" "GOs with their genes"]
    return $LesFenetres
}

proc LesNomsPourOlymClade {} {
    set LesNoms [ListeDesPABs]
#    set LesNoms [lrange $LesNoms 0 999]
    return $LesNoms
}

proc ChallengingClades {{Qui ""} {Quoi ""}} {
    #rR Connait les TaxIds des clades et le clade des TaxIds
    global ChallengingClades
    
    set LesClades {}
    if {$Qui=="Load"} {
	if {[info exists ChallengingClades]} { unset ChallengingClades }
	set LesClades $Quoi
	set Qui  "ListOf"
	set Quoi "Clade"
    }
    if {[info exists ChallengingClades($Qui,$Quoi)]}  { return $ChallengingClades($Qui,$Quoi) }
    if {[info exists ChallengingClades("EstCharge")]} { return "" }
    set ChallengingClades("EstCharge") 1
    
    if {$LesClades=={}} { set LesClades [SelectClade "Multiple"] }
    
    set ChallengingClades(ListOf,Clade) {}
    set ChallengingClades(ListOf,TaxId) {}
    foreach Clade $LesClades {
	Espionne $Clade
	lappend ChallengingClades(ListOf,Clade) $Clade
	if {[OnTraite "CilioCarta" "Like"]} {
	    set LesTaxIdsDuClade [QuestionDeScience CilioCarta "ret CladeContent $Clade"]
	} elseif {[OnTraite "OI2017" "Like"]}  {
#	    set LesTaxIdsDuClade [QuestionDeScience OI "ret CladeContentWithinOi2017 $Clade"]
	    set LesTaxIdsDuClade [CladeContentWithinOi2017 $Clade]
	    Espionne "CladeContentWithinOi2017 $Clade"
	    Espionne "LesTaxIdsDuClade $Clade = $LesTaxIdsDuClade"
	}
	if {[set i [lsearch $LesTaxIdsDuClade [NotreOX]]]>=0} {
	    set LesTaxIdsDuClade [lreplace $LesTaxIdsDuClade $i $i]
	}
	set ChallengingClades($Clade,Content) $LesTaxIdsDuClade
	LConcat ChallengingClades(ListOf,TaxId) $LesTaxIdsDuClade
	foreach TaxId $LesTaxIdsDuClade {
	    set ChallengingClades($TaxId,Clade) $Clade
	}
	Espionne $LesTaxIdsDuClade
    }
    return [ChallengingClades $Qui $Quoi]
}

proc OlymStock {{Qui ""} {Quoi ""} {Valeur ""}} {
    global OlymStock
    if {$Valeur==""} {
	if {[info exists OlymStock($Qui,$Quoi)]} { return $OlymStock($Qui,$Quoi) }
	if { ! [info exists OlymStock]} {
	    OlymClade                          ; #rR c'est là qu'on range tout !
	    return [OlymStock $Qui $Quoi]
	}
	if {[info exists OlymStock(EstCharge)]} { return "" }
    }
    if {$Qui=="CalculateAll"} {
	set OlymStock($Qui,EstCharge) 1
	set OlymStock(ListOf,Clade) [lsort -unique $OlymStock(ListOf,Clade)]
	foreach Clade $OlymStock(ListOf,Clade) {
	    set SommeExpect 0 
	    set SommeScore  0
	    set SommeRank   0
	    set NbNom 0
	    foreach Nom [LesNomsPourOlymClade] {
		if { ! [info exists OlymStock($Nom,$Clade-MoyenneExpect)]} { continue }
		incr NbNom
		set SommeExpect [expr $SommeExpect + $OlymStock($Nom,$Clade-MoyenneExpect)]
		set SommeScore  [expr $SommeScore  + $OlymStock($Nom,$Clade-MoyenneScore)]
		set SommeRank   [expr $SommeRank   + $OlymStock($Nom,$Clade-MoyenneRank)]
	    }
	    if {$NbNom==0} { continue }
	    set MoyenneExpect [expr $SommeExpect/$NbNom]
	    set MoyenneScore  [expr $SommeScore/$NbNom]
	    set MoyenneRank   [expr $SommeRank/$NbNom]
	    set OlymStock($Clade,NbNom)         $NbNom
	    set OlymStock($Clade,MoyenneExpect) $MoyenneExpect
	    set OlymStock($Clade,MoyenneScore)  $MoyenneScore
	    set OlymStock($Clade,MoyenneRank)   $MoyenneRank
	}
	set SommeMoyenneExpect 0
	set SommeMoyenneScore  0
	set SommeMoyenneRank   0
	set NbClade 0
	foreach Clade $OlymStock(ListOf,Clade) {
	    if { ! [info exists OlymStock($Clade,MoyenneExpect)]} { continue } 
	    incr NbClade
	    set SommeMoyenneExpect [expr $SommeMoyenneExpect + $OlymStock($Clade,MoyenneExpect)]
	    set SommeMoyenneScore  [expr $SommeMoyenneScore  + $OlymStock($Clade,MoyenneScore)]
	    set SommeMoyenneRank   [expr $SommeMoyenneRank   + $OlymStock($Clade,MoyenneRank)]
	}
	if {$NbClade==0} { parray OlymStock }
	set MoyenneMoyenneExpect [expr $SommeMoyenneExpect/$NbClade]
	set MoyenneMoyenneScore  [expr $SommeMoyenneScore/$NbClade]
	set MoyenneMoyenneRank   [expr $SommeMoyenneRank/$NbClade]
	OlymStock Moyenne MoyenneExpect $MoyenneMoyenneExpect
	OlymStock Moyenne MoyenneScore  $MoyenneMoyenneScore
	OlymStock Moyenne MoyenneRank   $MoyenneMoyenneRank
	#rR on en fait quoi ???
	
	set OlymStock(EstCharge) 1
    }
    lappend OlymStock($Qui,$Quoi) $Valeur  ; #rR attention on fait toujours lappend
    return $OlymStock($Qui,$Quoi)
}

proc CaseRank Valeur {
    global CaseRank
    if { ! [info exists CaseRank]} {
#	set CaseRank(Deb) [list 0 20 40 60 80 100] 
	set Pas 1
	set Pos 0
	while {1} {
	    if {$Pos>17} { break }
	    lappend CaseRank(Deb) $Pos
	    incr Pos $Pas
	}
	set CaseRank(Deb) 
	set CaseRank(Fin) [lrange $CaseRank(Deb) 1 end]
	lappend CaseRank(Fin) 100

	foreach D $CaseRank(Deb) F $CaseRank(Fin) {
	    lappend CaseRank(ListOf) "$D-$F"
	}
    }

    if {[info exists  CaseRank($Valeur)]} { return $CaseRank($Valeur) }

    foreach D $CaseRank(Deb) F $CaseRank(Fin) {
	if {$D <= $Valeur && $Valeur <= $F} { return "$D-$F" }
    }
    return ""
}

proc OlymClade {{Seuil ""} {GetWhat ""} {SelectMethod ""} {UseExpect ""} {Clades ""}} {
    #rR On veut faire un classemnent des clades en fonction du comportement des 20000 blast par rapport au projet courant (initalement Homo sapiens)
    #rR OlymClade ne fait que remplir le tableau OlymStock puis lance les calculs par OlymStock CalculateAll
    if {$Clades!=""} { ChallengingClades "Load" $Clades }
    if {$UseExpect==""}    { set UseExpect    "UseExpect" }	
    if {$SelectMethod==""} { set SelectMethod "FirstOnly" }	
    if {$GetWhat==""}      { set GetWhat      "Show" }
    if {$Seuil==""}        { set Seuil        99999 }
    set iNom 0
    foreach Nom [LesNomsPourOlymClade] {
	set FiTaxobla [GscopeFile $Nom taxobla]
	if {[FileAbsent $FiTaxobla]} { continue }
	set LesCladesDuNom {}
	if {[info exists SommeExpect]} { unset SommeExpect }
	if {[info exists SommeScore]}  { unset SommeScore }
	set LesLignes [LesLignesDuFichier $FiTaxobla]
	set NbHitDuNom [llength $LesLignes]
	if {$NbHitDuNom==0} { continue }
	OlymStock $Nom NbHits $NbHitDuNom
	set iLigne 0 
	if {[info exists DejaVuCeClade]} { unset DejaVuCeClade }
	foreach Ligne $LesLignes {
	    incr iLigne
	    set Rank [expr round(100*$iLigne/$NbHitDuNom)]
	    lassign [split $Ligne "\t"] Expect Score TaxId OS Reste
	    if {$Expect==0.0} { set Expect 1.0e-250 }
	    #		if {$Expect >1.0} { set Expect 1.0 }
	    set TaxId  [string trim $TaxId]
	    set OS     [string trim $OS]
	    set Reste  [string trim $Reste]
	    if {[set Clade [ChallengingClades $TaxId Clade]]==""} { continue } ;#rR on ne s'interesse qu'aux TaxIds qui sont dans un Clade participant	
	    if {[info exists DejaVuCeClade($Clade)]} { continue }
	    set DejaVuCeClade($Clade) 1
	    lappend LesCladesDuNom $Clade

	    set Rank [llength [array names DejaVuCeClade]]      ;#rR attention on triche a fond !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

	    OlymStock ListOf Clade   $Clade
	    OlymStock ListOf TaxId   $TaxId
	    OlymStock $Clade Content $TaxId

	    set Expect [string trim $Expect]
	    set Score  [string trim $Score]
	    set Score  [expr round($Score)]
	    if {$Expect > $Seuil} { break }

	    set Expect [expr log10($Expect)]        ; #rR attention on prend le log !!!!!!!!
	    lappend LesExpects $Expect
	    lappend LesScores  $Score
	    lappend LesRanks   $Rank
	    OlymStock $TaxId Expect$Nom $Expect 
	    OlymStock $TaxId Score$Nom  $Score 
	    OlymStock $TaxId Rank$Nom   $Rank 
	    lappend LesChoisis "$Expect\t$Score\t$TaxId\t$OS\t$Reste"

	    if { ! [info exists SommeExpect($Clade)]} { set SommeExpect($Clade) 0 }
	    if { ! [info exists SommeScore($Clade)]}  { set SommeScore($Clade) 0 }
	    if { ! [info exists SommeRank($Clade)]}   { set SommeRank($Clade) 0 }

	    set SommeExpect($Clade) [expr $SommeExpect($Clade) + $Expect]
	    set SommeScore($Clade)  [expr $SommeScore($Clade)  + $Score]
	    set SommeRank($Clade)   [expr $SommeRank($Clade)   + $Rank]
	    if { ! [info exists NbHitDuClade($Clade)]} { set NbHitDuClade($Clade) 0 }
	    incr NbHitDuClade($Clade) 
	}
	set LesCladesDuNom [ListeSansDoublon $LesCladesDuNom]
	set SommeMoyennesExpect 0
	set SommeMoyennesScore  0
	set SommeMoyennesRank   0
	foreach Clade $LesCladesDuNom {
	    set MoyenneExpect($Clade) [expr $SommeExpect($Clade)/$NbHitDuClade($Clade)]
	    set MoyenneScore($Clade)  [expr $SommeScore($Clade)/$NbHitDuClade($Clade)]
	    set MoyenneRank($Clade)   [expr $SommeRank($Clade)/$NbHitDuClade($Clade)]
	    OlymStock $Nom $Clade-MoyenneExpect $MoyenneExpect($Clade)
	    OlymStock $Nom $Clade-MoyenneScore  $MoyenneScore($Clade)
	    OlymStock $Nom $Clade-MoyenneRank   $MoyenneRank($Clade)
	    set SommeMoyennesExpect [expr $SommeMoyennesExpect + $MoyenneExpect($Clade)]
	    set SommeMoyennesScore  [expr $SommeMoyennesScore  + $MoyenneScore($Clade)]
	    set SommeMoyennesRank   [expr $SommeMoyennesRank   + $MoyenneRank($Clade)]

	    set Case [CaseRank $MoyenneRank($Clade)]
	    OlymStock ListOf CaseRank $Case 
	    OlymStock "CaseRank-$Case" $Clade $Nom
	}
	set NbCladesDuNom [llength $LesCladesDuNom]
	if {$NbCladesDuNom==0} { continue }
	OlymStock $Nom ListOfClade $LesCladesDuNom
	set MoyennesExpect [expr $SommeMoyennesExpect/$NbCladesDuNom]
	set MoyennesScore  [expr $SommeMoyennesScore/$NbCladesDuNom]
	set MoyennesRank   [expr $SommeMoyennesRank/$NbCladesDuNom]
	OlymStock $Nom MoyennesExpect $MoyennesExpect
	OlymStock $Nom MoyennesScore  $MoyennesScore
	OlymStock $Nom MoyennesRank   $MoyennesRank


	foreach Clade $LesCladesDuNom {
	    OlymStock $Nom $Clade-DeltaExpect [expr $MoyenneExpect($Clade)- $MoyennesExpect]
	    OlymStock $Nom $Clade-DeltaScore  [expr $MoyenneScore($Clade) - $MoyennesScore]
	    OlymStock $Nom $Clade-DeltaRank   [expr $MoyenneRank($Clade)  - $MoyennesRank]
	    #rR c'est ici qu'il faut les ranger dans des cases (on va peut-etre commencer par seulement les rank ...)
	}
    }
    OlymStock CalculateAll
}

proc TestMoyenneRank {} {
    set LesClades [OlymStock ListOf Clade]
    #    set LesClades [list Deuterostomia Fungi]
    foreach Nom [ListeDesPABs] {
	foreach Clade $LesClades {
	    set M [OlymStock $Nom $Clade-MoyenneRank]
	    Espionne "$Nom $M $Clade"
	}
    }
}

proc CladeChallenge {{Challenger ""} {Referencer ""} {Seuil ""} {GetWhat ""} {SelectMethod ""} {UseExpect ""}} {
    FaireLire "Pas encore fini ... on voudrait comparer deux clades .. le meilleur de l'un par rapport à l'autre ???"
    if {$Challenger==""} { set Challenger [SelectOneClade]  }
    if {$Referencer==""}  { set Referencer [SelectOneClade]  }
    
    set EnTest [regexp {^(ripp|scherb)$} [Login]] 
    #	set EnTest 0
    
    if {$UseExpect==""}    { set UseExpect "UseScore" }	
    if {$GetWhat==""} { set GetWhat "Show" }
    if {$Seuil==""} { set Seuil 99999 }
    
    regsub -all " " $Challenger "_" ChallengerUnderscore
    regsub -all " " $Referencer "_" ReferencerUnderscore
    set UseExpect [string equal -nocase "UseExpect" $UseExpect]
    
    set Echantillonage 20
    
    if {[OnTraite CilioCarta Like]} {
	set LesTaxIdsChallenger [QuestionDeScience CilioCarta "ret CladeContent $Challenger"]
	set LesTaxIdsReferencer [QuestionDeScience CilioCarta "ret CladeContent $Referencer"]
    } elseif {[OnTraite OI2017 Like]} {
	set LesTaxIdsChallenger [QuestionDeScience OI "ret CladeContentWithinOi2017 $Challenger"]
	set LesTaxIdsReferencer [QuestionDeScience OI "ret CladeContentWithinOI2017 $Referencer"]
    } else {
    }
    set NbTaxIdChallenger [llength $LesTaxIdsChallenger]
    set NbTaxIdReferencer [llength $LesTaxIdsReferencer]
    
    # on fait l'initialisation
    foreach TaxId $LesTaxIdsReferencer {
	set SommeDesDeltasReferencerPour($TaxId) 0.0
	set NbDeltasReferencerPour($TaxId) 0
    }
    
    set LesMeilleursChallenger {}
    set LesMeilleursReferencer {}
    set NbNomChallenger 0
    set NbNomReferencer 0
    foreach Nom [ListeDesPABs] {
	if {0 && $NbNom%100==0} { Espionne "$NbNom $Nom" }
    	if {$EnTest && $Nom>"HSAP20193"} { break }
	set LesHitsAvecDeltaChallenger [LesHitsAvecDelta $Nom $LesTaxIdsChallenger $Seuil "GetList" $SelectMethod $UseExpect]
	set LesHitsAvecDeltaReferencer [LesHitsAvecDelta $Nom $LesTaxIdsReferencer $Seuil "GetList" $SelectMethod $UseExpect]
	if {$LesHitsAvecDeltaChallenger!={}} {
	    incr NbNomChallenger
	    foreach HitAvecDelta $LesHitsAvecDeltaChallenger {
		lassign $HitAvecDelta Delta Expect Score TaxId OS Reste
		regsub -all "\t" $OS " " OS
		set SommeDesDeltasChallengerPour($TaxId) [expr $SommeDesDeltasChallengerPour($TaxId)+$Delta]
		set InfoDu($TaxId) "$OS\t$Reste"
		incr NbDeltasChallengerPour($TaxId)
		lappend LesDeltasChallengerDe($TaxId) $Delta
		lappend LesNomsChallengerDe($TaxId,$Delta) $Nom
		MemoDelta $TaxId $Delta $Nom
	    }
	}
	if {$LesHitsAvecDeltaReferencer!={}} {
	    incr NbNomReferencer
	    foreach HitAvecDelta $LesHitsAvecDeltaReferencer {
		lassign $HitAvecDelta Delta Expect Score TaxId OS Reste
		regsub -all "\t" $OS " " OS
		set SommeDesDeltasReferencerPour($TaxId) [expr $SommeDesDeltasReferencerPour($TaxId)+$Delta]
		set InfoDu($TaxId) "$OS\t$Reste"
		incr NbDeltasReferencerPour($TaxId)
		lappend LesDeltasReferencerDe($TaxId) $Delta
		lappend LesNomsReferencerDe($TaxId,$Delta) $Nom
		MemoDelta $TaxId $Delta $Nom
	    }
	}
    }
    foreach TaxId $LesTaxIdsChallenger {
	set Moyenne [expr $SommeDesDeltasChallengerPour($TaxId)/$NbDeltasChallengerPour($TaxId)]
	set MoyenneDesDeltasChallengerPour($TaxId) $Moyenne
	lappend LesMoyennesDesDeltasChallenger $Moyenne
	lappend LesTaxIdsDeLaMoyenneDesDeltasChallenger($Moyenne) $TaxId
    }
    foreach TaxId $LesTaxIdsReferencer {
	set Moyenne [expr $SommeDesDeltasReferencerPour($TaxId)/$NbDeltasReferencerPour($TaxId)]
	set MoyenneDesDeltasReferencerPour($TaxId) $Moyenne
	lappend LesMoyennesDesDeltasReferencer $Moyenne
	lappend LesTaxIdsDeLaMoyenneDesDeltasReferencer($Moyenne) $TaxId
    }
    if {$UseExpect} {
	set LesMoyennesDesDeltasChallenger [lsort -unique -real $LesMoyennesDesDeltasChallenger]
	set LesMoyennesDesDeltasReferencer [lsort -unique -real $LesMoyennesDesDeltasChallenger]
    } else {
	set LesMoyennesDesDeltasChallenger [lsort -decreasing -unique -real $LesMoyennesDesDeltasChallenger]
	set LesMoyennesDesDeltasReferencer [lsort -decreasing -unique -real $LesMoyennesDesDeltasReferencer]
    }
    #####################################################################################################################
    set LaSortie [list "# TailleP  NombreDeDelta  Moyenne    TaxId      Nom_de_l'espece "]
    foreach Moyenne $LesMoyennesDesDeltasChallenger {
	foreach TaxId $LesTaxIdsDeLaMoyenneDesDeltasChallenger($Moyenne) {
	    set BelleMoyenne [format "%6.0f" $Moyenne]
	    lappend LaSortie "[TailleProteome $TaxId]\t$NbDeltasPourChallenger($TaxId)\t$BelleMoyenne\t$TaxId\t$InfoDu($TaxId)"
	}
    }
    set AvecHisto 0
    if {$AvecHisto} {
	set LargeurMax 4000
	set HauteurMax 5000
	set Largeur    3000
	set Hauteur    2000
	set K [UnCanva $LargeurMax $HauteurMax $Largeur $Hauteur]
	global BornesDuGraphe ; set BornesDuGraphe($K) [list -250 0 250 400]
    }
    set IemeTaxId -1
    
    foreach TaxId $LesTaxIdsChalenger {
	set OS [Tax $TaxId Name]
	regsub -all " " $OS "_" OSUnderscore
	incr IemeTaxId
	if {[info exists Cumul]} { unset Cumul }
	
	set MinDelta  9999999
	set MaxDelta -9999999
	foreach Delta $LesDeltasDeChallenger($TaxId) {
	    set MinDelta [Mini $Delta $MinDelta]
	    set MaxDelta [Maxi $Delta $MaxDelta]
	}
	set IntDelta [expr ($MaxDelta - $MinDelta)/$Echantillonage]
	
	set MinDeltaDe($TaxId) $MinDelta
	set MaxDeltaDe($TaxId) $MaxDelta
	set IntervalDeltaDe($TaxId) $IntDelta
	
	set MinCase  9999
	set MaxCase -9999
	foreach Delta $LesDeltasDe($TaxId) {
	    if {$IntDelta<0.0000001} {
		set Case 0
	    } else {
		set Case [expr round(($Delta - $MinDelta)/$IntDelta)]
	    }
	    set MinCase [Mini $MinCase $Case]
	    set MaxCase [Maxi $MaxCase $Case]
	    if { ! [info exists Cumul($Case)]} { set Cumul($Case) 0 }
	    incr Cumul($Case)
	    set Tag($Case) $Delta
	    foreach Nom [MemoDelta $TaxId $Delta] {
		set BeauDelta    [format "%6.0f" $Delta]
		set BelleMoyenne [format "%6.0f" $Moyenne]
		MemoInfo $TaxId $Case "$Nom $BeauDelta $BelleMoyenne"
	    }
	}
	set LesX {}
	set LesY {}
	set LesTags {}
	set LaCase [list "#EcartM      NF       Case         TaxId           OS                                                                     Reference_Clade"]
	set LesBornesDeCases [NombresEntre $MinCase $MaxCase]
	if { ! $UseExpect} {
	    set LesBornesDeCases [lreverse $LesBornesDeCases]
	}
	foreach Case $LesBornesDeCases {
	    if { ! [info exists Cumul($Case)]}         { continue }
	    if { ! [info exists Tag($Case)]}           { set Tag($Case) "0.0" }
	    if { ! [info exists DeltaDeLaCase($Case)]} { set DeltaDeLaCase($Case) "0.0" }
	    set X  [expr $MinDelta + $Case*$IntDelta]
	    lappend LesX $X
	    lappend LesY $Cumul($Case)
	    lappend LesTags "[format %5.0f $X]:$Cumul($Case) $OS"
	    lappend LaCase  "[format %5.0f $X]\t$Cumul($Case)\t$Case\tTaxId:$TaxId\tOS:$OSUnderscore\tReferenceClade:$CladeUnderscore"  
	}
	MemoCase $TaxId LaCase $LaCase
	if {$AvecHisto} {
	    set Couleur [Nuance [expr 1.0*$IemeTaxId/$NbTaxId]]
	    Graphe $LesX $LesY $K $Couleur "" "" "" "" "HistoDelta" $LesTags "" "BindOnly_oval" $LargeurMax $HauteurMax
	} else {
	    #	    set F [AfficheListe $LaCase "AvecCase" $OS]
	    #	    set B [BoutonneLaFenetre $F "ShowHits" "ShowHitsFromTaxoBlast \[selection get\]"]
	    #	    $B configure -background "Magenta"
	}
	
    }
    
    if {$GetWhat=="Show"} {
	set F [AfficheListe $LaSortie "" "Delta distribution for $Clade"]
	set B [BoutonneLaFenetre $F "Distribution" "ShowDeltaDistribution \[selection get\]"]
	$B configure -background "Magenta"
    }
    
    return $LaSortie
}

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