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

#rR gscope_retchip.tcl

proc TestCineticCongRD1 {} {
    foreach GN [CineticCongRD1 ListOf GN] {
	foreach Mot [split $GN ","] {
	    set GscopeId [QuestionDeScience "EVImm" "ret GscopeIdsOfGeneName $Mot WithSynonyms"]
	    Espionne "$Mot $GscopeId"
	}
    }
}

proc IsRetchip Nom {
    set Retchip [ExtraitInfo $Nom "Retchip:"]
    return [string equal -nocase $Retchip "Yes"]
}

proc MiseEnSequenceDeRetinoBase {} {
    FaireLire "attention ne pas reexecuter cette procedure"; exit
    CanalSqlRetinoBase
    set LesTables [list analysissoftware arraytype cluster experiment genotype individual organism ortholog probeset ratio rawdata realexp sample treatment treatmenttype]
    foreach Table $LesTables {
	set NomPk "pk_${Table}"
	if {$NomPk=="pk_analysissoftware"} { set NomPk "pk_software" } 
	set Last [SqlExec "select $NomPk from retinobase3.${Table} order by $NomPk desc limit 1" "GetFirstValue"]
	if {$Last==""} { continue }
	Espionne "$Table $Last" 
	set Sql "CREATE SEQUENCE retinobase3.${Table}_pk_${Table}_seq \
		INCREMENT 1 \
		MINVALUE 1 \
		MAXVALUE 9223372036854775807 \
		START $Last \
		CACHE 1; \
		ALTER TABLE retinobase3.${Table}_pk_${Table}_seq OWNER TO berthomg; \
		GRANT ALL ON TABLE retinobase3.${Table}_pk_${Table}_seq TO berthomg; \
		GRANT SELECT, INSERT, REFERENCES ON TABLE retinobase3.${Table}_pk_${Table}_seq TO guest; \
		GRANT SELECT ON TABLE retinobase3.${Table}_pk_${Table}_seq TO hoan"
	Espionne $Sql
	SqlExec $Sql
    }
}
proc CineticCongRD1Tissues {} {
    CanalSqlRetinoBase
    SqlExec "select set_curcfg('default');"
    set LesTissues [list \
	    "retina = Ret" \
	    "MGC" \
	    "brain = BR" \
	    "testis" \
	    "cumulus_oocyte_complex" \
	    "ovary" \
	    "placenta" \
	    "aorta" \
	    "heart" \
	    "lung" \
	    "kidney" \
	    "liver" \
	    "spleen" \
	    "submax_gland" \
	    "thymus" \
	    "stomach" \
	    "lymph_node" \
	    "skeletal_muscle" \
	    "CD4+_naive" \
	    "embryo_d7"]
    foreach Truc $LesTissues {
	set Better ""
	set Old ""
	scan $Truc "%s %s %s" Name Better Old
	if {$Old!=""} { continue }
	if {$Better!=""} { set BetterName($Name) $Better ; set Name $Better }
	set Pk [ProchainPk "retinobase3.tissue"]
	regsub -all "_" $Name " " Description 
	set Sql "insert into retinobase3.tissue (pk_tissue, name, description) values ($Pk, '$Name', '$Description') ;"
	Espionne $Sql
#	SqlExec $Sql
    }
    CanalSqlDisconnect

}

proc CineticCongRD1Filter Liste {
    set New {}
    foreach Nom $Liste {
	if {[info exists DejaVu($Nom)]} { continue }
	set DejaVu($Nom) 1
	if { ! [IsRetchip $Nom]} { continue }
	lappend New $Nom
    }
    return $New
}

proc CineticCongRD1 {{Qui ""} {Quoi ""}} {
    global CineticCongRD1

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

    if {[info exists CineticCongRD1($Qui,$Quoi)]}  { return $CineticCongRD1($Qui,$Quoi) }
    if {[info exists CineticCongRD1("EstCharge")]} {
	if {$Qui=="SaveInFile"} {
	    set LesGoodHeader [CineticCongRD1 ListOf GoodHeader]
	    set Headers [join $LesGoodHeader "\t"]
	    set LaSortie {}
	    lappend LaSortie $Headers
	    foreach PS [CineticCongRD1 ListOf PS] {
		set LaLigne {}
		foreach H [CineticCongRD1 ListOf GoodHeader] {
 		    lappend LaLigne [CineticCongRD1 $PS $H]
		}
		set Ligne [join $LaLigne "\t"]
		lappend LaSortie $Ligne
	    }
	    set Fichier $Quoi
	    set Fichier [SauveLesLignes $LaSortie dans $Fichier]
	    return $Fichier
	}
	return ""
    }
    set CineticCongRD1("EstCharge") 1

#rR set FichierFred "[HomeRipp]/GenoretWww/Collaboration/CineticCongRD1/Additional_File_3-Table.csv"
    set FichierFred "[HomeRipp]/GenoretWww/Collaboration/CineticCongRD1/Additional_File_3-Tablev3.csv"
    set Q [file tail $FichierFred]
    regsub -nocase {\.[^\.]+$} $Q "" Q
    LoadTxlWithRowsOfCells $FichierFred Txl -1 ";"

    set CineticCongRD1(File,Name)  $FichierFred
    set CineticCongRD1(File,Queue) $Q

#    EspionneL $Txl(ListHeaderPlease,$Q)
    set CineticCongRD1(ListOf,Header) $Txl(ListHeaderPlease,$Q)
    set CineticCongRD1(ListOf,Index)  $Txl(ListAllPlease,$Q)
    set UnknownGN 0
    foreach I $CineticCongRD1(ListOf,Index) {
	set GN $Txl($I,GeneName)
	if {$GN=="-"} { set GN "Unknown_[incr UnknownGN]" }
	lappend CineticCongRD1(ListOf,GN) $GN
	set PS $Txl($I,ID)
	lappend CineticCongRD1(ListOf,PS) $PS
	lappend CineticCongRD1($GN,ListOfPS) $PS
	if {[info exists DejaVu($PS)]} { FaireLire "I found redondant probesets : $I $GN $PS" }
	set DejaVu($PS) $I
	set CineticCongRD1($PS,GN) $GN
	foreach T $CineticCongRD1(ListOf,Header) {
	    set CineticCongRD1($I,$T)  $Txl($I,$T)
	    set CineticCongRD1($PS,$T) $Txl($I,$T)
	    set CineticCongRD1($PS,Index) $I
	}
    }


    set CineticCongRD1(ListOf,GN) [lsort -unique $CineticCongRD1(ListOf,GN)]
    foreach GN $CineticCongRD1(ListOf,GN) {
	foreach Mot [split $GN ","] {
	    if {[OnTraiteEVImm]} {
		set GscopeIds [GscopeIdsOfGeneName $Mot "WithSynonymsRetChipOnly"]
		set GscopeIds [CineticCongRD1Filter $GscopeIds]
	    } else {
		set GscopeIds [QuestionDeScience "EVImm" "ret GscopeIdsOfGeneName $Mot WithSynonymsRetChipOnly"]
		set GscopeIds [QuestionDeScience "EVImm" "ret CineticCongRD1Filter $GscopeIds"]
	    }
	    set CineticCongRD1($GN,GscopeIds) $GscopeIds
	    foreach PS $CineticCongRD1($GN,ListOfPS) {
		set CineticCongRD1($PS,GscopeIds) $GscopeIds
		set CineticCongRD1($PS,PS) $PS
		set CineticCongRD1($PS,GN) $GN
	    }
	}
    }
    set CineticCongRD1(ListOf,GoodHeader) [concat [list "PS" "GN" "GscopeIds"] $CineticCongRD1(ListOf,Header)] 
    return [CineticCongRD1 $Qui $Quoi]
}

proc SynonymsPourTous {{Liste ""} {Quoi ""} {GscopeSyn ""}} {

    set GscopeSyn [string equal -nocase $GscopeSyn "GscopeSyn"]
    set SynGscope [expr  ! $GscopeSyn]

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

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

    if {$GscopeSyn} {
	set LesGscopeSyn {}
	foreach Nom $Liste {
	    lappend LesGscopeSyn "$Nom [join [SynonymsOfGscopeId $Nom] " "]"
	}
	
	if {$Quoi=="GetList"} { return $LesGscopeSyn }
	set GscopeSyn [join $LesGscopeSyn "\n"]
	if {[PourWscope]} {
	    return [Html_DuTexteTelQuel $GscopeSyn]
	}
	if {$Quoi=="GetTxt"} { return $GscopeSyn }
	if {$Quoi=="Show"} { return [AfficheVariable $GscopeSyn] }
	return $LesGscopeSyn
    }

    if {$SynGscope} {
	set LesSynGscope {}
	foreach Synonym [GscopeSynonyms ListOf Synonyms] {
	    lappend LesSynGscope "[format %-20s $Synonym] [join [GscopeSynonyms $Synonym GscopeIds] " "]"
	}
	
	if {$Quoi=="GetList"} { return $LesSynGscope }
	set SynGscope [join $LesSynGscope "\n"]
	if {[PourWscope]} {
	    return [Html_DuTexteTelQuel $SynGscope]
	}
	if {$Quoi=="GetTxt"} { return $SynGscope }
	if {$Quoi=="Show"} { return [AfficheVariable $SynGscope] }
	return $LesSynGscope
    }
}

proc GscopeSynonyms {{Qui ""} {Quoi ""}} {
    global GscopeSynonyms

    if {$Qui==""}  { set Qui "ListOf" }
    if {$Quoi==""} { set Quoi "Synonyms" }

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

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

    set GscopeSynonyms(LISTOF,SYNONYMS) {}
    foreach Nom [ListeDesPABs] {
	set LesSyn [Synonyms $Nom]
	foreach Syn $LesSyn {
	    set SYN [string toupper $Syn]
	    lappend GscopeSynonyms(LISTOF,SYNONYMS) $Syn
	    lappend GscopeSynonyms($SYN,GSCOPEIDS)  $Nom
	    foreach S $LesSyn {
		lappend GscopeSynonyms($SYN,SYNONYMS) $S   
	    }
	}
    }
    set GscopeSynonyms(LISTOF,SYNONYMS) [lsort -unique $GscopeSynonyms(LISTOF,SYNONYMS)]
    foreach Syn $GscopeSynonyms(LISTOF,SYNONYMS) {
	set SYN [string toupper $Syn]
	set GscopeSynonyms($SYN,SYNONYMS) [ListeSansDoublon $GscopeSynonyms($SYN,SYNONYMS) "" "NoEmpty"]
    }
    return [GscopeSynonyms $Qui $Quoi]
}

proc Synonyms Nom {
  return [SynonymsOfGscopeId $Nom]
}

proc SynonymsOfGscopeId Nom {
    set GN [ValiGN $Nom]
    set Alias [Alias $Nom]
    if {$GN==""} { set GN $Alias }
    if {$GN==""} { return {} }

    set FromGscope   [list $GN $Alias]
    set FromSameOrga [SynonymsFromSameOrganism $GN]
    set LesSynonymes [concat $FromGscope $FromSameOrga]
    set LesSynonymes [ListeSansDoublon $LesSynonymes "" "NoEmpty"]
    return $LesSynonymes
}

proc SynonymsFromSameOrganism {G {Programme ""}} {
    while {$Programme==""} {
	set OS [NotreOS]
	if {$OS=="Homo sapiens"} { set Programme "HumanSynonyms" ; break }
	if {$OS=="Mus musculus"} { set Programme "MouseSynonyms" ; break }
	if {[PourWscope]} { return "" }
	set Programme [ChoixParmi [list "MouseSynonyms" "HumanSynonyms"]]
	if {$Programme==""} { return "" }
    }
    if {$G=="NameOfProgram"} { return $Programme }
    return [$Programme $G]
}

proc MouseSynonyms G {
    set M [MGI $G "MgiId"]
    if {$M==""} { return {} }
    set O [MGI $M "GeneName"]
    set All [concat [list $O] [MGI $M "Synonyms"]]
    set All [ListeSansDoublon $All]
    return $All
}

proc HumanSynonyms G {
    set H [HGNC $G "HGNC_ID"]
    if {$H==""} { return {} }
    set O [HGNC $H "Approved_Symbol"]
    set All [concat [list $O] [HGNC $H "Synonyms"]]
    set All [ListeSansDoublon $All]
    return $All
}

proc MouseFromHuman {{Qui ""} {Quoi ""}} {

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

    if {[string equal -nocase $Qui "ListOf"]} {
	if {[string equal -nocase $Quoi "HumanHeader"]} { return [HGNC ListOf Header] }
	if {[string equal -nocase $Quoi "MouseHeader"]} { return [MGI ListOf Header] }
    }

    set H [HGNC $Qui HGNC_ID]
    Espionne "H $H"
    set M [MGIHGNC $H MGIID]
    Espionne "M $M"
    if {$M==""} { set M [MGIHGNC $Qui MGIID] }
    return [MGI $M $Quoi]
}

proc HumanFromMouse {{Qui ""} {Quoi ""}} {

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

    if {[string equal -nocase $Qui "ListOf"]} {
	if {[string equal -nocase $Quoi "MouseHeader"]} { return [MGI ListOf Header] }
	if {[string equal -nocase $Quoi "HumanHeader"]} { return [HGNC ListOf Header] }
    }
    set M [MGI $Qui MGIID]
    Espionne "M $M"
    set H [MGIHGNC $M HGNCID]
    Espionne "H $H"
    if {$H==""} { set H [MGIHGNC $Qui HGNCID] }
    if {$H==""} { set H [HGNC $Qui HGNC_ID]}
    return [HGNC $H $Quoi]
}

proc MGIHGNC {{Qui ""} {Quoi ""}} {
    global MGIHGNC

    if {$Qui==""}  { set Qui "ListOf" ; set Quoi "Header" } 
    if {$Quoi==""} {                    set Quoi "AllTxt" } 
    set Qui  [string toupper $Qui]
    set Quoi [string toupper $Quoi]

    if {[info exists MGIHGNC($Qui,$Quoi)]}  { return $MGIHGNC($Qui,$Quoi) }
    if {$Quoi=="ALLTXT" || $Quoi=="ALLLIST" || $Quoi=="ALLHTML"} {
	set LeTout [MGIHGNC $Qui "All"]
	if {$LeTout==""} { return "" }
	foreach T [MGIHGNC ListOf Header] V $LeTout {
	    lappend LeRetour [format "%45s : %s" $T $V]
	}
	if {$Quoi=="ALLLIST"} { return $LeRetour }
	set Retour [join $LeRetour "\n"]
	if {$Quoi=="ALLHTML" || [PourWscope]} { 
	    return "<pre>\n$Retour\n</pre>"
	}
	if {$Quoi=="ALLTXT"} { return $Retour }
	return $Retour
    }
    if {[info exists MGIHGNC("EstCharge")]} {
	if {[info exists MGIHGNC($Qui,MGIID)]} { 
	    set FirstRef [lindex $MGIHGNC($Qui,MGIID) 0]
	    if {[string equal -nocase $Qui $FirstRef]} { return "" }
	    return [MGIHGNC $FirstRef $Quoi]
	}
	return ""
    }
    set MGIHGNC("EstCharge") 1

    set FichierMGIHGNC "[GscopeDatabaseDir UCSCGenomes]/GeneNaming/HMD_HGNC_Accession.rpt"
    set Q [file tail $FichierMGIHGNC]
    set MGIHGNC(FILE,NAME)  $FichierMGIHGNC
    set MGIHGNC(FILE,QUEUE) $Q

    set MGIHGNC(LISTOF,HEADER) [list "MgiId" "MgiGeneName" "MgiMarkerName" "MgiEntrezGeneId" "HgncId" "HgncGeneName" "HgncEntrezGeneId"]

    foreach Ligne [LesLignesDuFichier $FichierMGIHGNC] {
	set LesMots [split $Ligne "\t"]
	ScanLaListe $LesMots MgiId MgiGeneName MgiMarkerName MgiEntrezGeneId HgncId HgncGeneName HgncEntrezGeneId
	set MGIID  [string toupper $MgiId]
	set HGNCID [string toupper $HgncId]
	set MGIGENENAME [string toupper $MgiGeneName]
	set HGNCGENENAME [string toupper $HgncGeneName]
	#if {$HGNCID!="" && [info exists DejaVu($HGNCID)]} { FaireLire "DejaVu $HGNCID\n$DejaVu($HGNCID)\n$Ligne" }
	#set DejaVu($HGNCID) $Ligne
	#if {$MGIID!="" && [info exists DejaVu($MGIID)]} { FaireLire "DejaVu $MGIID\n$DejaVu($MGIID)\n$Ligne" }
	#set DejaVu($MGIID) $Ligne
	foreach T $MGIHGNC(LISTOF,HEADER) V $LesMots {
	    set T [string toupper $T]
	    set MGIHGNC($MGIID,$T)  $V
	    set MGIHGNC($HGNCID,$T) $V
	}
	set MGIHGNC($MGIID,HGNCID) $HGNCID
	set MGIHGNC($HGNCID,MGIID) $MGIID
	lappend MGIHGNC($MGIGENENAME,MGIID) $MGIID
	lappend MGIHGNC($HGNCGENENAME,HGNCID) $HGNCID
	lappend MGIHGNC($MgiEntrezGeneId,HGNCGENEID) $HgncEntrezGeneId
	lappend MGIHGNC($HgncEntrezGeneId,MGIGENEID) $MgiEntrezGeneId
	lappend MGIHGNC($HgncEntrezGeneId,MGIID) $MGIID

	lappend MGIHGNC(LISTOF,MGIID) $MGIID
	lappend MGIHGNC(LISTOF,HGNCID) $HGNCID
	lappend MGIHGNC(LISTOF,MGIGENENAME) $MGIGENENAME
	lappend MGIHGNC(LISTOF,HGNCGENENAME) $HGNCGENENAME
	set MGIHGNC($MGIID,ALL)  $LesMots
	set MGIHGNC($HGNCID,ALL) $LesMots
    }
    set MGIHGNC(LISTOF,MGIID)  [lsort -unique $MGIHGNC(LISTOF,MGIID)]
    set MGIHGNC(LISTOF,HGNCID) [lsort -unique $MGIHGNC(LISTOF,HGNCID)]
    set MGIHGNC(LISTOF,MGIGENENAME) [lsort -unique $MGIHGNC(LISTOF,MGIGENENAME)]
    set MGIHGNC(LISTOF,HGNCGENENAME) [lsort -unique $MGIHGNC(LISTOF,HGNCGENENAME)]

    return [MGIHGNC $Qui $Quoi]
}
 
