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

#rR gscope_secator
#rR ce n'est pas clair ... faut-il utiliser /biolo/secator ou le secator dans cluspack ??? 
#rR car il y a /biolo/secator ou dpc ou l'un ou l'autre dans cluspack
 
proc Secator {FichierMSF {Sortie ""}} {

    if {$Sortie==""} { set Sortie "GetClusterFile" }

    set Racine [TmpFile secator "" "_"]
    file copy $FichierMSF $Racine

    global env ; set env(SECATORHOME) "/biolo/secator"

    global ExecutableSecator
#rR if { ! [info exists ExecutableSecator]} { set ExecutableSecator "secator" }
    if { ! [info exists ExecutableSecator]} { set ExecutableSecator "/biolo/cluspack/binNew/cluspack" }
    set OptionAlignment ""
    set FichierDesClusters "$Racine.sec"
    if {[regexp "cluspack" $ExecutableSecator]} {
	set OptionAlignment "-dt=alignment -cm=bionj -nbc=secator"
	set FichierDesClusters "$Racine.clu"
    }
    if {$ExecutableSecator=="dpc"} {
	set OptionAlignment "alignment"
	set FichierDesClusters "$Racine.dpc"
    }
    if {[catch {eval exec $ExecutableSecator $Racine $OptionAlignment} Message]} {
	Warne "$ExecutableSecator $Racine $OptionAlignment\n failed with \n$Message"
	return ""
    }
    if { ! [file exists $FichierDesClusters]} {
	Warne "$ExecutableSecator didn't create $FichierDesClusters for \n$FichierMSF"
	return ""
    }
    if {$Sortie=="ListAllOutputs"} {
	set LesSorties [glob -nocomplain $Racine*]
	return $LesSorties
    }
    if {$Sortie=="GetText"}        { return [ContenuDuFichier $FichierDesClusters] }
    if {$Sortie=="GetClusterFile"} { return $FichierDesClusters }
    file copy $FichierDesClusters $Sortie
    return $Sortie
}


proc LesAccessDuGroupe {NomOuMSF Query {Liste "Tous"} {Calculate ""}} {

    if {$Liste=="Tous"} { return [GroupeSecator $NomOuMSF $Query "In" $Calculate] }

    foreach Access [GroupeSecator $NomOuMSF $Query "In" $Calculate] {
	set MoiAussi([string toupper $Access]) 1
    }

    set LesBons {}
    foreach Access $Liste {
	if { ! [info exists MoiAussi([string toupper $Access])] } { continue }
	lappend LesBons $Access
    }
    Espionne $LesBons
    return $LesBons
}

proc RapportGroupeSecator Nom {
    global RepertoireDuGenome
    global RapportGroupeSecator


    if {[info exists RapportGroupeSecator($Nom)]} { return [set RapportGroupeSecator($Nom)] }
    if {[info exists RapportGroupeSecator("EstCharge")]} { return "-1 -1" }

    set FichierRapportGroupeSecator "$RepertoireDuGenome/fiches/rapportgroupesecator"
    if {[file exists $FichierRapportGroupeSecator]} {
	foreach Ligne [LesLignesDuFichier $FichierRapportGroupeSecator] {
	    scan $Ligne "%s %d %d" NomLu i n
	    set RapportGroupeSecator($NomLu) "$i $n"
	}
	set RapportGroupeSecator("EstCharge") 1
	return [RapportGroupeSecator $Nom]
    }
    foreach PAB [ListeDesPABs] {
	set MSF "$RepertoireDuGenome/msf/$PAB"
	if { ! [file exists $MSF]} {
	    set i 0
	    set n 0
	} else {	    
	    DecortiqueUnMSF $MSF LesNomsDeSequences
	    set LeGroupe [GroupeSecator $PAB $PAB "Out"]
	    set i [llength $LeGroupe]
	    set n [llength $LesNomsDeSequences]
	}
	AppendAuFichier $FichierRapportGroupeSecator "$PAB $i $n"
	set RapportGroupeSecator($PAB) "$i $n"
    }
    return [RapportGroupeSecator $Nom]    
}

proc TestRGS Nom {
    set LeGroupe [GroupeSecator $Nom $Nom "Out"]
    Espionne $LeGroupe
    Espionne [llength $LeGroupe]  
    Espionne [RapportGroupeSecator $Nom] 
    exit
    
}

