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

#rR gscope_cilio.tcl

#rR Attention : Odile a triché elle a défini des "Clades" Excavata et Archaeplastida MAIS
#rR             ces termes n'existent pas dans TaxUniprot
#rR             J'ai fait une petite magouille pour la proc JeSuisTonAncetre (utilisé par taxobla pour protall) 
#rR             Sinon ailleurs on ne devrait pas en avoir besoin. 

#rR petite histoire des proteome de OrthoInspector:
#rR ET C'EST PAS FINI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#rR Tout ce qui suit risque d'être faux car il y a maintenant le proteome que Yannis Nevers a ramené 
#rR donc Attention il y a plein de procédures ...OrthoInspector... qui se transforme en ...Yannis...
#rR et ... je répète ... ne vous fiez pas trop aux commentaires !!
#rR .... et 2014/07 Yannis a tout mis dans une base de données docn tot ce qui suit est très approximatif !!! 

#rR Benjamin nous fournit
#rR ********* ne sert pas
#rR 1: (mais il ne sert pas pour le moment je le laisse quand même ici pour l'explication)
#rR  /dimo/data/orthoinspector_eukaryota_2011_12/orthoinspector_v2_database_dumps_raw_not_pgsql_7-12-2012.tar.gz
#rR - ce fichier fait 34 GO
#rR - je le decompresse dans /biolo/orthoinpector/DataOrthoInspector/database_dumps/
#rR ********* fin ne sert pas 

#rR /dimo/data/orthoinspector_eukaryota_2011_12/Orthoinspector_v2_project_data_backup.tar.gz
#rR - ce fichier fait 5.5 GO
#rR - je le decompresse dans /biolo/orthoinpector/DataOrthoInspector/Orthoinspector_v2/
#rR - il contient essentiellement bacteria_archae/ et eukaryota/ qui nous intéresse ici.
#rR - eukaryota/ contient plein de renseignements utiles concernant les organismes et surtout
#rR - all/ contient 261 fasta les protéomes qui nous intéressent.
#rR ATTENTION il y a plein de fichiers qui n'ont pas de CR à la fin. 
#rR Je les ai modifiés avec la proc ci-dessous.
#rR J'ai aussi changé cavia_porcellus_9823_23_11_11_merged.fasta
#rR                en cavia_porcellus_10141_23_11_11_merged.fasta
#rR    car 9823 c'est Sus scrofa !!! ???
#rR Je me suis servi de CreeUneBanqueBlastAvecOrthoInspector pour créer les proteomes 
#rR    dans /biolo/orthoinpector/DataOrthoInspector/Orthoinspector_v2/eukaryota/proteomes
  
#rR Pour CilioCarta 2014/07/01 :
#rR  si on refait un nouveau projet il faut 
#rR  - InformeIdEtAcPourTous
#rR  - InformeValiDEPourTous
#rR  - InformeValiGNPourTous
#rR  - InformeIdOiAndAcOiPourTous
#rR  - InformeIdRefAndAcRefPourTous
#rR Faire
#rR  - BlastPPourTous   (penser à mettre BlastParameters.txt dans CilioCarta/blastp) 
#rR  - DbClustalPourTous All Ortholog (ATTENTION obsolète: Yannis créée lui-même les tfasdecopains 2014/07)
#rR  - LeonEtMacsimPourTous


#rR ********* ce paragraphe est obsolète (c'était un essai avec Kirsley)
#rR pour initialiser CilioCarta : (Raymond le 2014/03/28)
#rR Kirsley m'a fourni les fichiers
#rR 101_ciliopathies_desc.csv        qui donne des infos generales
#rR 101_ciliopathies_mapping_ids.tsv pour la correspondance ensg enst ensp genename uniprotId
#rR 101_ciliopathies_pep.fasta       sequences proteiques
#rR 101_ciliopathies_gene.2.fasta    sequences des transcrits correpondants

#rR j'ai commence par integrer tout ca.
#rR Ca s'interroge par CilioDesc Qui Quoi, CilioMappping Qui Quoi, CilioPep Qui Quoi
#rR J'ai créé CilioCarta101.fasta
#rR puis le projet Gscope  
#rR et j'integre le tout avec InformeCilioCarta
#rR ********* fin paragraphe obsolète