proc MGI {{Qui ""} {Quoi ""}} {
    #LP 2013/01/31 avant on lisait MRK_Synonym.sql.rpt. Maintenant on lit MRK_List2.rpt 
    global MGI

    if {$Qui==""}  { set Qui "ListOf" }
    if {$Quoi=="" && [string equal -nocase $Qui "ListOf"]} { set Quoi "Header" }
    if {$Quoi==""} { set Quoi "AllTxt" } 
    set Qui  [string toupper $Qui]
    set Quoi [string toupper $Quoi]

    if {[info exists MGI($Qui,$Quoi)]}  { return $MGI($Qui,$Quoi) }
    if {$Quoi=="ALLTXT" || $Quoi=="ALLLIST" || $Quoi=="ALLHTML"} {
	set LesTouts [MGI $Qui All]
	set LeRetour {}
	set N [llength $LesTouts]
	set Saut ""
	if {$N>1} {
	    set Saut "\n"
	}
	set I 0
	foreach LeTout $LesTouts {
	    incr I
	    if {$LeTout==""} { continue }
	    if {$N>1} { lappend LeRetour [format "\n%45s : %s" "I_found_${N}_hits" $I] }
	    foreach T [MGI ListOf Header] V $LeTout {
		lappend LeRetour [format "%45s : %s" $T $V]
	    }
	}

	if {$Quoi=="ALLLIST"} { return $LeRetour }
	set Retour [join $LeRetour "\n"]
	if {$Quoi=="ALLHTML" || [PourWscope]} { 
	    return "<pre>\n$Retour\n</pre>"
	}
	if {$Quoi=="ALLTXT"} { return $Retour }
	return $Retour
    }
    if {[info exists MGI("EstCharge")]} {
	if {[info exists MGI($Qui,ONE_MGIID)]} { 
	    return [MGI $MGI($Qui,ONE_MGIID) $Quoi]
	}
	return ""
    }
    set MGI("EstCharge") 1

    set FichierMGI "[GscopeDatabaseDir UCSCGenomes]/GeneNaming/MRK_List2.rpt"
    set Q [file tail $FichierMGI]
    regsub -nocase {\.[^\.]+$} $Q "" Q
    set MGI(FILE,NAME)  $FichierMGI
    set MGI(FILE,QUEUE) $Q
    LoadTxl $FichierMGI Txl -1 "\t"

    set MGI(LISTOF,HEADER) $Txl(ListHeaderPlease,$Q)    
    set MGI(LISTOF,INDEX)  $Txl(ListAllPlease,$Q)
    foreach I $Txl(ListAllPlease,$Q) {
	set MgiId $Txl($I,MGI_Accession_ID)
	set Gn    $Txl($I,Marker_Symbol)
	if {[info exists Txl($I,Marker_Synonyms_pipe-separated)]} { 
	    set SynIni $Txl($I,Marker_Synonyms_pipe-separated)
	}
	set MGIID [string toupper $MgiId]
	set GN    [string toupper $Gn]

	lappend MGI(LISTOF,MGIID)    $MgiId
	lappend MGI(LISTOF,GENENAME) $Gn

	set MGI($GN,MGIID) [lsort -unique [lappend MGI($GN,MGIID) $MgiId]]
	set MGI($MGIID,GENENAME) [lsort -unique [lappend MGI($MGIID,GENENAME) $Gn]]

	if {[info exists SynIni]} {
	    set LesSyn [split $SynIni "|"]
	    set MGI($MGIID,LISTOFSYN) $LesSyn
	    set MGI($GN,LISTOFSYN) $LesSyn
	    foreach Syn $LesSyn {
		set SYN [string toupper $Syn]
		lappend MGI($SYN,REFERENCE_MGIID) $MGIID
		lappend MGI($SYN,REFERENCE_GENENAME) $Gn
	    }
	}
	set LeTout {}
	foreach T $Txl(ListHeaderPlease,$Q) {
	    lappend LeTout $Txl($I,$T)
	    set MGI($MGIID,[string toupper $T]) $Txl($I,$T)
	    set MGI($GN,[string toupper $T])    $Txl($I,$T)
	}
	lappend MGI($MGIID,ALL) $LeTout
	lappend MGI($GN,ALL)    $LeTout
    }
    
    set MGI(LISTOF,MGIID)    [lsort -unique $MGI(LISTOF,MGIID)]
    set MGI(LISTOF,GENENAME) [lsort -unique $MGI(LISTOF,GENENAME)]
    return [MGI $Qui $Quoi]
}

proc MGISW {{Qui ""} {Quoi ""} {Ou ""}} {
    JeMeSignale
    #Utilise l'un ou l'autre
    #set FichierMGISW "/genomics/link/UCSCGenomes/GeneNaming/MRK_SwissProt.rpt"
    #set FichierMGISW "/genomics/link/UCSCGenomes/GeneNaming/MRK_SwissProt_TrEMBL.rpt"
    global MGISW

    if {$Qui==""}  { set Qui "ListOf" ; set Quoi "Header" } 
    if {$Quoi==""} {                    set Quoi "AllTxt" } 
    set Qui  [string toupper $Qui]
    set Quoi [string toupper $Quoi]
    
    Espionne $Ou
    if {[string equal -nocase $Ou "SW"]}       { set Ou "MRK_SwissProt.rpt" } 
    if {[string equal -nocase $Ou "SWTrEmbl"]} { set Ou "MRK_SwissProt_TrEMBL.rpt" } 
    if {$Ou!="" && ! [regexp "/" $Ou]} { set Ou "/genomics/link/UCSCGenomes/GeneNaming/$Ou" } 
    Espionne $Ou
    if {$Ou!=""} {
	if {[info exists MGISW(FILE,NAME)] && $Ou!=$MGISW(FILE,NAME)} {
	    unset MGISW
	}
	set FichierMGISW     $Ou
	set MGISW(FILE,NAME) $Ou
    } else {
	if {[info exists MGISW(FILE,NAME)]} { 
	    set Ou $MGISW(FILE,NAME)
	    set FichierMGISW $Ou
	} else {
	    FaireLire "Il faut donner un nom de fichier ou SW ou SWTrEmbl la premiere fois"
	    return ""
	}
    }

    if {[info exists MGISW($Qui,$Quoi)]}  { return $MGISW($Qui,$Quoi) }
    if {$Quoi=="ALLTXT" || $Quoi=="ALLLIST" || $Quoi=="ALLHTML"} {
	set LeTout [MGISW $Qui "All"]
	if {$LeTout==""} { return "" }
	foreach T [MGISW ListOf Header] V $LeTout {
	    lappend LeRetour [format "%45s : %s" $T $V]
	}
	if {$Quoi=="ALLLIST"} { return $LeRetour }
	set Retour [join $LeRetour "\n"]
	if {$Quoi=="ALLHTML" || [PourWscope]} { 
	    return "<pre>\n$Retour\n</pre>"
	}
	if {$Quoi=="ALLTXT"} { 
	    return $Retour 
	}
	return $Retour
    }
    if {[info exists MGISW("EstCharge")]} {
	if {[info exists MGISW($Qui,MGIID)]} { 
	    set FirstRef [lindex $MGISW($Qui,MGIID) 0]
	    if {[string equal -nocase $Qui $FirstRef]} { return "" }
	    return [MGISW $FirstRef $Quoi]
	}
	return ""
    }
    set MGISW("EstCharge") 1

    set Q [file tail $FichierMGISW]
    set MGISW(FILE,NAME)  $FichierMGISW
    set MGISW(FILE,QUEUE) $Q
    set MGISW(LISTOF,HEADER) [list "MgiId" "GeneName" "Status" "Name" "cMPosition" "Chr" "Sw"]
    foreach Ligne [LesLignesDuFichier $FichierMGISW] {
	set LesMots [split $Ligne "\t"]
	ScanLaListe $LesMots MgiId GeneName Status Name cMPosition Chr Sw
	set MGIID  [string toupper $MgiId]
	set GENENAME [string toupper $GeneName]
	lappend MGISW(LISTOF,MGIID) $MGIID
	lappend MGISW(LISTOF,GENENAME) $GENENAME
	if {$MGIID!="" && [info exists DejaVu($MGIID)]} { FaireLire "DejaVu $MGIID\n$DejaVu($MGIID)\n$Ligne" }
	set DejaVu($MGIID) $Ligne
	if {$GENENAME!="" && [info exists DejaVu($GENENAME)]} { FaireLire "DejaVu $GENENAME\n$DejaVu($GENENAME)\n$Ligne" }
	set DejaVu($GENENAME) $Ligne
	foreach T $MGISW(LISTOF,HEADER) V $LesMots {
	    set T [string toupper $T]
	    set MGISW($MGIID,$T)  $V
	    set MGISW($GENENAME,$T) $V
	}
	set MGISW($MGIID,SW) $Sw
	set MGISW($MGIID,ALL) $LesMots
    }
    set MGISW(LISTOF,MGIID)    [lsort -unique $MGISW(LISTOF,MGIID)]
    set MGISW(LISTOF,GENENAME) [lsort -unique $MGISW(LISTOF,GENENAME)]

    return [MGISW $Qui $Quoi]
}

proc MGILP {{Qui ""} {Quoi ""}} {
    #From LP: En 2008, tous les MGI n etaient pas present dans [GscopeDatabaseDir UCSCGenomes]/GeneNaming/MRK_Synonym.sql.rpt ??? exemple:ccng2
    #FromLP: En 2013, le fichier MRK_Synonym.sql.rpt n existe plus : ne se sert plus de MGILP 
    global MGILP
    
    set Qui  [string toupper $Qui]
    
    if {[info exists MGILP($Qui,$Quoi)]} {return $MGILP($Qui,$Quoi)}  
    if {[info exists MGILP("EstCharge")]} {return ""}
    set MGILP("EstCharge") 1

    #set MGILP(LISTOF,HEADER) [list "MgiId" "GeneName"]
    set Fichier "[GscopeDatabaseDir UCSCGenomes]/GeneNaming/MRK_Dump1.rpt"
    foreach Ligne [LesLignesDuFichier $Fichier] {
	set LesMotsDeLaLigne [split $Ligne "\t"]
	set Mgi [lindex $LesMotsDeLaLigne 0]
	set Gn  [lindex $LesMotsDeLaLigne 1]
	set Gn  [string toupper $Gn]
	set MGILP($Mgi,Gn) $Gn
	set MGILP($Gn,Mgi) $Mgi
    }
    return [MGILP $Qui $Quoi]
}

proc HGNC {{Qui ""} {Quoi ""}} {
    global HGNC

    if {[string equal -nocase $Quoi "GeneName"]} { set Quoi "Approved_Symbol" }

    if {$Qui==""}  { set Qui "ListOf" }
    if {$Quoi=="" && [string equal -nocase $Qui "ListOf"]} { set Quoi "Header" }
    if {$Quoi==""} { set Quoi "AllTxt" } 
    set Qui  [string toupper $Qui]
    set Quoi [string toupper $Quoi]

    if {$Quoi=="ALLTXT" || $Quoi=="ALLLIST" || $Quoi=="ALLHTML"} {
	set LeTout [HGNC $Qui All]
	if {$LeTout==""} { return "" }
	foreach T [HGNC ListOf Header] V $LeTout {
	    lappend LeRetour [format "%45s : %s" $T $V]
	}
	if {$Quoi=="ALLLIST"} { return $LeRetour }
	set Retour [join $LeRetour "\n"]
	if {$Quoi=="ALLHTML" || [PourWscope]} { 
	    return "<pre>\n$Retour\n</pre>"
	}
	if {$Quoi=="ALLTXT"} { return $Retour }
	return $Retour
    }
    if {[info exists HGNC($Qui,$Quoi)]}  { return $HGNC($Qui,$Quoi) }
    if {[info exists HGNC("EstCharge")]} {
	if {[info exists HGNC($Qui,REFERENCES)]} { 
	    set FirstRef [lindex $HGNC($Qui,REFERENCES) 0]
	    return [HGNC $FirstRef $Quoi]
	}
	return ""
    }
    set HGNC("EstCharge") 1

    set FichierHGNC "[GscopeDatabaseDir UCSCGenomes]/GeneNaming/HGNC.txt"
    set Q [file tail $FichierHGNC]
    regsub -nocase {\.[^\.]+$} $Q "" Q
    LoadTxl $FichierHGNC Txl -1 "\t"

    set HGNC(FILE,NAME)  $FichierHGNC
    set HGNC(FILE,QUEUE) $Q

    set HGNC(LISTOF,HEADER) $Txl(ListHeaderPlease,$Q)
    lappend HGNC(LISTOF,HEADER) "Source_of_information"
    lappend HGNC(LISTOF,HEADER) "HttpReference"
    set HGNC(LISTOF,INDEX)  $Txl(ListAllPlease,$Q)
    foreach I $Txl(ListAllPlease,$Q) {
	set HGNCID "$Txl($I,HGNC_ID)"
	if { ! [regexp {^HGNC\:} $HGNCID]} { set HGNCID "HGNC:$HGNCID" }
	set Txl($I,HGNC_ID) $HGNCID
	set AS $Txl($I,Approved_Symbol)
	if {[info exists Txl($I,Aliases)]}  { set Aliases  $Txl($I,Aliases) }
	if {[info exists Txl($I,Synonyms)]} { set Aliases  $Txl($I,Synonyms) }
	lappend HGNC(LISTOF,SYNOTXT) $Aliases
	set Previous $Txl($I,Previous_Symbols)
	set HGNC($AS,HGNC_ID) $I
	if {[info exists DejaVu($AS)]} { FaireLire "I saw already $AS $I $DejaVu($AS)" }
	set DejaVu($AS) $I
	lappend HGNC(LISTOF,APPROVED_SYMBOL) $AS
	set LesAlias    [split $Aliases ","]
	set LesPrevious [split $Previous ","]
	set LesAliasEtPrevious [lsort -unique [concat $LesAlias $LesPrevious]]
	set HGNC($HGNCID,SYNONYMS) {}
	foreach Alias $LesAliasEtPrevious {
	    regsub -all " " $Alias "" Alias
	    lappend HGNC($HGNCID,LISTOFSYNONYM) $Alias
	    lappend HGNC($AS,LISTOFSYNONYM)     $Alias
	    set ALIAS [string toupper $Alias]
	    lappend HGNC($ALIAS,REFERENCES) $HGNCID
	    lappend HGNC(LISTOF,ALIAS) $Alias
	}
	set LeTout {}
	foreach T $Txl(ListHeaderPlease,$Q) {
	    lappend LeTout $Txl($I,$T)
	    set HGNC($HGNCID,[string toupper $T])  $Txl($I,$T)
	    set HGNC($AS,[string toupper $T])      $Txl($I,$T)
	}
	set HGNC($HGNCID,SOURCE_OF_INFORMATION) "Created by Gscope with download from http://www.genenames.org"
	lappend LeTout $HGNC($HGNCID,SOURCE_OF_INFORMATION)
	regsub -all {[^0-9]} $HGNCID "" HGNCIDnu
	set Ref "http://www.genenames.org/data/hgnc_data.php?hgnc_id=$HGNCIDnu"
	set TexteRef $Ref
	if {[PourWscope]} { set TexteRef "<a href='$Ref'>$Ref</a>" }
	set HGNC($HGNCID,HTTPREFERENCE) $TexteRef
	lappend LeTout $HGNC($HGNCID,HTTPREFERENCE)
	set HGNC($HGNCID,ALL)  $LeTout
	set HGNC($AS,ALL) $LeTout
	lappend HGNC(LISTOF,HGNC_ID) $HGNCID
    }
    set HGNC(LISTOF,SYNOTXT) [lsort -unique $HGNC(LISTOF,SYNOTXT)]
    set HGNC(LISTOF,ALIAS)   [lsort -unique $HGNC(LISTOF,ALIAS)]
    set HGNC(LISTOF,SYNONYM)                $HGNC(LISTOF,ALIAS)
    return [HGNC $Qui $Quoi]
}