proc GroupeSecator {NomOuMSFOuAutre {Query "SameAs"} {InOut "Out"} {Calculate ""} {OutFile ""}} {
    global GroupeSecator

    Wup "InOut can be In, Out or ToutLeMonde, ToutLeMondeAvecGroupe,"
    Wup "or AppendAuGroupeSecator if you want to complete the file groupesecator"
    Wup "OutFile can be a filename but it works only with ToCalculate."
  
    set OutQuery 0
    set Racine "TrululuTrala"

    if {$NomOuMSFOuAutre=="AppendAuGroupeSecator"} {
	set OnAppend 1
	set Nom "Bidon"
    } else {
	set OnAppend 0
    }
    set NomOuMSF $NomOuMSFOuAutre

    set MayBeMSF $NomOuMSF
    set Nom [file tail $NomOuMSF]
    if {[file exists $MayBeMSF] && (! [EstUnPAB $Nom] || $Query!="SameAs")} {
	set FichierMSF $MayBeMSF
	if { ! [regexp "^/" $FichierMSF]} { set FichierMSF "[pwd]/$MayBeMSF" }
	set Calculate "ToCalculate"
    }

    if {$Query=="" || $Query=="SameAs"} { set Query $Nom }
    set QueryEstNom [string equal -nocase $Query $Nom]

    set ToCalculate [string equal -nocase $Calculate "ToCalculate"]

    set OnVeutToutLeMonde 0
    set OnVeutToutLeMondeAvecGroupe 0

    set UnGroupe 1
    if {$InOut=="ToutLeMonde"} {
	set OnVeutToutLeMonde 1
	set UnGroupe 0
	set Query "CacheToiQueryQuOnNeTeTrouvePas"
	set ToCalculate 1
    } elseif {$InOut=="ToutLeMondeAvecGroupe"} {
	set OnVeutToutLeMondeAvecGroupe 1
	set UnGroupe 0
	set Query "CacheToiQueryQuOnNeTeTrouvePas"
	set ToCalculate 1
    } else {
	set OutQuery [string equal -nocase $InOut "Out"]
    }

    set QUERY [string toupper $Query]
    if { ! [info exists FichierMSF] || ! [file exists $FichierMSF]} {
	if {[info exists GroupeSecator($QUERY)]} {
	    set LeGroupe [set GroupeSecator($QUERY)]
	    if {$OutQuery} {
		return $LeGroupe
	    } else {
		return [lappend LeGroupe $Query]
	    }
	}
	if {$QueryEstNom && [info exists GroupeSecator("EstCharge")]} {
	    if {$OutQuery} {
		return {}
	    } else {
		return [list $Query]
	    }
	}
	
	set FichierGroupeSecator "[RepertoireDuGenome]/fiches/groupesecator"
	if { ! $ToCalculate && [file exists $FichierGroupeSecator]} {
	    foreach Ligne [LesLignesDuFichier $FichierGroupeSecator] {
		scan $Ligne "%s" NomLu
		set NOMLU [string toupper $NomLu]
		set GroupeSecator($NOMLU) [lrange [split [string trim $Ligne] " "] 1 end]
	    }
	    if { ! $OnAppend} {
		set GroupeSecator("EstCharge") 1
		return [GroupeSecator $Nom $Query $InOut]
	    }
	}
	
	if { $OnAppend || ! $ToCalculate && [OuiOuNonMemo "Do I create the file $FichierGroupeSecator ?" 0]} {
	    foreach PAB [ListeDesPABs] {
		
		if {[info exists GroupeSecator($PAB)]} { continue } 
		
		set FichierMSF "[RepertoireDuGenome]/msf/$PAB"
		if { ! [file exists $FichierMSF]} { continue }
		set PL [PremiereLigneDuFichier $FichierMSF]
		if {[regexp "Clustalw inutile|NoSequence" $PL]} { continue }
		
		set LeGroupe [GroupeSecator $PAB $PAB "Out" "ToCalculate"]
		set Texte "$PAB [join $LeGroupe " "]"
		AppendAuFichier $FichierGroupeSecator $Texte
		Espionne "I appended : $Texte"
	    }
	    return [GroupeSecator $Nom $Query $InOut]
	}
	
	set FichierMSF "[RepertoireDuGenome]/msf/$Nom"
	if { ! [file exists $FichierMSF]} { return {} }
    }

    set FichierSortie [Secator $FichierMSF]
    if {$FichierSortie==""} { return {} }
    regsub {\.[a-z]+$} $FichierSortie "" Racine

    set LeGroupe {}
    set OnLeTient 0
    set Numero -1
    foreach Ligne [LesLignesDuFichier $FichierSortie] {
	if { ! [regexp -nocase {[a-z]+} $Ligne] || [regexp -nocase "^Number of clusters" $Ligne]} { continue }
	if {[regexp -nocase {^Cluster [0-9]|^unclustered } $Ligne]} {
	    if { ! $OnVeutToutLeMondeAvecGroupe && ! $OnVeutToutLeMonde && $OnLeTient} { break }
	    set Numero ""
	    scan $Ligne "%s %s" Groupe Numero
	    if { ! [regexp {^[0-9]} $Numero]} { set Numero -1 }
	    set LeGroupe {}
	    continue
	}
	scan $Ligne "%s" Access
	if {[string toupper $Access]==[string toupper $Query]} {
	    set OnLeTient 1
	    if {$OutQuery} { continue }
	}
	lappend ToutLeMondeAvecGroupe "$Access $Numero" 
	lappend ToutLeMonde $Access
	lappend LeGroupe $Access
    }
    if {[regexp "tmp" $Racine]} {
	foreach Fichier [glob -nocomplain "$Racine*"] {
	    file delete $Fichier
	}
    }

    set Resultat $LeGroupe

    if {$OnVeutToutLeMonde}                  { set Resultat $ToutLeMonde }
    if {$OnVeutToutLeMondeAvecGroupe}        { set Resultat $ToutLeMondeAvecGroupe }
    if {$UnGroupe && $Groupe=="unclustered"} { set Resultat $ToutLeMonde }

    if {$OutFile==""} { return $Resultat }
    return [SauveLesLignes $Resultat dans $OutFile]
}