proc CilioPathyGenes {{Qui ""} {Quoi ""}} {
    global CPG
    if {[info exists CPG($Qui,$Quoi)]} { return $CPG($Qui,$Quoi) }
    if {[info exists CPG("EstCharge")]} { return "" }
    set CPG("EstCharge") 1
    
    #set FichierCsv "[GscopeDatabaseDir EHomsa]/fiches/ciliopathy_genes_v1_sans_cr.csv"
    set FichierCsv "[GscopeDatabaseDir EHomsa]/fiches/1869CilioPathyGenes_20170510.csv"

    set PremiereFois 1
    foreach Ligne [LesLignesDuFichier $FichierCsv] {
	regsub -all {\"} $Ligne "" Ligne
	if {$PremiereFois} {
	    regsub -all " " $Ligne "_" Ligne
	    set LesHeaders [split $Ligne ";"]
	    set PremiereFois 0
	    continue
	}
	set LesMots [split $Ligne ";"]
	set Gs [lindex $LesMots 1]
	regsub -all {[ \?]} $Gs "" Gns
	set LesGn [split $Gns "/"]
	foreach H $LesHeaders V $LesMots {
	    foreach Gn $LesGn {
		lappend CPG(ListOf,Gn) $Gn
		lappend CPG($Gn,$H) $V
	    }
	}
    }
    
    set CPG(ListOf,Gn) [lsort -unique $CPG(ListOf,Gn)]
    return [CilioPathyGenes $Qui $Quoi]
}

proc CilioPathyGenesOLD {{Qui ""} {Quoi ""}} {
    global CPG
    if {[info exists CPG($Qui,$Quoi)]} { return $CPG($Qui,$Quoi) }
    if {[info exists CPG("EstCharge")]} { return "" }
    set CPG("EstCharge") 1
    
    set FichierCsv "[GscopeDatabaseDir EHomsa]/fiches/ciliopathy_genes_v1_sans_cr.csv"

    set PremiereFois 1
    foreach Ligne [LesLignesDuFichier $FichierCsv] {
	regsub -all {\"} $Ligne "" Ligne
	if {$PremiereFois} {
	    regsub -all " " $Ligne "_" Ligne
	    set LesHeaders [split $Ligne "\t"]
	    set PremiereFois 0
	    continue
	}
	set LesMots [split $Ligne "\t"]
	set Gs [lindex $LesMots 2]
	regsub -all {[ \?]} $Gs "" Gns
	set LesGn [split $Gns "/"]
	foreach H $LesHeaders V $LesMots {
	    foreach Gn $LesGn {
		lappend CPG(ListOf,Gn) $Gn
		lappend CPG($Gn,$H) $V
	    }
	}
    }
    set CPG(ListOf,Gn) [lsort -unique $CPG(ListOf,Gn)]
    return [CilioPathyGenes $Qui $Quoi]
}

proc AamForCilioPathyGenes {} {
    foreach Gn [CilioPathyGenes ListOf Gn] {
	set Trouve 0
	set Acs [QuestionDeScience GeneQuid "ret GnAc $Gn"]
	foreach Ac [split $Acs " "] {
	    set OX [QuestionDeScience GeneQuid "ret UniprotData $Ac OX"]
	    if { ! [regexp {NCBI_TaxID=9606( |;)} $OX]} { continue }
	    #set GnLu [QuestionDeScience GeneQuid "ret AcGn $Ac"]
	    set GnLu ""
	    set N [NIAG $Ac N]
	    if {$N==""} { continue }
	    set Trouve 1
	    #Espionne "$Gn $Ac $GnLu $N"
	    lappend LesNoms $N
	}
	if { ! $Trouve } { Espionne "Je ne trouve rien pour $Gn" }
    }
    Espionne $LesNoms
#    Espionne [AllAboutMacsimPourTous "[RepertoireDuGenome]/AAM_CilioPathyGenes_OK.tsv" [join $LesNoms ","]]
    Espionne [AllAboutMacsimPourTous "[RepertoireDuGenome]/AAM_CilioPathyGenes_1759.tsv" [join $LesNoms ","]]
    return $LesNoms
}



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

    set LesDeOi [glob -nocomplain "/gstock/*/DeOi"]
    set LesProj {}
    foreach DeOi $LesDeOi {
	set Proj [file tail [file dirname $DeOi]]
	lappend LesProj $Proj
    }
    
    set LesTypes [list prottfa blastp taxobla descritptifs msf]

    set LesProj [lsort $LesProj]
    set PCC(ListOf,Project) $LesProj
    foreach Pro $LesProj {
	set Message [format "%-15s" $Pro]
	foreach Type $LesTypes {
	    set Rep "/gstock/$Pro/$Type"
	    if {[FileAbsent $Rep]} {
		set PCC($Pro,$Type) 0
	    } else {
		cd "/gstock/$Pro/$Type"
		set PCC($Pro,$Type) [exec ls -f | wc -l]
	    }
	    append Message [format "%10d %s" $PCC($Pro,$Type) $Type]
	}
	Espionne $Message
    }
    return [CilioCartaProject $Qui $Quoi]
}

proc InventOi {{Qui ""} {Quoi ""} {Defaut ""} } {
    LogWscope [Environ]
    set RG $Qui
    if { ! [file exists "$RG/beton"]} { return $Defaut }
    scan [PremiereLigneDuFichier "$RG/fiches/bornesdespabs"] "%s" Premier
    if {[file exists "$RG/blastp/$Premier"] && [file exists "$RG/taxobla/$Premier"]}  { return "lightgreen" }
    if {[file exists "$RG/taxobla/$Premier"]} { return "yellow" }
    return "orange"
}

proc OiName {{Qui ""} {Quoi ""}} {
    global OiName

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

    set ProteomeDir "/genomics/link/CilioCarta/banques"
    set OiName(ProteomeDir,) $ProteomeDir

    set Alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    NousAllonsAuBoulot $ProteomeDir
    foreach Orga [lsort [glob *]] {
	if {[regexp {\.p|\.log} $Orga]} { continue }
	if { ! [regexp {([A-Z][a-z]+)_([a-z]+)_([0-9]+)} $Orga Match G E OX]} { continue }
	set Ge [string range $G 0 1]
	set Es [string totitle [string range $E 0 1]]
	set GeEs "$Ge$Es"
	set Info "$GeEs [format %8d $OX] $Orga"
	set InfoDe($OX) $Info
	set OrgaDe($OX) $Orga
	lappend LesGeEs $GeEs
	lappend LesOX   $OX
	lappend LesOrga $Orga
	incr NbCops($GeEs)
    }
    set iAlpha -1
    foreach GeEs $LesGeEs OX $LesOX {
	set Prefixe $GeEs
	if {$NbCops($GeEs)==1} {
	    set iAlpha -1
	} else {
	    incr iAlpha
	    append Prefixe [string index $Alphabet $iAlpha]
	}
	set Orga $OrgaDe($OX)
	set OiName($OX,Prefixe) $Prefixe
	set OiName($OX,Orga)    $OrgaDe($OX) 
	set OiName($OX,Info)    $InfoDe($OX) 
	set OiName($OX,Fasta)   "$ProteomeDir/$OrgaDe($OX)" 
	set OiName($Prefixe,OX) $OX
	set OiName($Orga,OX)    $OX
	lappend LesPrefixe $Prefixe
    }
    set LesOXTries [lsort -integer $LesOX]
    set LesPrefixe [lsort $LesPrefixe]
    set LesInfo {}
    foreach Prefixe $LesPrefixe {
	set OX $OiName($Prefixe,OX)
	lappend LesInfo "[format %-5s $Prefixe] $InfoDe($OX)" 
    }
    set OiName(ListOf,Prefixe) [lsort $LesPrefixe]
    set OiName(ListOf,OX)      $LesOXTries
    set OiName(ListOf,Orga)    $LesOrga
    set OiName(ListOf,Info)    $LesInfo

    OnRevientDuBoulot
    return [OiName $Qui $Quoi]
}

proc CreeBlastDatabasesWithOrthoinspectorProteomes {} {
    NousAllonsAuBoulot "[RepertoireDuGenome]/newbanques"
    set LesCrees {}
    foreach P [lsort [glob *]] {
	if {[regexp {\.p} $P]} { continue }
	Espionne $P
	exec formatdb -i $P -p T -o
	file rename formatdb.log $P.formatdb.log
	lappend LesCrees $P 
    }
    OnRevientDuBoulot
    return $LesCrees
}

proc RajouteEnFinDeEnteteFasta {{FichierFastaIn ""} {Fin ""} {FichierFastaOut ""} {Clean ""}} {
    set MaxLigne 900

    set Clean [string equal -nocase $Clean "Clean"]
    #rR attention il faut le blanc en début de ce qu'on rajoute
    set LeNouveau {}
    foreach Ligne [LesLignesDuFichier $FichierFastaIn] {
	if {[regexp "^>" $Ligne] && ! [regexp $Fin $Ligne] } {
	    set F [string length $Fin]
	    set L [string length $Ligne]
	    if {$F +$L > 960 } {
		set Milieu [expr $L/2]
		set Excuse " ... HERE XXXX CHARACTERS WERE CUTTED ... "
		set ACouper [expr $L - $MaxLigne + [string length $Excuse]]
		regsub "XXXX" $Excuse $ACouper Excuse
		set Half [expr $ACouper/2]
		set AvantMilieu [expr $Milieu - $Half]
		set ApresMilieu [expr $Milieu + $Half]
		set LigneCoupee ""
		append LigneCoupee [string range $Ligne 0 $AvantMilieu]
		append LigneCoupee $Excuse
		append LigneCoupee [string range $Ligne $ApresMilieu end]
		set Ligne $LigneCoupee
	    }
	    append Ligne $Fin
	}
	if {$Clean} { regsub -all {[\[\]]} $Ligne "" Ligne }
	lappend LeNouveau $Ligne

    }
    SauveLesLignes $LeNouveau dans $FichierFastaOut
    return $FichierFastaOut
}

proc RajouteOXDansEnteteFasta {{FichierFastaIn ""} {OX ""} {FichierFastaOut ""}} {
    set LeNouveau {}
    foreach Ligne [LesLignesDuFichier $FichierFastaIn] {
	if {[regexp "^>" $Ligne] && ! [regexp { OX=([0-9]+)} $Ligne] } { append Ligne " OX=$OX" }
	lappend LeNouveau $Ligne

    }
    SauveLesLignes $LeNouveau dans $FichierFastaOut
    return $FichierFastaOut
}

proc RajouteOXDansBanqueOrthoinspector {{Qui ""}} {
    #rR Quand j'ai créé les protéomes et les banques blast de Orthoinspector j'ai mis TAXID=9606 et non pas OX=9606
    #rR Je corrige ça ici

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

    set RepBank "[RepertoireDuGenome]/banques"
    NousAllonsAuBoulot $RepBank
    file mkdir "../newbanques"
    set LesNouvellesBanques {}
    foreach Fichier [lsort [glob $Qui]] {
	if {[regexp {\.p} $Fichier]} { continue }
	Espionne $Fichier
	set Nouveau "../newbanques/$Fichier"
	set LeNouveau {}
	foreach Ligne [LesLignesDuFichier $Fichier] {
	    if { ! [regexp "^>" $Ligne] } { lappend LeNouveau $Ligne; continue }
	    if { ! [regexp { TAXID=([0-9]+)} $Ligne Match OX] } { lappend LeNouveau $Ligne; continue }
	    append Ligne " OX=$OX"
	    lappend LeNouveau $Ligne
	}
	SauveLesLignes $LeNouveau dans $Nouveau
	lappend LesNouvellesBanques $Fichier
    }
    OnRevientDuBoulot
    return $LesNouvellesBanques
}

proc MajYaProteomes {{TaxId ""}} {
    set LesIDs [QuestionDeScience EVImm "ret FromYannis $TaxId IDs"]
    set LesACs [QuestionDeScience EVImm "ret FromYannis $TaxId IDs"]
    foreach ID $LesIDs AC $LesACs {
	if { ! [regexp "_" $ID]} { continue }   ;#rR on verra plus tard !!!!!!!!!!!!!!!!!!
	set AJour 1
	set LesLignesEMBL [LaSequenceDesBanques $ID $AC AccessOK "OnVeutEmbl"]
	if {$LesLignesEMBL=={}} {
	    set IdAcRef [UniprotHistory $AC]
	    if {$IdAcRef=="" || IdAcRef=="$ID $AC"} { lappend LesIntrouvablesUniques "$ID $AC"; continue }
	    scan $IdAcRef "%s %s" IdRef AcRef
	    set LesLignesEMBL [LaSequenceDesBanques $ID $AC AccessOK "OnVeutEmbl"]
	    if {$LesLignesEMBL=={}} { lappend LesIntrouvablesHistoriques "$ID $AC $IdAcRef"; continue } 
	    set AJour 0
	}
	if {$AJour} { continue }
	Espionne "$ID $AC $IdAcRef"
    }	
} 

proc InformeIdYaAndAcYaPourTous {} {
    #rR ne sert pas pour le moment car c'est les mêmes que Oi

    set TestIt [OuiOuNon "Do I do a test only" 0]    

    set leLog {}
    foreach Nom [ListeDesPABs] {
	set Id [ExtraitInfo $Nom "Id:"]
	set Ac [ExtraitInfo $Nom "Ac:"]

	set TFA [QuestionDeScience EVImm "ret FromYannis $Id tfa"]
	set DejaVu($Id) 1
	set IdYa ""
	if {$TFA!=""} {
	    set IdYa $Id
	} else {
	    foreach I [UniprotHistory $Ac "IdHis"] {
		if {[info exists DejaVu($I)]} { continue }
		set DejaVu($I) 1
		set TFA [QuestionDeScience EVImm "ret FromYannis $I tfa"]
		if {$TFA!=""} { set IdYa $I ; break }
	    }
	}
	unset DejaVu

	set TFA [QuestionDeScience EVImm "ret FromYannis $Ac tfa"]
	set DejaVu($Ac) 1
	set AcYa ""
	if {$TFA!=""} {
	    set AcYa $Ac
	} else {
	    foreach A [UniprotHistory $Ac "AcHis"] {
		if {[info exists DejaVu($A)]} { continue }
		set DejaVu($A) 1
		set TFA [QuestionDeScience EVImm "ret FromYannis $A tfa"]
		if {$TFA!=""} { set AcYa $A ; break }
	    }
	}
	unset DejaVu

	set Warning ""
	if {$Id!=$IdYa || $Ac!=$AcYa} { set Warning "********" }
	lappend LeLog "$Nom\t$Ac\t$AcYa\t$Id\t$IdYa\t$Warning"
	if {$IdYa!="" && ! $TestIt} { InformeSansDemander $Nom "IdYa: $IdYA" }
	if {$AcYa!="" && ! $TestIt} { InformeSansDemander $Nom "AcYa: $AcYa" }
    }
    return $LeLog
} 

proc InformeIdYaRefAndAcYaRefPourTous {} {
    #rR ne sert pas pour le moment car c'est les mêmes que Oi

    set TestIt [OuiOuNon "Do I do a test only" 0]    

    set leLog {}
    foreach Nom [ListeDesPABs] {
	set Id [ExtraitInfo $Nom "Id:"]
	set Ac [ExtraitInfo $Nom "Ac:"]
	set IdAcRef [UniprotHistory $Ac "IdAcRef"]
	set IdYaRef ""
	set AcYaRef ""
	scan $IdAcRef "%s %s" IdYaRef AcYaRef
	set Warning ""
	if {$Id!=$IdYaRef || $Ac!=$AcYaRef} { set Warning "********" }
	lappend LeLog "$Nom\t$Ac\t$AcYaRef\t$Id\t$IdYaRef\t$Warning"
	if {$IdYaRef!="" && ! $TestIt} { InformeSansDemander $Nom "IdYaRef: $IdYaRef" }
	if {$AcYaRef!="" && ! $TestIt} { InformeSansDemander $Nom "AcYaRef: $AcYaRef" }
    }
    return $LeLog
} 

proc MajOiProteomes {{TaxId ""}} {
    set LesIDs [QuestionDeScience EVImm "ret FromOrthoInspector $TaxId IDs"]
    set LesACs [QuestionDeScience EVImm "ret FromOrthoInspector $TaxId IDs"]
    foreach ID $LesIDs AC $LesACs {
	if { ! [regexp "_" $ID]} { continue }   ;#rR on verra plus tard !!!!!!!!!!!!!!!!!!
	set AJour 1
	set LesLignesEMBL [LaSequenceDesBanques $ID $AC AccessOK "OnVeutEmbl"]
	if {$LesLignesEMBL=={}} {
	    set IdAcRef [UniprotHistory $AC]
	    if {$IdAcRef=="" || IdAcRef=="$ID $AC"} { lappend LesIntrouvablesUniques "$ID $AC"; continue }
	    scan $IdAcRef "%s %s" IdRef AcRef
	    set LesLignesEMBL [LaSequenceDesBanques $ID $AC AccessOK "OnVeutEmbl"]
	    if {$LesLignesEMBL=={}} { lappend LesIntrouvablesHistoriques "$ID $AC $IdAcRef"; continue } 
	    set AJour 0
	}
	if {$AJour} { continue }
	Espionne "$ID $AC $IdAcRef"
    }	
} 

proc InformeIdOiAndAcOiPourTous {} {

    set DoIt [OuiOuNon "Do I write to info files"]    

    set leLog {}
    foreach Nom [ListeDesPABs] {
	set Id [ExtraitInfo $Nom "Id:"]
	set Ac [ExtraitInfo $Nom "Ac:"]

	set TFA [QuestionDeScience EVImm "ret FromOrthoInspector $Id tfa"]
	set DejaVu($Id) 1
	set IdOi ""
	if {$TFA!=""} {
	    set IdOi $Id
	} else {
	    foreach I [UniprotHistory $Ac "IdHis"] {
		if {[info exists DejaVu($I)]} { continue }
		set DejaVu($I) 1
		set TFA [QuestionDeScience EVImm "ret FromOrthoInspector $I tfa"]
		if {$TFA!=""} { set IdOi $I ; break }
	    }
	}
	unset DejaVu

	set TFA [QuestionDeScience EVImm "ret FromOrthoInspector $Ac tfa"]
	set DejaVu($Ac) 1
	set AcOi ""
	if {$TFA!=""} {
	    set AcOi $Ac
	} else {
	    foreach A [UniprotHistory $Ac "AcHis"] {
		if {[info exists DejaVu($A)]} { continue }
		set DejaVu($A) 1
		set TFA [QuestionDeScience EVImm "ret FromOrthoInspector $A tfa"]
		if {$TFA!=""} { set AcOi $A ; break }
	    }
	}
	unset DejaVu

	set Warning ""
	if {$Id!=$IdOi || $Ac!=$AcOi} { set Warning "********" }
	lappend LeLog "$Nom\t$Ac\t$AcOi\t$Id\t$IdOi\t$Warning"
	if {$IdOi!="" && $DoIt} { InformeSansDemander $Nom "IdOi: $IdOi" }
	if {$AcOi!="" && $DoIt} { InformeSansDemander $Nom "AcOi: $AcOi" }
    }
    return $LeLog
} 

proc InformeIdRefAndAcRefPourTous {} {

    set TestIt [OuiOuNon "Do I do a test only" 0]    

    set leLog {}
    foreach Nom [ListeDesPABs] {
	set Id [ExtraitInfo $Nom "Id:"]
	set Ac [ExtraitInfo $Nom "Ac:"]
	set IdAcRef [UniprotHistory $Ac "IdAcRef"]
	set IdRef ""
	set AcRef ""
	scan $IdAcRef "%s %s" IdRef AcRef
	set Warning ""
	if {$Id!=$IdRef || $Ac!=$AcRef} { set Warning "********" }
	lappend LeLog "$Nom\t$Ac\t$AcRef\t$Id\t$IdRef\t$Warning"
	if {$IdRef!="" && ! $TestIt} { InformeSansDemander $Nom "IdRef: $IdRef" }
	if {$AcRef!="" && ! $TestIt} { InformeSansDemander $Nom "AcRef: $AcRef" }
    }
    return $LeLog
} 

proc UniprotHistory {{Qui ""} {Quoi ""}} {
    #rR on rend la référence ou l'historique de Id ou Ac
    #rR uniprot ne rend que le premier si on lui fournit l'id, mais il rend l'historique avec ac

    if {$Quoi==""} { set Quoi "History" }

    set Access [string toupper $Qui]
    set Url "http://www.uniprot.org/uniprot/$Access.txt?version=*"
 
    set LesTFAs [LesLignesDuFichier $Url]
    set IdReference ""
    set IdHistory {}
    set AcReference ""
    set AcHistory {}
    set IdAcReference ""

    set HistoryOfId {}
    set HistoryOfAc {}
    
    foreach Ligne $LesTFAs {
	if {[regexp {ID   ([^ ]+)} $Ligne Match IDLu]} {
	    if {$IDLu!=""} {
		if {$IdReference==""} { set IdReference $IDLu }
		lappend IdHistory $IDLu
		lappend HistoryOfId $IDLu
	    }
	}
	if {[regexp {AC   (.+)} $Ligne Match ACsLus]} {
	    set ACs $ACsLus
	    regsub -all {[ ;]+} $ACs " " ACs
	    set LesACs [split [string trim $ACs] " "]
	    if {$LesACs!={}} {
		lappend HistoryOfAc $ACsLus
		if {$AcReference==""} {
		    set AcReference [lindex $LesACs 0]
		    if {$AcReference!=$Qui} { return [UniprotHistory $AcReference $Quoi] }
		}
		foreach AC $LesACs {
		    lappend AcHistory $AC
		}
	    }
	}
    }
    set IdHistory [ListeSansDoublon $IdHistory]
    set AcHistory [ListeSansDoublon $AcHistory]

    set IdAcReference "$IdReference $AcReference"

    if {[regexp -nocase "^IdAcR" $Quoi]} { set Quoi "IdAcReference" }
    if {[regexp -nocase "^IdR"   $Quoi]} { set Quoi "IdReference" }
    if {[regexp -nocase "^IdH"   $Quoi]} { set Quoi "IdHistory" }
    if {[regexp -nocase "^AcR"   $Quoi]} { set Quoi "AcReference" }
    if {[regexp -nocase "^AcH"   $Quoi]} { set Quoi "AcHistory" }    

    if {[info exists $Quoi]} { return [set $Quoi] }
    
    if {[regexp -nocase "^H" $Quoi]} {
	set LeHis {}
	foreach A $HistoryOfAc I $HistoryOfId {
	    lappend LeHis "$I\t$A"
	}
	set LeHis [ListeSansDoublon $LeHis]
	return $LeHis
    }
    return ""
}

proc PABsDuIdOuAc {IdOuAc {Science ""}} {
    global PABsDuIdOuAc

    if { $Science!="" && ! [OnTraite $Science] } {
    	return [QuestionDeScience Science "ret PABsDuIdOuAc $IdOuAc"]
    }

    set IDOUAC [string toupper $IdOuAc]

    if {[info exists PABsDuIdOuAc($IDOUAC)]} { return $PABsDuIdOuAc($IDOUAC) }
    if {[info exists PABsDuIdOuAc("EstCharge")]} { return "" }
    set PABsDuIdOuAc("EstCharge") 1

    foreach Nom [ListeDesPABs] {
	set Id [ExtraitInfo $Nom "Id:"]
	if {$Id!=""} { set ID [string toupper $Id] ; lappend PABsDuIdOuAc($ID) $Nom }
	set Ac [ExtraitInfo $Nom "Ac:"]
	if {$Ac!=""} { set AC [string toupper $Ac] ; lappend PABsDuIdOuAc($AC) $Nom }
    }
    return [PABsDuIdOuAc $IdOuAc]
}

proc OiOrthologsFromCilioCarta {Query {Action ""} {OrganismList ""}} {
    global OiOrthologsFrom
    #rR Action can be IDs, ACs, Contains_P12345

    if {$Action==""} { set Action "IDs" }

    if {$Query==""} { return "" }

    if {[regexp {^CIL[0-9]+$} $Query]} {
	set Nom $Query
    } else {
	set Nom [PABsDuIdOuAc $Query "CilioCarta"]
    }
    if {$Nom==""} { return "" }

    set Action [string toupper $Action]

    if {[info exists OiOrthologsFrom($Nom,$Action)]} { return $OiOrthologsFrom($Nom,$Action) }
    if {[info exists OiOrthologsFrom($Nom,ESTCHARGE)]} {
	if {[regexp {CONTAINS_(.+)} $Action Match Access]} {
	    if {[info exists OiOrthologsFrom($Access,REFERENCE)]} {
		return [expr [lsearch $Nom $OiOrthologsFrom($Access,REFERENCE)] >= 0]
	    }
	    return 0
	}
	return ""
    }
    set OiOrthologsFrom($Nom,ESTCHARGE) 1
    

    #rR on peut prendre Oi au lieu de Ya car c'est les mêmes
    if {[OnTraite "CilioCarta"]} {
	set IdQuery [ExtraitInfo $Nom "IdOi:"]
	set AcQuery [ExtraitInfo $Nom "AcOi:"]
    } else {
	set IdQuery [QuestionDeScience "CilioCarta" "ret ExtraitInfo $Nom IdOi:"]
	set AcQuery [QuestionDeScience "CilioCarta" "ret ExtraitInfo $Nom AcOi:"]
    }
    set LesHeader [OiLesTFAsDesOrthologs $IdQuery $OrganismList "GetHeader"]
    foreach H $LesHeader {
	regsub ">" $H "" H
	scan $H "%s %s" A B
	if {[regexp {\|} $A]} {
	    lassign [split $A "|"] Banque Ac Id
	} else {
	    set Id $A
	    set Ac $B
	}

	#rR 2014/07/08 pour éventuellement prendre la ref plus récente dans Yannis
	if {[OnTraite "EVImm"]} {
	    set TFA [FromYannis $Ac "tfa"]
	} else {
	    set TFA [QuestionDeScience "EVImm" "ret FromYannis $Ac tfa"]
	}
	if {$TFA==""} {
	    set IdAcNow [UniprotHistory $Id "IdAcRef"]
	    if {$IdAcNow==""} { continue }
	    lassign [split $IdAcNow "\t"] Id Ac
	} 

	set ID [string toupper $Id]
	set AC [string toupper $Ac]
	if {$Id!=""} { lappend OiOrthologsFrom($Nom,IDS) $Id }
	if {$Ac!=""} { lappend OiOrthologsFrom($Nom,ACS) $Ac }
	lappend OiOrthologsFrom($ID,REFERENCE) $Nom
	lappend OiOrthologsFrom($AC,REFERENCE) $Nom
    }
    return [OiOrthologsFromCilioCarta $Query $Action $OrganismList]
}

proc CompareOrganismsOiYannis {} {
    foreach TOI [OiOrganism ListOf TaxId] {
	set TYA [YannisOrganism $TOI TaxId]
#	Espionne "$TOI $TYA"
    }
    Espionne ""
    foreach TYA [YannisOrganism ListOf TaxId] {
	set TOI [OrganismFromOrthoInspector $TYA TaxId]
	set FOS [YannisOrganism $TYA FullOs]
	set OS  [YannisOrganism $TYA OS]
	if {$TOI==""} {
	    set TOI [OrganismFromOrthoInspector $OS TaxId]
	    set FOSoi [OrganismFromOrthoInspector $TOI FullOs]
	    Espionne "$TYA $TOI $FOS $FOSoi"
	}
    }
}

proc YannisOrganism {{Qui ""} {Quoi ""}} {
    global YannisOrganism

    if {$Qui==""} { set Qui "ListOf" ; set Quoi "Keys" }

    set LesKeys [list TaxId FullOs Filename OS Strain Keys]
    foreach K $LesKeys {
	if {[string equal -nocase $Quoi $K]} { set Quoi $K ; break }
    }

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

    set Rep "/home/nevers/StageJuin/Proteomes"
    set YannisOrganism(Rep,) $Rep 

    NousAllonsAuBoulot $Rep
    
    set LesFichiersTfa [lsort [glob -nocomplain "*.tfa"]]
			 
    foreach Fichier $LesFichiersTfa {
	if { ! [regexp {([0-9]+)_([A-Z][a-z]+)_([a-z\.\-]+)_(.*)} $Fichier Match TaxId G E R]} { FaireLire "Bas $Fichier"; continue }
	set Filename "$Rep/$Fichier"
	set OS "${G}_$E"
	set Strain $R
	regsub "\.tfa$" $Strain "" Strain
	if {$Strain=="-"} { set Strain "" }
	set FullOs "$TaxId $G $E $Strain"

	lappend YannisOrganism(ListOf,TaxId)      $TaxId
	lappend YannisOrganism(ListOf,OS)         $OS
	lappend YannisOrganism(ListOf,Strain)     $Strain
	lappend YannisOrganism(ListOf,Filename)   $Fichier
	lappend YannisOrganism(ListOf,FullOs)     $FullOs

	set YannisOrganism($TaxId,TaxId)    $TaxId
	set YannisOrganism($TaxId,OS)       $OS
	set YannisOrganism($TaxId,FullOs)   $FullOs
	set YannisOrganism($TaxId,Strain)   $Strain
	set YannisOrganism($TaxId,Filename) $Filename

	lappend YannisOrganism($OS,TaxId)   $TaxId
	set YannisOrganism($FullOs,TaxId)   $TaxId
	set YannisOrganism($Filename,TaxId) $TaxId
    }
    set YannisOrganism(ListOf,Keys) $LesKeys
    set YannisOrganism(ListOf,TaxId)      [lsort -integer $YannisOrganism(ListOf,TaxId)]
    set YannisOrganism(ListOf,OS)         [lsort -unique  $YannisOrganism(ListOf,OS)]
    set YannisOrganism(ListOf,FullOs)     [lsort          $YannisOrganism(ListOf,FullOs)]

    OnRevientDuBoulot

    return [YannisOrganism $Qui $Quoi]
		   
}

proc OiOrganism {{Qui ""} {Quoi ""}} {
    global OiOrganism

    #rR on utilise oi_client -organism_ids pour avoir les correspondances Id de Orthoinspector et TaxId
    #rR au premier appel on charge TaxId dasn EVImm ça peut être long

    if {$Qui==""} { set Qui "ListOf" ; set Quoi "Keys" }

    set LesKeys [list Id Identifier TextOs OS TaxId Keys]
    foreach K $LesKeys {
	if {[string equal -nocase $Quoi $K]} { set Quoi $K ; break }
    }

    if {[info exists OiOrganism($Qui,$Quoi)]}  { return $OiOrganism($Qui,$Quoi) }
    if {[info exists OiOrganism("EstCharge")]} {
	if {[info exists OiOrganism($Qui,Id)]} {
	    set Id $OiOrganism($Qui,Id)
	    if {[info exists OiOrganism($Id,$Quoi)]} { return $OiOrganism($Id,$Quoi) }
	}
	return ""
    }
    set OiOrganism("EstCharge") 1
    
    #rR il faut mettre le catch sinon ca marche pas
    catch {set Texte [exec oi_client -organism_ids]} Texte
    foreach Ligne [split $Texte "\n"] {
	if { ! [regexp -nocase {id=([0-9]+)[ \t]+identifier=([A-Z0-9]+)[ \t]+(.*)} $Ligne Match Id Identifier TextOs]} { continue }
	scan $TextOs "%s %s" G E
	set OS "${G}_$E"
	set TaxId [Tax $OS]
	if {$TaxId==""} {
	    if {$OS=="Micromonas_sp."}  { set TaxId 296587 }
	    if {$OS=="Salpingoeca_sp."} { set TaxId 946362 }
	}
	if {$TaxId==""} { set TaxId 999999 }
	lappend OiOrganism(ListOf,Id)         $Id
	lappend OiOrganism(ListOf,Identifier) $Identifier
	lappend OiOrganism(ListOf,TextOs)     $TextOs
	lappend OiOrganism(ListOf,OS)         $OS
	lappend OiOrganism(ListOf,TaxId)      $TaxId
	set OiOrganism($Id,Id)         $Id
	set OiOrganism($Identifier,Id) $Id
	set OiOrganism($TextOs,Id)     $Id
	set OiOrganism($OS,Id)         $Id
	set OiOrganism($TaxId,Id)      $Id
	set OiOrganism($TaxId,TaxId)   $TaxId

	set OiOrganism($Id,Identifier) $Identifier
	set OiOrganism($Id,TextOs)     $TextOs
	set OiOrganism($Id,OS)         $OS
	set OiOrganism($Id,TaxId)      $TaxId
    }
    set OiOrganism(ListOf,Keys) $LesKeys
    set OiOrganism(ListOf,Id)         [lsort -integer $OiOrganism(ListOf,Id)]
    set OiOrganism(ListOf,TaxId)      [lsort -integer $OiOrganism(ListOf,TaxId)]
    set OiOrganism(ListOf,Identifier) [lsort          $OiOrganism(ListOf,Identifier)]
    set OiOrganism(ListOf,OS)         [lsort          $OiOrganism(ListOf,OS)]
    set OiOrganism(ListOf,TextOs)     [lsort          $OiOrganism(ListOf,TextOs)]

    return [OiOrganism $Qui $Quoi]
		   
}

proc OiLesTFAsDesOrthologs {{Query ""} {OrgaList ""} {Quoi ""}} {
    if {$OrgaList=="" || [regexp -nocase "Defau" $OrgaList]} { set OrgaList [OiOrgaList]}
    set FicOut "[TmpFile].oi"
    exec /biolo/orthoinspector/oi_client -mode single -query $Query -organism_list $OrgaList -outfmt 5 -out $FicOut
    if {[FileAbsent $FicOut]} { return {} }
    set LesLignes [LesLignesDuFichier $FicOut]
    file delete $FicOut
    if {$Quoi=="GetHeader" || $Quoi=="GetAccess"} {
	set LeRetour {}
	foreach Ligne $LesLignes {
	    if { ! [regexp ">" $Ligne]} { continue }
	    if {$Quoi=="GetHeader"} { lappend LeRetour $Ligne ; continue }
	    scan [string range $Ligne 1 end] "%s" Access
	    if {$Quoi=="GetAccess"} { lappend LeRetour $Access ; continue }
	}
	return $LeRetour
    }
    return $LesLignes
} 

proc OrganismListForCilioCode {{GetWhat ""}} {

    if {$GetWhat==""} { set GetWhat "TaxId" }

    set Fichier [Fiches "ListOfTaxIdCilioCode.txt"]

    set LesTaxId {}
    foreach Ligne [LesLignesDuFichier $Fichier] {
	set Ligne [string trim $Ligne]
	if {$Ligne==""} { continue }
	lappend LesTaxId $Ligne
    }

    set AsText    [regexp -nocase "AsText" $GetWhat]
    set WithComma [regexp -nocase "AsTextWithComma" $GetWhat]
    set WithSpace [regexp -nocase "AsTextWithSpase" $GetWhat]
    regsub -nocase "AsText.*" $GetWhat "" GetWhat

    set Liste {}
    if {[regexp -nocase "^TaxId" $GetWhat]} {
	set Liste $LesTaxId
    } else {
	foreach TaxId $LesTaxId {
	    set Info [OiOrganism $TaxId $GetWhat]
	    if {$Info==""} { continue }
	    lappend Liste $Info
	}
    }
    if { ! $AsText } { return $Liste }
    set Sep ","
    if {$WithComma} { set Sep "," }
    if {$WithSpace} { set Sep " " }
    return [join $Liste $Sep]
}

proc OiOrgaList {{GetWhat ""}} {

    if {$GetWhat==""} { set GetWhat "GetIdAsTextWithComma" }

#    set OrgaList "82 210 254 140 66 101 72 69 184 9 152 197 49 170 194 37 118 88 169 59 225 119 124 141 138 32 200 255 151 50 18 20 163 186 249 189 99 223 77 221 114 155 188"
    set OrgaList "101,104,109,114,115,116,117,118,119,122,124,125,128,13,138,14,140,141,142,143,146,149,15,151,152,155,159,161,163,169,170,173,174,18,183,184,186,188,189,190,194,197,2,20,200,203,210,212,214,217,22,221,222,223,225,226,232,239,240,242,244,245,246,247,248,249,254,255,257,259,26,29,3,32,33,37,39,4,41,49,50,51,53,59,6,60,65,66,67,69,7,72,77,78,82,88,9,90,92,99"


    set OrgaList [split $OrgaList ", "]
    set OrgaList [lsort -integer $OrgaList]
    
    if {$GetWhat=="GetIdAsTextWithComma"} { return [join $OrgaList ","] }
    if {$GetWhat=="GetIdAsTextWithBlank"} { return [join $OrgaList " "] }

    set Keys [OiOrganism ListOf Keys]
    foreach K $Keys {
	if {[regexp -nocase "Get${K}As" $GetWhat]} {
	    set Li {}
	    foreach O $OrgaList {
		set V [OiOrganism $O $K]
		lappend Li "$O=$V"
	    }
	    if {[regexp "AsTextWithComma" $GetWhat]} { return [join $Li ","] }
	    if {[regexp "AsTextWithBlank" $GetWhat]} { return [join $Li " "] }
	    return $Li
	}
    }
    return $OrgaList
}

proc CorrigeLesDescriptifsEnSupprimantRootEtCellularOrganism {} {
    set LesNouveaux {}
    foreach Nom [ListeDesPABs] {
	set  FichierDescriptif [GscopeFile $Nom descriptifs]
	if {[FileAbsent $FichierDescriptif]} { continue }
	set LeNew {}
	set YaDuNeuf 0
	foreach Ligne [LesLignesDuFichier $FichierDescriptif] {
	    set New $Ligne
	    if { [regexp {OC\:root; cellular organisms; } $New]} {
		incr YaDuNeuf 1
		regsub {OC\:root; cellular organisms; } $New "OC:" New
	    }
	    if { [regexp {Opisthokonta; } $New]} {
		incr YaDuNeuf 1
		regsub {Opisthokonta; } $New "" New
	    }
	    lappend LeNew $New
	}
	if {$YaDuNeuf} {
	    Espionne "$Nom $YaDuNeuf"
	    SauveLesLignes $LeNew dans $FichierDescriptif
	    lappend LesNouveaux $FichierDescriptif
	}
    }
    return $LesNouveaux
}

proc CorrigeLesDescriptifs {} {
    set LesOS [QuestionDeScience "CilioCarta" "FromOrthoInspector ListOf OS"]
    set LesNouveaux {}
    foreach Nom [ListeDesPABs] {
	set  FichierDescriptif [GscopeFile $Nom descriptifs]
	if {[FileAbsent $FichierDescriptif]} { continue }
	set LeNew {}
	set YaDuNeuf 0
	foreach Ligne [LesLignesDuFichier $FichierDescriptif] {
	    if { ! [regexp {OS\:  GN\:} $Ligne]} { lappend LeNew $Ligne; continue }
	    if { ! [regexp {DE\:([A-Z][a-z]+) ([a-z\.]+) } $Ligne Match G E]} { lappend LeNew $Ligne; continue }
	    set YaDuNeuf 1
	    set New $Ligne
	    regsub {OS\:  GN\:}                    $New "OS:$G $E GN:" New
	    regsub {DE\:([A-Z][a-z]+) ([a-z\.]+) } $New "DE:"           New
	}
	if {$YaDuNeuf} {
	    SauveLesLignes $LeNew dans $FichierDescriptif
	    lappend LesNouveaux $FichierDescriptif
	}
    }
    return $LesNouveaux
}


proc VerifieLeFasta Fichier {
    #rR j'ai ecrit ca pour voir pourquoi le proteome de OrthoInspector etait mauvais ... mais c'était la faute a formatdb
    set n 0
    set t 0
    foreach Ligne [LesLignesDuFichier $Fichier] {
	incr t
	if {[regexp {^>([^ ]+)( |$)} $Ligne Match Access]} {
	    if { ! [regexp -nocase {^[A-Z0-9_\-\:\.]+$} $Access]} { FaireLire "Wrong $Access" }
	    set ACCESS [string toupper $Access]
	    if {[info exists DejaVu($ACCESS)]}                  { FaireLire "DejaVu $Access" }
	    set DejaVu($ACCESS) 1
	    if {[string length $Access]>50}                     { FaireLire "long $Access" }
	    if {[string length $Ligne]>1000}                    { FaireLire "long $Ligne" }
	    incr n
	    lappend LeNouveau $Ligne
	    continue
	}
	if {[regexp -nocase {[^A-Z]} $Ligne]}                   { FaireLire "wrong seq for $Access\n$Ligne" } 
	if {$Ligne==""}                                         { continue }
	lappend LeNouveau $Ligne
    }
    SauveLesLignes $LeNouveau dans $Fichier.NEW
    return "$t lines for $n accesses"
}

proc TailleDeLaBanque {Banque} {
    set Taille 0
    foreach F [glob -nocomplain $Banque.*] {
	set Size [file size $F]
	incr Taille $Size
    }
    return "$Taille [expr $Taille/1000 + 1]KO [expr $Taille/1000000 + 1]MO [expr $Taille/1000000000 + 1]GO"
}

proc CilioCartaVersion {} {
    return 1.2
}

proc CilioCartaDir {} {
    return "/genomics/link/CilioCarta/DeKirsley/101"
}

proc CilioDesc {{Qui ""} {Quoi ""}} {
    global CilioDesc

    if {$Qui==""} { set Qui "ListOf"; set Quoi "Header" }

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

    set FichierCsv "[CilioCartaDir]/101_ciliopathies_desc.csv"
    set CilioDesc(filename,) $FichierCsv

    LoadTxlWithRowsOfCells $FichierCsv CilioDesc 0 "\t"

    set CilioDesc(ListOf,Gene)   $CilioDesc(ListAllPlease,)
    set CilioDesc(ListOf,Header) $CilioDesc(ListHeaderPlease,)
    return [CilioDesc $Qui $Quoi]
}

proc CilioMapping {{Qui ""} {Quoi ""}} {
    global CilioMapping

    if {$Qui==""} { set Qui "ListOf"; set Quoi "Keys" }

    if {[info exists CilioMapping($Qui,$Quoi)]} { return $CilioMapping($Qui,$Quoi) }
    if {[info exists CilioMapping("EstCharge")]} {
	if {[info exists CilioMapping($Qui,GI)] \
		&& [info exists CilioMapping($CilioMapping($Qui,GI),$Quoi)]} {
	    return $CilioMapping($CilioMapping($Qui,GI),$Quoi)
	}
	return ""
    }
    set CilioMapping("EstCharge") 1

    set FichierCsv "[CilioCartaDir]/101_ciliopathies_mapping_ids.tsv"
    set CilioMapping(filename,) $FichierCsv

    LoadTxlWithRowsOfCells $FichierCsv CilioMapping 0 "\t"

    set CilioMapping(ListOf,GI) $CilioMapping(ListAllPlease,)
    set CilioMapping(ListOf,Header)  $CilioMapping(ListHeaderPlease,)

    set LesH [list gene_stable_id gene_display_label transcript_stable_id translation_stable_id UniProt_ID]
    set LesK [list GI             GN                 TI                   PI                    AC        ]
    set CilioMapping(ListOf,Keys) $LesK
    foreach GI $CilioMapping(ListOf,GI) {
	set CilioMapping($GI,All) "$GI"
	foreach H $LesH K $LesK {
	    set $K [string trim $CilioMapping($GI,$H)]
	    append CilioMapping($GI,All) "\t[set $K]"
	    lappend CilioMapping(ListOf,$K) [set $K]
	    set CilioMapping($GI,$K) [set $K]
	    set CilioMapping([set $K],GI) $GI
	}
    }

    return [CilioMapping $Qui $Quoi]
}

proc CilioPep {{Qui ""} {Quoi ""}} {
    global CilioPep

    if {$Qui==""} { set Qui "ListOf"; set Quoi "Header" }

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

    set Fichier "[CilioCartaDir]/101_ciliopathies_pep.fasta"

    set LesK [list AC ID GN     GI   TI   PI   DE     SO          PM     CS             LO       CN           SQ FA]
    set LesG [list AC ID ValiGN ENSG ENST ENSP ValiDE SourceOfDef PubMed CiliomeStudies Location CuratorsNote "" ""]
    set CilioPep(ListOf,Header)       $LesK
    set CilioPep(ListOf,GscopeHeader) $LesG

    set LesLignes [LesLignesDuFichier $Fichier]
    lappend LesLignes ">fin"
    set PremiereFois 1
    foreach Ligne $LesLignes {
	if { ! [regexp ">" $Ligne]} {
	    lappend LaSeq $Ligne
	    continue
	}
	if {$PremiereFois} {
	    set PremiereFois 0
	    set LaSeq {}
	} else {
	    set SQ [join $LaSeq "\n"]
	    set LaSeq {}
	    set FA [SequenceFormatTFA $SQ "$GN $DE ID=$ID AC=$AC PI=$PI"]
	    foreach K $LesK {
		set CilioPep($GI,$K) [set $K]
		lappend CilioPep(ListOf,$K) [set $K]
	    }
	}
	if {$Ligne==">fin"} { break }
        #   AC     ID         DE          OS              GN
	#sp|Q8N157|AHI1_HUMAN Jouberin OS=Homo sapiens GN=AHI1 PE=1 SV=1

	if { ! [regexp {([^ ]+) ([^=]+)} $Ligne Match Access DE]} { FaireLire "ca merde pour $Ligne" }
	set AC [lindex [split $Access "|"] 1]
	set ID [lindex [split $Access "|"] 2]
	
	set DE [string trim [string range $DE 0 end-2]]
	regsub { PE=.*} $Ligne "" Ligne
	set GN [string trim [StringApres "GN=" dans $Ligne]]
	regsub { GN=.*} $Ligne "" Ligne
	set OS [StringSuivant "OS=" dans $Ligne]
#	Espionne "$AC $ID $GN $OS / $DE"

	set GI [CilioMapping $AC GI]
	set TI [CilioMapping $AC TI]
	set PI [CilioMapping $AC PI]

	set gn [CilioMapping $AC GN]         ; if {$gn!=$GN} { FaireLire "dans mapping $AC/$gn/!=/$GN/$AC [CilioMapping $AC All]" }
	set gn [CilioDesc $GI Gene_Name]     ; if {0 && $gn!=$GN} { FaireLire "dans desc $GI/$gn/!=$GN/" }
	set ei [CilioDesc $GI "Ensembl_ID"]  ; if {0 && $ei!=$GI} { FaireLire "Ca merde pour Ensembl_Id=$ei= et GI=$GI=" }

	set de [CilioDesc $GI "Description"] 	
	set SO ""
	if {[regexp {([^\[]+) \[Source:(.*)\]} $de Match NewDE SO]} {
	    set de [string trim $NewDE]
	    set SO [string trim $SO]
	}
	if {0 && $de!=$DE} {
	    regsub "protein " $DE "" DEcoupe
	    if {[string trim $de]!=[string trim $DEcoupe]} { FaireLire "Ca merde pour \n$de\n$DEcoupe" }
	}

	set PM [CilioDesc $GI "PubMed_IDs"]
	set CS [CilioDesc $GI "Ciliome_studies"]
	set LO [CilioDesc $GI "Localisation"]
	set CN [CilioDesc $GI "Curators_Note"]
    }

    foreach K $LesK {
	set CilioPep(ListOf,$K) [lsort -unique $CilioPep(ListOf,$K)]
    }
    foreach GI $CilioPep(ListOf,GI) {
	set GN $CilioPep($GI,GN)
	set PI $CilioPep($GI,PI)
	foreach K $LesK {
	    set CilioPep($GN,$K) $CilioPep($GI,$K)
	    set CilioPep($PI,$K) $CilioPep($GI,$K)
	}
    }
    
    return [CilioPep $Qui $Quoi]
}

proc InformeParProtemblPourTous {{DoIt ""}} {
    if {$DoIt==""} {
	if {[OuiOuNon "Do I really do the updates"]} { set DoIt "DoIt" }
    }
    set DoIt [string equal -nocase $DoIt "DoIt"] 
    foreach Nom [ListeDesPABs] {
	set FicEmbl [GscopeFile $Nom protembl]
	set LesLignesEMBL [LesLignesDuFichier $FicEmbl]
	DecortiqueLesLignesEMBL $LesLignesEMBL ID AC DE GN OS OC OX
	set LesK [list ID AC DE GN OS OC OX]
	foreach K $LesK {
	    set V [set $K]
	    if {$V==""} { continue }
	    set ClefInfo $K
	    if {$K=="ID"} {
		if {$ID==$Nom} {
		    #rR pour CilioCarta on va chercher l'ID dans le prottfa
		    set FicTfa [GscopeFile $Nom prottfa]
		    set Header [PremiereLigneDuFichier $FicTfa]
		    scan $Header "%s %s" N I
		    set A "" ; set B ""; set C ""
		    lassign [split $I "|"] A B C
		    if {$C!=""} {
			set ID $C
		    } elseif {$B!=""} {
			set ID $B
		    } else {
			set ID $A
		    }
		}
		set V $ID
		set ClefInfo "Id"
	    }
	    if {$K=="AC"} { set ClefInfo "Ac" }
	    if {$K=="DE"} { set ClefInfo "ValiDE" }
	    if {$K=="GN"} { set ClefInfo "ValiGN" }
	    if {$DoIt} {
		InformeSansDemander $Nom "=$ClefInfo: $V"
	    } else {
		Espionne "InformeSansDemander $Nom =$ClefInfo: $V"
	    }
	    lappend LesInfos "$Nom =$ClefInfo: $V"
	}
    }
    return $LesInfos
}

proc InformeCilioCarta {} {
    FaireLire "Merci de vérifier cette proc, elle est peut-être obsolète"
    foreach Nom [ListeDesPABs] {
	set FicTfa [GscopeFile $Nom prottfa]
	scan [PremiereLigneDuFichier $FicTfa] "%s %s" N Gn
	set GN [CilioPep $Gn GN]
	if {$Gn!=$GN} { FaireLire "Ca merde pour $Nom $Gn!=$GN" }
	#AC ID GN GI TI PI DE SO PM CS LO CN SQ FA"
	foreach K [CilioPep ListOf Header] G [CilioPep ListOf GscopeHeader] {
	    if {$G==""} { continue }
	    set V [CilioPep $GN $K]
	    InformeSansDemander $Nom "$G: $V"
	}	
    }
    return
}

proc CreeProjetGscopeCilioCarta {} {
    set LeTFAs [CilioPep ListOf FA]
    set FichierFasta [SauveLesLignes $LeTFAs dans "[CilioCartaDir]/CilioCarta.fasta"]
    return [Espionne "$FichierFasta est créé.\nMaitenant il faut faire \nsetgscoperr CilioCarta\n et lancer \ngscope\n puis gscope InformeCilioCarta"]
}

######################################## FromOrthoInspector

proc CompareOrganismFromOrthoInspectorAndYannis {} {
    foreach TYA [OrganismFromYannis ListOf TaxId] {
	set OSYA [OrganismFromYannis $TYA OS]
	set FullOsYA [OrganismFromYannis $TYA FullOs]
	set TOI [OrganismFromOrthoInspector $TYA TaxId]
	if {$TOI==""} {
	    set TOI [OrganismFromOrthoInspector $FullOsYA TaxId]
	    if {$TOI==""} {
		set TOI [OrganismFromOrthoInspector $FullOsYA TaxId]
		if {$TOI==""} { FaireLire "Je ne trouve pas\n$TYA $FullOsYA\ndans OrthoInspector" ; continue }
	    }
	}
 	set FullOsOI [OrganismFromOrthoInspector $TYA FullOs]
	if {$FullOsYA==$FullOsOI} { continue }
	Espionne "$FullOsYA\n$FullOsOI"
	Espionne
    }
	    
}

proc OrganismFromOrthoInspector {{Qui ""} {Quoi ""}} {
    #rR on lit le nom du fichier qui contient le taxid et l'os mais avec le strain qui peut-être n'importe quoi.

    global OFOI

    set QUI  [string toupper $Qui]
    regsub " " $QUI "_" QUI
    set QUOI [string toupper $Quoi]
    if {[info exists OFOI($QUI,$QUOI)]}  { return $OFOI($QUI,$QUOI) }
    if {[info exists OFOI("EstCharge")]} {
	if {[info exists OFOI($QUI,TAXID)]} {
	    set LaReponse {}
	    foreach TaxId $OFOI($QUI,TAXID) {
		if {[info exists OFOI($TaxId,$QUOI)]} { lappend LaReponse $OFOI($TaxId,$QUOI) }
	    }
	    return $LaReponse
	}
	return ""
    }
    set OFOI("EstCharge") 1

    set Rep "/biolo/orthoinspector/DataOrthoinspector/Orthoinspector_v2/eukaryota/all"
    set OFOI(REP,) $Rep

    foreach Fichier [lsort [glob -nocomplain "$Rep/*.fasta"]] {
	set Queue [file tail $Fichier]
	#if {[regexp {^[0-9]} $Queue]} { continue }
	set OsDuFichier ""
	set TaxIdDuFichier ""
	regsub {\.fasta$} $Queue "" FullName
	set G ""
	set E ""
	set T ""
	set S ""
	if {[regexp {([a-z]+)_([a-z\-\.]+)_([0-9]+)_(.+)} $FullName Match G E T S]} {
	    set G [string totitle $G]
	    set OsDuFichier "${G}_$E"
	    set FullOs $OsDuFichier
	    set TaxIdDuFichier $T
	    set Strain $S
	    if {$Strain!=""} { append FullOs "_$Strain" }
	}
	if {[regexp {([0-9]+)_([A-Z][a-z]+)_([a-z\-\.]+)(_(.*)|$)} $FullName Match T G E X S]} {
	    set TaxIdDuFichier $T
	    set OsDuFichier "${G}_$E"
	    set FullOs $OsDuFichier
	    set Strain $S
	    if {$Strain!=""} { append FullOs "_$Strain" }
	}
#	if {$TaxIdDuFichier=="9823" && $OsDuFichier=="Cavia_porcellus"} { set TaxIdDuFichier "10141" }
	if {[info exists DejaVu($TaxIdDuFichier)]} { FaireLire "DejaVu $TaxIdDuFichier" }
	set DejaVu($TaxIdDuFichier) 1
	set OsFromTax [Tax $TaxIdDuFichier]
	regsub " " $OsFromTax "_" OsFromTax
	set AfficheOsFromTax "" ; if {$OsFromTax!="$OsDuFichier"} { set AfficheOsFromTax $OsFromTax }

	set TaxId $TaxIdDuFichier
	set Os $OsDuFichier
	regsub "_" $Os " " $Os
	

	set OFOI($TaxId,TAXID)     $TaxId
	set OFOI($TaxId,FULLNAME)  $FullName
	set OFOI($TaxId,FILENAME)  $Fichier
	set OFOI($TaxId,OS)        $Os
	set OFOI($TaxId,FULLOS)    $FullOs
	set OFOI($TaxId,STRAIN)    $Strain
	set OFOI($TaxId,OSFROMTAX) [Tax $TaxId]
	
	set FULLNAME [string toupper $FullName]
	set FULLOS   [string toupper $FullOs]
	set OS       [string toupper $Os]
	set STRAIN   [string toupper $Strain]

	set OFOI($FULLNAME,TAXID)   $TaxId
	set OFOI($FULLOS,TAXID)     $TaxId
	lappend OFOI($OS,TAXID)     $TaxId
	lappend OFOI($STRAIN,TAXID) $TaxId

	lappend OFOI(LISTOF,TAXID)    $TaxId
	lappend OFOI(LISTOF,FULLNAME) $FullName
	lappend OFOI(LISTOF,FULLOS)   $FullOs
#	lappend OFOI(LISTOF,OS)       $Os
	lappend OFOI(LISTOF,STRAIN)   $Strain
	lappend OFOI(LISTOF,FILENAME) $Fichier
    }
    set OFOI(LISTOF,FULLOS)   [lsort -unique $OFOI(LISTOF,FULLOS)]
    set OFOI(LISTOF,FULLNAME) [lsort -unique $OFOI(LISTOF,FULLNAME)]
    set OFOI(LISTOF,FILENAME) [lsort -unique $OFOI(LISTOF,FILENAME)]
    set OFOI(LISTOF,STRAIN)   [lsort -unique $OFOI(LISTOF,STRAIN)]
    foreach FullOS $OFOI(LISTOF,FULLOS) {
	lassign [split $FullOS "_"] G E
	set OS "$G $E"
	lappend OFOI(LISTOF,OS) $OS
    }     
    return [OrganismFromOrthoInspector $Qui $Quoi]
}

proc OrganismFromYannis {{Qui ""} {Quoi ""}} {
    #rR on lit le nom du fichier qui contient le taxid et l'os mais avec le strain qui peut-être n'importe quoi.

    global OFYA

    set QUI  [string toupper $Qui]
    regsub " " $QUI "_" QUI
    set QUOI [string toupper $Quoi]
    if {[info exists OFYA($QUI,$QUOI)]}  { return $OFYA($QUI,$QUOI) }
    if {[info exists OFYA("EstCharge")]} {
	if {[info exists OFYA($QUI,TAXID)]} {
	    set LaReponse {}
	    foreach TaxId $OFYA($QUI,TAXID) {
		if {[info exists OFYA($TaxId,$QUOI)]} { lappend LaReponse $OFYA($TaxId,$QUOI) }
	    }
	    return $LaReponse
	}
	return ""
    }
    set OFYA("EstCharge") 1

#   set Rep "/home/nevers/StageJuin/Proteomes"
    set Rep "/home/nevers/StageJuin/Proteomes"
    set OFYA(REP,) $Rep

    foreach Fichier [lsort [glob -nocomplain "$Rep/*.tfa"]] {
	set Queue [file tail $Fichier]
	#if {[regexp {^[0-9]} $Queue]} { continue }
	set OsDuFichier ""
	set TaxIdDuFichier ""
	regsub {\.tfa$} $Queue "" FullName
	set FullName [string trim $FullName "_-"]
	set G ""
	set E ""
	set T ""
	set S ""
	if {[regexp {([0-9]+)_([A-Z][a-z]+)_([a-z\-\.]+)(_(.*)|$)} $FullName Match T G E X S]} {
	    set TaxIdDuFichier $T
	    set OsDuFichier "${G}_$E"
	    set FullOs $OsDuFichier
	    set Strain $S
	    if {$Strain!=""} { append FullOs "_$Strain" }
	}
	
	if {[info exists DejaVu($TaxIdDuFichier)]} { FaireLire "DejaVu $TaxIdDuFichier" }
	set DejaVu($TaxIdDuFichier) 1
	set OsFromTax [Tax $TaxIdDuFichier]
	regsub " " $OsFromTax "_" OsFromTax
	set AfficheOsFromTax "" ; if {$OsFromTax!="$OsDuFichier"} { set AfficheOsFromTax $OsFromTax }

	set TaxId $TaxIdDuFichier
	set Os $OsDuFichier
	regsub "_" $Os " " $Os
	

	set OFYA($TaxId,TAXID)     $TaxId
	set OFYA($TaxId,FULLNAME)  $FullName
	set OFYA($TaxId,FILENAME)  $Fichier
	set OFYA($TaxId,OS)        $Os
	set OFYA($TaxId,FULLOS)    $FullOs
	set OFYA($TaxId,STRAIN)    $Strain
	set OFYA($TaxId,OSFROMTAX) [Tax $TaxId]
	
	set FULLNAME [string toupper $FullName]
	set FULLOS   [string toupper $FullOs]
	set OS       [string toupper $Os]
	set STRAIN   [string toupper $Strain]

	set OFYA($FULLNAME,TAXID)   $TaxId
	set OFYA($FULLOS,TAXID)     $TaxId
	lappend OFYA($OS,TAXID)     $TaxId
	lappend OFYA($STRAIN,TAXID) $TaxId

	lappend OFYA(LISTOF,TAXID)    $TaxId
	lappend OFYA(LISTOF,FULLNAME) $FullName
	lappend OFYA(LISTOF,FULLOS)   $FullOs
	lappend OFYA(LISTOF,STRAIN)   $Strain
	lappend OFYA(LISTOF,FILENAME) $Fichier
    }
    set OFYA(LISTOF,FULLOS)   [lsort -unique $OFYA(LISTOF,FULLOS)]
    set OFYA(LISTOF,FULLNAME) [lsort -unique $OFYA(LISTOF,FULLNAME)]
    set OFYA(LISTOF,FILENAME) [lsort -unique $OFYA(LISTOF,FILENAME)]
    set OFYA(LISTOF,STRAIN)   [lsort -unique $OFYA(LISTOF,STRAIN)]
    foreach FullOS $OFYA(LISTOF,FULLOS) {
	lassign [split $FullOS "_"] G E
	set OS "$G $E"
	lappend OFYA(LISTOF,OS) $OS
    }     
    return [OrganismFromYannis $Qui $Quoi]
}

proc FromOrthoInspector {{Qui ""} {Quoi ""}} {
    #rR Lit les fasta de OrthoInspector
    #rR 
    global FromOrthoInspector

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

    if {[info exists FromOrthoInspector($Qui,$Quoi)]}  { return $FromOrthoInspector($Qui,$Quoi) }
    if {[info exists FromOrthoInspector("EstCharge")]} {
	if {[info exists FromOrthoInspector($Qui,ID)]} {
	    set ID [string toupper $FromOrthoInspector($Qui,ID)]
	    if {[info exists FromOrthoInspector($ID,$Quoi)]} { return $FromOrthoInspector($ID,$Quoi) }
	}
	if {[info exists FromOrthoInspector($Qui,TAXID)]} {
	    set TID $FromOrthoInspector($Qui,TAXID)
	    if {[info exists FromOrthoInspector($TID,$Quoi)]} { return $FromOrthoInspector($TID,$Quoi) }
	}
	return ""
    }
    set FromOrthoInspector("EstCharge") 1
    
    set OnGarde 0
    
    set Rep [OrganismFromOrthoInspector Rep]
    
    set FromOrthoInspector(REP,) $Rep
    set LesTaxId [OrganismFromOrthoInspector ListOf TaxId]

    set Testons 0                                                            ;#rR pour test ********
    if {$Testons} { set LesTaxId [list 9606 9823 764100 4577 6182 7668] }

    set FromOrthoInspector(LISTOF,TAXID) [join $LesTaxId "\n"]
    foreach TaxId $LesTaxId {
	set OsDuFichier [OrganismFromOrthoInspector $TaxId FullOs]
	set OsCourtDuFichier [OrganismFromOrthoInspector $TaxId Os]
	lappend FromOrthoInspector(LISTOF,FULLOS) $OsDuFichier
	set FromOrthoInspector($TaxId,FULLOS) $OsDuFichier 
	set Fichier [OrganismFromOrthoInspector $TaxId Filename]
	set Queue [file tail $Fichier]
	set LeTFACourant {}
	set LesLignes [LesLignesDuFichier $Fichier]
	lappend LesLignes ">CESTFINIPOURCEFICHIER"
	set OsDansFichier ""
	set MaxiPourTestons 100 ;#rR 100 ou -1 pour tout
	if {[info exists Courant]} { unset Courant }
	foreach Ligne $LesLignes {

	    if {$Testons && [incr MaxiPourTestons -1]==0} { break }

	    regsub -all " +" $Ligne " " Ligne
	    set Ligne [string trim $Ligne]
	    if {$Ligne==""} { continue }
	    #rR dans sequence
	    if { ! [regexp "^>" $Ligne]} {
		if {[regexp -nocase {[^A-Z]} $Ligne]} {
		    if {[string index $Ligne end]=="*"} { set Ligne [string range $Ligne 0 end-1] }
		    if {[regexp -nocase {[^A-Z\*]} $Ligne Match]} {
			#rR la, il y a meme autre chose
			lappend FromOrthoInspector(LISTOF,BAD) "$Queue $Courant $Ligne"
			FaireLire "Dans $Queue $Courant \n$Ligne"
			set OnGarde 0
			continue
		    }
		    if {[regexp -nocase {\*} $Ligne Match]} {
			#FaireLire "Dans $Queue $Courant \n$Ligne"
			lappend FromOrthoInspector(LISTOF,OSWHITHSTAR) $Queue
			lappend FromOrthoInspector($TaxId,STAR) $Courant
			set OnGarde 0
			continue
		    }
		}
		if {$Ligne!=""} {
		    set OnGarde 1
		    lappend LeTFACourant $Ligne
		}
		continue
	    }
	    
	    #rR on a un chevron
	    
	    #rR on traite d'abord le précédent
	    if {[info exists Courant]} {
		if {$OnGarde} {
		    set ID [string toupper $Id]
		    set COURANT [string toupper $Courant]
		    set FromOrthoInspector($COURANT,TFA) [join $LeTFACourant "\n"]
		    set FromOrthoInspector($ID,ID)     $Id
		    set FromOrthoInspector($ID,AC)     $Ac
		    lappend FromOrthoInspector(LISTOF,IDS)     $Id
		    lappend FromOrthoInspector(LISTOF,ACS)     $Ac
		    lappend FromOrthoInspector($TaxIdDuCourant,IDS) $Id
		    lappend FromOrthoInspector($TaxIdDuCourant,ACS) $Ac
		    set FromOrthoInspector($ID,TAXID) $TaxIdDuCourant
		}
	    }
	    if {$Ligne==">CESTFINIPOURCEFICHIER"} { break }
	    
	    #rR on traite l'entête
	    if { ! [regexp {^>([^ ]+) (.+)} $Ligne Match AI D]} {
		FaireLire "pas bon $Ligne"
		lappend LeNew $Ligne
		continue
	    }
	    set TexteBanque ""
	    if {[regexp {\|} $Ligne]} {
		regexp {^>([^ ]+) (.+)} $Ligne Match AI D
		set Banque ""
		set Ac ""
		set Id ""
		lassign [split $AI "|"] Banque Ac Id
		if {$Ac==""} { set Ac $AI }
		if {$Id==""} { set Id $Ac }
		regsub {OS=.*} $D ""  D
		regsub {GN=.*} $D ""  D
		regsub -all ";" $D " " D
		set D [string trim $D " _,"]
		if {[regexp "_" $Ac] && ! [regexp "_" $Id]} {
		    set W $Id
		    set Id $Ac
		    set Ac $W
		}
		if {$Banque!=""} { set TexteBanque " BANK=$Banque" }
	    } else {
		regexp {^>([^ ]+) ([^ ]+) (.+)} $Ligne Match Id Ac D
		regsub {OS=.*} $D ""  D
		regsub {GN=.*} $D ""  D
		regsub -all ";" $D " " D
		set D [string trim $D " _,"]
		if {[regexp "_" $Ac] && ! [regexp "_" $Id]} {
		    set W $Id
		    set Id $Ac
		    set Ac $W
		}
		#rR Traitement spécial pour lui ....................... il y a tr ou gn à la fin des Id ou Ac
		if {$TaxId==7668} { regsub {(tr|sp|gn)$} $Id "" Id }
		if {$TaxId==7668} { regsub {(tr|sp|gn)$} $Ac "" Ac }
	    }
	    
	    set Gn ""
	    regexp {GN=([^ ]+)} $Ligne Match Gn 
	    set TextGn ""
	    if {$Gn!=""} { set TextGn " GN=$Gn" }

	    
	    regsub { (GN|PE|SV)=.*} $Ligne "" LigneSansGN
	    set FullOs "Unknown unknown"
	    set OsDansEntete ""
	    if {[regexp { OS=(.+)} $LigneSansGN Match FullOs]} {
		regsub -all " " $FullOs "_" FullOs
		regsub -all "/" $FullOs "and" FullOs
		set OsDansEntete $FullOs
	    }
	    lassign [split $FullOs "_"] G E

	    set Entete ">$Id $Ac $G $E $D $TextGn OS=$OsDuFichier TAXID=$TaxId$TexteBanque"	    

	    set LeTFACourant [list $Entete]
	    if {$OsDansEntete==""} { set OsDansFichier $FullOs }
	    if {$OsDansEntete!=$OsDuFichier && $OsDansEntete!=$OsCourtDuFichier} {
		set Message "Dans $Queue\n$OsDansEntete differe de \n$OsDuFichier\n\n$OsDansEntete differe de \n$OsCourtDuFichier"
		if {0 &&  ! [info exists MessageLu($Message)]} {
		    FaireLire "$Message"
		    set  MessageLu($Message) 1
		} 
	    }
	    set Courant $Id
	    set COURANT [string toupper $Courant]
	    set TaxIdDuCourant $TaxId
	    set ID [string toupper $Id]
	    set AC [string toupper $Ac]
	    if {$ID!=$AC} { set FromOrthoInspector($AC,ID) $ID }
	    set FromOrthoInspector($ID,FULLOS) $FullOs
	    set FULLOS [string toupper $FullOs]
	    set FromOrthoInspector($FULLOS,TAXID) $TaxId
	}

	set FromOrthoInspector([string toupper $OsDuFichier],TAXID) $TaxId
    }
    set FromOrthoInspector(LISTOF,STAR) {}
    set FromOrthoInspector(LISTOF,COUNTSTAR) {}
    foreach TaxId $LesTaxId {
	if { ! [info exists FromOrthoInspector($TaxId,IDS)]} { FaireLire "$TaxId empty" ; continue } 
	set FullOs $FromOrthoInspector($TaxId,FULLOS)
	lappend FromOrthoInspector(LISTOF,TAXIDOS) "${TaxId}_$FullOs" 
	set nOK [llength $FromOrthoInspector($TaxId,IDS)]
	lappend FromOrthoInspector(LISTOF,COUNT) "$nOK $TaxId $FullOs"
	if {[info exists FromOrthoInspector($TaxId,STAR)]} {
	    set nKO [llength $FromOrthoInspector($TaxId,STAR)]
	    lappend FromOrthoInspector(LISTOF,COUNTSTAR) "$nKO $nOK $TaxId $FullOs"
	}
    }
    set FromOrthoInspector(LISTOF,TAXIDOS)   [join $FromOrthoInspector(LISTOF,TAXIDOS) "\n"]
    set FromOrthoInspector(LISTOF,FULLOS)    [join $FromOrthoInspector(LISTOF,FULLOS) "\n"]
    set FromOrthoInspector(LISTOF,COUNT)     [join $FromOrthoInspector(LISTOF,COUNT) "\n"]
    set FromOrthoInspector(LISTOF,STAR)      [join $FromOrthoInspector(LISTOF,STAR) "\n"]
    set FromOrthoInspector(LISTOF,COUNTSTAR) [join $FromOrthoInspector(LISTOF,COUNTSTAR) "\n"]
    return [FromOrthoInspector $Qui $Quoi]
}

proc FromYannis {{Qui ""} {Quoi ""}} {
    #rR Lit les fasta de Yannis
    #rR en utilisant OrganismFromYannis qui lit tous les ficheirs d'un repertoire
    global FromYannis

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

    if {[info exists FromYannis($Qui,$Quoi)]}  { return $FromYannis($Qui,$Quoi) }
    if {[info exists FromYannis("EstCharge")]} {
	if {[info exists FromYannis($Qui,ID)]} {
	    set ID [string toupper $FromYannis($Qui,ID)]
	    if {[info exists FromYannis($ID,$Quoi)]} { return $FromYannis($ID,$Quoi) }
	}
	if {[info exists FromYannis($Qui,TAXID)]} {
	    set TID $FromYannis($Qui,TAXID)
	    if {[info exists FromYannis($TID,$Quoi)]} { return $FromYannis($TID,$Quoi) }
	}
	return ""
    }
    set FromYannis("EstCharge") 1
    
    set OnGarde 0
    
    set Rep [OrganismFromYannis Rep]
    
    set FromYannis(REP,) $Rep
    set LesTaxId [OrganismFromYannis ListOf TaxId]

    set Testons 0                                                            ;#rR pour test ********
    if {$Testons} { set LesTaxId [list 9606 9823 764100 4577 6182 7668] }

    set FromYannis(LISTOF,TAXID) [join $LesTaxId "\n"]
    foreach TaxId $LesTaxId {
	set OsDuFichier [OrganismFromYannis $TaxId FullOs]
	set OsCourtDuFichier [OrganismFromYannis $TaxId Os]
	lappend FromYannis(LISTOF,FULLOS) $OsDuFichier
	set FromYannis($TaxId,FULLOS) $OsDuFichier 
	set Fichier [OrganismFromYannis $TaxId Filename]
	set Queue [file tail $Fichier]
	set LeTFACourant {}
	set LesLignes [LesLignesDuFichier $Fichier]
	lappend LesLignes ">CESTFINIPOURCEFICHIER"
	set OsDansFichier ""
	set MaxiPourTestons 100 ;#rR 100 ou -1 pour tout
	if {[info exists Courant]} { unset Courant }
	foreach Ligne $LesLignes {

	    if {$Testons && [incr MaxiPourTestons -1]==0} { break }

	    regsub -all " +" $Ligne " " Ligne
	    set Ligne [string trim $Ligne]
	    if {$Ligne==""} { continue }
	    #rR dans sequence
	    if { ! [regexp "^>" $Ligne]} {
		if {[regexp -nocase {[^A-Z]} $Ligne]} {
		    if {[string index $Ligne end]=="*"} { set Ligne [string range $Ligne 0 end-1] }
		    if {[regexp -nocase {[^A-Z\*]} $Ligne Match]} {
			#rR la, il y a meme autre chose
			lappend FromYannis(LISTOF,BAD) "$Queue $Courant $Ligne"
			FaireLire "Dans $Queue $Courant \n$Ligne"
			set OnGarde 0
			continue
		    }
		    if {[regexp -nocase {\*} $Ligne Match]} {
			#FaireLire "Dans $Queue $Courant \n$Ligne"
			lappend FromYannis(LISTOF,OSWHITHSTAR) $Queue
			lappend FromYannis($TaxId,STAR) $Courant
			set OnGarde 0
			continue
		    }
		}
		if {$Ligne!=""} {
		    set OnGarde 1
		    lappend LeTFACourant $Ligne
		}
		continue
	    }
	    
	    #rR on a un chevron
	    
	    #rR on traite d'abord le précédent
	    if {[info exists Courant]} {
		if {$OnGarde} {
		    set ID [string toupper $Id]
		    set COURANT [string toupper $Courant]
		    set FromYannis($COURANT,TFA) [join $LeTFACourant "\n"]
		    set MemoTaxId $MemoTaxIdDuCourant($COURANT)
		    set FromYannis($ID,ID)     $Id
		    set FromYannis($ID,AC)     $Ac
		    lappend FromYannis(LISTOF,IDS)     $Id
		    lappend FromYannis(LISTOF,ACS)     $Ac
		    lappend FromYannis($MemoTaxId,IDS) $Id
		    lappend FromYannis($MemoTaxId,ACS) $Ac
		    set FromYannis($ID,TAXID) $MemoTaxId
		}
	    }
	    if {$Ligne==">CESTFINIPOURCEFICHIER"} { break }
	    
	    #rR on traite l'entête
	    if { ! [regexp {^>([^ ]+) (.+)} $Ligne Match AI D]} {
		FaireLire "pas bon $Ligne"
		lappend LeNew $Ligne
		continue
	    }
	    set TexteBanque ""
	    if {[regexp {\|} $Ligne]} {
		regexp {^>([^ ]+) (.+)} $Ligne Match AI D
		set Banque ""
		set Ac ""
		set Id ""
		lassign [split $AI "|"] Banque Ac Id
		if {$Ac==""} { set Ac $AI }
		if {$Id==""} { set Id $Ac }
		regsub {OS=.*} $D ""  D
		regsub {GN=.*} $D ""  D
		regsub -all ";" $D " " D
		set D [string trim $D " _,"]
		if {[regexp "_" $Ac] && ! [regexp "_" $Id]} {
		    set W $Id
		    set Id $Ac
		    set Ac $W
		}
		if {$Banque!=""} { set TexteBanque " BANK=$Banque" }
	    } else {
		regexp {^>([^ ]+) ([^ ]+) (.+)} $Ligne Match Id Ac D
		regsub {OS=.*} $D ""  D
		regsub {GN=.*} $D ""  D
		regsub -all ";" $D " " D
		set D [string trim $D " _,"]
		if {[regexp "_" $Ac] && ! [regexp "_" $Id]} {
		    set W $Id
		    set Id $Ac
		    set Ac $W
		}
		#rR Traitement spécial pour lui ....................... il y a tr ou gn à la fin des Id ou Ac
		if {$TaxId==7668} { regsub {(tr|sp|gn)$} $Id "" Id }
		if {$TaxId==7668} { regsub {(tr|sp|gn)$} $Ac "" Ac }
	    }
	    
	    set Gn ""
	    regexp {GN=([^ ]+)} $Ligne Match Gn 
	    set TextGn ""
	    if {$Gn!=""} { set TextGn " GN=$Gn" }

	    
	    regsub { (GN|PE|SV)=.*} $Ligne "" LigneSansGN
	    set FullOs "Unknown unknown"
	    set OsDansEntete ""
	    if {[regexp { OS=(.+)} $LigneSansGN Match FullOs]} {
		regsub -all " " $FullOs "_" FullOs
		regsub -all "/" $FullOs "and" FullOs
		set OsDansEntete $FullOs
	    }
	    lassign [split $FullOs "_"] G E

	    set Entete ">$Id $Ac $G $E $D $TextGn OS=$OsDuFichier TAXID=$TaxId$TexteBanque"	    

	    set LeTFACourant [list $Entete]
	    if {$OsDansEntete==""} { set OsDansFichier $FullOs }
	    if {$OsDansEntete!=$OsDuFichier && $OsDansEntete!=$OsCourtDuFichier} {
		set Message "Dans $Queue\n$OsDansEntete differe de \n$OsDuFichier\n\n$OsDansEntete differe de \n$OsCourtDuFichier"
		if {0 &&  ! [info exists MessageLu($Message)]} {
		    FaireLire "$Message"
		    set  MessageLu($Message) 1
		} 
	    }
	    set Courant $Id
	    set COURANT [string toupper $Courant]
	    set MemoTaxIdDuCourant($COURANT) $TaxId
	    set ID [string toupper $Id]
	    set AC [string toupper $Ac]
	    if {$ID!=$AC} { set FromYannis($AC,ID) $ID }
	    set FromYannis($ID,FULLOS) $FullOs
	    set FULLOS [string toupper $FullOs]
	    set FromYannis($FULLOS,TAXID) $TaxId
	}

	set FromYannis([string toupper $OsDuFichier],TAXID) $TaxId
    }
    set FromYannis(LISTOF,STAR) {}
    set FromYannis(LISTOF,COUNTSTAR) {}
    foreach TaxId $LesTaxId {
	if { ! [info exists FromYannis($TaxId,IDS)]} { FaireLire "$TaxId empty" ; continue } 
	set FullOs $FromYannis($TaxId,FULLOS)
	lappend FromYannis(LISTOF,TAXIDOS) "${TaxId}_$FullOs" 
	set nOK [llength $FromYannis($TaxId,IDS)]
	lappend FromYannis(LISTOF,COUNT) "$nOK $TaxId $FullOs"
	if {[info exists FromYannis($TaxId,STAR)]} {
	    set nKO [llength $FromYannis($TaxId,STAR)]
	    lappend FromYannis(LISTOF,COUNTSTAR) "$nKO $nOK $TaxId $FullOs"
	}
    }
    set FromYannis(LISTOF,TAXIDOS)   [join $FromYannis(LISTOF,TAXIDOS) "\n"]
    set FromYannis(LISTOF,FULLOS)    [join $FromYannis(LISTOF,FULLOS) "\n"]
    set FromYannis(LISTOF,COUNT)     [join $FromYannis(LISTOF,COUNT) "\n"]
    set FromYannis(LISTOF,STAR)      [join $FromYannis(LISTOF,STAR) "\n"]
    set FromYannis(LISTOF,COUNTSTAR) [join $FromYannis(LISTOF,COUNTSTAR) "\n"]
    return [FromYannis $Qui $Quoi]
}

proc RajouteCrEnFinDeFasta {} {
    set Rep "/biolo/orthoinspector/DataOrthoinspector/Orthoinspector_v2/eukaryota/all"
    foreach Fichier [lsort [glob -nocomplain "$Rep/*.fasta"]] {
	set Queue [file tail $Fichier]
	set f [open $Fichier "a+"]
	set Texte [read $f]
	if {[string index $Texte end]=="\n"} { close $f; continue }
	puts $f ""
	Espionne $Queue
	close $f
    }
}

proc CreeUneBanqueBlastPAL {{LesOsChoisis ""} {Banque ""} {Dir ""}} {
    #rR on suppose que les .phr existent déjà. 
    #rR LesOsChoisis sont une liste de TaxId qui figurent en fin du nom des fichiers .phr

    set LesOSTaxId {}
    set LesOS      {}
    set LesTaxId   {}

    if {$Banque==""} { set Banque "BlastDatabase_[Date]" } 


    if {$Dir!=""} { set Dir "[RepertoireDuGenome]/banques" }
    NousAllonsAuBoulot $Dir
    foreach Fichier [lsort [glob -nocomplain "*.phr"]] {
	regsub ".phr$" $Fichier "" OSTaxId
	if { ! [regexp {([A-Z][a-z]+_[a-z\.]+)_([0-9]+)$} $OSTaxId Match OS TaxId]} { continue }
	lappend LesOSTaxId $OSTaxId
	lappend LesOS      $OS
	lappend LesTaxId   $TaxId
	set OSTaxIdDu($TaxId)   $OSTaxId
	set OSTaxIdDu($OSTaxId) $OSTaxId
    }
    if {$LesOsChoisis==""} { set LesOsChoisis [OrganismListForCilioCode "TaxId"] }
    if {$LesOsChoisis==""} { set LesOsChoisis [split [Affiche $LesOSTaxId "AvecRetour" "Select_the_organisms_and_press_Validate"] "\n"] }
    
    if {$LesOsChoisis==""} { return "" }
    
    set LesFichiersChoisis {} 
    foreach Choix $LesOsChoisis {
	if { ! [info exists OSTaxIdDu($Choix)]} {
	    set  OsName [Tax $Choix]
	    if {$OsName!=""} {
		set iUnder [string first " " $OsName]
Espionne $iUnder
		set Debut [string range $OsName 0 [incr iUnder -1]]
		Espionne $Debut
		set PhrTrouves [glob -nocomplain "$Debut*.phr"]
		if {$PhrTrouves!=""} {
		    set PhrRemplace ""
		    if {[llength $PhrTrouves]==1} {
			if {[OuiOuNon "I couldn't find $Choix $OsName\n Can I use \n$PhrTrouves\n"]} {
			    set PhrRemplace $PhrTrouves
			}
		    } else {
			if {[OuiOuNon "I couldn't find $Choix $OsName\n Ok to coose within\n$PhrTrouves\n"]} {
			    set PhrRemplace [ChoixParmi $PhrTrouves]
			}
		    }
		    if {$PhrRemplace!=""} {
			regsub ".phr$" $PhrRemplace "" Secours
			lappend LesFichiersChoisis $Secours
			continue
		    }
		}
	    }
	    Espionne "I can not find $Choix   I'll skip it. Sorry"
	    continue
	}
	lappend LesFichiersChoisis $OSTaxIdDu($Choix)
    }
    if {$LesFichiersChoisis==""} { return "" }
    
    set LeTextePal {}
    lappend LeTextePal "#"
    lappend LeTextePal "# Alias file created by Gscope CreeUneBanqueBlastPAL"
    lappend LeTextePal "#"
    lappend LeTextePal "#"
    lappend LeTextePal "TITLE $Banque"
    lappend LeTextePal "#"
    
    
    set LePal $LesFichiersChoisis
    set LePal [lsort -unique $LePal]
    set Pal [join $LePal " "]
    lappend LeTextePal "DBLIST $Pal"
    lappend LeTextePal "#"
    set BanqueCreee [SauveLesLignes $LeTextePal dans "$Banque.pal"]
    
    OnRevientDuBoulot

    return "$Dir/$BanqueCreee"
}

proc CreeUneBanqueBlastAvecYannis {{LesOsChoisis ""} {Banque ""} {Separate ""}} {
    #rR a parfaire !!!!!!!!!!!!!!!!!! pour aller chercher les banques dans /biolo/orthoinspector/.../proteomes ou ils existent déjà

    if {$Separate==""} { set Separate "Separate" }
    set Separate [regexp -nocase "Separ" $Separate]

    set Dir ""
    if {$Banque==""} { set Banque "Proteome" } 
    if {[regexp "/" $Banque]} {
	set Dir [file dirname $Banque]
	set Banque [file tail $Banque]
    }
    if {$Dir==""} { set Dir "[RepertoireDuGenome]/banques" } 
    file mkdir $Dir

    if {$LesOsChoisis==""} {
	set LesOS [FromYannis ListOf TaxIdOs]	
	set Choisis [Affiche $LesOS "AvecRetour" "Select_the_organisms_and_press_Validate"]
	set LesOsChoisis [split $Choisis "\n"]
    }
    if {[string equal -nocase "All" $LesOsChoisis]} {
	set LesOsChoisis [split [FromYannis ListOf TaxIdOs] "\n"]
    }


    NousAllonsAuBoulot $Dir

    set LePal {}

    if {$Separate} {
	lappend LeTextePal "#"
	lappend LeTextePal "# Alias file created by Gscope CreeUneBanqueBlastAvecYannis"
	lappend LeTextePal "#"
	lappend LeTextePal "#"
	lappend LeTextePal "TITLE $Banque"
	lappend LeTextePal "#"
    }


    set LeGrosTfa {}
    foreach OS $LesOsChoisis {
	set TaxId ""; set G ""; set E ""
	lassign [split $OS "_"] TaxId G E
	if {$TaxId=="" || $G=="" || $E==""} { FaireLire "$OS is wrong I'll skip" ; continue }
	set GET "${G}_${E}_${TaxId}"
	set i 0
	set LePetitTfa {}
	foreach ID [FromYannis $TaxId IDs] {
	    set ID [string toupper $ID]
	    if {[info exists DejaVu($ID)]} { FaireLire "Deja vu $ID"; continue }
	    set TFA [FromYannis $ID TFA]
	    if {$TFA==""} { continue }
	    if {$Separate} {
		lappend LePetitTfa $TFA
		lappend LePal $GET
	    } else {
		lappend LeGrosTfa $TFA
	    }
	    incr i
	}
	AppendAuFichier ${Banque}_TaillesDesOs.txt "$i $GET"
	if {$Separate && ! [file exists $GET.phr]} {
	    SauveLesLignes $LePetitTfa dans $GET
	    exec formatdb -i $GET -p T
	}
    }
    set LePal [lsort -unique $LePal]
    if {$Separate} {
	set Pal [join $LePal " "]
	lappend LeTextePal "DBLIST $Pal"
	lappend LeTextePal "#"
	SauveLesLignes $LeTextePal dans "$Banque.pal"
    } else {
	while {[glob -nocomplain $Banque]!={} || [glob -nocomplain $Banque.*]!={}} {
	    if {[OuiOuNon "Attention. Some files with the same name already exist.\nPlease verify and remove them if necessary\nDo I overwrite"]} {
		break
	    }
	    if {[OuiOuNon "Do I stop creating the BlastDatabase"]} { return "" }
	}
	SauveLesLignes $LeGrosTfa dans $Banque
	exec formatdb -i $Banque -p T
    }
    OnRevientDuBoulot

    return "$Dir/$Banque"
}

proc CreeUneBanqueBlastAvecOrthoInspector {{LesOsChoisis ""} {Banque ""} {Separate ""}} {
    #rR a parfaire !!!!!!!!!!!!!!!!!! pour aller chercher les banques dans /biolo/orthoinspector/.../proteomes ou ils existent déjà

    if {$Separate==""} { set Separate "Separate" }
    set Separate [regexp -nocase "Separ" $Separate]

    set Dir ""
    if {$Banque==""} { set Banque "FromOI" } 
    if {[regexp "/" $Banque]} {
	set Dir [file dirname $Banque]
	set Banque [file tail $Banque]
    }
    if {$Dir==""} { set Dir "[RepertoireDuGenome]/banques" } 
    file mkdir $Dir

    if {$LesOsChoisis==""} {
	set LesOS [FromOrthoInspector ListOf TaxIdOs]	
	set Choisis [Affiche $LesOS "AvecRetour" "Select_the_organisms_and_press_Validate"]
	set LesOsChoisis [split $Choisis "\n"]
    }
    if {[string equal -nocase "All" $LesOsChoisis]} {
	set LesOsChoisis [split [FromOrthoInspector ListOf TaxIdOs] "\n"]
    }


    NousAllonsAuBoulot $Dir

    set LePal {}

    if {$Separate} {
	lappend LeTextePal "#"
	lappend LeTextePal "# Alias file created by Gscope CreeUneBanqueBlastAvecOrthoInspector"
	lappend LeTextePal "#"
	lappend LeTextePal "#"
	lappend LeTextePal "TITLE $Banque"
	lappend LeTextePal "#"
    }


    set LeGrosTfa {}
    foreach OS $LesOsChoisis {
	set TaxId ""; set G ""; set E ""
	lassign [split $OS "_"] TaxId G E
	if {$TaxId=="" || $G=="" || $E==""} { FaireLire "$OS is wrong I'll skip" ; continue }
	set GET "${G}_${E}_${TaxId}"
	set i 0
	set LePetitTfa {}
	foreach ID [FromOrthoInspector $TaxId IDs] {
	    set ID [string toupper $ID]
	    if {[info exists DejaVu($ID)]} { FaireLire "Deja vu $ID"; continue }
	    set TFA [FromOrthoInspector $ID TFA]
	    if {$TFA==""} { continue }
	    if {$Separate} {
		lappend LePetitTfa $TFA
		lappend LePal $GET
	    } else {
		lappend LeGrosTfa $TFA
	    }
	    incr i
	}
	AppendAuFichier ${Banque}_TaillesDesOs.txt "$i $GET"
	if {$Separate && ! [file exists $GET.phr]} {
	    SauveLesLignes $LePetitTfa dans $GET
	    exec formatdb -i $GET -p T
	}
    }
    set LePal [lsort -unique $LePal]
    if {$Separate} {
	set Pal [join $LePal " "]
	lappend LeTextePal "DBLIST $Pal"
	lappend LeTextePal "#"
	SauveLesLignes $LeTextePal dans "$Banque.pal"
    } else {
	while {[glob -nocomplain $Banque]!={} || [glob -nocomplain $Banque.*]!={}} {
	    if {[OuiOuNon "Attention. Some files with the same name already exist.\nPlease verify and remove them if necessary\nDo I overwrite"]} {
		break
	    }
	    if {[OuiOuNon "Do I stop creating the BlastDatabase"]} { return "" }
	}
	SauveLesLignes $LeGrosTfa dans $Banque
	exec formatdb -i $Banque -p T
    }
    OnRevientDuBoulot

    return "$Dir/$Banque"
}

proc CilioCartaDb {{Qui ""} {Quoi ""} {Value ""} {GetWhat ""}} {

    CanalSqlCilioCarta
#    set R [SqlExec "select name from sqlite_master" $Quoi]
#    set R [SqlExec "select * from prot where genename is not null limit 3" $Quoi]

    if {[regexp -nocase "ListOf" $Qui] && [regexp -nocase "Table" $Quoi]} {
	return [SqlExec "SELECT name FROM sqlite_master" "GetList"]
    }
    if {[regexp -nocase "Sql" $Qui] } {
	return [SqlExec "SELECT sql FROM sqlite_master WHERE name='$Quoi'" "GetFirstValue"]
    }
    if {[regexp "Columns" $Qui]} {
	set S [SqlExec "SELECT sql FROM sqlite_master WHERE name='$Quoi'" "GetFirstValue"]
	set LesMots [split [string trim [join [lrange [split $S " "] 3 end] " "] "()"] ","]
	set LeR {}
	set LesC {}
	foreach Mot $LesMots {
	    set Mot [string trim $Mot]
	    regsub " " $Mot "\t" Mot
	    lassign [split $Mot "\t"] N T
	    regsub -all {\"} $N "" N
	    lappend LeR [format "%-25s\t%s" $N $T]
	    lappend LesC $N
	}
	if {[regexp "ColumnsWith" $Qui]} { return $LeR }
	return $LesC
    }
    return [SqlExec "select * from $Qui where $Quoi like '$Value'" $GetWhat]    
}

proc FastaForBlast {{Qui ""} {Quoi ""} {FastaFile ""} {NewFastaFile ""}} {
    global FastaForBlast

    set RemovePipeFromHeader [OuiOuNon "Do I replace >sp|ac|id with >ID AC" 0 ]

    #rR on lit le fichier fasta fourni par Uniprot et si RemeovePipeFromHeader on modifie sp|ac|id en SPT:ID AC
    #rR on rajoute aussi OX=9606 en fin d'entete (attentio avant j'avais OX: ... !)
    #rR les statistiques peuvent se faire apres création du nouveau fasta avec StatFromFasta ci-dessous 

    set Qui  [string toupper $Qui]
    set Quoi [string toupper $Quoi]
    if {$Qui=="-"} { set Qui "" }
    if {$Quoi=="-"} { set Quoi "" }

    if {$FastaFile!=""} {
	if {[info exists FastaForBlast(FASTAFILE,)]} {
	    if {$FastaForBlast(FASTAFILE,)!=$FastaFile} {
		unset FastaForBlast
	    }
	}
	set FastaFileToSet $FastaFile
	set NewFastaFileToSet $NewFastaFile
    }


    if {[info exists FastaForBlast($Qui,$Quoi)]}  { return $FastaForBlast($Qui,$Quoi) }
    if {[info exists FastaForBlast("EstCharge")]} {
	if {[info exists FastaForBlast($Qui,ID)]} {
	    set ID [string toupper $FastaForBlast($Qui,ID)]
	    if {[info exists FastaForBlast($ID,$Quoi)]} { return $FastaForBlast($ID,$Quoi) }
	}
	if {[info exists FastaForBlast($Qui,TAXID)]} {
	    set TID $FastaForBlast($Qui,TAXID)
	    if {[info exists FastaForBlast($TID,$Quoi)]} { return $FastaForBlast($TID,$Quoi) }
	}
	return ""
    }
    if { ! [info exists FastaFileToSet]} {
	FaireLire "Please give the name of the FastaFile"
	return ""
    }
    set FastaForBlast(FASTAFILE,)       $FastaFileToSet
    set FastaForBlast(NEWFASTAFILE,) $NewFastaFileToSet
    set FastaForBlast("EstCharge") 1

    set FastaFile $FastaForBlast(FASTAFILE,)
    set Queue [file tail $FastaFile]

    set OnGarde 1
    set LeTFAACreer {}
    set FlushSize 10000
    set iFlush 0
    set DejaStocke 0

    if {$FastaForBlast(NEWFASTAFILE,)==""} {
	set CreateNew 0
    } else {
	set CreateNew 1
	if {[file exists $FastaForBlast(NEWFASTAFILE,)]} {
	    if {[OuiOuNon "$FastaForBlast(NEWFASTAFILE,)\n already exists. Do I overwrite"]} {
		file delete $FastaForBlast(NEWFASTAFILE,)
	    } else {
		if { ! [OuiOuNon "$FastaForBlast(NEWFASTAFILE,)\n already exists. Do I append"]} {
		    return ""
		}
	    }
	}
    }
    
    set MaxiPourTestons -10000 ;#rR 100 pour limité, -100 pour illimité
    
    set F [open $FastaForBlast(FASTAFILE,) "r"]
    while {1} {
	
	set OnBreak [expr [gets $F Ligne] < 0 ]
	
	if { ! $OnBreak } {
	    regsub -all " +" $Ligne " " Ligne
	    set Ligne [string trim $Ligne]
	    if {$Ligne==""} { continue }
	    #rR dans sequence
	    if { ! [regexp "^>" $Ligne]} {
		lappend LeTFAACreer $Ligne
		continue
	    }
	}
	
	#rR on a un chevron	
	#rR on traite d'abord le précédent
	if {[info exists Courant]} {
	    if {$OnGarde} {
		if {[incr MaxiPourTestons -1]==0} { set OnBreak 1 }
		set ID [string toupper $Id]
		set COURANT [string toupper $Courant]
		lappend FastaForBlast(LISTOF,IDS)     $Id
		lappend FastaForBlast(LISTOF,ACS)     $Ac
		lappend FastaForBlast($MemoTaxId,IDS) $Id
		lappend FastaForBlast($MemoTaxId,ACS) $Ac
		if { ! $CreateNew} {
		    #set FastaForBlast($COURANT,TFA) [join $LeTFACourant "\n"]
		    set FastaForBlast($ID,ID)     $Id
		    set FastaForBlast($ID,AC)     $Ac
		    set FastaForBlast($ID,TAXID) $MemoTaxId
		}
		incr iFlush
		if {$CreateNew && ($iFlush>=$FlushSize || ($iFlush>0 && $OnBreak))} {
		    AppendAuFichier $FastaForBlast(NEWFASTAFILE,) [join $LeTFAACreer "\n"]
		    incr DejaStocke $iFlush
		    Espionne "$DejaStocke sequences already done."
		    set LeTFAACreer {}
		    set iFlush 0
		}
	    }
	}
	if {$OnBreak} { break }
	
	#rR on traite l'entête
	if { ! [regexp {^>([^ ]+) (.+)} $Ligne Match AI D]} {
	    FaireLire "pas bon $Ligne"
	    lappend LeNew $Ligne
	    continue
	}
	set TexteTaxId ""
	if {[regexp {\|} $Ligne]} {
	    
	    #rR on espere >Banque|Ac|Id Definition... (attention à l'ordre)
	    set ResteDeLaLigne ""
	    regexp {^>([^ ]+) (.+)} $Ligne Match BAI ResteDeLaLigne
	    set Banque ""
	    set Ac ""
	    set Id ""
	    lassign [split $BAI "|"] Banque Ac Id
	    if {$Ac==""} { set Ac $BAI }
	    if {$Id==""} { set Id $Ac }
	    if {[regexp "_" $Ac] && ! [regexp "_" $Id]} {
		set W $Id
		set Id $Ac
		set Ac $W
	    }
	} else {
	    #rR on espere >Banque:Id Ac Definition... (Attention à l'ordre Id avant Ac)
	    set Banque ""
	    set Id ""
	    set Ac ""
	    set ResteDeLaLigne ""
	    regexp {^>([^ ]+) ([^ ]+) (.+)} $Ligne Match Id Ac ResteDeLaLigne
	    if {[regexp {([^\:]+)\:(.+)} $Id Match B I]} {
		set Banque $B
		set Id $I
	    }
	    if {$Ac==""} { set Ac $Id }
	    if {[regexp "_" $Ac] && ! [regexp "_" $Id]} {
		set W $Id
		set Id $Ac
		set Ac $W
	    }
	}
	
	
	set TexteBanque ""
	# on laisse comme c'est  if {[string equal -nocase "sp" $Banque]} { set Banque "SW" }
	# on laisse comme c'est  if {[string equal -nocase "tr" $Banque]} { set Banque "TR" }
	#rR supprimé 20160708 ***************************************************	if {$Banque!=""} { set TexteBanque "$Banque:" }
	
	set Gn ""
	regexp {GN=([^ ]+)} $Ligne Match Gn 
	set TextGn ""
	if {$Gn!=""} { set TextGn " GN=$Gn" }
	
	
	set FullOs "Unknown unknown"
	if {[regexp { OS=(.+)} $Ligne Match FullOsWithJunk]} {
	    regsub {[A-Z][A-Z]=.*} $FullOsWithJunk "" FullOs
	    set FullOs [string trim $FullOs]
	}
	set TexteTaxId ""
	set TaxId [TaxParQdsMemo $FullOs]
	if {$TaxId!=""} {
	    lappend LesTaxId $TaxId
	    set TexteTaxId " OX=$TaxId"
	    set FastaForBlast($TaxId,FULLOS) $FullOs
	}
	
	if {$RemovePipeFromHeader} {
	    set Entete ">$TexteBanque$Id $Ac $ResteDeLaLigne$TexteTaxId"	    
	} else {
	    set Entete "$Ligne$TexteTaxId"
	}
	lappend LeTFAACreer $Entete
	
	set Courant $Id
	set COURANT [string toupper $Courant]
	set MemoTaxId $TaxId
	set ID [string toupper $Id]
	set AC [string toupper $Ac]
	if { ! $CreateNew} { 
	    if {$ID!=$AC} { set FastaForBlast($AC,ID) $ID }
	    set FastaForBlast($ID,FULLOS) $FullOs
	}
	set FULLOS [string toupper $FullOs]
	set FastaForBlast($FULLOS,TAXID) $TaxId
    }
    
    set LesTaxId [lsort -unique $LesTaxId]
    set FastaForBlast(LISTOF,TAXID) $LesTaxId
    
    foreach TaxId $LesTaxId {
	if { ! [info exists FastaForBlast($TaxId,IDS)]} { FaireLire "$TaxId empty" ; continue } 
	set FullOs $FastaForBlast($TaxId,FULLOS)
	lappend FastaForBlast(LISTOF,FULLOS)  "$FullOs" 
	lappend FastaForBlast(LISTOF,TAXIDOS) "${TaxId}_$FullOs" 
	set nOK [llength $FastaForBlast($TaxId,IDS)]
	lappend FastaForBlast(LISTOF,COUNT) "$nOK $TaxId $FullOs"
    }
    set FastaForBlast(LISTOF,TAXID)     [join $FastaForBlast(LISTOF,TAXID)   "\n"]
    set FastaForBlast(LISTOF,TAXIDOS)   [join $FastaForBlast(LISTOF,TAXIDOS) "\n"]
    set FastaForBlast(LISTOF,FULLOS)    [join $FastaForBlast(LISTOF,FULLOS)  "\n"]
    set FastaForBlast(LISTOF,COUNT)     [join $FastaForBlast(LISTOF,COUNT)   "\n"]
    
    if {$CreateNew} {
	set FichierStat "$FastaForBlast(NEWFASTAFILE,).stat"
	set FastaForBlast(STAT,FILENAME) [Sauve $FastaForBlast(LISTOF,COUNT) dans $FichierStat]
    }
    
    return [FastaForBlast $Qui $Quoi]
}

proc StatFromFasta {{Qui ""} {Quoi ""} {FastaFile ""} {StatFile ""} {ProcessAlsoId ""}} {
    global StatFromFasta

    set ProcessAlsoId [string equal -nocase $ProcessAlsoId "ProcessAlsoId"]

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

    if {$FastaFile!=""} {
	if {[info exists StatFromFasta(FASTAFILE,)]} {
	    if {$StatFromFasta(FASTAFILE,)!=$FastaFile} {
		unset StatFromFasta
	    }
	}
	set StatFromFasta(FASTAFILE,) $FastaFile
	set StatFromFasta(STAFILE,)   $StatFile
    }

    if { ! [info exists StatFromFasta(FASTAFILE,)]} {
	FaireLire "Please give the name of the FastaFile"
	return ""
    }

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

    set FastaFile $StatFromFasta(FASTAFILE,)

    set OnGarde 1

    set DejaFaits 0
    set MaxiPourTestons -1000 ;#rR 100 pour limité, -100 pour illimité
    
    set F [open $StatFromFasta(FASTAFILE,) "r"]
    while {1} {
	
	set  OnBreak [expr [gets $F Ligne] < 0 ]
	if {$OnBreak } { break }
	if { ! [regexp ">" $Ligne]} { continue }
	if {[incr MaxiPourTestons -1]==0} { break }

	regsub -all " +" $Ligne " " Ligne
	set Ligne [string trim $Ligne]

	if {[incr DejaFaits]%10000==0} { Espionne "$DejaFaits déjà faits" }

	if {[regexp {\|} $Ligne]} {
	    #rR normalement on a que le cas else si on a fait FastaForBlast
	    #rR on espere >Banque|Ac|Id Definition... (attention à l'ordre)
	    set ResteDeLaLigne ""
	    regexp {^>([^ ]+) (.+)} $Ligne Match BAI ResteDeLaLigne
	    set Banque ""
	    set Ac ""
	    set Id ""
	    lassign [split $BAI "|"] Banque Ac Id
	    if {$Ac==""} { set Ac $BAI }
	    if {$Id==""} { set Id $Ac }
	    if {[regexp "_" $Ac] && ! [regexp "_" $Id]} {
		set W $Id
		set Id $Ac
		set Ac $W
	    }
	} else {
	    #rR on espere >Banque:Id Ac Definition... (Attention à l'ordre Id avant Ac)
	    set Banque ""
	    set Id ""
	    set Ac ""
	    set ResteDeLaLigne ""
	    regexp {^>([^ ]+) ([^ ]+) (.+)} $Ligne Match Id Ac ResteDeLaLigne
	    if {[regexp {([^\:]+)\:(.+)} $Id Match B I]} {
		set Banque $B
		set Id $I
	    }
	    if {$Ac==""} { set Ac $Id }
	    if {[regexp "_" $Ac] && ! [regexp "_" $Id]} {
		set W $Id
		set Id $Ac
		set Ac $W
	    }
	}
	
	set FullOs "Unknown unknown"
	if {[regexp { OS=(.+)} $Ligne Match FullOsWithJunk]} {
	    regsub {[A-Z][A-Z]=.*} $FullOsWithJunk "" FullOs
	    set FullOs [string trim $FullOs]
	}

	set TaxId [IntegerApres "OX=" dans $Ligne]
	if {$TaxId==""} {
	    set TaxId [IntegerApres "OX:" dans $Ligne]
	}
	if {$TaxId!=""} {
	    lappend LesTaxId $TaxId
	    set StatFromFasta($TaxId,FULLOS) $FullOs
	}
	
	set Courant $Id
	set COURANT [string toupper $Courant]
	set ID [string toupper $Id]
	set AC [string toupper $Ac]
	if {$ProcessAlsoId} { 
	    if {$ID!=$AC} { set StatFromFasta($AC,ID) $ID }
	    set StatFromFasta($ID,FULLOS) $FullOs
	}
	set FULLOS [string toupper $FullOs]
	set StatFromFasta($FULLOS,TAXID) $TaxId

	set ID [string toupper $Id]
	set COURANT [string toupper $Courant]
	lappend StatFromFasta(LISTOF,IDS) $Id
	lappend StatFromFasta(LISTOF,ACS) $Ac
	lappend StatFromFasta($TaxId,IDS) $Id
	lappend StatFromFasta($TaxId,ACS) $Ac
	if {$ProcessAlsoId} {
	    set StatFromFasta($ID,ID)     $Id
	    set StatFromFasta($ID,AC)     $Ac
	    set StatFromFasta($ID,TAXID)  $TaxId
	}
    }
    
    set LesTaxId [lsort -unique $LesTaxId]
    set StatFromFasta(LISTOF,TAXID) $LesTaxId
    
    foreach TaxId $LesTaxId {
	if { ! [info exists StatFromFasta($TaxId,IDS)]} { FaireLire "$TaxId empty" ; continue } 
	set FullOs $StatFromFasta($TaxId,FULLOS)
	lappend StatFromFasta(LISTOF,FULLOS)  "$FullOs" 
	lappend StatFromFasta(LISTOF,TAXIDOS) "${TaxId}_$FullOs" 
	set nOK [llength $StatFromFasta($TaxId,IDS)]
	lappend StatFromFasta(LISTOF,COUNT) "$nOK $TaxId $FullOs"
    }
    set StatFromFasta(LISTOF,TAXID)     [join $StatFromFasta(LISTOF,TAXID)   "\n"]
    set StatFromFasta(LISTOF,TAXIDOS)   [join $StatFromFasta(LISTOF,TAXIDOS) "\n"]
    set StatFromFasta(LISTOF,FULLOS)    [join $StatFromFasta(LISTOF,FULLOS)  "\n"]
    set StatFromFasta(LISTOF,COUNT)     [join $StatFromFasta(LISTOF,COUNT)   "\n"]
    
    if {$StatFile!=""} {
	set StatFromFasta(STAT,FILENAME) [Sauve $StatFromFasta(LISTOF,COUNT) dans $StatFile]
    }
    
    return [StatFromFasta $Qui $Quoi]
}

proc PdbInfo {{Qui ""} {Quoi ""}} {
    global PdbInfo

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

    set FichierProtnames "./protnames.lst"

    foreach Ligne [LesLignesDuFichier $FichierProtnames] {
	scan $Ligne "%s" Acc
	set PdbInfo($Acc,txt) $Ligne
	lappend PdbInfo(listof,acc) $Acc
	if {[regexp -nocase {^([0-9a-z]+) [\*\- ]+$} $Ligne Match Acc]} {
	    set PdbInfo($Acc,def) ""
	    continue
	}
	if {[regexp -nocase {^([0-9a-z]+) +\* +\- +\- +} $Ligne Match Acc]} {
	    regsub {^([0-9a-z]+) +\* +\- +\- +} $Ligne "" Def
	    set PdbInfo($Acc,def) [string trim $Def]
	    continue
	}
	set T ""
	set Date ""
	set Meth ""
	lassign [split $Ligne " "] Acc T Date Meth
	if { ! [regexp {^[0-9][0-9]\-[A-Z][a-z][a-z]\-[0-9][0-9]$} $Date]} {
	    if {[regexp {(X\-ray|NMR) +([0-9\.]+) (.+)$} $Ligne Match Meth Resol Def]} {
		set PdbInfo($Acc,def) [string trim $Def]
		set PdbInfo($Acc,met) [string trim $Meth]
		set PdbInfo($Acc,res) [string trim $Resol]
		continue
	    } 
	    if {[regexp {(Theoret model) (.+)$} $Ligne Match Meth Def]} {
		set PdbInfo($Acc,def) [string trim $Def]
		continue
	    }
	    FaireLire $Ligne
	    continue
	}
	if {$Meth==""} { set Meth "-" }
	regsub -all -- {\*} $T    "\\*" xT
	regsub -all -- {\-} $xT    "\\-" xT
	regsub -all -- {\-} $Date "\\-" xDate
	regsub -all -- {\-} $Meth "\\-" xMeth
	regsub "$Acc +$xT +$xDate +$xMeth" $Ligne "" ResDef
	scan $ResDef "%s" Resol
	regsub -all -- {\-} $Resol "\\-" Resol
	regsub -- "$Resol +" $ResDef "" Def

	if { ! [regexp {^[0-9\.]+$} $Resol]} { set Resol "" }

	set PdbInfo($Acc,def) [string trim $Def]
	set PdbInfo($Acc,dat) [string trim $Date]
	set PdbInfo($Acc,met) [string trim $Meth]
	set PdbInfo($Acc,res) [string trim $Resol]
    }

    foreach Acc [PdbInfo listof acc] {
	set Def $PdbInfo($Acc,def)
	if {[info exists PdbInfo($Acc,dat)]}                                  { append Def " $PdbInfo($Acc,dat)" }
	if {[info exists PdbInfo($Acc,met)] && $PdbInfo($Acc,met)!="Theoret"} { append Def " $PdbInfo($Acc,met)" }
	if {[info exists PdbInfo($Acc,res)]}                                  { append Def " $PdbInfo($Acc,res)" }
	set PdbInfo($Acc,def) $Def
    }

    return [PdbInfo $Qui $Quoi]
    
}

proc PdbSeqRes {{Qui ""} {Quoi ""}} {
    global PdbSeqRes

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

    set FichierSeqRes "./pdb_seqres.txt"

    foreach Ligne [LesLignesDuFichier $FichierSeqRes] {
	if {[regexp ">" $Ligne]} {
	    scan $Ligne "%s" AccChain
	    regsub ">" $AccChain "" AccChain
	    lappend PdbSeqRes(listof,acc) $AccChain
	    set PdbSeqRes($AccChain,seq) ""
	    regsub {.*length\:[0-9]+ +} $Ligne "" Titre
	    set PdbSeqRes($AccChain,tit) $Titre
	    continue
	}
	set Ligne [string trim $Ligne]
	append PdbSeqRes($AccChain,seq) $Ligne
    }
    foreach AccChain $PdbSeqRes(listof,acc) {
	regsub {_[A-Z]+} $AccChain "" Acc
	set acc [string tolower $Acc]
	set Def [PdbInfo $acc def]
	set Entete ">PDB:$AccChain $PdbSeqRes($AccChain,tit)."
	if {$Def!=""} { append Entete " $Def" }
	set Seq $PdbSeqRes($AccChain,seq)
	if {[regexp -nocase {[^a-z]} $Seq]} { Espionne "$Acc $Seq" }
	set Tfa [SequenceFormatTFA $Seq $Entete "protbrut"]
	set PdbSeqRes($AccChain,tfa) $Tfa
	set ACCCHAIN [string toupper $AccChain]
	if {$AccChain!=$ACCCHAIN} {
	    set PdbSeqRes($ACCCHAIN,tfa) $Tfa
	    set PdbSeqRes($ACCCHAIN,seq) $Seq
	}
    }
    return [PdbSeqRes $Qui $Quoi]
}

proc CreatePdbFromSeqResAndProtName {{Sortie ""}} {
    foreach Acc [PdbSeqRes listof acc] {
	set Tfa [PdbSeqRes $Acc tfa]
	lappend LeTfa $Tfa
    }
    set GrosTfa [join $LeTfa "\n"]
    if {$Sortie==""} {return $GrosTfa }
    return [Sauve $GrosTfa dans $Sortie] 
}

proc BonneEntetePourBilanCilio Header {
    global BonneEntetePourBilanCilio
    set HEADER [string toupper $Header]
    if {[info exists BonneEntetePourBilanCilio($HEADER)]} { return $BonneEntetePourBilanCilio($HEADER) }
    if {[info exists BonneEntetePourBilanCilio("EstCharge")]} { return $Header }
    set BonneEntetePourBilanCilio("EstCharge") 1

    set LookupList [list \
			"In_GoldStandard"         "InGoldStandard"       \
			"GScope"                  "GscopeId"             \
			"Uniprot ID"              "UniprotId"            \
			"In orthoinspector"       "InOrthoinspector"     \
			"Groupe de paralogue"     "GroupOfParalog"       \
			"GO"                      -                      \
			"Function"                -                      \
			"Citation"                -                      \
			"ProteinName"             -                      \
			"Uniprot Total"           "UniprotTotal"         \
			"Genomique comparative"   "ComparativeGenomics"  \
			"Proteomique"             -                      \
			"Transcriptomique"        "Trasncriptomics"      \
			"Promoteur X-Box"         "PromoteurX-Box"       \
			"Total"                   -                      \
			"Prediction"              -                      \
			"Phylum specific"         "PhylumSpecific"       \
			"Ciliated-specific"       "CiliatedSpecific"     \
			"Diff Stramenopile"       "DiffStramenopile"     \
			"Diff Archaeplastidae"    "Diff Archaeplastidae" \
			"Diff Alveolata"          "DiffAlveolata"        \
			"Diff Fungi"              "DiffFungi"            \
			"Nb de clades ciliés"     "NbCladesCilies"       \
			"Nb de clades non ciliés" "NbCladesNonCilies"    \
			"Nb de PR"                "NbPR"                 \
			"Universal"               "Universal"            \
			"Nb Diff"                 "NbDiff"               \
		       ]
    foreach {K V} $LookupList {
	if {$V=="-"} { set V $K }
	set BonneEntetePourBilanCilio([string toupper $K]) $V
    }
    return [BonneEntetePourBilanCilio $Header]
}

proc BilanCilio2014 {{Qui ""} {Quoi ""}} {
    global BilanCilio2014

    #rR on lit le fichier Excel de Odile
    #rR gscope puts BilanCilio2014 ListOf Usage

    if {[info exists BilanCilio2014($Qui,$Quoi)]} { return $BilanCilio2014($Qui,$Quoi) }
    if {[info exists BilanCilio2014("EstCharge")]} {
	if {$Qui=="ListOf" && $Quoi=="Example"} {
	    set LesExemples {}
	    foreach Us $BilanCilio2014(ListOf,Usage) {
		if { ! [regexp "^Bilan" $Us]} { continue }
		lappend LesExemples "\n$Us"
		lappend LesExemples [eval $Us]
	    }
	    lappend LesExemples "\nYou can run all these commands with :"
	    lappend LesExemples "gscope puts BilanCilio2014 Y_Mammalia TaxId"
	    return [join $LesExemples "\n"]
	}		
	return ""
    }
    set BilanCilio2014("EstCharge") 1


    set Fichier "[RepertoireDuGenome]/fiches/bilan_presence_absence_avecgroupes_tentativescriteres.csv"
    if {[FileAbsent $Fichier]} { unset BilanCilio2014; return "" }
    set BilanCilio2014(exists,) 1

    set Usage [list \
		   "gscope puts BilanCilio2014 ListOf Usage" \
		   "BilanCilio2014 ListOf Box" \
		   "BilanCilio2014 ListOf Access" \
		   "BilanCilio2014 ListOf Categories" \
		   "BilanCilio2014 ListOf TaxId" \
		   "BilanCilio2014 ListOf Class" \
		   "BilanCilio2014 ListOf Clade" \
		   "" \
		   "BilanCilio2014 10090  Class" \
		   "BilanCilio2014 10090  Clade" \
		   "BilanCilio2014 10090  State" \
		   "BilanCilio2014 10090  PA" \
		   "" \
		   "BilanCilio2014 Y_Mammalia TaxId" \
		   "BilanCilio2014 Y_Mammalia State" \
		   "BilanCilio2014 Y_Mammalia States" \
		   "BilanCilio2014 Y_Mammalia Count" \
		   "BilanCilio2014 Y_Mammalia PA" \
		   "" \
	       ]
    set BilanCilio2014(ListOf,Usage) $Usage

    set BilanCilio2014(Filename,) $Fichier 

    set Texte [ContenuDuFichier $Fichier]
    regsub -all "\n\"" $Texte "\"" Texte

    
    set Prems 1
    set Deuss 0
    set Trois 0
    set LesTaxId {}
    set LesTaxIdsDuG {}
    set LesEtatsDuG {}
    set LesEspecesDuG {}
    set LesClades {}
    foreach Ligne [split $Texte "\n"] {
	if {$Prems} {
	    set Prems 0
	    set Deuss 1
	    set LesBox [lrange [split $Ligne ";"] 4 end]
	    set BilanCilio2014(ListOf,Box) $LesBox
	    continue
	}
	if {$Deuss} { set Trois 1; set Deuss 0 ; continue }
	if {$Trois} { set Trois 0; set BilanCilio2014(ListOf,Categories) [lrange [split $Ligne ";"] 4 end]; continue }
	set Classe ""
	if {[regexp {;\"([^\"]+)\";} $Ligne Match Classe]} {
	    regsub  {;\"([^\"])+\";} $Ligne ";Classe;" Ligne
	}
	set LesMots [split $Ligne ";"]
	
	set TaxId  [string trim [lindex $LesMots 0] " -"]
	set Espece [string trim [lindex $LesMots 1] " -"]
	set Clade  [string trim [lindex $LesMots 2] " -"]
	set Etat   [string trim [lindex $LesMots 3] " -"]

	if {$TaxId=="" && $Espece=="" && $Clade=="" && $Etat==""} {
	    set LesAccess [lrange $LesMots 4 end]
	    set BilanCilio2014(ListOf,Access) $LesAccess
	    break
	}

	set Clade "${Etat}_$Clade"
	regsub -all " +" $Clade "_" Clade 

	if {[regexp {^[0-9]+$} $TaxId]} {
	    lappend LesTaxIdsDuG  $TaxId
	    lappend LesEspecesDuG $Espece
	    lappend LesEtatsDuG   $Etat
	    lappend LesClassesDuG $Classe
	    lappend BilanCilio2014(ListOf,TaxId) $TaxId
	    lappend BilanCilio2014(ListOf,Class) $Classe
	    set BilanCilio2014($TaxId,PA) [lrange $LesMots 4 end]
	    set BilanCilio2014($TaxId,State) $Etat
	    set BilanCilio2014($TaxId,Class) $Classe
	    set BilanCilio2014($Classe,TaxId) $TaxId
	} else {
	    set Compte $Espece
	    lappend BilanCilio2014(ListOf,Clade) $Clade 
	    set BilanCilio2014($Clade,Count)   $Compte
	    set BilanCilio2014($Clade,State)   $Etat
	    set BilanCilio2014($Clade,TaxId)   $LesTaxIdsDuG
	    set BilanCilio2014($Clade,Species) $LesEspecesDuG
	    set BilanCilio2014($Clade,States)  $LesEtatsDuG
	    set BilanCilio2014($Clade,Class)   $LesClassesDuG
	    set BilanCilio2014($Clade,TaxId)   $LesTaxIdsDuG
	    set BilanCilio2014($Clade,PA) [lrange $LesMots 4 end]
	    foreach TaxId $LesTaxIdsDuG {
		set BilanCilio2014($TaxId,Clade) $Clade
		set BilanCilio2014($TaxId,Clade) $Clade
	    }
	    set LesTaxIdsDuG {}
	    set LesEtatsDuG {}
	    set LesEspecesDuG {}
	}
    }
    foreach S [array names BilanCilio2014 "10090,*"] {
	regsub 10090 $S 9606 H
	Espionne "$S $H"
	set BilanCilio2014($H) $BilanCilio2014($S)
    }
    regsub -all 0 $BilanCilio2014(10090,PA) 1 BilanCilio2014(9606,PA)
    return [BilanCilio2014 $Qui $Quoi]
}

proc SelectClade {{Multiple ""} {UseQds ""}} {
    if {$Multiple==""} { set Multiple "One" }
    set GetAll   [string equal -nocase "GetAll"   $Multiple]
    set Multiple [string equal -nocase "Multiple" $Multiple]
    set UseQds   [string equal -nocase "UseQds"   $UseQds]
    if {[OnTraite "CilioCarta" "Like"]} {
	if {$UseQds} {
	    set LesBilCla [QuestionDeScience CilioCarta "ret BilanCilio ListOf Clade"]
	} else {
	    set LesBilCla [BilanCilio ListOf Clade]
	}
	set LesClades {}
	foreach BilCla $LesBilCla {
	    regsub {[^_]+_} $BilCla "" Clade          ;#rR on enleve Y_ N_ et PR_
	    lappend LesClades $Clade
	}
	set LesClades [lsort -unique $LesClades]
    } elseif {[OnTraite "OI2017" "Like"]} {
	if {$UseQds} {
	    set LesClades [QuestionDeScience OI "ret CMC ListOf Clade"]
	} else {
	    set LesClades [CMC ListOf Clade]
	}
	set LesClades [lsort -unique $LesClades]

    }



    if {$GetAll} { return $LesClades }

    if {$Multiple} {
	if {[OnTraite "CilioCarta"]} { return [lrange $LesClades 0 end] }
	set Choisis [Affiche [join $LesClades "\n"] "AvecRetour" "Select within this list. Highlight several and press 'Validate selection' or 'All'"]
	return [split $Choisis "\n"]
    }

    set LesClades [linsert $LesClades 0 "Use another one"]
    set Choisi [ChoixParmi $LesClades]
    if {$Choisi=="Use another one"} { set Choisi [Entre "Hominidae"] }

    return $Choisi
}

proc BilanCilioQds {{Qui ""} {Quoi ""}} {
    return [QuestionDeScience CilioCarta "ret BilanCilio $Qui $Quoi"]
}

proc CladeContent {Clade {UseQds ""} {WithoutTaxIds ""}} {
    #rR WithoutTaxIds est une liste de TaxIds qu'il faut ne pas considérer (typiquement 9606)
    #rR UseQds Pour aller plus vite ... mais attention à ne pas le faire en QDS
    if {$UseQds=="UseQds" && ( ! [OnTraite CilioCarta] || ! [PourWscope]) } {
	return [QuestionDeScience CilioCarta "ret CladeContent $Clade Direct $WithoutTaxIds"]
    }
    set WithoutTaxIds [split $WithoutTaxIds ","]
    set Content {}
    foreach S {Y PR N} {
	if {[regexp {([A-Z]+)_} $Clade Match X]} {
	    if {$S!=$X} { Espionne $Clade; continue } 
	    set C [BilanCilio $Clade "CladeContentTaxIds"]
	} else {
	    set C [BilanCilio "${S}_$Clade" "CladeContentTaxIds"]
	}
	foreach TaxId $C {
	    if {[lsearch $WithoutTaxIds $TaxId]>=0} { continue }
	    lappend Content $TaxId
	}
    }
    return $Content
}

proc BilanCilio {{Qui ""} {Quoi ""}} {
    global BilanCilio

    if {[OnTraite CilioCarta2014]} { return [BilanCilio2014 $Qui $Quoi] }

    #rR on lit le fichier Excel de Odile
    #rR gscope puts BilanCilio ListOf Usage

    if {[info exists BilanCilio($Qui,$Quoi)]} { return $BilanCilio($Qui,$Quoi) }
    if {[info exists BilanCilio("EstCharge")]} {
	regsub -all "_" $Qui   " " Qi
	regsub -all "_" $Quoi  " " Qo
	if {[info exists BilanCilio($Qui,$Qo)] } { return $BilanCilio($Qui,$Qo) }
	if {[info exists BilanCilio($Qi,$Quoi)]} { return $BilanCilio($Qi,$Quoi) }
	if {[info exists BilanCilio($Qui,Column)] && [info exists BilanCilio($BilanCilio($Qui,Column),$Quoi)]} { return $BilanCilio($BilanCilio($Qui,Column),$Quoi) }
	if {[info exists BilanCilio($Qi,Column)]  && [info exists BilanCilio($BilanCilio($Qi,Column),$Quoi)]}  { return $BilanCilio($BilanCilio($Qi,Column),$Quoi) }
	if {[info exists BilanCilio($Qui,Column)] && [info exists BilanCilio($BilanCilio($Qui,Column),$Qo)]}   { return $BilanCilio($BilanCilio($Qui,Column),$Qo) }
	if {[info exists BilanCilio($Qi,Column)]  && [info exists BilanCilio($BilanCilio($Qi,Column),$Qo)]}    { return $BilanCilio($BilanCilio($Qi,Column),$Qo) }
	if {$Qui=="Example"} {
	    set LesExemples {}
	    foreach Us $BilanCilio(ListOf,Usage) {
		if { ! [regexp "^Bilan" $Us]} { continue }
		lappend LesExemples "\n$Us"
		set Res [eval $Us]
		if {[string length $Res]>100} { set Res "[string range $Res 0 132] ..." }
		lappend LesExemples $Res
	    }
	    lappend LesExemples "\nYou can run all these commands with :"
	    lappend LesExemples "gscope puts BilanCilio N_Fungi TaxId"
	    return [join $LesExemples "\n"]
	}		
	return ""
    }
    set BilanCilio("EstCharge") 1

    #rR ************************************************** attention il faut le fichier sinon return 0 si on demande exists vide autrement
#    set Fichier "[RepertoireDuGenome]/bilan/bilanOK.csv"
    set Fichier "/genomics/link/CilioCarta/bilan/bilanOK.csv"
    if {[FileAbsent $Fichier]} {
	unset BilanCilio
	if {$Qui=="exists"} { return 0 }
	return ""
    }
    set BilanCilio(exists,) 1

    set ListOfUsage [list \
		   "gscope puts BilanCilio Usage" \
		   "gscope puts BilanCilio Example" \
		   "BilanCilio ListOf GscopeId" \
		   "BilanCilio ListOf UniprotId" \
		   "BilanCilio ListOf TaxId" \
		   "BilanCilio ListOf Class" \
		   "BilanCilio ListOf Clade" \
		   "" \
		   "BilanCilio 10090  Species" \
		   "BilanCilio 10090  Class"   \
		   "BilanCilio 10090  Clade"   \
		   "BilanCilio 10090  State"   \
		   "BilanCilio 10090  TaxId"   \
		   "" \
		   "BilanCilio (556484_12968) Column" \
		   "BilanCilio (556484_12968) Clade"  \
		   "" \
		   "BilanCilio Y_Fungi  TaxId" \
		   "BilanCilio Y_Fungi  CladeContentTaxIds" \
		   "BilanCilio Y_Fungi  CladeContentSpecies" \
		   "BilanCilio Y_Fungi  CladeContentColumns" \
		   "BilanCilio N_Fungi  Permil" \
		   "BilanCilio PR_Fungi Count" \
		   "" \
	       ]

    set BilanCilio(ListOf,Usage) $ListOfUsage
    set BilanCilio(Usage,) [join $ListOfUsage "\n"] 

    set BilanCilio(Filename,) $Fichier 

    set Texte [ContenuDuFichier $Fichier]
    regsub -all "\n\"" $Texte "\"" Texte
    
    set CladeContentTaxIds  {}
    set CladeContentSpecies {}
    set CladeContentColumns {}

    set Prems 1
    set Deuss 0
    set Trois 0
    set Quats 0
    set N 0
    foreach Ligne [split $Texte "\n"] {
	if {0 && [incr N]==1000} { break }
	if {$Prems} {
	    set Prems 0
	    set Deuss 1
	    set LesTaxIdLus [lrange [split $Ligne ";"] 5 end]
	    set Column 5
	    set CladeContentTaxIds {}
	    set LesTaxId {}
	    foreach TaxId $LesTaxIdLus {
		if {$TaxId==""} {
		    if {$CladeContentTaxIds=={}} { break }
		    set TaxId "([join $CladeContentTaxIds { }])"
		    lappend BilanCilio(ListOf,CladeTaxIds) $TaxId
		    set BilanCilio($Column,CladeContentTaxIds)   $CladeContentTaxIds
		    set BilanCilio($Column,CladeContentColumns)  $CladeContentColumns
		    set CladeContentColumns {}
		    set CladeContentTaxIds {}
		} else {
		    lappend CladeContentColumns $Column
		    lappend CladeContentTaxIds  $TaxId
		    lappend BilanCilio(ListOf,TaxId) $TaxId
		}
		set BilanCilio($TaxId,Column) $Column
		set BilanCilio($Column,TaxId) $TaxId
		incr Column
	    }
	    continue
	}
	if {$Deuss} {
	    set Trois 1
	    set Deuss 0
	    set LesEspecesLus [lrange [split $Ligne ";"] 5 end]
	    set Column 5
	    set LesEspeces {}
	    foreach Espece $LesEspecesLus {
		regsub { \(.+\) *$} $Espece "" Espece
		if {$Espece==""} { break }
		set TaxId $BilanCilio($Column,TaxId)
		if {[regexp {^[0-9]+$} $Espece]} {
		    set TailleClade $Espece
		    set BilanCilio($Column,CladeContentSize)    $TailleClade
		    set BilanCilio($Column,IsClade)             1
		    set BilanCilio($Column,CladeContentSpecies) $CladeContentSpecies
		    lappend BilanCilio(ListOf,CladeColumn)      $Column
		    set CladeContentSpecies {}
		} else {
		    lappend CladeContentSpecies              $Espece
		    lappend BilanCilio(ListOf,Species)       $Espece
		    lappend BilanCilio(ListOf,SpeciesColumn) $Column
		    set BilanCilio($Column,TaxId)            $TaxId
		    set BilanCilio($Column,Species)          $Espece
		    set BilanCilio($Espece,TaxId)            $TaxId
		    set BilanCilio($TaxId,OS)                $Espece
		    regsub -all " " $BilanCilio($TaxId,OS) "_" BilanCilio($TaxId,OS_) 
		}
		incr Column
	    }
	    continue
	}
	if {$Trois} {
	    set Trois 0
	    set Quats 1
	    #rR attention il y a des ; protégés par de "" on les remplace par 1 2 3 etc.
	    set iC 0
	    while {[regexp {;\"([^\"]+)\";} $Ligne Match Class]} {
		set ClassMemo($iC) $Class 
		regsub  {;\"([^\"])+\";} $Ligne ";$iC;" Ligne
		incr iC
	    }
	    set LesClassLus [lrange [split $Ligne ";"] 5 end]
	    set Column 5
	    set LesEspeces {}
	    foreach Class $LesClassLus {
		if {[info exists ClassMemo($Class)]} { set Class $ClassMemo($Class) }
		if {$Class==""} { break }
		set TaxId $BilanCilio($Column,TaxId)
		if {[info exists BilanCilio($Column,IsClade)]} {
		    #rR ici on a le clade seul et non pas la classe de l'espèce.
		    set CladeSeul $Class
		    set BilanCilio($Column,CladeSeul) $CladeSeul
		    #rR il faut attendre la ligne 4 pour avoir les Y PR N
		} else {
		    set BilanCilio($Column,DoCount) 1
		    set BilanCilio($Column,TaxId) $TaxId
		    set BilanCilio($Column,Class) $Class
		}
		lappend BilanCilio(ListOf,Class) $Class  ; #rR attention les clades font partie de la liste des classes
		incr Column
	    }
	    continue
	}
	if {$Quats} {
	    set Quats 0
	    set LesHeadersLus [split $Ligne ";"]
	    set Column 0
	    set LesHeaders {}
	    foreach Header $LesHeadersLus {
		if {$Column==0} { set Header "Comment" }
		regsub {\([^\(]+\)} $Header "" Header
		if {$Header==""} { break }
		set Header [string trim $Header]
		set Header [BonneEntetePourBilanCilio $Header]
		if {[regexp {^(Y|PR|N)$} $Header]} {
		    set Etat $Header
		    set TaxId $BilanCilio($Column,TaxId)
		    if {[info exists BilanCilio($Column,CladeSeul)]} {
			set CladeSeul $BilanCilio($Column,CladeSeul)
			set EtatClade      "${Etat}_$CladeSeul"
			set BilanCilio($Column,Clade)     $EtatClade
			set BilanCilio($EtatClade,Column) $Column
			set BilanCilio($TaxId,Clade)      $EtatClade
			lappend BilanCilio(ListOf,Clade)  $EtatClade
			set Header $EtatClade
		    } else {
			set Species $BilanCilio($Column,Species)
			set SpeciesEtat "${Species} $Etat"
			set BilanCilio($SpeciesEtat,Column) $Column
			set BilanCilio($SpeciesEtat,TaxId)  $TaxId
			set BilanCilio($SpeciesEtat,Class)  $BilanCilio($Column,Class)
			#set Header $SpeciesEtat
			set Header $Species
		    }
		    set BilanCilio($Column,State) $Etat
		}
		set HeaderUnderscore $Header
		regsub -all " "      $HeaderUnderscore "_" HeaderUnderscore
		regsub -all {[\(\)]} $HeaderUnderscore ""  HeaderUnderscore
		set BilanCilio($Column,Header) $HeaderUnderscore
		set BilanCilio($Header,Column) $Column
		set BilanCilio($HeaderUnderscore,Column) $Column
		lappend BilanCilio(ListOf,Header) $HeaderUnderscore
		incr Column
	    }
	    continue
	}
	#rR maintenant il faut lire les données et les affecter en fonction de la column
	set LesMots [split $Ligne ";"]
	lassign $LesMots Comment InGoldStandard GscopeId UniprotId InOrthoinspector 
	set G $GscopeId
	lappend BilanCilio(ListOf,GscopeId) $GscopeId
	foreach K {Comment InGoldStandard GscopeId UniprotId InOrthoinspector} { 
	    set BilanCilio($G,$K) [set $K] 
	}
	set L [llength $BilanCilio(ListOf,Header)]; incr L -1
	foreach H $BilanCilio(ListOf,Header) Value [lrange $LesMots 0 $L] {
	    set BilanCilio($G,$H) $Value
	}
    }
    set BilanCilio(ListOf,JoinedClade) {}
    foreach Clade $BilanCilio(ListOf,Clade) {
	regsub {^[YNPR]+_} $Clade "" JoinedClade
	lappend BilanCilio(ListOf,JoinedClade) $JoinedClade
	if { ! [info exists BilanCilio($JoinedClade,CladeContentTaxIds)]} {
	    set BilanCilio($JoinedClade,CladeContentTaxIds) {}
	    set BilanCilio($JoinedClade,CladeContentSpecies) {}
	} 
#	LConcat BilanCilio($JoinedClade,CladeContentTaxIds)  $BilanCilio($Clade,CladeContentTaxIds)
#	LConcat BilanCilio($JoinedClade,CladeContentSpecies) $BilanCilio($Clade,CladeContentSpecies)
    }
    set BilanCilio(ListOf,JoinedClade) [lsort -unique $BilanCilio(ListOf,JoinedClade)]

    foreach CladeColumn $BilanCilio(ListOf,CladeColumn) {
	foreach Column $BilanCilio($CladeColumn,CladeContentColumns) {
	    set BilanCilio($Column,CladeColumn) $CladeColumn
	    set BilanCilio($Column,Clade) $BilanCilio($CladeColumn,Clade)
	}
    }

    set NG 0
    foreach G $BilanCilio(ListOf,GscopeId) {
	incr NG
	set U $BilanCilio($G,UniprotId)
	lappend BilanCilio(ListOf,UniprotId) $U
	set Column 0
	foreach H $BilanCilio(ListOf,Header) {
	    set BilanCilio($U,$H) $BilanCilio($G,$H)
	    if {[info exists BilanCilio($Column,DoCount)] && $BilanCilio($G,$H)==1 } { incr BilanCilio($H,Count) $BilanCilio($G,$H)}
	    incr Column
	}
    }
    foreach H $BilanCilio(ListOf,Header) {
	if { ! [info exists BilanCilio($H,Count)]} { set BilanCilio($H,Count) 0 }
	set BilanCilio($H,Permil) [expr round($BilanCilio($H,Count)*1000./$NG)]
	regsub -all " " $H "_" H
	lappend BilanCilio(ListOf,Usage) "BilanCilio HSAP00001 $H"  
    }
    set BilanCilio(ListOf,UniprotId) [lsort $BilanCilio(ListOf,UniprotId)]

    if {0} {
	foreach S [array names BilanCilio "10090,*"] {
	    regsub 10090 $S 9606 H
	    Espionne "$S $H"
	    set BilanCilio($H) $BilanCilio($S)
	}
	regsub -all 0 $BilanCilio(10090,State) 1 BilanCilio(9606,State)
	set BilanCilio(9606,Species) "Homo sapiens"
	set BilanCilio(9606,TaxId)   9606
    }
    set BilanCilio(9606,Clade) $BilanCilio($BilanCilio(10090,Column),Clade)
    set BilanCilio(9606,State) "Y"
    return [BilanCilio $Qui $Quoi]
}

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