proc TestGenoretProteomicsLinks {} {
    set Nom EVI00520
    foreach Ref [GenoretProteomicsLinks $Nom "Ref"] {
	Espionne $Ref
	EspionneL [GenoretProteomicsLinks "$Nom$Ref" "Columns"]
    }
    exit
}

proc GenoretProteomicsLinks {{Qui ""} {Quoi ""}} {
    global GenoretProteomicsLinks

    if {$Qui == "Reset" && [info exists GenoretProteomicsLinks]} { unset GenoretProteomicsLinks ; return "" }

    if {$Qui==""} { set Qui "ListOf"; set Quoi "EVI" }
    if {$Quoi == ""} { set Quoi "All" }

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

    set GenoretProteomicsLinks(ListOf,EVI) {}
    foreach Ligne [LesLignesDuFichier "[HomeRipp]/GenoretWww/Proteomics/GenoretGenesLinks.txt"] {
	scan $Ligne "%s %s" Nom Queue
	regsub { <a .*} $Ligne "" Columns
	regsub "$Nom $Queue" $Columns "" Columns
	set Ref "$Queue <a [StringSuivant "<a " dans $Ligne]"
	lappend GenoretProteomicsLinks(ListOf,EVI)       $Nom
	lappend GenoretProteomicsLinks($Nom$Ref,Columns) $Columns
	lappend GenoretProteomicsLinks($Nom,Ref)         $Ref
	set GenoretProteomicsLinks($Nom,Ref) [lsort -unique $GenoretProteomicsLinks($Nom,Ref)]
    }
    return [GenoretProteomicsLinks $Qui $Quoi]
}

proc LesRetChip {{LesChamps ""} {JoinCar ""}}  {

    if {$JoinCar==""} { set JoinCar " " }
    if {$JoinCar=="WithoutJoinCar"} { set JoinCar "" }
    if {$LesChamps==""} { set LesChamps [list "Nom"] }
    set LesRetChip {}
    foreach Nom [ListeDesPABs] {
	set RetChip [ExtraitInfo $Nom "RetChip"]
	if { ! [regexp -nocase "^y" $RetChip]} { continue }
	set LesInfos {}
	foreach Champ $LesChamps {
	    lappend LesInfos [ExtraitInfo $Nom $Champ]
	}
	set Infos [join $LesInfos $JoinCar]
	lappend LesRetChip $Infos
    }
    return $LesRetChip
}

proc TrieLesReductions {} {
    set Fichier "[RepertoireDuGenome]/TableauPourReductionSsRedondanceFiltrer"
    set LesLignes {}
    foreach Ligne [LesLignesDuFichier $Fichier]  {
	if {[regexp {^GscopeId} $Ligne]} {
	    set LigneDeTete $Ligne
	    continue
	}
	lappend LesLignes $Ligne
    }
    set LesLignesFinales [list $LigneDeTete]

    set LesLignesTriees [lsort -command CompareReduction $LesLignes]
    LConcat LesLignesFinales $LesLignesTriees
    SauveLesLignes $LesLignesFinales dans "[RepertoireDuGenome]/TableauPourReductionSsRedondanceFiltrerTrie"
    #EspionneL $LesLignesTriees
    #return $LesLignesTriees
}

proc CompareReduction {A B} {
    set LesMots [split $A ";"]
    set NomA [lindex $LesMots 0]
    set GenA [lindex $LesMots 2]
    set CopA [lindex $LesMots 4]
    set LesMots [split $B ";"]
    set NomB [lindex $LesMots 0]
    set GenB [lindex $LesMots 2]
    set CopB [lindex $LesMots 4]
    
    regsub {\+7 et \+8} $CopA "100" CopA
    regsub {\+7 et \+8} $CopB "100" CopB
    regsub {\+7 et \-8} $CopA "200" CopA
    regsub {\+7 et \-8} $CopB "200" CopB
    regsub {\-}         $CopA "300" CopA
    regsub {\-}         $CopB "300" CopB

    if {[set Cop [string compare $CopA $CopB]]!=0} { return $Cop }
    if {[set Gen [string compare $GenA $GenB]]!=0} { return $Gen }
    return [string compare $NomA $NomB]
}

proc NomLigne {{Qui ""} {Quoi ""}} {
    global NomLigne
    if {$Qui==""} {
	set Qui "ListeDes" ; set Quoi "Lignes"
    }
    if {$Quoi==""} {
	if {[EstUnPAB $Qui]} { set Quoi "LigneIeme" }
	if { ! [regexp {[A-Z]} $Qui]} { set Quoi "Ref" }
    }
    if {[info exists NomLigne($Qui,$Quoi)]} { return $NomLigne($Qui,$Quoi) }
    if {[info exists NomLigne("EstCharge")]} { return "" }
    set NomLigne("EstCharge") ""

    set FichierNomLigne "[Fiches]/NomLigne.txt"
    foreach Ligne [LesLignesDuFichier $FichierNomLigne] {
	scan $Ligne "%s %d %d" Nom Lig Ieme
	set NomLigne($Nom,Ligne) $Lig
	set NomLigne($Nom,Ieme)  $Ieme
	set NomLigne($Nom,LigneIeme) "$Lig $Ieme"
	if {$Ieme==0} {	set NomLigne($Lig,Ref) $Nom }
	set NomLigne($Lig,Imax) $Ieme 
	lappend NomLigne($Lig,Noms)   $Nom
	lappend NomLigne(ListeDes,Lignes) $Lig
    }
    set NomLigne(ListeDes,Lignes) [ListeSansDoublon $NomLigne(ListeDes,Lignes)]
    return [NomLigne $Qui $Quoi]
}

proc RenommeRetinalTargets {} {
    set D 1000
    set PremiereFois 1
    set Normal 0
    set PrecedentMerde 0
    set Ieme 0
    foreach Ligne [LesLignesDuFichier "[RepertoireDuGenome]/parser/AttriToutVf2"] {
	if {[regexp "^ligne" $Ligne]} {
	    set Normal 1
	    set YaEuLigne 1
	    set NumLigne [IntegerApres "ligne" dans $Ligne]
	    set N [expr $NumLigne*10]
	    set Ieme 0
	    continue 
	}
	if { ! [regexp "^>" $Ligne]} {
	    lappend LeTFA $Ligne
	    continue
	}
	if { ! $PremiereFois} {
#	    Espionne "Sauve dans $Nom"
#	    SauveLesLignes $LeTFA dans "[RepertoireDuGenome]/nuctfa/$Nom"
	}
	regsub ">" $Ligne "" Ligne
	if {[regexp "bidon" $Ligne] && ! $YaEuLigne} { FaireLire "Un bidon sans ligne !!!" ; continue }

	set PtiNom ""
	if { 0==$Ieme              } { set NewNum [expr $N              ] ; set NewNom [format "EVI%5.5d" $NewNum] }
	if { 0 <$Ieme && $Ieme < 10} { set NewNum [expr $N       + $Ieme] ; set NewNom [format "EVI%5.5d" $NewNum] }
	if {10<=$Ieme              } { set NewNum [expr $N*100   + $Ieme] ; set NewNom [format "EVI%7.7d" $NewNum] }
	if {10<=$Ieme              } { set PtiNum [expr $N+50000 + $Ieme] ; set PtiNom [format "EVI%5.5d" $PtiNum] }
	if {$PtiNom!="" && [info exists DejaVu($PtiNom)]} { Espionne "........................................... $PtiNom par $DejaVu($PtiNom)" }
	set DejaVu($PtiNom) $NewNom

	set I 0
	set NomDeBase [format "EVI%5.5d" [expr $N]]
	while 1 {
	    set Nom [format "EVI%5.5d" [expr $N+$I]]
	    if { ! [info exists DejaVu($Nom)]} { break }
	    incr I
	}
	set DejaVu($Nom) 1
	set Tout 1
	if {$Tout || $Nom!=$NewNom} {
	    set NewNomDe($Nom) $NewNom
	    set PlaceLibre [expr [string equal $Nom $NewNom] || [string length $NewNom]>8 || [info exists NewNomDe($NewNom)]]
	    set Texte "$Nom [format "%-10s" $NewNom] [format "%2d" $Ieme] $N $PlaceLibre $PtiNom"
	    Espionne $Texte
	    lappend LaCorrespondance "$Nom [expr $N/10] $Ieme"
	}
	incr Ieme
	continue
	if {$YaEuLigne && [info exists BonNom($Nom)]} {
	    Espionne "$Nom devrait s'appeler $BonNom($Nom)"
	}
	if {(0<$I && $I<10) && $PrecedentMerde} {
	    Espionne " ............................... $Nom"
	}
	if {$I>9 || $PrecedentMerde} {
	    set Normal 0
	    set BeauNom [format "EVI%7.7d" [expr $N*100 + $I]]
	    if {$YaEuLigne} {
		set MeilleurN [expr $N]
		set MeilleurNom [format "EVI%5.5d" [expr $MeilleurN]]
		Espionne "$Nom != $BeauNom mais $MeilleurNom"
		set PrecedentMerde 1
	    } else {
		Espionne "$Nom == $BeauNom"
		set PrecedentMerde 0
	    }
	    set NbDizaines [expr $I/10]
	    while {$NbDizaines>0} {
		set Pousse [format "EVI%5.5d" [expr $N + $NbDizaines*10]]

#		set MauvaisNomDuPousse($Pousse) [format "EVI%5.5d" [expr $N + $I + 1]]
#		set MauvaisNomPrecedent [format "EVI%5.5d" [expr $N + $I]]
#		if {[info exists BonNom($MauvaisNomPrecedent)]} { unset BonNom($MauvaisNomPrecedent) }
                set Decalage 0
		set MauvaisNom [format "EVI%5.5d" [expr $Decalage + $N + $I + 1]]
		set BonNom($MauvaisNom) $Pousse 
		incr NbDizaines -1
		continue
	    }
	}
	set YaEuLigne 0
	continue
    }
    SauveLesLignes $LaCorrespondance dans "[Fiches]/NomLigne.txt"
    exit
}

proc CompteLesPlusDixAccmRNA {} {
    set NumeroLigne ""
    set NbDeFois 0
    set Trop 0
    set OnALigne 0
    foreach Ligne [LesLignesDuFichier "/genomics/link/EVImm/parser/AttriToutVf2"] {
	if {[regexp "^ligne" $Ligne]} {
	    set OnALigne 1
	    if {$NbDeFois>10} {
		Espionne "$NumeroLigne $NbDeFois"
		incr Trop
	    }
	    set NbDeFois 0
	    scan $Ligne "%s %s" Bidon NumeroLigne
	}
	if {$OnALigne && [regexp "^>" $Ligne]} {
	    incr NbDeFois
	}
    }
    Espionne "trop $Trop"

}


proc CompulsoryGenesOnWeb {} {
    return [RetinalGenesSummaryOnWeb [ListOfCompulsoryGenes] "CompulsoryGenes"]
}

proc CorrigeLesBestCops {} {
    set Compte 0
    set DeCompte 100
    foreach Fichier [lsort [glob "[RepertoireDuGenome]/transcriptomique/LesCopainsClusterOld/*lesbestcops"]] {
	if { ! [incr DeCompte -1]} { Espionne "[incr Compte] $Fichier"; set DeCompte 100 }
	set Queue [file tail $Fichier]
	regsub {\-lesbestcops} $Queue "" Queue
	regsub {\-} $Queue {\\-} QX
	set LesAutres {}
	foreach Ligne [LesLignesDuFichier $Fichier] {
	    if {[regexp "nbdecombinaison" $Ligne]} {set Nlu [IntegerApres "nbdecombinaison" dans $Ligne] ; continue}
	    regsub -all "/" $Ligne "-OU-" Ligne
	    if {[regexp "$QX " $Ligne]} {
		set MoiMeme $Ligne
		scan $MoiMeme "%d" N
		if {$Nlu!=$N} { FaireLire "$Queue $N $Nlu $Ligne" }
		continue
	    }
	    lappend LesAutres $Ligne
	}
	set LeNouveau [list $MoiMeme]
	LConcat LeNouveau $LesAutres
	SauveLesLignes $LeNouveau dans $Fichier
    } 
}

proc CopainsDuBlastpEVImmProt {} {
    foreach Nom [ListeDesPABs] {
	set Fichier [GscopeFile $Nom "blastpEVImmProt"]
	if {[FileAbsent $Fichier]} { continue }
	set lBanqueId {}
	set lPN {}
	DecortiqueBlast $Fichier 1.0e-80 20 Query lBanqueId lAccess lDE lProfil lPN
	set SeqRef [QueLaSequenceDuFichierTFA [GscopeFile $Nom "prottfa"]]
	foreach BId $lBanqueId PN $lPN {
	    set Hit ""
	    regsub {^[^\:]+\:} $BId "" Hit
	    if {$Hit==$Nom || $Hit==""} { continue }
	    set SeqHit [QueLaSequenceDuFichierTFA [GscopeFile $Hit "prottfa"]]
	    if {[string equal -nocase $SeqHit $SeqRef]} {
		lappend LesEgaux "$Hit = $Nom"
		Espionne "$Hit = $Nom"
		continue
	    }
	    if {[regexp -nocase $SeqHit $SeqRef]} {
		lappend LesPetits "$Hit < $Nom"
		continue
	    }
	    if {[regexp -nocase $SeqRef $SeqHit]} {
		lappend LesPetits "$Nom < $Hit"
		continue
	    }
	}
    }
    set LesEgaux  [lsort -unique $LesEgaux]
    set LesPetits [lsort -unique $LesPetits]
    SauveLesLignes $LesEgaux dans "[Fiches]/LesEgaux"
    SauveLesLignes $LesPetits dans "[Fiches]/LesPetits"
    return [concat $LesEgaux $LesPetits]
}

proc NiceWebOfCluster Texte {
    set Liste {}
    foreach Ligne [split $Texte "\n"] {
	set GN ""
	scan $Ligne "%d %s %s" N Queue GN
	regsub {\-} $Queue " " NomProbeset
	scan $NomProbeset "%s %s" Nom Probeset
	set DE [DefinitionRapide $Nom]
	lappend Liste $Nom
	lappend LesPS $Probeset
	lappend LesN  $N
    }
    return [RetinalGenesSummaryOnWeb $Liste "BestFriendsInCluster" 1_ProbeSet $LesPS 1_ClusterHit $LesN ]
}

proc TranscriptomicBestFriendsInClusterDir {} {
    return "[RepertoireDuGenome]/transcriptomique/LesCopainsCluster"
}

proc TranscriptomicBestFriendsInCluster {Nom {Quoi ""} {Comment ""}} {
    set Extension "-lesbestcops"
    if {$Comment==""} { set Comment "FileContent" }
    if {$Quoi==""} { set Quoi "All"} 
    set Fichier "[TranscriptomicBestFriendsInClusterDir]/${Nom}-$Quoi$Extension"
    if {[FileExists $Fichier]} {
	if {$Comment=="FileContent"} { return [ContenuDuFichier $Fichier] }
	if {$Comment=="NiceWeb"}     { return [NiceWebOfCluster [ContenuDuFichier $Fichier]] }
    }
    if {$Quoi!="Filenames" || $Quoi!="All"} { return "" }
    set Probesets [ExtraitInfo $Nom "ProbeSetId:"]
    regsub -all "/" $Probesets "-OU-" Probesets
    regsub -all "," $Probesets " " Probesets
    set LesPS [LesMotsDeLaLigne $Probesets]
    set LaSortie {}
    foreach PS $LesPS {
	set Fichier "[TranscriptomicBestFriendsInClusterDir]/$Nom-$PS$Extension"
	if {[FileAbsent $Fichier]} {continue}
	if {$Quoi=="FileNames"} { lappend LaSortie $Fichier }
	if {$Quoi=="All"}       { lappend LaSortie [ContenuDuFichier $Fichier] }
    }
    return [join $LaSortie "\n"]
}