proc LesClustersDeCluspack {TexteOuFichier {GetIt ""}} {

    if {$GetIt==""} { set GetIt "GetGroupsAndMembers" }

    if {[regexp "\n" TexteOuFichier]} {
	set Texte $TexteOuFichier
    } else {
	set Texte [ContenuDuFichier $TexteOuFichier]
    }

    Espionne $Texte

    set ToutLeMondeAvecGroupe {}
    set LesGroupesEtLeursMembres {}

    set LesGroupes {}
    set LesMembres {}
    set OnLeTient 0
    append Texte "\nThatsAllFolks"
    foreach Ligne [split $Texte "\n"] {
	if { ! [regexp -nocase {[a-z]+} $Ligne] || [regexp -nocase "^Number of clusters" $Ligne]} {
	    continue
	}
	if {[regexp -nocase {^Cluster [0-9]|^unclustered seq} $Ligne] | $Ligne=="ThatsAllFolks"} {
	    set Numero ""
	    scan $Ligne "%s %s" Groupe Numero
	    if { ! [regexp {^[0-9]} $Numero]} { set Numero -1 }
	    if {[info exists NumeroCourant]} {
		lappend LesGroupesEtLeursMembres [list $NumeroCourant $LesMembres] 
		if {$Ligne=="ThatsAllFolks"} { break }
		set LesMembres {}
	    }
	    set NumeroCourant $Numero
	    continue
	}
	scan $Ligne "%s" Access
	lappend ToutLeMondeAvecGroupe "$Access $Numero" 
	lappend LesMembres $Access
    }
    if {$GetIt=="GetGroupsAndMembers"} { return $LesGroupesEtLeursMembres }
    if {$GetIt=="GetAllWithGroup"}     { return $ToutLeMondeAvecGroupe }
    return [list $ToutLeMondeAvecGroupe $LesGroupesEtLeursMembres]
}