proc TranscriptomicClustersDir {} {
    return "[RepertoireDuGenome]/transcriptomique/cluster"
}

proc TranscriptomicClusters {Nom {Quoi ""}} {
    if {$Quoi==""} { set Quoi "All"} 
    set Fichier "[TranscriptomicClustersDir]/${Nom}_$Quoi"
    if {[FileExists $Fichier]} { return [ContenuDuFichier $Fichier] }
    set Probesets [ExtraitInfo $Nom "ProbeSetId:"]
    regsub -all "/" $Probesets "-OU-" Probesets
    regsub -all "," $Probesets " " Probesets
    set LesPS [LesMotsDeLaLigne $Probesets]
    set LaSortie {}
    foreach PS $LesPS {
	set Fichier "[TranscriptomicClustersDir]/$Nom-$PS"
	if {[FileAbsent $Fichier]} {continue}
	if {$Quoi=="FileNames"} { lappend LaSortie $Fichier }
	if {$Quoi=="All"}       { lappend LaSortie [ContenuDuFichier $Fichier] }
    }
    return [join $LaSortie "\n"]
}

proc SignalIntensityDir {} {
    return "[RepertoireDuGenome]/transcriptomique/SignalIntensity"
}


proc SignalIntensities {Nom {Quoi ""}} {
    if {$Quoi==""} { set Quoi "All"} 
    set Fichier "[SignalIntensityDir]/${Nom}_$Quoi"
    if {[FileExists $Fichier]} { return [ContenuDuFichier $Fichier] }
    set Probesets [ExtraitInfo $Nom "ProbeSetId:"]
    regsub -all "/" $Probesets "-OU-" Probesets
    regsub -all "," $Probesets " " Probesets
    set LesPS [LesMotsDeLaLigne $Probesets]
    set LaSortie {}
    foreach PS $LesPS {
	set Fichier "[SignalIntensityDir]/$Nom-$PS"
	if {[FileAbsent $Fichier]} {continue}
	if {$Quoi=="FileNames"} { lappend LaSortie $Fichier }
	if {$Quoi=="All"}       { lappend LaSortie [ContenuDuFichier $Fichier] }
    }
    return [join $LaSortie "\n"]
}

proc GscopeIdsOfIdAccProt {Iap} {
    global GscopeIdsOfIdAccProt

    set IAP [string toupper $Iap]
    if {[info exists GscopeIdsOfIdAccProt($IAP)]} { return $GscopeIdsOfIdAccProt($IAP) }
    if {[info exists GscopeIdsOfIdAccProt("EstCharge")]} { return {} }
    set GscopeIdsOfIdAccProt("EstCharge") 1 

    foreach Nom [ListeDesPABs] {
	foreach IapLu [split [ExtraitInfo $Nom "IdAccProt:"] " "] {
	    set IapLu [string trim $IapLu]
	    set IAPLU [string toupper $IapLu]
	    lappend GscopeIdsOfIdAccProt($IAPLU) $Nom
	    lappend GscopeIdsOfIdAccProt(LISTOFIDACCPROTS) $IapLu
	}
    }
    set GscopeIdsOfIdAccProt(LISTOFIDACCPROTS) [lsort -unique $GscopeIdsOfIdAccProt(LISTOFIDACCPROTS)]
    return [GscopeIdsOfIdAccProt $Iap]
}

proc GscopeIdsOfIdAccArnm {accarnm} {
    global GscopeIdsOfIdAccArnm 

    if {[info exists GscopeIdsOfIdAccArnm($accarnm)]} { return $GscopeIdsOfIdAccArnm($accarnm) }
    if {[info exists GscopeIdsOfIdAccArnm("EstCharge")]} { return {} }
    set GscopeIdsOfIdAccArnm("EstCharge") 1 

    foreach Nom [ListeDesPABs] {
	set Acc [AccessEvi $Nom]
	lappend GscopeIdsOfIdAccArnm($Acc) $Nom
    }
    return [GscopeIdsOfIdAccArnm $accarnm]
}

proc DefinitionsOfAliasGeneName Gn {
    set DefinitionsOfAliasGeneName {}
    foreach Nom [GscopeIdsOfGeneName $Gn] {
	lappend DefinitionsOfAliasGeneName "$Nom [ValiGN $Nom] [DefinitionRapide $Nom]"
    }
    return $DefinitionsOfAliasGeneName
}

proc GscopeIdsOfProbeSet {Ps} {
    global GscopeIdsOfProbeSet

    if {[info exists GscopeIdsOfProbeSet($Ps)]} { return $GscopeIdsOfProbeSet($Ps) }
    if {[info exists GscopeIdsOfProbeSet("EstCharge")]} { return {} }
    set GscopeIdsOfProbeSet("EstCharge") 1

    foreach Nom [ListeDesPABs]  {
	set LaLigneProbesSet [ExtraitInfo $Nom "ProbeSetId:"]
	regsub -all "/" $LaLigneProbesSet "-OU-" LaLigneProbesSet
	set LesProbesSet [split $LaLigneProbesSet ","]
	foreach PsLu $LesProbesSet {
	    lappend GscopeIdsOfProbeSet($PsLu) $Nom
	    lappend GscopeIdsOfProbeSet(LISTOFProbeSet) $PsLu
	}
    }
    return [GscopeIdsOfProbeSet $Ps]
}

proc ProbesetsOfGscopeId Nom {
    set PS [ExtraitInfo $Nom "ProbesetId"]
    if {[regexp -nocase "no value" $PS]} { return {} }
    set LesPS [split $PS ", "]
    return $LesPS
}

proc ProbesetsOfGeneName {Gn} {
    set LesProbesetsOfGeneName {}
    foreach Nom [GscopeIdsOfGeneName $Gn] {
	LConcat LesProbesetsOfGeneName [ProbesetsOfGscopeId $Nom]
    }
    return [lsort -unique $LesProbesetsOfGeneName]
}

proc GscopeIdsOfGeneName {Gn {WithSynonyms ""}} {
    global GscopeIdsOfGeneName

    set WithSynonyms [regexp -nocase "WithSynonym" $WithSynonyms]

    set GN [string toupper $Gn]
    if {[info exists GscopeIdsOfGeneName($GN)]} { return $GscopeIdsOfGeneName($GN) }
    if {[info exists GscopeIdsOfGeneName("EstCharge")]} { return {} }
    set GscopeIdsOfGeneName("EstCharge") 1 

    set GscopeIdsOfGeneName(LISTOFGENENAMES) {}
    foreach Nom [ListeDesPABs] {
	set ValiGN [ValiGN $Nom]
	if {$ValiGN==""} {continue}
	lappend GscopeIdsOfGeneName(LISTOFGENENAMES) $ValiGN
	lappend GscopeIdsOfGeneName([string toupper $ValiGN]) $Nom

	set LesAliasGn [AliasGeneNames $Nom]
	foreach GnLu $LesAliasGn {
	    set GNLU [string toupper $GnLu]
	    lappend GscopeIdsOfGeneName($GNLU) $Nom
	}
	lappend GscopeIdsOfGeneName(LISTOFGENENAMES) $GnLu

	if {$WithSynonyms} {
	    foreach Synonym [SynonymsOfGscopeId $Nom] {
		set SYNONYM [string toupper $Synonym]
		lappend GscopeIdsOfGeneName($SYNONYM) $Nom
	    }
	}
    }
    set GscopeIdsOfGeneName(LISTOFGENENAMES) [lsort -unique $GscopeIdsOfGeneName(LISTOFGENENAMES)]
    return [GscopeIdsOfGeneName $Gn]
}

proc AliasGeneNames Nom {
    set LesGn {}
    foreach PossibleAlias [list "AliasGnRna:" "AliasGnProt:" "AliasGnHuman:"] {
	LConcat LesGn [split [ExtraitInfo $Nom $PossibleAlias] " "]
    }
    set LesAliasGn {}
    set DejaVu([string toupper [ValiGN $Nom]]) 1
    foreach Gn $LesGn {
	set GN [string toupper $Gn]
	if {[info exists DejaVu($GN)]} { continue }
	set DejaVu($GN) $Gn
	lappend LesAliasGn $Gn
    }
    return $LesAliasGn
}

proc CorrigeAliasGnEVImm {} {
    foreach Nom [ListeDesPABs] {
	Espionne $Nom
	set F [GscopeFile $Nom "infos"]
	if {[FileExists $F]} {
	    set LesLignes {}
	    foreach Ligne [LesLignesDuFichier $F] {
		if {[regexp {^(AliasGnRna|AliasGnProt)} $Ligne]} {
		    regsub -all ", " $Ligne " " Ligne
		    regsub -all ","  $Ligne " " Ligne
		    while {[regexp "  " $Ligne]} { regsub -all "  " $Ligne " " Ligne }
		}
		lappend LesLignes $Ligne
	    }
	    SauveLesLignes $LesLignes dans $F
	}
	set F [GscopeFile $Nom "infosfiche"]
	if {[FileExists $F]} {
	    set LesLignes {}
	    foreach Ligne [LesLignesDuFichier $F] {
		if {[regexp {^(RnaAliasGn|ProtAliasGn)} $Ligne]} {
		    regsub -all ", " $Ligne " " Ligne
		    regsub -all ","  $Ligne " " Ligne
		    while {[regexp "  " $Ligne]} { regsub -all "  " $Ligne " " Ligne }
		}
		lappend LesLignes $Ligne
	    }
	    SauveLesLignes $LesLignes dans $F
	}
    }
}

proc TranscriptomicSignalIntensity Nom {
    set Rep "[RepertoireDuGenome]/transcriptomique/SignalIntensity"
    set LesFichiers [glob -nocomplain "$Rep/$Nom-*"]
    set LaSortie {}
    foreach Fichier $LesFichiers {
	set Queue [file tail $Fichier]
	set Probeset [StringSuivant "-" dans $Queue]
	lappend LaSortie ""
	lappend LaSortie "$Nom $Probeset"
	foreach Ligne [LesLignesDuFichier $Fichier] {
	    ScanLaListe [split $Ligne "\t"] Ps Ch Ex Sa Si Ca Re So
	    lappend LaSortie "$Ps [format "%6.2f" $Si] [format "%1s" $Ca] $Re [format "%-8s" $So] $Ch  $Ex  $Sa"
	}
    }
    set Texte [join $LaSortie "\n"]
    if {[PourWscope]} { return [Html_DuTexteTelQuel $Texte] }
    return $Texte
}

proc InterrogeCopainsDesCompulsory {{Qui ""} {Quoi ""}} {
    global InterrogeCopainsDesCompulsory


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

    if {[info exists InterrogeCopainsDesCompulsory($Qui,$Quoi)]} {
	#if {[PourWscope]} {return "<pre>[join $InterrogeCopainsDesCompulsory($Qui,$Quoi) "\n"]</pre>"}
	return $InterrogeCopainsDesCompulsory($Qui,$Quoi)
    }
    if {[info exists InterrogeCopainsDesCompulsory("EstCharge")]} { return "" }
    set InterrogeCopainsDesCompulsory("EstCharge") 1

    #attention certains n'ont pas gn
    set Repertoire "[RepertoireDuGenome]/transcriptomique/LesCopainsClusterSsBigClu"
    set Seuil 8

    set I 0
    foreach Nom [ListOfCompulsoryGenes] {
	set LesGnsDuNom {}
	#Espionne "$Nom"
	set InterrogeCopainsDesCompulsory($Nom,Boite) {}
	foreach File [glob -nocomplain "$Repertoire/${Nom}-*-lesbestcops"] {
	    #Espionne "File $File"
	    if {[regexp "AFFX" $File]} {Espionne "Attention AFFX"}
	    set premiereligne 1
	    foreach Ligne [LesLignesDuFichier $File] {
		if {$premiereligne} {
		    set premiereligne 0
		    scan $Ligne "%s %s" nbdecombinaisoncompul bidon
		    set TabCompul($Nom) $nbdecombinaisoncompul
		}
		set LesMots [split $Ligne " "]
		set nb    [lindex $LesMots 0]
		if {$nb < $Seuil} {continue}
		#Espionne "nb $nb"
		set EviPs [lindex $LesMots 1]
		if {[regexp "AFFX" EviPs]} {Espionne "Attention2"}
		set LesEviPs [split $EviPs "-"]
		set Boite [lindex $LesEviPs 0]
		set Gn [lindex $LesMots 2]
		lappend InterrogeCopainsDesCompulsory($Nom,Boite) $Boite
		lappend InterrogeCopainsDesCompulsory($Boite,Nom) $Nom
		set InterrogeCopainsDesCompulsory($Boite,Nom) [lsort -unique $InterrogeCopainsDesCompulsory($Boite,Nom)]
		#Espionne "$Boite $Gn"
	    }
	}
	set InterrogeCopainsDesCompulsory($Nom,Boite) [lsort -unique $InterrogeCopainsDesCompulsory($Nom,Boite)]
    }
    return [InterrogeCopainsDesCompulsory $Qui $Quoi]
}

proc BelleVue {H V Nom} {
    if {$H=="ProbeSetId" || $H=="ProbeSet"} {return [H_Href $V "http://genoret.igbmc.fr/genoret/Project/igbmc/evimm/testGscopeLaetitia.php?GscopeID=$Nom" "target='_blank'"]}
    #if {$H=="ProbeSetId"} {return [H_Href $V "[LbgiUrl]/SignalIntensityImage/$Nom*" "target='_blank'"]}

    if {$H=="GscopeId"} {return [H_Href $V "[WscopeScience]&FileMoi&$Nom" "target='_blank'"]}

    if {$H=="Description"} {return [H_Href $V "[WscopeScience]&FileMoi&notes&$Nom" "target='_blank'"]}

    if {$H=="TissueTypes" || $H=="TissueType"} {
	return [H_Href $V "[LbgiUrl]/jpg_of_TissType/${Nom}_TissType.jpg" "target='_blank'"]
    }
    if {$H=="DevStages"} {
	return [H_Href $V "[LbgiUrl]/jpg_of_DevStage/${Nom}_DevStage.jpg" "target='_blank'"]
    }
    if {$H=="AccessmRNA"} {
	return [H_Href $V [WgetzSurWeb "$V" "" "GetUrl"] "target='_blank'"]
    }
    if {$H=="AccessProt"} {
	return [H_Href $V [WgetzSurWeb "$V" "" "GetUrl"] "target='_blank'"]
    }
    if {$H=="CopainsDesCompulsory"} {
	return [H_Href $V "[WscopeScience]&InterrogeCopainsDesCompulsory&$Nom" "target='_blank'"]
    }
    if {$H=="cDNA"} {
	return [H_Href $V "[WscopeScience]&FileMoi&ResultcDNA/RecapInfoADNc&$Nom" "target='_blank'"]
    }
    return $V
}

proc RetinalGenesSummaryOnWeb {{ListeDesNoms ""} {TitreSummary ""} args} {

    set LesHeadSup {}
    set I 0
    foreach {PH LesV} $args {
	regsub "_" $PH " " PH
	scan $PH "%s %s" Pos Head
	incr Pos $I
	lappend LesHeadSup $Head
	set PosSup($Head) $Pos
	set K 0
	foreach V $LesV {
	    set ValSup($Head,$K) $V
	    incr K
	}
	incr I
    }

    set LesHeaders [RecapitulatifRetChip "LesHeaders" "GetIt"]
    foreach Head $LesHeadSup {
	set LesHeaders [linsert $LesHeaders $PosSup($Head) $Head]
    }
    set NbHeaders [llength $LesHeaders]

    set Titre "Gscope summary for Retinal Genes <i>$TitreSummary</i>"
    set HeaderDuHtml ""
    Html_ZeroToBody $Titre $HeaderDuHtml
    Html_BackTo
    Html_Append [H_Balise $Titre "h3"]

    set NbCol $NbHeaders
    CouleurDegradee $NbCol
    set Liste {}
    lappend Liste $NbCol
    lappend Liste "border='1' cellpadding='3' cellspacing='1'"
    lappend Liste ""
    foreach Header $LesHeaders {
	lappend Liste "bgcolor='[CouleurDegradee]' nowrap='nowrap'"
    }
    foreach Header $LesHeaders {
	lappend Liste $Header
    }

    set K 0
    foreach Ligne [RecapitulatifRetChip $ListeDesNoms "GetIt"] {
	Espionne "Debut$Ligne FIN"
	set LesValeurs [split $Ligne ";"]
	foreach Head $LesHeadSup {
	    set P $PosSup($Head)
	    set V ""
	    if {[info exists ValSup($Head,$K)]} { set V $ValSup($Head,$K) }
	    set LesValeurs [linsert $LesValeurs $P $V]
	}
	incr I
	set Nom [lindex $LesValeurs 0]
	if { ! [EstUnPAB $Nom]} { continue }
	foreach H $LesHeaders V $LesValeurs {
	    set Vue [BelleVue $H $V $Nom]
	    lappend Liste $Vue
	}
	incr K
    }
    Html_TableFromList $Liste
    Html_BodyToEnd
    return [Html_Get "ZeroIt"]
} 

proc RetinalGenesForSelectionOnWeb {{ListeDesNoms ""} {TitreSummary ""} args} {

    set LesHeadSup {}
    set I 0
    foreach {PH LesV} $args {
	regsub "_" $PH " " PH
	scan $PH "%s %s" Pos Head
	incr Pos $I
	lappend LesHeadSup $Head
	set PosSup($Head) $Pos
	set K 0
	foreach V $LesV {
	    set ValSup($Head,$K) $V
	    incr K
	}
	incr I
    }
    set Fichier "[RepertoireDuGenome]/Reduction/TableauPourReductionSsRedondanceTrie"
    set LesLignes [LesLignesDuFichier $Fichier]
    set LigneDeTete [lindex $LesLignes 0]
    set LesHeaders [split $LigneDeTete ";"]

    #set LesHeaders [RecapitulatifRetChip "LesHeaders" "GetIt"]
    foreach Head $LesHeadSup {
	set LesHeaders [linsert $LesHeaders $PosSup($Head) $Head]
    }
    set NbHeaders  [llength $LesHeaders]

    set Titre "Selection of Retinal Genes <i>$TitreSummary</i>"
    set HeaderDuHtml ""
    Html_ZeroToBody $Titre $HeaderDuHtml
    Html_BackTo
    Html_Append [H_Balise $Titre "h3"]

    set NbCol $NbHeaders
    CouleurDegradee $NbCol
    set Liste {}
    lappend Liste $NbCol
    lappend Liste "border='1' cellpadding='3' cellspacing='1'"
    lappend Liste ""
    foreach Header $LesHeaders {
	lappend Liste "bgcolor='[CouleurDegradee]' nowrap='nowrap'"
    }
    foreach Header $LesHeaders {
	lappend Liste $Header
    }

    set K 0
    foreach Ligne $LesLignes {
    #foreach Ligne [RecapitulatifRetChip $ListeDesNoms "GetIt"] 
	Espionne "Debut$Ligne FIN"
	set LesValeurs [split $Ligne ";"]
	foreach Head $LesHeadSup {
	    set P $PosSup($Head)
	    set V ""
	    if {[info exists ValSup($Head,$K)]} { set V $ValSup($Head,$K) }
	    set LesValeurs [linsert $LesValeurs $P $V]
	}
	incr I
	set Nom [lindex $LesValeurs 0]
	if { ! [EstUnPAB $Nom]} { continue }
	foreach H $LesHeaders V $LesValeurs {
	    set Vue [BelleVue $H $V $Nom]
	    #set LongV [string length $V]
	    #if {$LongV>=80} 
		#set Milieu [expr $LongV / 2]
		#set Vue "[string range $Vue 0 $Milieu]<br/>[string range $Vue [expr $Milieu+1] end]"
	    lappend Liste $Vue
	}
	incr K
    }
    Html_TableFromList $Liste
    Html_BodyToEnd
    return [Html_Get "ZeroIt"]
} 

proc ImAnnoRefPour Nom {
    global ListOfRetChipAnnotated

    set UrlGenoretServer [GenoretServer]
 
    if { ! [info exists ListOfRetChipAnnotated]} {
	set ListOfRetChipAnnotated [HttpGetUrl "$UrlGenoretServer?Genoret&ListOfRetChipAnnotated"]
    }
    set R ""
    foreach Syno [RecupereSynonyms $Nom "AvecGN" " "] {
	if {[lsearch $ListOfRetChipAnnotated $Syno] >= 0} { set R $Syno ; break }
    }
    if {$R ne ""} {
	set Ref "<a href='http://genoret.igbmc.fr/genoret/Project/phrame.php?action=imannoShowAllConceptAnnot&cadre=1&organ=1&names=$R'>$R</a>"
    } else {
	set Ref "-" 
    }
    return $Ref
}

proc RetChipGenesOnWeb {{ListeDesNoms ""} {TitreSummary ""} args} {

    set LesHeadSup {}
    set I 0
    foreach {PH LesV} $args {
	regsub "_" $PH " " PH
	scan $PH "%s %s" Pos Head
	incr Pos $I
	lappend LesHeadSup $Head
	set PosSup($Head) $Pos
	set K 0
	if {[regexp "^Generic_" $LesV]} {
	    set VG $LesV
	    regsub "^Generic_" $VG "" VG
	    regsub -all "_" $VG " " VG
	    set ValeurGenerique($Head) $VG
	} else {
	    foreach V $LesV {
		set ValSup($Head,$K) $V
		incr K
	    }
	}
	incr I
    }
    set FichierComp  "[RepertoireDuGenome]/Reduction/TableauDesCompulsory"
    set Fichier78    "[RepertoireDuGenome]/Reduction/TableauDes7et8"
    set FichierParal "[RepertoireDuGenome]/Reduction/TableauDesParalogue"
    set Fichier7     "[RepertoireDuGenome]/Reduction/TableauDes7"
    set LesLignesComp  [LesLignesDuFichier $FichierComp]
    set LesLignes78    [LesLignesDuFichier $Fichier78]
    set LesLignesParal [LesLignesDuFichier $FichierParal]
    set LesLignes7     [LesLignesDuFichier $Fichier7]

    set LigneDeTete [lindex $LesLignesComp 0]
    set LesHeaders [split $LigneDeTete ";"]

    foreach Head $LesHeadSup {
	set LesHeaders [linsert $LesHeaders $PosSup($Head) $Head]
    }
    set NbHeaders  [llength $LesHeaders]

    set Titre "1500 RetChip Genes <i>$TitreSummary</i>"
    set HeaderDuHtml ""
    Html_ZeroToBody $Titre $HeaderDuHtml
    Html_BackTo
    Html_Append [H_Balise $Titre "h2"]

    foreach L [list $LesLignesComp     $LesLignes78 $LesLignes7] \
	    T [list "Compulsory Genes" "+7+8 Genes" "+7-8 Genes"] {

	Html_Append [H_Balise $T "h3"]

	set NbCol $NbHeaders
	CouleurDegradee $NbCol
	set Liste {}
	lappend Liste $NbCol
	lappend Liste "border='1' cellpadding='3' cellspacing='1'"
	lappend Liste ""
	foreach Header $LesHeaders {
	    lappend Liste "bgcolor='[CouleurDegradee]' nowrap='nowrap'"
	}
	foreach Header $LesHeaders {
	    lappend Liste $Header
	}
	
	set K 0
	foreach Ligne $L {
	    Espionne "Debut$Ligne FIN"
	    set LesValeurs [split $Ligne ";"]
	    incr I
	    set Nom [lindex $LesValeurs 0]
	    foreach Head $LesHeadSup {
		set P $PosSup($Head)
		set V ""
		if {[info exists ValSup($Head,$K)]} { set V $ValSup($Head,$K) }
		if {[info exists ValeurGenerique($Head)]} {
		    regsub -all "XXXX" $ValeurGenerique($Head) $Nom V
		    set V [eval $V]
		}
		set LesValeurs [linsert $LesValeurs $P $V]
	    }
	    if { ! [EstUnPAB $Nom]} { continue }
	    foreach H $LesHeaders V $LesValeurs {
		if {$H=="ProbeSet" || $H=="Pathway"} {
		    set LongV [string length $V]
		    if {$LongV>=200} {
			set Milieu [expr $LongV / 2]
			set V "[string range $V 0 $Milieu]<br/>[string range $V [expr $Milieu+1] end]"
		    }
		}
		set Vue [BelleVue $H $V $Nom]
		lappend Liste $Vue
	    }
	    incr K
	}
	Html_TableFromList $Liste
    }
    Html_BodyToEnd
    return [Html_Get "ZeroIt"]
#rR suite obsolete

    Html_Append [H_Balise "Compulsory Genes" "h3"]

    set NbCol $NbHeaders
    CouleurDegradee $NbCol
    set Liste {}
    lappend Liste $NbCol
    lappend Liste "border='1' cellpadding='3' cellspacing='1'"
    lappend Liste ""
    foreach Header $LesHeaders {
	lappend Liste "bgcolor='[CouleurDegradee]' nowrap='nowrap'"
    }
    foreach Header $LesHeaders {
	lappend Liste $Header
    }
    
    set K 0
    foreach Ligne $LesLignesComp {
	Espionne "Debut$Ligne FIN"
	set LesValeurs [split $Ligne ";"]
	foreach Head $LesHeadSup {
	    set P $PosSup($Head)
	    set V ""
	    if {[info exists ValSup($Head,$K)]} { set V $ValSup($Head,$K) }
	    set LesValeurs [linsert $LesValeurs $P $V]
	}
	incr I
	set Nom [lindex $LesValeurs 0]
	if { ! [EstUnPAB $Nom]} { continue }
	foreach H $LesHeaders V $LesValeurs {
	    if {$H=="ProbeSet" || $H=="Pathway"} {
		set LongV [string length $V]
		if {$LongV>=200} {
		    set Milieu [expr $LongV / 2]
		    set V "[string range $V 0 $Milieu]<br/>[string range $V [expr $Milieu+1] end]"
		}
	    }
	    set Vue [BelleVue $H $V $Nom]
	    lappend Liste $Vue
	}
	incr K
    }
    Html_TableFromList $Liste
    
    Html_Append [H_Balise "+7+8 Genes" "h3"]
    set NbCol $NbHeaders
    CouleurDegradee $NbCol
    set Liste {}
    lappend Liste $NbCol
    lappend Liste "border='1' cellpadding='3' cellspacing='1'"
    lappend Liste ""
    foreach Header $LesHeaders {
	lappend Liste "bgcolor='[CouleurDegradee]' nowrap='nowrap'"
    }
    foreach Header $LesHeaders {
	lappend Liste $Header
    }

    set K 0
    foreach Ligne $LesLignes78 {
	Espionne "Debut$Ligne FIN"
	set LesValeurs [split $Ligne ";"]
	foreach Head $LesHeadSup {
	    set P $PosSup($Head)
	    set V ""
	    if {[info exists ValSup($Head,$K)]} { set V $ValSup($Head,$K) }
	    set LesValeurs [linsert $LesValeurs $P $V]
	}
	incr I
	set Nom [lindex $LesValeurs 0]
	if { ! [EstUnPAB $Nom]} { continue }
	foreach H $LesHeaders V $LesValeurs {
	    set Vue [BelleVue $H $V $Nom]
	    lappend Liste $Vue
	}
	incr K
    }
    Html_TableFromList $Liste
    
    #Html_Append [H_Balise "removed paralogues" "h3"]
    #set NbCol $NbHeaders
    #CouleurDegradee $NbCol
    #set Liste {}
    #lappend Liste $NbCol
    #lappend Liste "border='1' cellpadding='3' cellspacing='1'"
    #lappend Liste ""
    #foreach Header $LesHeaders {
#	lappend Liste "bgcolor='[CouleurDegradee]' nowrap='nowrap'"
 #   }
  #  foreach Header $LesHeaders {
	#lappend Liste $Header
    #}

    #set K 0
    #foreach Ligne $LesLignesParal {
	#Espionne "Debut$Ligne FIN"
	#set LesValeurs [split $Ligne ";"]
	#foreach Head $LesHeadSup {
	 #   set P $PosSup($Head)
         #   set V ""
	 #   if {[info exists ValSup($Head,$K)]} { set V $ValSup($Head,$K) }
	 #   set LesValeurs [linsert $LesValeurs $P $V]
#	}
	#incr I
	#set Nom [lindex $LesValeurs 0]
	#if { ! [EstUnPAB $Nom]} { continue }
	#foreach H $LesHeaders V $LesValeurs {
	#    set Vue [BelleVue $H $V $Nom]
	 #   lappend Liste $Vue
	#}
	#incr K
    #}
    #Html_TableFromList $Liste
    
    Html_Append [H_Balise "+7-8 Genes" "h3"]
    set NbCol $NbHeaders
    CouleurDegradee $NbCol
    set Liste {}
    lappend Liste $NbCol
    lappend Liste "border='1' cellpadding='3' cellspacing='1'"
    lappend Liste ""
    foreach Header $LesHeaders {
	lappend Liste "bgcolor='[CouleurDegradee]' nowrap='nowrap'"
    }
    foreach Header $LesHeaders {
	lappend Liste $Header
    }
    set K 0
    foreach Ligne $LesLignes7 {
	Espionne "Debut$Ligne FIN"
	set LesValeurs [split $Ligne ";"]
	foreach Head $LesHeadSup {
	    set P $PosSup($Head)
	    set V ""
	    if {[info exists ValSup($Head,$K)]} { set V $ValSup($Head,$K) }
	    set LesValeurs [linsert $LesValeurs $P $V]
	}
	incr I
	set Nom [lindex $LesValeurs 0]
	if { ! [EstUnPAB $Nom]} { continue }
	foreach H $LesHeaders V $LesValeurs {
	    set Vue [BelleVue $H $V $Nom]
	    lappend Liste $Vue
	}
	incr K
    }
    
    Html_TableFromList $Liste
    Html_BodyToEnd
    return [Html_Get "ZeroIt"]
} 

proc EviSummary {{GN ""}} {
    set LesLignes {}
    foreach Nom [ListeDesPABs] {
	if { ! [regexp -nocase $GN [ExtraitInfo $Nom "ValiGN"]]} { continue }
	set DE [ExtraitInfo $Nom "ValiDE"]
	set OS [ExtraitInfo $Nom "Organism"]
	set Ligne "$Nom;$GN;$OS;$DE"
	lappend LesLignes $Ligne
    }
    return [join $LesLignes "\n"]
}



proc CorrigeInfosEVI {} {
    foreach Nom [ListeDesPABs] {
	set DE [ExtraitInfo $Nom "DE"]
	if {$DE!=""} {
	    InformeParSuppressionDuChamp $Nom "DE:"
	    InformeSansDemander $Nom "ValiDE: $DE"
	}#rR Debut de gscope_atelier.tcl

	set GN [ExtraitInfo $Nom "ValiGN"]
	if {[regexp -nocase (Fragment|Mouse) $GN]} {
	    InformeParSuppressionDuChamp $Nom "ValiGN:"
	    Espionne $GN
	}
    }
}

proc ShowDuplicates {} {
    foreach GN [RetinalGene] {
	if {[llength [set LesNoms [RetinalGene GscopeIdOf $GN]]]<2} { continue }
	Espionne "$GN $LesNoms"
    }
}

proc RetinalGene {{Qui ""} {Quoi ""}} {
    global RetinalGene

    if {$Qui==""} {
        set Qui "ListAll"
        set Quoi "GN"
    }

    if {[regexp -nocase {^Genes?$} $Quoi]} { set Quoi "GN" }

    if {[info exists RetinalGene($Qui,$Quoi)]}  { return $RetinalGene($Qui,$Quoi)}
    if {$Qui=="GscopeIdsOf"} {
	if {[info exists RetinalGene(GscopeIdsOfUppercase,[string toupper $Quoi])]}  {
	    return $RetinalGene($Qui,$Quoi)
	}
    }
    if {[info exists RetinalGene("EstCharge")]} { return ""}
    set RetinalGene(ListAll,GN) {}
    foreach Nom [ListeDesPABs] {
        set GN [ExtraitInfo $Nom "ValiGN"]
        if {$GN==""} { continue }
        set RetinalGene(GeneNameOf,$Nom) $GN
        lappend RetinalGene(GscopeIdsOf,$GN) $Nom
        lappend RetinalGene(GscopeIdsOfUppercase,[string toupper $GN]) $Nom
        lappend RetinalGene(ListAll,GN) $GN
    }

    set RetinalGene(ListAll,GN) [lsort -u $RetinalGene(ListAll,GN)]
    foreach GN $RetinalGene(ListAll,GN) {
	foreach Nom $RetinalGene(GscopeIdsOf,$GN) {
	    lappend RetinalGene(ListAll,GscopeIds) $Nom
	}
    }
    set RetinalGene("EstCharge") 1
    return [RetinalGene $Qui $Quoi]
}