proc Cluspack {ListeOuTexteOuFichier {FichierSortie ""}} {
    #rR j'ail'impression que ce n'est pas pour un alignement ... mais pour un fichier de coordonnees.

    if {$FichierSortie==""} { set FichierSortie "GetGroupsAndMembers" }

    if {[regexp "\n" $ListeOuTexteOuFichier]} {
	set Liste [split $ListeOuTexteOuFichier "\n"]
    } elseif { ! [regexp " " $ListeOuTexteOuFichier]} {
	set Liste [LesLignesDuFichier $ListeOuTexteOuFichier]
    } else {
	set Liste $ListeOuTexteOuFichier
    }

    set nL 0
    set nCOld -1
    foreach Ligne $Liste {
	incr nL
	set nC [expr [llength $Ligne] - 1]
	if {$nCOld==-1} { set nCOld $nC }
	if {$nC!=$nCOld} { FaireLire "Missing values in line $Ligne for Cluspack" }
    }
    set LeTexte {}
    lappend LeTexte "$nL $nC"
    lappend LeTexte ""
    LConcat LeTexte $Liste
    NousAllonsAuBoulot
    set Racine "[TmpFile Cluspack]"
    regsub -all {\.} $Racine "_" Racine
    set FichierSecatorIn [SauveLesLignes $LeTexte dans "$Racine.in"]
#   set ExecutableCluspack "/biolo/secator/cluspack"
    set ExecutableCluspack "/biolo/cluspack/binNew/cluspack"
    if {[catch {exec $ExecutableCluspack $FichierSecatorIn \
		    -data_type=coordinates -clustering_method=ward -nb_clusters=secator} Message]} {
	FaireLire "cluspack failed with message\n $Message"
	return ""
    }
    set FichierSecatorOut "$Racine.clu"
    if { ! [file exists $FichierSecatorOut]} { return "" }
    if {$FichierSortie=="GetAsIs"} {
	set Sortie [ContenuDuFichier $FichierSecatorOut]
    } elseif {$FichierSortie=="GetGroupsAndMembers"} {
	set Sortie [LesClustersDeCluspack $FichierSecatorOut "GetGroupsAndMembers"]
    } elseif {$FichierSortie=="GetAllWithGroup"} {
	set Sortie [LesClustersDeCluspack $FichierSecatorOut "GetAllWithGroup"]
    } else {
	file copy $FichierSecatorOut $FichierSortie
	set Sortie $FichierSortie
    }
    if {[file exists "$Racine.in"]}  { file delete "$Racine.in" }
    if {[file exists "$Racine.clu"]} { file delete "$Racine.clu" }
    OnRevientDuBoulot
    return $Sortie
}

proc GroupeDpc {Nom {Query "SameAs"} {InOut "Out"}} {
    global GroupeDpc

    Wup "Attention GroupeDpc ne calcule pas il ne donne que la valeur"
    Wup "il faut avoir fait GroupeSecator en positionnant ExecutableSecator a dpc"
    Wup "Ca devrait marcher si il y a le FichierSortieDpc"

    set OnAppend 0

    if {$Query=="" || $Query=="SameAs"} { set Query $Nom }
    set QueryEstNom [string equal -nocase $Query $Nom]

    set OnVeutToutLeMonde 0
    set OnVeutToutLeMondeAvecGroupe 0

    if {$InOut=="ToutLeMonde"} {
	set OnVeutToutLeMonde 1
	set Query "CacheToiQueryQuOnNeTeTrouvePas"
    } elseif {$InOut=="ToutLeMondeAvecGroupe"} {
	set OnVeutToutLeMondeAvecGroupe 1
	set Query "CacheToiQueryQuOnNeTeTrouvePas"
    } else {
	set OutQuery [string equal -nocase $InOut "Out"]
    }

    set QUERY [string toupper $Query]
    if {[info exists GroupeDpc($QUERY)]} {
	set LeGroupe [set GroupeDpc($QUERY)]
	if {$OutQuery} {
	    return $LeGroupe
	} else {
	    return [lappend LeGroupe $Query]
	}
    }
    if {$QueryEstNom && [info exists GroupeDpc("EstCharge")]} {
	if {$OutQuery} {
	    return {}
	} else {
	    return [list $Query]
	}
    }
    
    set FichierGroupeDpc "[RepertoireDuGenome]/fiches/groupedpc"
    if {[file exists $FichierGroupeDpc]} {
	foreach Ligne [LesLignesDuFichier $FichierGroupeDpc] {
	    scan $Ligne "%s" NomLu
	    set NomLu [string toupper $NomLu]
	    set GroupeDpc($NomLu) [lrange [split [string trim $Ligne] " "] 1 end]
	}
	if { ! $OnAppend} {
	    set GroupeDpc("EstCharge") 1
	    return [GroupeDpc $Nom $Query $InOut]
	}
    }
    
    set LeGroupe {}
    set OnLeTient 0
    set FichierSortieDpc "[RepertoireDuGenome]/dpc/$Nom"
    if { [FileAbsent $FichierSortieDpc] } {
	foreach Ext [list ".dpc" ".clu"] {
	    set Possible $FichierSortieDpc$Ext
	    if {[FileExists $Possible]} { set FichierSortieDpc $Possible ; break }
	}
	append FichierSortieDpc ".dpc"
    }
    if { [FileAbsent $FichierSortieDpc] } { return {} }
    foreach Ligne [LesLignesDuFichier $FichierSortieDpc] {
	if { ! [regexp -nocase {[a-z]+} $Ligne] || [regexp -nocase "^Number of clusters" $Ligne]} { continue }
	if {[regexp -nocase {^Cluster [0-9]|^unclustered seq} $Ligne]} {
	    if {$OnLeTient} { break }
	    set Numero ""
	    scan $Ligne "%s %s" Groupe Numero
	    if { ! [regexp {^[0-9]} $Numero]} { set Numero -1 }
	    set LeGroupe {}
	    continue
	}
	scan $Ligne "%s" Access
	if {[string toupper $Access]==[string toupper $Query]} {
	    set OnLeTient 1
	    if {$OutQuery} { continue }
	}
	lappend ToutLeMondeAvecGroupe "$Access $Numero" 
	lappend ToutLeMonde $Access
	lappend LeGroupe $Access
    }

    if {$OnVeutToutLeMonde} { return $ToutLeMonde }
    if {$OnVeutToutLeMondeAvecGroupe} { return $ToutLeMondeAvecGroupe }
    if {$Groupe=="unclustered"} {
	return $ToutLeMonde
    } else {
	return $LeGroupe
    }
}

proc GroupeOumy {Nom {Query "SameAs"} {InOut "Out"}} {
    global GroupeOumy

    Wup "Attention GroupeOumy ne calcule pas il ne donne que la valeur"
    Wup "il faut avoir fait GroupeSecator en positionnant ExecutableSecator a Oumy"
    Wup "Ca devrait marcher si il y a le FichierSortieOumy"

    set OnAppend 0

    if {$Query=="" || $Query=="SameAs"} { set Query $Nom }
    set QueryEstNom [string equal -nocase $Query $Nom]

    set OnVeutToutLeMonde 0
    set OnVeutToutLeMondeAvecGroupe 0

    if {$InOut=="ToutLeMonde"} {
	set OnVeutToutLeMonde 1
	set Query "CacheToiQueryQuOnNeTeTrouvePas"
    } elseif {$InOut=="ToutLeMondeAvecGroupe"} {
	set OnVeutToutLeMondeAvecGroupe 1
	set Query "CacheToiQueryQuOnNeTeTrouvePas"
    } else {
	set OutQuery [string equal -nocase $InOut "Out"]
    }

    set QUERY [string toupper $Query]
    if {[info exists GroupeOumy($QUERY)]} {
	set LeGroupe [set GroupeOumy($QUERY)]
	if {$OutQuery} {
	    return $LeGroupe
	} else {
	    return [lappend LeGroupe $Query]
	}
    }
    if {$QueryEstNom && [info exists GroupeOumy("EstCharge")]} {
	if {$OutQuery} {
	    return {}
	} else {
	    return [list $Query]
	}
    }
    
    set FichierGroupeOumy "[RepertoireDuGenome]/fiches/groupeoumy"
    if {[file exists $FichierGroupeOumy]} {
	foreach Ligne [LesLignesDuFichier $FichierGroupeOumy] {
	    scan $Ligne "%s" NomLu
	    set NomLu [string toupper $NomLu]
	    set GroupeOumy($NomLu) [lrange [split [string trim $Ligne] " "] 1 end]
	}
	if { ! $OnAppend} {
	    set GroupeOumy("EstCharge") 1
	    return [GroupeOumy $Nom $Query $InOut]
	}
    }
    
    set LeGroupe {}
    set OnLeTient 0
    set FichierSortieOumy "[RepertoireDuGenome]/Oumy/$Nom"
    if { ! [file exists $FichierSortieOumy]} { append FichierSortieOumy ".Oumy" }
    if { ! [file exists $FichierSortieOumy]} { return {} }
    foreach Ligne [LesLignesDuFichier $FichierSortieOumy] {
	if { ! [regexp -nocase {[a-z]+} $Ligne] || [regexp -nocase "^Number of clusters" $Ligne]} { continue }
	if {[regexp -nocase {^Cluster [0-9]|^unclustered seq} $Ligne]} {
	    if {$OnLeTient} { break }
	    set Numero ""
	    scan $Ligne "%s %s" Groupe Numero
	    if { ! [regexp {^[0-9]} $Numero]} { set Numero -1 }
	    set LeGroupe {}
	    continue
	}
	scan $Ligne "%s" Access
	if {[string toupper $Access]==[string toupper $Query]} {
	    set OnLeTient 1
	    if {$OutQuery} { continue }
	}
	lappend ToutLeMondeAvecGroupe "$Access $Numero" 
	lappend ToutLeMonde $Access
	lappend LeGroupe $Access
    }

    if {$OnVeutToutLeMonde} { return $ToutLeMonde }
    if {$OnVeutToutLeMondeAvecGroupe} { return $ToutLeMondeAvecGroupe }
    if {$Groupe=="unclustered"} {
	return $ToutLeMonde
    } else {
	return $LeGroupe
    }
}


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