proc InformeRetinalTargets {} {
    foreach Nom [ListeDesPABs] {
	set Entete [EnteteDuFichierTFA "[RepertoireDuGenome]/nuctfa/$Nom"]
	if {[regexp "bidon" $Entete]} {
	    set Raison [StringSuivant "bidon" dans $Entete]
	    InformeSansDemander $Nom "SeqWarning: No sequence available $Raison"
	    continue
	}
	set iP [string last "(" $Entete]
	set GN ""
	if {$iP>0} {
	    set iF [string last ")" $Entete]
	    set GN [string range $Entete [incr iP] [incr iF -1]]
	    if {[regexp " " $GN]} { set GN "" }
	    if {[regexp -nocase "Fragment" $GN]} { set GN "" }
	}
	if {$GN!=""} { InformeSansDemander $Nom "ValiGN: $GN" }
	scan $Entete "%s %s %s %s" N BId Genre Espece 
	if {$Genre=="M."} { set Genre "Mus" }
	InformeSansDemander $Nom "Organism: $Genre $Espece"
	InformeSansDemander $Nom "BId: $BId"
	set DE [StringSuivant " " dans $Entete]
	if {$DE!=""} { InformeSansDemander $Nom "DE: $DE" }	
    }
    exit
}

proc CreateRetinalTargets {} {
    set D 1000
    set PremiereFois 1
    foreach Ligne [LesLignesDuFichier "/genomics/link/EVItest/parser/AttriToutVf"] {
	if {[regexp "^ligne" $Ligne]} {
	    set YaEuLigne 1
	    set NumLigne [IntegerApres "ligne" dans $Ligne]
	    set N [expr $NumLigne*10]
	    continue 
	}
	if { ! [regexp "^>" $Ligne]} {
	    lappend LeTFA $Ligne
	    continue
	}
	if { ! $PremiereFois} {
	    Espionne "Sauve dans $Nom"
	    SauveLesLignes $LeTFA dans "/genomics/link/EVItest/nuctfa/$Nom"
	}
	regsub ">" $Ligne "" Ligne
	if {[regexp "bidon" $Ligne] && ! $YaEuLigne} { FaireLire "Un bidon sans ligne !!!"}
	set YaEuLigne 0
	set I 0
	while 1 {
	    set Nom [format "EVI%5.5d" [expr $N+$I]]
	    if { ! [info exists DejaVu($Nom)]} { break }
	    incr I
	}
	set DejaVu($Nom) 1
	
	set F [expr $D + 3000] 
	set Bornes "$Nom $D $F F"
	incr D 3300
	lappend LesBornes $Bornes
	if {[regexp "^bidon" $Ligne]} {
	    regsub -all {\'} $Ligne " " Ligne
	    set L ">$Nom $Ligne"
	} else {
	    ScanLaListe [split $Ligne "|"] B A A2
	    set Entete [StringSuivant " " dans $Ligne]
	    regsub "genbankfull"   $B "gbf" B
	    regsub "refseqnew"     $B "rsn" B
	    regsub "refseqrelease" $B "rsr" B
	    regsub "refseq" $B "rs" B
	    set L ">$Nom $B:$A $Entete"
	}
	Espionne "\n$L"
	set LeTFA [list $L]
	set PremiereFois 0
	continue
    }
    SauveLesLignes $LeTFA dans "/genomics/link/EVItest/nuctfa/$Nom"
    SauveLesLignes $LesBornes dans "/genomics/link/EVItest/fiches/bornesdespabs"
    exit
}

proc AcDuId {ID {Fichier ""}} {
    global AcDuId

    if {$Fichier==""} { set Fichier "[Fiches]/IDAC.txt" }

    if {[info exists AcDuId($ID)]} { return $AcDuId($ID) }
    if {[info exists AcDuId("EstCharge")]} { return "" }
    set AcDuId("EstCharge") 1
    foreach {N I A B} [LesLignesDuFichier $Fichier] {
	scan $N "%s %s" Bidon Nom
	if {[regexp "_" $Nom]} { continue }
	scan $I "%s %s" Bidon Id
	scan $A "%s %s" Bidon Ac
	regsub {\;} $Ac "" Ac
	set AcDuId($Id) $Ac
    }
    return [AcDuId $ID]
}

proc IndexDuDescrCustom {OldNew Valeur} {
    global IndexDuDescrCustom 
    if {[info exists IndexDuDescrCustom($OldNew,$Valeur)]} { return $IndexDuDescrCustom($OldNew,$Valeur) }
    if {[info exists IndexDuDescrCustom("EstCharge")]} { return "" }
    set IndexDuDescrCustom("EstCharge") 1
    foreach IndexA [RetChip2 ListOf Index] {
	set VA [RetChip2 $IndexA "description_customer"]
	lappend IndexDuDescrCustom(Ancien,$VA) $IndexA
    }
    foreach IndexB [RetChip3 ListOf Index] {
	set VB [RetChip3 $IndexB "description_customer"]
	lappend IndexDuDescrCustom(Nouveau,$VB) $IndexB
    }
    return [IndexDuDescrCustom $OldNew $Valeur]
}

proc MonCopain {Quoi Moi} {
    global MonCopain

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

    set LesAnciensHeader [RetChip2 ListOf Header]
    set LesAnciensIndex  [RetChip2 ListOf Index]
    set LesNouveauxIndex [RetChip3 ListOf Index]
    
    
    set LongA [llength $LesAnciensIndex]
    set LongB [llength $LesNouveauxIndex]
    set A 0
    set B 0
    set Decal 0
    while 1 {
	if {$A>=$LongA} { break }
	set IndexA [lindex $LesAnciensIndex $A]
	set IndexB [lindex $LesNouveauxIndex $B]
	set Ok 1
	foreach H $LesAnciensHeader {
	    if {$H=="status_ID"} { continue }
	    set VA [RetChip2 $IndexA $H]
	    set VB [RetChip3 $IndexB $H]
	    if {$VA=="" || $VB==""} { continue }
	    if {[RetChip2 $IndexA $H]!=[RetChip3 $IndexB $H]} {
		if {[regexp -nocase {[a-z]} $VA] && [regexp {\,} $VB] && [regexp $VA $VB]} { break }
		set Ok 0
	    }
	    break
	}
	if {$Ok} {
	    set MonCopain(Nouveau,$IndexA) $IndexB
	    set MonCopain(Ancien,$IndexB)  $IndexA
	    set LastNotYetAffected ""
	    incr A
	    incr B
	    set Decal 0
	    set RepereA $A
	    set RepereB $B
	    continue
	}
#	Espionne "$IndexA $IndexB\n[RetChip2 $IndexA WholeLine]\n[RetChip3 $IndexB WholeLine]"
	set MonCopain(Ancien,$IndexB) "NouveauAvant $IndexA"
	set LastNotYetAffected $IndexA
	incr B
	if {$B>=$LongB || [incr Decal]>100} {
	    set Decal 0
	    set A [incr RepereA]
	    set B $RepereB
	}
    }
    if {$LastNotYetAffected!=""} { FaireLire "Horreur ! $IndexA n'a pas de nouveau copain\nVoir $MonCopain(Nouveau,[expr $IndexA -1])" }

    return [MonCopain $Quoi $Moi]
}

proc TestMonCopain {} {
    foreach IndexA [RetChip2 ListOf Index] {
	if {[set IndexB [MonCopain Nouveau $IndexA]]==""} {
	    Espionne "$IndexA [RetChip2 $IndexA description_customer]"
	    continue
	}
	set VA [RetChip2 $IndexA WholeLine]
	set VB [RetChip3 $IndexB WholeLine]
	set LesMots [split $VB ";"]
	set LesMots [concat [lrange $LesMots 0 6] [list ""] [lrange $LesMots 8 end]]
	set VB [join $LesMots ";"]
	if {[string first $VA $VB]==0} { continue }
	Espionne "$IndexA $IndexB\n$VA\n$VB\n"
    }
    exit
}

proc AvecKegg Nom {
    global AvecKegg
    if {[info exists AvecKegg($Nom)]} { return $AvecKegg($Nom) }
    if {[info exists AvecKegg("EstCharge")]} { return "NotAvailable" }
    set AvecKegg("EstCharge") 1
    set FK [Fiches "Kegg"]
    if {[FileAbsent $FK]} { return 0 }
    foreach Ligne [LesLignesDuFichier $FK] {
	set NomLu ""
	scan $Ligne "%s" NomLu
	if {[regexp "Nothing" $Ligne]} {
	    set AvecKegg($NomLu) "Nothing"
	} else {
	    set AvecKegg($NomLu) "Yes"
	}
    }
    return [AvecKegg $Nom]
}

proc MultipleProbeset {} {
    foreach P [AffyAnno ListOf Index] {
	set GeneChipArray [AffyAnno $P "GeneChip_Array"]
	if {[regexp { \-or\- } $GeneChipArray]} {
	    Espionne "$P $GeneChipArray"
	}
    }
}

proc MeilleurEMBL Nom {
    set onaswiss 0
    Espionne "coucoucA"
    array set TabCorres [LesLignesDuFichier "[RepertoireDuGenome]/fiches/TabCorres"]
    Espionne "coucoucB"
    set Racine [GscopeFile $Nom "protembl"]
    set LesPossibles [lsort [glob -nocomplain ${Racine}_*]]
    if {$LesPossibles=={}} { return "" }
    set LesInfos {}
    foreach Fichier $LesPossibles {
	set Queue [file tail $Fichier]
	set LigneDT ""
	set Fragment 0
	set Date "01-JAN-1970"
	foreach Ligne [LesLignesDuFichier $Fichier] {
	    if {[regexp "^SQ   " $Ligne]} { break }
	    if {[regexp "^DT   " $Ligne]} { set LigneDT $Ligne }
	    if {[regexp "^DE   " $Ligne]} {
		if {[regexp -nocase "\(Fragment\)" $Ligne]} { set Fragment 1 }
	    }   
	}
	scan $LigneDT "%s %s" Bidon Date
	set Banque $TabCorres($Queue)
	lappend LesInfos "$Date $Fragment $Queue $Banque"
    }
    set LesInfosTriees [lsort -decreasing -index 0 -command "CompareDate" $LesInfos]
    #EspionneL $LesInfosTriees
    foreach elmt [array names TabCorres] {
	if {[regexp "^$Nom" $elmt]} {
	    if {[regexp "SWISSPROT" $TabCorres($elmt)]} {
		set onaswiss 1
	    }
	}
    } 
    foreach Info $LesInfosTriees {
	scan $Info "%s %s %s %s" D F Q B
	if {$F} { continue }
	if {$onaswiss && [regexp "SPTREMBL" $B]} {continue}
	return $Q
    }
    scan [lindex $LesInfosTriees 0] "%s %s %s %s" D F Q B
    return $Q
}

proc DeProtEmblVersProtTfaEvi {{Liste ""}} {
    if {[EstUnPAB $Liste]} { set Liste [list $Liste] }
    if {$Liste==""} { set Liste [ListeDesPABs] }
    set RepProtInter "[RepertoireDuGenome]/protintermediare"
    if { ! [file exists $RepProtInter]} { File mkdir $RepProtInter }
    foreach Nom $Liste {
	Espionne "coucouc"
	set FichierProtEmbl "[GscopeFile $Nom protembl]"
	if {[FileExists $FichierProtEmbl]} { continue }
	set FichierProtTfa  "[GscopeFile $Nom protintermediare/prottfaBEST]"
	set FichierProtTfa2  "[GscopeFile $Nom protintermediare/prottfaBEST2]"
	if {[FileExists $FichierProtTfa] || [FileExists $FichierProtTfa2]} { continue }
	set FichierProtEmbldeux ""; set FichierProtEmblun ""
	set FichierProtEmblun "[GscopeFile $Nom protembl]_1"
	set FichierProtEmbldeux "[GscopeFile $Nom protembl]_2"
	if {![file exists $FichierProtEmblun]} {continue}
	if {[file exists $FichierProtEmbldeux]} {
	    set Repprottfabest2 "$RepProtInter/prottfaBEST2"
	    Espionne "coucouc2"
	    if { ! [file exists $Repprottfabest2]} { File mkdir $Repprottfabest2 }
	    DeProtEmblMultipleVersProtTfaEvi $Nom
	} else {
	    set Repprottfabest "$RepProtInter/prottfaBEST"
	    if { ! [file exists $Repprottfabest]} { File mkdir $Repprottfabest }
	    DeProtEmblSingleVersProtTfaEvi $Nom
	}
    }
}

proc DeProtEmblSingleVersProtTfaEvi {Nom} {
    set FichierProtEmblun "[GscopeFile $Nom protembl]_1"
    set FichierProtEmbl "[GscopeFile $Nom protembl]"
    set FichierProtTfa  "[GscopeFile $Nom protintermediare/prottfaBEST]"
    file copy -force $FichierProtEmblun $FichierProtEmbl
    set LesLignesEMBL [LesLignesDuFichier $FichierProtEmbl]
    DecortiqueLesLignesEMBL $LesLignesEMBL ID AC DE GN OS OC OX SequenceBrute
    set EnteteProtTfa "$Nom $AC from $ID $OS $DE"
    set ProtTfa [SequenceFormatTFA [ContenuDuFichier $FichierProtEmbl] "ForceHeaderTo=$EnteteProtTfa" "embl"]
    Sauve $ProtTfa dans $FichierProtTfa
}

proc DeProtEmblMultipleVersProtTfaEvi {Nom} {
    set FichierProtEmbl "[GscopeFile $Nom protembl]"
    set FichierProtTfa2  "[GscopeFile $Nom protintermediare/prottfaBEST2]"
    Espionne "couocu3"
    set Meilleur [MeilleurEMBL $Nom]
    Espionne "coucou4"
    if {$Meilleur==""} { continue }
    regsub $Nom $FichierProtEmbl $Meilleur FichierProtEmblMeilleur
    file copy $FichierProtEmblMeilleur $FichierProtEmbl
    set LesLignesEMBL [LesLignesDuFichier $FichierProtEmbl]
    #Espionne $LesLignesEMBL
    DecortiqueLesLignesEMBL $LesLignesEMBL ID AC DE GN OS OC OX SequenceBrute
    set EnteteProtTfa "$Nom $AC from $ID $OS $DE"
    set ProtTfa [SequenceFormatTFA [ContenuDuFichier $FichierProtEmbl] "ForceHeaderTo=$EnteteProtTfa" "embl"]
    Sauve $ProtTfa dans $FichierProtTfa2
}

proc RangeProt {Nom} {
    set RepProtembl_ "[RepertoireDuGenome]/protintermediare/protembl_"
    if { ! [file exists $RepProtembl_]} { File mkdir $RepProtembl_ }
    foreach Fichier [glob -nocomplain "[RepertoireDuGenome]/protembl/$Nom*_*"] {
	file rename -force $Fichier $RepProtembl_/.
    }

    set RepProttfa "[RepertoireDuGenome]/prottfa"
    if { ! [file exists $RepProttfa]} { File mkdir $RepProttfa }
    set Fichier "[RepertoireDuGenome]/protintermediare/prottfaBEST/$Nom"
    set Fichier2 "[RepertoireDuGenome]/protintermediare/prottfaBEST2/$Nom"
    if {[file exists $Fichier]} {
	file copy -force $Fichier $RepProttfa/.
    } else {
	file copy -force $Fichier2 $RepProttfa/.
    }

    
}   
 
proc DeProtEmblRecupereVersProtTfaEvi {} {
    set RepEntree "[RepertoireDuGenome]/protemblRecupere"
    foreach FichierProtEmblRecupere [glob -nocomplain "$RepEntree/EVI*"] {
	set Nom [file tail $FichierProtEmblRecupere]
	#Espionne $Nom
	set FichierProtTfa  "[GscopeFile $Nom prottfaRecupere]"
	set FichierNucTfa   "[GscopeFile $Nom nuctfa]"
	if {[FileExists $FichierProtTfa]} { continue } 
	set LesLignesEMBL [LesLignesDuFichier $FichierProtEmblRecupere]
	#Espionne $LesLignesEMBL

	if {[regexp {^LOCUS} [lindex $LesLignesEMBL 0]]} {
	    set TexteGB [ContenuDuFichier $FichierProtEmblRecupere]
	    set ProtTfa [SequenceFormatTFA $TexteGB "$Nom" "gbprot"]
	    #Espionne "$ProtTfa"
	    Sauve $ProtTfa dans $FichierProtTfa
	    continue
	}
	DecortiqueLesLignesEMBL $LesLignesEMBL ID AC DE GN OS OC OX SequenceBrute
	set EnteteProtTfa "$Nom $AC from $ID $OS $DE"
	set ProtTfa [SequenceFormatTFA [ContenuDuFichier $FichierProtEmblRecupere] "ForceHeaderTo=$EnteteProtTfa" "embl"]
	puts "$ProtTfa"
	Sauve $ProtTfa dans $FichierProtTfa
    }
}

proc essaidix {} {
    set A 0; set B 0; set C 0; set D 0; set E 0; set G 0
    foreach F [glob -nocomplain "[RepertoireDuGenome]/protemblRecupere/EVI*"] {incr A}
    foreach F [glob -nocomplain "[RepertoireDuGenome]/prottfaRecupere/EVI*"] {incr B}
    foreach F [glob -nocomplain "[RepertoireDuGenome]/protembl/EVI*"] {incr C}
    foreach F [glob -nocomplain "[RepertoireDuGenome]/prottfaBEST/EVI*"] {incr D}
    foreach F [glob -nocomplain "[RepertoireDuGenome]/prottfaBEST2/EVI*"] {incr E}
    foreach F [glob -nocomplain "[RepertoireDuGenome]/prottfa/EVI*"] {incr G}
    puts "A= $A"; puts "B= $B"; puts "C= $C"; puts "D= $D"; puts "E= $E"; puts "G= $G"
}

proc essaivingt {{Liste ""}} {
    set pls 0; set seul 0; set recupere 0
    if {[EstUnPAB $Liste]} { set Liste [list $Liste] }
    if {$Liste==""} { set Liste [ListeDesPABs] }
    foreach Nom $Liste {
	set FichierProtEmblun "[GscopeFile $Nom protembl]_1"
	set FichierProtEmbldeux "[GscopeFile $Nom protembl]_2"
	set FichierProtEmblRecupere "[GscopeFile $Nom protemblRecupere]"
	if {[file exists $FichierProtEmblun] && [file exists $FichierProtEmbldeux]} {incr pls}
	if {[file exists $FichierProtEmblun] && ![file exists $FichierProtEmbldeux]} {incr seul}
	if {[file exists $FichierProtEmblRecupere]} {incr recupere}
    }
    puts "pls $pls"
    puts "seul $seul"
    puts "recupere $recupere"
}
 
proc essai4994 {} {
    set RepEntree "[RepertoireDuGenome]/protemblRecupere"
    set FichierProtEmblRecupere "$RepEntree/EVI04994"
    set Nom [file tail $FichierProtEmblRecupere]
    puts $Nom
    set FichierProtTfa  "[GscopeFile $Nom prottfaRecupere]"
    set FichierNucTfa   "[GscopeFile $Nom nuctfa]"
    if {[FileExists $FichierProtTfa]} { continue }
    set LesLignesEMBL [LesLignesDuFichier $FichierProtEmblRecupere]
    Espionne $LesLignesEMBL
}
 
proc ProtParGeneNamePourTous {{Liste ""}} {
    if {[EstUnPAB $Liste]} { set Liste [list $Liste] }
    if {$Liste==""} { set Liste [ListeDesPABs] }
    set Repprotembl "[RepertoireDuGenome]/protembl"
    if { ! [file exists $Repprotembl]} { File mkdir $Repprotembl }
    foreach Nom $Liste {
	#Espionne $Nom
	set Texte ""

	set FichierProtembl "[GscopeFile $Nom protembl]_1"
	if {[FileExists $FichierProtembl]} {continue}

	set Acc [AccessEvi $Nom]
	if {$Acc==""} { continue }
	#Espionne "$Nom $Acc"

	if {[regexp {^NM_} $Acc] || [regexp {^XM_} $Acc] || [regexp {^NR_} $Acc]} {
	    set Commande "getz \"\\\[refseq-acc:$Acc\\\] > \(\\\[swissprot-org:Mus musculus\\\] | \\\[sptrembl-org:Mus musculus\\\]\)\" \-vf acc"
	    set Texte [eval exec $Commande]
	} else {
	    set Commande "getz \"\\\[genbankfull-acc:$Acc\\\] > \(\\\[swissprot-org:Mus musculus\\\] | \\\[sptrembl-org:Mus musculus\\\]\)\" \-vf acc"
	    set Texte [eval exec $Commande]
	}
	Espionne "$Texte"
	if {$Texte==""} { continue }
	set I 0
	foreach BIdAcc [split $Texte "\n"] {
	    scan $BIdAcc "%s %s" BId Access
	    Espionne "BIdAcc $BIdAcc"
	    set LesLignesEMBL [LaSequenceDesBanques $BId $Access "OnVeutEMBL"]
	    if {$LesLignesEMBL == {}} { continue }
	    incr I
	    set FichierEMBL "[GscopeFile $Nom protembl]_$I"
	    set Queue [file tail $FichierEMBL]
	    set LesMots [split $BIdAcc ":"]
	    set Tab($Queue) [lindex $LesMots 0]
	    set F [SauveLesLignes $LesLignesEMBL dans $FichierEMBL]
	    #Espionne "$Nom $Acc [file tail $F]\n[join $LesLignesEMBL "\n"]"
	}
    }
    set FichierTabCorres "[RepertoireDuGenome]/fiches/TabCorres"
    AppendAuFichier $FichierTabCorres [join [array get Tab] "\n"]
    
    #SauveLesLignes [array get Tab] dans TabCorres
    #array set Tab [LesLignesDuFichier toto]
}

proc ProtParLocUcscPourTous {} {
    foreach Nom [ListeDesPABs] {
	Espionne [ProtParLocUcsc $Nom]
    }
}

proc ProtParLocUcsc Nom {
    set Acc [AccessEvi $Nom]
    set ProtId [LocUcsc $Acc proteinID]
    if {$ProtId==""} { return "" }
    set LesLignesEmbl [LaSequenceDesBanques $ProtId]
    return [SauveLesLignes $LesLignesEmbl dans "[RepertoireDuGenome]/protembl2/$Nom"]
}

# name chrom strand txStart txEnd cdsStart cdsEnd exonCount exonStarts exonEnds proteinID alignID

proc LocUcscEvi {Nom {FromWhere ""} {AllLoc ""}} {

    set LesLignesLocUcsc {}
    set AllLoc [string equal -nocase "AllLoc" $AllLoc]
    set Acc [AccessEvi $Nom]

    if {$FromWhere==""} { set FromWhere "From200602" }
    if {$FromWhere=="From200602"} {
	set LigneLocUcsc [LocUcsc $Acc "line"]

	set LigneNewAcc [LocUcsc PolyLocalisationOf $Acc]
	set LesNewsAcc [split $LigneNewAcc " "]
	lappend LesLignesLocUcsc $LigneLocUcsc
	foreach New $LesNewsAcc {
	    lappend LesLignesLocUcsc [LocUcsc $New "line"]
	}
    }
  
    set Name ""; set Chrom ""; set Strand ""; set TxStart ""; set TxEnd ""
    scan $LigneLocUcsc "%s %s %s %s %s" Name Chrom Strand TxStart TxEnd
    set LocUcscEvi "$Chrom:$TxStart-$TxEnd ($Strand)"

    if { ! $AllLoc} { return $LocUcscEvi }
    if {$AllLoc && $LocUcscEvi==":- ()"} { return $LocUcscEvi }
    foreach LigneLocUcsc $LesLignesLocUcsc {
	set Name ""; set Chrom ""; set Strand ""; set TxStart ""; set TxEnd ""
	scan $LigneLocUcsc "%s %s %s %s %s" Name Chrom Strand TxStart TxEnd
	set LocUcscEvi "$Chrom:$TxStart-$TxEnd ($Strand)"
	lappend LesLUE $LocUcscEvi
    }
    return $LesLUE
}

proc InformeAffyPourTous {} {
    foreach Nom [ListeDesPABs] {

	set LesProbeAccess {}
	set LesProbeLocUcsc {}
	set LocUcsc {}
	set LesLocAffy {}

	set Access [AccessEvi $Nom]
	if {$Access!=""} {
	    set LocUcsc [LocUcscEvi $Access "From200503"]
	    foreach ProbeAccess [lsort -unique [AffyAnno $Access "Probe_Set_ID"]] {
		lappend LesProbeAccess $ProbeAccess
		lappend LesLocAffy [AffyAnno $ProbeAccess "Alignments"]
	    }
	    set LesProbeLocUcsc [AffyAnno $LocUcsc "Probe_Set_ID"]
	}
	Espionne ""
	Espionne "$Nom"
	Espionne "Access      =$Access"
	Espionne "ProbeAccess =$LesProbeAccess"
	Espionne "ProbeLocUcsc=$LesProbeLocUcsc"
	Espionne "LocUcsc     =$LocUcsc"
	Espionne "LocAffy     =$LesLocAffy"
    }
}

proc VerifieCoherenceGscopeBioArrayBase {{Schema ""} {FromWhere ""}} {
    if {$FromWhere==""} { set FromWhere "FromInfo" }
    if {$Schema==""} { set Schema "poidevin" }

    CanalSqlBioArrayBase
    foreach Nom [ListeDesPABs] {
	set TxStartSql ""
	set TxEndSql ""
	set TxStart ""
	set TxEnd ""
	if {$Schema=="poidevin"} {
	    set Li [SqlExec "select tsstart,tsstop from retinobase2.probeset where gscopeid = '$Nom';" "GetList"]
	    Espionne "LI $Li"
	    ScanLaListe $Li TxStartSql TxEndSql
	}
	if {$Schema=="retinobase2"} {
	    set Access [AccessEvi $Nom]
	    if {$Access==""} { continue }
	    set Li [SqlExec "select chromo_loc from retinobase2.probeset where accno = '$Access';" "GetList"]
	    Espionne "LI for $Nom $Access $Li"
	    if {$Li==""} { continue }
	    set StrandSql "?"
	    regsub {\-} $Li " " Li
	    regsub -all {[\:\(\)]} $Li " " Li
	    scan $Li "%s %s %s %s" ChromSql TxStartSql TxEndSql StrandSql
	}
	if {$FromWhere=="FromInfo"} {
	    set Loc [ExtraitInfo $Nom "InfoLocUcsc"]
	    scan $Loc "%s %s %s %s %s" NomLu Chrom Strand TxStart TxEnd
	}
	if {$FromWhere=="From200508"} {
	    set Access [AccessEvi $Nom]
	    set Strand "?"
	    regsub {\-} $Loc " " Loc
	    regsub -all {[\:\(\)]} $Loc " " Loc
	    scan $Loc "%s %s %s %s" Chrom TxStart TxEnd Strand
	}
	if {$FromWhere=="From200503"} {
	    set Access [AccessEvi $Nom]
	    set Loc [LocUcscEvi $Access "From200503"]
	    puts $Loc
	    set Strand "?"
	    regsub {\-} $Loc " " Loc
	    puts $Loc
	    regsub -all {[\:\(\)]} $Loc " " Loc
	    puts $Loc
	    scan $Loc "%s %s %s %s" Chrom TxStart TxEnd Strand
	}
	Espionne "Loc for $Access $FromWhere $Loc"
	Espionne "$Nom $TxStart $TxEnd $FromWhere"
	Espionne "$Nom $TxStartSql $TxEndSql $Schema"
	Espionne ""
	if {$TxStartSql>$TxEnd || $TxStart>$TxEndSql }  { FaireLire horreur } 
    }
    CanalSqlDisconnect
}

proc RangeGbNmFromNcbiEnStock {} {

}

proc LignesParGb GB {
    return [GbsParLigne $GB]
}

proc GbsParLigne I {
    global GbsParLigne

    if {[info exists GbsParLigne($I)]} { return $GbsParLigne($I) }
    if {[info exists GbsParLigne("EstCharge")]} { return {} }

    set GbsParLigne("EstCharge") 1

    set FichierGbsParLigne "[Fiches]/GbsParLigne"
    array set GbsParLigne [LesLignesDuFichier $FichierGbsParLigne]

    foreach {C Vs} [array get GbsParLigne] {
	foreach V [split $Vs " "] {
	    if {[info exists GbsParLigne($V)]} { lappend GbsParLigne(GbMultiple) $V }
	    lappend GbsParLigne($V) $C
	}
    }

    set GbsParLigne(GbMultiple) [lsort -unique $GbsParLigne(GbMultiple)]

    set GbsParLigne(Vide) {}
    foreach L [RetChip ListOf Index] {
	if {[GbsParLigne $L]=={}} { lappend GbsParLigne(Vide) $L }
    }

    return [GbsParLigne $I]
}

proc LignesParNm NM {
    return [NmsParLigne $NM]
}

proc NmsParLigne I {
    global NmsParLigne

    if {[info exists NmsParLigne($I)]} { return $NmsParLigne($I) }
    if {[info exists NmsParLigne("EstCharge")]} { return {} }

    set NmsParLigne("EstCharge") 1

    set FichierNmsParLigne "[Fiches]/NmsParLigne"
    array set NmsParLigne [LesLignesDuFichier $FichierNmsParLigne]

    foreach {C Vs} [array get NmsParLigne] {
	foreach V [split $Vs " "] {
	    if {[info exists NmsParLigne($V)]} { lappend NmsParLigne(NmMultiple) $V }
	    lappend NmsParLigne($V) $C
	}
    }

    set NmsParLigne(NmMultiple) [lsort -unique $NmsParLigne(NmMultiple)]

    set NmsParLigne(Vide) {}
    foreach L [RetChip ListOf Index] {
	if {[NmsParLigne $L]=={}} { lappend NmsParLigne(Vide) $L }
    }

    return [NmsParLigne $I]
}

proc GbEnStock GB {
    global GbEnStock

    if {[info exists GbEnStock($GB)]} { return $GbEnStock($GB) }
    if {[info exists GbEnStock("EstCharge")]} { return "" }

    set  GbEnStock("EstCharge") 1

    set FichierGbEnStock "[Fiches]/GbEnStock"

    set Redondance 0
    foreach Ligne [LesLignesDuFichier $FichierGbEnStock] {
	if { ! [regexp -nocase {[a-z0-9/]} $Ligne]} { continue }
	if {[regexp {^LOCUS +[A-Z]} $Ligne]} {
	    set GbLu [StringApres LOCUS dans $Ligne]
	    if {[info exists GbEnStock($GbLu)]} { set Redondance 1 ; unset GbEnStock($GbLu)} 
	    set GbCourant $GbLu
	    set GbEnStock($GbCourant) $Ligne
	    lappend LesGbLus $GbLu
	    continue
	}
	if {[regexp {^ACCESSION +[A-Z]} $Ligne]} {
	    set GbEnStock($GbCourant,Accession) [StringApres "ACCESSION" dans $Ligne]
	}
	append GbEnStock($GbCourant) "\n$Ligne"
	if {[regexp "//" $Ligne] && [info exists GbEnStock($GbCourant,Accession)]} {
	    set GbEnStock($GbEnStock($GbCourant,Accession)) $GbEnStock($GbCourant)
	}
    }
    if {$Redondance} {
	set FichierGbEnStockNew [TmpFile]
	foreach GbLu $LesGbLus {
	    AppendAuFichier $FichierGbEnStockNew $GbEnStock($GbLu)
	}
	Garde $FichierGbEnStock
	file rename -force $FichierGbEnStockNew $FichierGbEnStock
    }
    return [GbEnStock $GB]
}  

proc NmEnStock NM {
    global NmEnStock

    if {[info exists NmEnStock($NM)]} { return $NmEnStock($NM) }
    if {[info exists NmEnStock("EstCharge")]} { return "" }

    set NmEnStock("EstCharge") 1

    set FichierNmEnStock "[Fiches]/NmEnStock"

    set Redondance 0
    foreach Ligne [LesLignesDuFichier $FichierNmEnStock] {
	if { ! [regexp -nocase {[a-z0-9/]} $Ligne]} { continue }
	if {[regexp {^LOCUS +NM} $Ligne]} {
	    set NmLu [StringApres LOCUS dans $Ligne]
	    if {[info exists NmEnStock($NmLu)]} { set Redondance 1 ; unset NmEnStock($NmLu) } 
	    set NmCourant $NmLu
	    set NmEnStock($NmCourant) $Ligne
	    continue
	}
	append NmEnStock($NmCourant) "\n$Ligne"
    }
    if {$Redondance} {
	set FichierNmEnStockNew [TmpFile]
	foreach NmLu [array names NmEnStock] {
	    AppendAuFichier $FichierNmEnStockNew $NmEnStock($NmLu)
	}
	Garde $FichierNmEnStock
	file rename -force $FichierNmEnStockNew $FichierNmEnStock
    }
    return [NmEnStock $NM]
}  

proc InventaireDesNMsEtGBs {} {

    set LesNMs {}
    set LesGBs {}
    foreach I [RetChip ListOf Index] {
	foreach C [list "refseq_PIQOR" "DNA_acc"] {
	    set NM [RetChip $I $C]
	    if { ! [regexp {^NM_[0-9]+$} $NM]} {
		if {[regexp "," $NM]} {
		    set SesNMs [split $NM ","]
		    foreach NM $SesNMs {
			if {[regexp {^NM_[0-9]+$} $NM]} {
			    lappend LesNMs $NM ; lappend LesNMsDu($I) $NM; continue
			}
		    }
		    continue 
		}
	    }
	    if {$NM==""} { continue }
	    if {[regexp {^NM_[0-9]+$} $NM]} {
		lappend LesNMs $NM ; lappend LesNMsDu($I) $NM; continue
	    }
	    Espionne "GB $NM"
	    if {[regexp {^[A-Z]+[0-9]+$} $NM]} {
		lappend LesGBs $NM ; lappend LesGBsDu($I) $NM; continue
	    }	    
	}
    }
    set LesNMs [lsort -unique $LesNMs]
    set LesGBs [lsort -unique $LesGBs]

    if {[OuiOuNon "Do I look for missing NM and GB at NCBI ?"]} {
	set LesVides {}
	set Fichier "[Fiches]/GbNmFromNcbiEnStock"
	if {[file exists $Fichier] && [OuiOuNon "Do I replace $Fichier ?"]} { file delete $Fichier }
	foreach X [concat $LesNMs $LesGBs] {
	    if {[NmEnStock $X]!=""} { continue }
	    if {[GbEnStock $X]!=""} { continue }
	    set NCBI [FromNCBI $X]
	    if {$NCBI==""} { lappend LesVides $X }
	    AppendAuFichier $Fichier $NCBI
	}
	return
    }

    SauveLesLignes [array get LesNMsDu] dans "[Fiches]/NmsParLigne"
    SauveLesLignes [array get LesGBsDu] dans "[Fiches]/GbsParLigne"


    set KeepEnStock [OuiOuNon "Do I keep existing NmEnStock (and GbEnStock) ?"]

    set LesRestants $LesNMs
    if {$KeepEnStock} {
	set LesRestants {}
	foreach NM $LesNMs {
	    if {[NmEnStock $NM]!=""} { continue }
	    lappend LesRestants $NM
	}
    }
    Espionne $LesRestants
    set Fichier "[Fiches]/NmEnStock"
    if {[file exists $Fichier] && [OuiOuNon "Do I replace $Fichier ?"]} { file delete $Fichier }
    while 1 {
	if {$LesRestants=={}} { break }
	set LesCourants [lrange $LesRestants 0 99]
	set LesRestants [lrange $LesRestants 100 end]
	set NMs [join $LesCourants "|"]
	set GetzCourant [Getz $NMs refseq]
	set T [regexp -all {\|} $NMs] ; incr T
	set N [regexp -all "//" $GetzCourant]
	Espionne "Recu $N sur $T"
	AppendAuFichier $Fichier $GetzCourant
    }
    set LesRestants $LesGBs
    if {$KeepEnStock} {
	set LesRestants {}
	foreach GB $LesGBs {
	    if {[GbEnStock $GB]!=""} { continue }
	    lappend LesRestants $GB
	}
    }
    Espionne $LesRestants
    set Fichier "[Fiches]/GbEnStock"
    if {[file exists $Fichier] && [OuiOuNon "Do I replace $Fichier ?"]} { file delete $Fichier }
    while 1 {
	if {$LesRestants=={}} { break }
	set LesCourants [lrange $LesRestants 0 99]
	set LesRestants [lrange $LesRestants 100 end]
	set GBs [join $LesCourants "|"]
	set GetzCourant [Getz $GBs genbank genbanknew]
	set T [regexp -all {\|} $GBs] ; incr T
	set N [regexp -all "//" $GetzCourant]
	Espionne "Recu $N sur $T"
	AppendAuFichier $Fichier $GetzCourant
    }
    exit
}


proc RetChip {Ligne Colonne} {
    global RetChip

    if {[info exists RetChip($Ligne,$Colonne)]} { return $RetChip($Ligne,$Colonne) }
    if {[info exists RetChip("EstCharge")]} { return "" }
    set RetChip("EstCharge") 1

#rR set FichierRetChip "[RepertoireDuGenome]/DeLaetitia/genoret_050909_sansPV.csv"
    set FichierRetChip "[RepertoireDuGenome]/parser/AcNMetProt_v4.csv"
    set Queue [file tail $FichierRetChip]
    regsub -nocase {\.[^\.]+$} $Queue "" Queue

#rR LoadTxl
    LoadTxl $FichierRetChip RetChip -1 ";"    
    set LesTetes $RetChip(ListHeaderPlease,$Queue)
    set LesIndex $RetChip(ListAllPlease,$Queue)
#rR loadTxl

    set RetChip(ListOf,Header) $LesTetes
    set RetChip(ListOf,Index)  $LesIndex

    return [RetChip $Ligne $Colonne]
    exit
    
}

proc TestAffyAnno {} {
    foreach Index [AffyAnno ListOf Index] {
	foreach Header [AffyAnno ListOf Header] {
	    Espionne "$Index $Header [AffyAnno $Index $Header]"
	}
    }
}

proc LocAffy {{Qui ""} {Quoi ""}} {
    global LocAffy

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

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

    set Org "Mouse"

    foreach P [AffyAnno ListOf Index] {
	set Ali [AffyAnno $P "Alignments"]
	regsub -all { */// *} $Ali "@" Ali
	foreach Lo [split $Ali "@"] {
	    regsub -all { */+ *} $Lo "@" Lo
	    set LesChamps [split $Lo "@"]
	    set CSES [lindex $LesChamps 0]
	    regsub -all {[\:\-\(\)]} $CSES " " CSES
	    scan $CSES "%s %s %s %s" Chr Start End Strand
	    lappend LocAffy(ListOf$Org$Chr,StartEndName) "$Start $End $P"
	    set Cytoband [lindex $LesChamps 2]
	    lappend LocAffy(ListOf$Org$Chr,CytobandName) "$Cytoband $P"
	}
    }
    set LocAffy(ListOf,Arguments) [array names LocAffy]
    foreach V $LocAffy(ListOf,Arguments) {
	if {[regexp "StartEndName$" $V]} {
	    set LocAffy($V) [lsort -integer -index 0 $LocAffy($V)]
	}
	if {[regexp "CytobandName$" $V]} {
	    set LocAffy($V) [lsort $LocAffy($V)]
	}
    }
    return [LocAffy $Qui $Quoi]
} 

proc AffyAnnoAllFields Probe {
    foreach Tete [AffyAnno ListOf Header] {
	lappend LaSortie "[format %33s $Tete] [AffyAnno $Probe $Tete]"
    }
    return [join $LaSortie "\n"]
}

proc AffyAnno {{Ligne ""} {Colonne ""}} {
    #attention un nouvelle version
    global AffyAnno

    if {$Ligne==""} { set Ligne "ListOf" }
    if {$Colonne==""} { set Colonne "Header" }

    if {[info exists AffyAnno($Ligne,$Colonne)]} { return $AffyAnno($Ligne,$Colonne) }
    if {[info exists AffyAnno("EstCharge")]} { return "" }
    set AffyAnno("EstCharge") 1

    set FichierAffyAnno "[RepertoireDuGenome]/fiches/AffyAnno"
    if {[file exists $FichierAffyAnno]} {
	array set AffyAnno [LesLignesDuFichier $FichierAffyAnno]
	return [AffyAnno $Ligne $Colonne]
    }

    set CreeFichierAffyAnno [OuiOuNon "Do I create $FichierAffyAnno ?"]

    set AffyAnno(ListOf,Header) {}
    set AffyAnno(ListOf,Index)  {}

    set LesFichiersAffyAnno [list \
	    "/genomics/link/affyArrayAnnot/AffyAnno20070309/MGU74v2/MG_U74Av2.na22.annot.csv" \
	    "/genomics/link/affyArrayAnnot/AffyAnno20070309/MGU74v2/MG_U74Bv2.na22.annot.csv" \
	    "/genomics/link/affyArrayAnnot/AffyAnno20070309/MGU74v2/MG_U74Cv2.na22.annot.csv" \
	    "/genomics/link/affyArrayAnnot/AffyAnno20070309/MG430_2.0/Mouse430_2.na22.annot.csv" \
	    "/genomics/link/affyArrayAnnot/AffyAnno20070309/MG430A_2.0/Mouse430A_2.na22.annot.csv" ]

    set LesTetes {}
    set LesIndex {}
    foreach CurrentFichierAffyAnno $LesFichiersAffyAnno {
	Espionne "$CurrentFichierAffyAnno"
	set Queue [file tail $CurrentFichierAffyAnno]
	Espionne "$Queue"
	regsub -nocase {\.[^\.]+$} $Queue "" Queue
	Espionne "$Queue"
	
	LoadTxlAffy $CurrentFichierAffyAnno AffyAnno 0 ","  
	set LesNouvellesTetes $AffyAnno(ListHeaderPlease,$Queue)
	Espionne "$LesTetes"
	Espionne "++"
	Espionne "$LesNouvellesTetes"
	if {$LesTetes=={}} { set LesTetes $LesNouvellesTetes }
	if {$LesTetes!=$LesNouvellesTetes} { FaireLire "The headers are different in [join $LesFichiersAffyAnno "\n"]" }
	LConcat LesIndex $AffyAnno(ListAllPlease,$Queue)
    }	
    set AffyAnno(ListOf,Header) $LesTetes
    set AffyAnno(ListOf,Index)  $LesIndex

    if {$CreeFichierAffyAnno} {
	SauveLesLignes [array get AffyAnno] dans $FichierAffyAnno
    }
	
    return [AffyAnno $Ligne $Colonne]
}

proc BonneTete {Tete}  {
    global BonneTete
    if {[info exists BonneTete($Tete)]} { return $BonneTete($Tete) }
    if {[info exists BonneTete("EstCharge")]} { return 0 }
    set BonneTete("EstCharge") 1
    set BonneTete(Probe_Set_ID) 1
    set BonneTete(GeneChip_Array) 1
    set BonneTete(Species_Scientific_Name) 1
    set BonneTete(Annotation_Date) 1
    set BonneTete(Sequence_Type) 1
    set BonneTete(Representative_Public_ID) 1
    set BonneTete(UniGene_ID) 1
    set BonneTete(Genome_Version_) 1
    set BonneTete(Alignments) 1
    set BonneTete(Gene_Title) 1
    set BonneTete(Gene_Symbol) 1
    set BonneTete(Ensembl) 1
    set BonneTete(Entrez_Gene) 1
    set BonneTete(SwissProt) 1
    set BonneTete(OMIM) 1
    set BonneTete(RefSeq_Protein_ID) 1
    set BonneTete(RefSeq_Transcript_ID) 1
    set BonneTete(Gene_Ontology_Biological_Process) 1
    set BonneTete(Gene_Ontology_Cellular_Component) 1
    set BonneTete(Gene_Ontology_Molecular_Function) 1
    set BonneTete(Pathway) 1
    set BonneTete(InterPro) 1
    set BonneTete(Trans_Membrane) 1
    set BonneTete(ListAll) [array names BonneTete]
    set BonneTete(GrandChef) "Probe_Set_ID"
    set BonneTete(ListChef) [list "RefSeq_Transcript_ID" "Alignments" "Representative_Public_ID" "SwissProt" "RefSeq_Protein_ID"]
    foreach Chef $BonneTete(ListChef) {
	set BonneTete($Chef-IsChef) 1
    }

    lappend BonneTete(ListOfReferents) "Alignments"
    set BonneTete(ListChefForAlignments) [list "RefSeq_Transcript_ID" "Representative_Public_ID"]
    return [BonneTete $Tete]
}

proc LoadTxlAffy {Fichier {aTxl ""} {MainIndex 0} {Sep ""} {CoLi ""}} {
    Wup "Attention BonSep n'est pas utilise, ca ne marche que pour \",\""
    set BonSep $Sep
    if {[regexp {[\,\-\;]} $BonSep]} { set BonSep "\\$Sep" } 

    if {$CoLi==""} { set CoLi "LiCo" }

    Wup "Normally the values are stored in  Txl(Line,Column)"
    Wup "  with CoLi==CoLi we have Txl(Column,Line)"

    if {$aTxl!=""} { upvar $aTxl Txl } else { global Txl ; set aTxl Txl }
    if {$Sep==""} { set Sep "\t" }
    set Queue [file tail $Fichier]
    regsub -nocase {\.[^\.]+$} $Queue "" Queue

    if { ! [file exists $Fichier]} {
	set Txl(ListHeaderPlease,$Queue) {}
	set Txl(ListAllPlease,$Queue)    {}
	return $aTxl
    }
	
#LP	
    #set LesLignes [LesLignesDuFichier $Fichier]
    foreach Ligne [LesLignesDuFichier $Fichier] {
	if {[regexp "^#" $Ligne]} {continue}
	lappend LesLignes $Ligne
    }
#LP
    set Entete    [lindex $LesLignes 0]
    set LesLignes [lrange $LesLignes 1 end]
    set LesTetes {}
    foreach Tete [split $Entete $Sep] {
	regsub -all {\(} $Tete "" Tete
	regsub -all {\)} $Tete "" Tete
	regsub -all {\"} $Tete "" Tete
	regsub -all { }  $Tete "_" Tete
	lappend LesTetes $Tete
    }	
    set Txl(ListHeaderPlease,$Queue) $LesTetes
    set I 1
    foreach Ligne $LesLignes {
	incr I
	regsub -all "@" $Ligne "A=r=O=b=A"

	set BelleLigne [string trim $Ligne {\"}]	
	regsub -all {\"\,\"} $BelleLigne "@" BelleLigne
	set LesMots [split $BelleLigne "@"]
	if {$MainIndex<0} {
	    set Nom $I
	} else {
	    set Nom [lindex $LesMots $MainIndex]
	    regsub -all {\"} $Nom "" Nom
	}
	lappend Txl(ListAllPlease,$Queue) $Nom
	if {[info exists DejaVu]} {unset DejaVu}
	foreach Mot $LesMots Tete $LesTetes {
	    #LP
	    if {$Tete=="RefSeq_Protein_ID"} {
		if {[regexp "." $Mot]} {
		    set Mot [lindex [split $Mot "."] 0]
		}
	    }
	    #LP
	    set MemoValeur($Tete) $Mot 
	    if {$Tete==""} { continue }
	    if { ! [BonneTete $Tete]} { continue }
	    regsub -all {"A=r=O=b=A"} $Mot "@" Mot
	    regsub -all {\"} $Mot "" Mot
	    set LesPetitsMots [LesBoutsDeLaLigneAvecTexteSeparateur $Mot "///" "trim"]
	    if {$CoLi=="CoLi"} {
		if {[info exists Txl($Tete,$Nom)]} {
		    if {$Txl($Tete,$Nom)!=$Mot} { append Txl($Tete,$Nom) " -or- $Mot" } 
		} else {
		    set Txl($Tete,$Nom) $Mot
		}
		if {[BonneTete "$Tete-IsChef"]} {
		    foreach PetitMot $LesPetitsMots {
			if {[set iSS [string first {//} $PetitMot]]>0} {
			    set PetitMot [string range $PetitMot 0 [incr iSS -1]]
			    set PetitMot [string trim $PetitMot]
			}
			lappend Txl([BonneTete "GrandChef"],$PetitMot) $Nom
		    }
		}
	    } else {
		if {[info exists Txl($Nom,$Tete)]} {
		    if {$Txl($Nom,$Tete)!=$Mot} { append Txl($Nom,$Tete) " -or- $Mot" } 
		} else {
		    set Txl($Nom,$Tete) $Mot
		}
		if {[BonneTete "$Tete-IsChef"]} {
		    foreach PetitMot $LesPetitsMots {
			if {[set iSS [string first {//} $PetitMot]]>=0} {
			    set PetitMot [string range $PetitMot 0 [incr iSS -1]]
			    set PetitMot [string trim $PetitMot]
			}
			lappend Txl($PetitMot,[BonneTete "GrandChef"]) $Nom
		    }
		}
	    }
	}
	foreach Referent [BonneTete ListOfReferents] {
	    foreach Chef [BonneTete ListChefFor$Referent] {
		if {$CoLi=="CoLi"} {
		    lappend Txl($Referent,$MemoValeur($Chef)) $MemoValeur($Referent)		
		} else {
		    lappend Txl($MemoValeur($Chef),$Referent) $MemoValeur($Referent)		
		}
	    }
	}
    }

    return $aTxl
}




























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