#rR gscope_oi.tcl #rR 20170101 Traitement des proteomes des poissons de Audrey Defosset #rR on reprend ici ce qui a été fait pour CilioCarta #rR avec de nouveaux noms #rR OiName devient ainsi OiCode #rR Yannis a ramené les protéomes Achaea Bacteria Eukaryota et Virus #rR Pour chaqcun j'ai créé desprotéomes bien nommé (dans NotaBene dans un premier temps) #rR Et je leur ai donné un nouveau nom qui ICI SERA APPELE OI de OiCode #rR C'est la procédure OiCode #rR Pour la bactérie 'Trucmuch machin chose' ce sera BTruma et s'il y a plusieurs BTruma ce sera BTrumaA BTrumaB ... BTrumaZ BTrumaAA BTrumaAB ... proc GyraseTfasDesCopains {} { #rR On lit le taxobla et si l'access est celui d'un proteome cité dans les fichiers lus par Gyrase #rR on va le chercher dans les proteomes de NotaBene set TfaCopDir "[RepertoireDuGenome]/tfasdescopainsGyrase" file mkdir $TfaCopDir foreach Nom [ListeDesPABs] { set FicTfaCop "$TfaCopDir/$Nom" if {[file exists $FicTfaCop]} { continue } set FicTaxobla [GscopeFile $Nom "taxobla"] if {[FileAbsent $FicTaxobla]} { continue } Espionne $Nom set LesSeq {} foreach Ligne [LesLignesDuFichier $FicTaxobla] { scan $Ligne "%s %s %s" PN SCore Ox if {[Gyrase $Ox YN]==""} { continue } set FicTfaProteome [OiCode $Ox FullFilePath] set Info [lindex [split $Ligne "\t"] 4] scan $Info "%s %s" BId Ac set Bank [StringApres "BANK=" dans $Info] set Access "$Bank|$Ac|$BId" set Seq [LaSequenceDuTFAs $FicTfaProteome $Access] if {$Seq==""} { continue } lappend LesSeq $Seq } SauveLesLignes $LesSeq dans $FicTfaCop lappend LesCrees $FicTfaCop } return $LesCrees } proc Gyrase {{Qui ""} {Quoi ""}} { global Gyrase set Qui [string toupper $Qui] set Quoi [string toupper $Quoi] if {[info exists Gyrase($Qui,$Quoi)]} { return $Gyrase($Qui,$Quoi) } if {[info exists Gyrase("EstCharge")]} { return "" } set Gyrase("EstCharge") 1 set Gyrase(YES,FILENAME) "/genomics/link/AArcfu/DeClaudine/14" set Gyrase(NO,FILENAME) "/genomics/link/AArcfu/DeClaudine/16" foreach YN [list NO YES] { foreach Ligne [LesLignesDuFichier $Gyrase($YN,FILENAME)] { set Os [string trim $Ligne] set Oi [OiCode $Os OI] set Ox [OiCode $Os OX] lappend Gyrase($YN,LISTOFOI) $Oi lappend Gyrase($YN,LISTOFOS) $Os lappend Gyrase($YN,LISTOFOX) $Ox lappend Gyrase(ALL,LISTOFOI) $Oi lappend Gyrase(ALL,LISTOFOS) $Os lappend Gyrase(ALL,LISTOFOX) $Ox set OX $Ox set OI [string toupper $Oi] set OS [string toupper $Os] set Gyrase($OI,OI) $Oi set Gyrase($OI,OS) $Os set Gyrase($OI,OX) $Ox set Gyrase($OI,YN) $YN set Gyrase($OS,OI) $Oi set Gyrase($OS,OS) $Os set Gyrase($OS,OX) $Ox set Gyrase($OS,YN) $YN set Gyrase($OX,OI) $Oi set Gyrase($OX,OS) $Os set Gyrase($OX,OX) $Ox set Gyrase($OX,YN) $YN } } return [Gyrase $Qui $Quoi] } proc OiLikeFishProteomes {{Rep ""}} { ##rR on remplace #>XP_018528244.1 PREDICTED: F-box only protein 15-like isoform X1 [Lates calcarifer] #par #>XP_018528244.1 PREDICTED: F-box only protein 15-like isoform X1 OS=Lates calcarifer OX=123456 if {$Rep==""} { set Rep "/home/defosset/These/Proteome/Purged_proteomes/Other_fish" } NousAllonsAuBoulot "$Rep/NotaBene" set LesNotaBene {} foreach Fic [glob "../*_purged"] { Espionne $Fic if { ! [regexp -nocase {^../([a-z]+)_([a-z]+)_purged$} $Fic Match Genre Espece]} { FaireLire "$Fic bad name" ; continue } set OS "${Genre} ${Espece}" set OX [Tax $OS] if {$OX==""} { FaireLire "$OS has no TaxId" } set LeNew {} foreach Access [LaSequenceDuTFAs $Fic "LaListeDesAccess"] { set TFA [LaSequenceDuTFAs $Fic $Access] set Entete [EnteteDuTexteTFA $TFA] set Seq [QueLaSequenceDuTexteTFA $TFA] regsub {\[.+$} $Entete "" Entete append Entete " OS=$OS OX=$OX" set New [SequenceFormatTFA $Seq $Entete "protbrut"] lappend LeNew $New } set FishCode "F[string range $Genre 0 2][string range $Espece 0 1]" if {[info exists DejaVu($FishCode)]} { set FishCode [Entre "$FishCode deja vu"] } set NewName ${FishCode}_[join [split $OS " "] "_"]_$OX lappend LesNotaBene $NewName Espionne $NewName SauveLesLignes $LeNew dans $NewName } OnRevientDuBoulot return $LesNotaBene } proc BiggestHeaderPourTous {{Rep ""}} { if {$Rep==""} { set Rep "." } foreach Fasta [lsort [glob -nocomplain "$Rep/*"]] { set R [BiggestHeader $Fasta] scan $R "%d" M if {$M>600} { Espionne "$Fasta\n$R" } } } proc BiggestHeader {Fichier} { set Max 0 foreach Ligne [LesLignesDuFichier $Fichier] { if { ! [regexp -nocase "^>" $Ligne]} { continue } set L [string length $Ligne] if {$L>$Max} { set Max $L set Biggest $Ligne } } return "$Max $Biggest" } proc OiProteomesDir {} { return "/genomics/link/OrthoInspector_Proteomes/Proteomes2016" } proc OiDomainFromOiCode {OiCode} { return [OiDomain [string index $OiCode 0] Que] } proc OiDomain {{Value ""} {Quoi ""}} { global OiDomain global OIDomainStack #rR Positionne Rend le domaine ou la dir du domaine concerné Euka Bact Arch Virus Qfo #rR Une lettre suffit pour les domaines pour les mots clés il en faut au moins 3 #rR ... mais attention il ne faut pas que les domaines commencent pas les mots clefs listés ci-dessous #rR OiDomain rend le defaut (Eukaryota) ou autre s'il a été modifié précédemment #rR OiDomain B positionne à Bacteria et rend Bacteria #rR OiDomain B Dir positionne à Bacteria et rend /genomics/link/OrthoInspector_Proteomes/Bacteria #rR OiDomain Dir rend /genomics/link/OrthoInspector_Proteomes/Bacteria si c'est le dernier positionné #rR OiDomain Dir B pareil que l'inverse #rR OiDomain Lis rend la liste de ce qui existe #rR On peut mémoriser par OiDomain MemorizeThenSetTo Nouveau #rR .... et dépiler par OiDomain BackToMemorized set ProteomesDir [OiProteomesDir] set LesInitiales {} set LesQueues {} foreach PossibleDir [glob -nocomplain -type "d" "$ProteomesDir/*"] { set Queue [file tail $PossibleDir] if {[regexp "NewSoft" $Queue]} { continue } ;#rR 20220207 if {$Queue=="QFO"} { continue } ;#rR a supprimer !!!!!!!!!!!!!!!!!! lappend LesQueues $Queue set Ini [string index $Queue 0] lappend LesInitiales $Ini set QueueDe($Ini) $Queue } if {$Value=="Ini"} { return $LesInitiales } if {$Quoi=="Que"} { if {[info exists QueueDe($Value)]} { return $QueueDe($Value) } else { return "" } } if {$Value=="Ask"} { set PossibleDirs [lsort [glob -nocomplain -type "d" "$ProteomesDir/*"]] foreach PossibleDir $PossibleDirs { if {[regexpo "NewSoft" $PossibleDir]} { continue } ; #rR 20220207 lappend LesQueue [file tail $PossibleDir] } set Choix [ChoixParmi $LesQueue] if {$Choix==""} { return "" } return [OiDomain $Choix $Quoi] } if { ! [info exists OiDomain]} { if {[OnTraite ArchaeaProteome Like]} { set PossibleDir [glob -nocomplain -type "d" "$ProteomesDir/Archaea"] ; #rR pour enlever NewSoft } elseif {[OnTraite BacteriaProteome Like]} { set PossibleDir [glob -nocomplain -type "d" "$ProteomesDir/B*"] } elseif {[OnTraite EukaryotaProteome Like]} { set PossibleDir [glob -nocomplain -type "d" "$ProteomesDir/E*"] } elseif {[OnTraite TransverseProteome Like]} { set PossibleDir [glob -nocomplain -type "d" "$ProteomesDir/T*"] } elseif {[OnTraite QfoProteome Like]} { set PossibleDir [glob -nocomplain -type "d" "$ProteomesDir/Q*"] } else { set PossibleDir [glob -nocomplain -type "d" "$ProteomesDir/Eukaryota"] ; #rR pour enlever NewSoft } set OiDomain [file tail $PossibleDir] set OIDomainStack [list $OiDomain] } if {[regexp -nocase "^Memo" $Value]} { lappend OiDomainStack $OiDomain set OiDomain $Quoi return $OiDomain } if {[regexp -nocase "BackTo" $Value]} { set OiDomain [lindex $OIDomainStack 0] set OIDomainStack [lrange $OIDomainStack 0 end-1] return $OiDomain } set VAL [string totitle [string range $Value 0 2]] set Quoi [string totitle [string range $Quoi 0 2]] if {$VAL in [list Dir Lis Que]} { set W $VAL set VAL $Quoi set Quoi $W } set V [string toupper [string index $VAL 0]] if {$V!=""} { set Dir "" set Dom "" foreach PossibleDir [glob -nocomplain -type "d" "$ProteomesDir/*"] { Espionne $PossibleDir set Queue [file tail $PossibleDir] if {[regexp "NewSoft" $Queue]} { continue } ; #rR 20220207 if {$Queue=="QFO"} { continue } if {$V==[string toupper [string index $Queue 0]]} { set Dir $PossibleDir set OiDomain $Queue break } } } if {$Quoi=="Que"} { return [lsort $LesQueues] } if {$Quoi=="Lis"} { return [lsort [glob -nocomplain -type "d" "$ProteomesDir/*"]] } if {$Quoi=="Dir"} { return "$ProteomesDir/$OiDomain" } return $OiDomain } proc OiCodeForDomain {Dom args} { set GoBack 0 if {[OiDomain]!=$Dom} { OiDomain "MemorizeThenSetTo" $Dom OiCode "Reset" set GoBack 1 } set R [OiCode {*}$args] if {$GoBack} { OiDomain "BackToMemorized" } return $R } proc OiCreateOrganismXml {{Domaine ""} {DefBkDate ""} {DefBkIdentifier ""} {DefBkDescription ""}} { if {$Domaine==""} { set Domaine [OiDomain] } if {$DefBkDate ==""} { set DefBkDate "2016-11-17" } if {$DefBkIdentifier ==""} { set DefBkIdentifier "UniprotKB" } if {$DefBkDescription ==""} { set DefBkDescription "$DefBkIdentifier - $DefBkDate" } OiDomain "MemorizeThenSetTo" $Domaine set Fichier "[OiCode ProteomesDir]/OtherDB.txt" if {[FileExists $Fichier]} { foreach Ligne [LesLignesDuFichier $Fichier] { set Date "" set Iden "" set Desc "" lassign [split $Ligne "\t"] OX Date Iden Desc set OtherDB($OX,BkDate) $Date set OtherDB($OX,BkIdentifier) $Iden set OtherDB($OX,BkDescription) $Desc } } set LesOX [OiCode ListOf OX] set File "[OiCode NotaBeneDir]/organism.xml" set LeXml {} lappend LeXml "" lappend LeXml "" foreach OX $LesOX { set BkDate $DefBkDate set BkIdentifier $DefBkIdentifier set BkDescription $DefBkDescription if {[info exists OtherDB($OX,BkDate) ]} { set BkDate $OtherDB($OX,BkDate) } if {[info exists OtherDB($OX,BkIdentifier) ]} { set BkIdentifier $OtherDB($OX,BkIdentifier) } if {[info exists OtherDB($OX,BkDescription)]} { set BkDescription $OtherDB($OX,BkDescription) } if {$BkDescription ==""} { set BkDescription "$BkIdentifier - $BkDate" } set OS [OiCode $OX OS] set OI [OiCode $OX OI] set FullFilename [OiCode $OX FullFilename] set Class [TaxClass $OX "TaxId"] Espionne "$OX $OS $OI $FullFilename" scan $OS "%s %s" Genre Espece ; #rR c'était avant 2017/02/02 regsub "$Genre " $OS "" Espece ; #rR on garde tout lappend LeXml " " lappend LeXml " $Genre" lappend LeXml " $Espece" lappend LeXml " $OI" lappend LeXml " $Class" lappend LeXml " " lappend LeXml " " lappend LeXml " $BkDate" lappend LeXml " $BkIdentifier" lappend LeXml " $BkDescription" lappend LeXml " " lappend LeXml " $OX" lappend LeXml " " lappend LeXml " " lappend LeXml " " lappend LeXml " $FullFilename" lappend LeXml " " } lappend LeXml "" set Xml [join $LeXml "\n"] OiDomain "BackToMemorized" set Retour [Sauve $Xml dans $File] return $Retour } proc CreeBlastDatabaseWithOiCode {Domaine {NomBanque ""} {FormatdbOrMakeblastdb ""}} { if {$FormatdbOrMakeblastdb==""} { set FormatdbOrMakeblastdb "makeblastdb" } set LesFasta [OiCodeForDomain $Domaine ListOf FullFilePath] if {$NomBanque==""} { set NomBanque "Oi$Domaine" } set Rep "/blast/OrthoInspector" file mkdir $Rep NousAllonsAuBoulot $Rep if {[file exists $NomBanque] || [file exists $NomBanque.phr]} { if { ! [OuiOuNon "$NomBanque already exist. Do I overwrite"]} { OnRevientDuBoulot; return "" } } set F [open $NomBanque "w"] foreach Fasta $LesFasta { set TFA [ContenuDuFichier $Fasta] puts $F $TFA } close $F if {$FormatdbOrMakeblastdb=="formatdb"} { exec formatdb -i $NomBanque -p T -l $NomBanque.formatdb.log -o } else { exec /biolo/blast/bin/makeblastdb -dbtype prot -in $NomBanque -out $NomBanque -hash_index -parse_seqids } OnRevientDuBoulot return "$Rep/$NomBanque" } proc OrderedClades {Clades {GetWhat ""}} { #rR on trie les Cladespour avoir les plus grosses situées après les plus petites contenues dans les grosses. if {[regexp "," $Clades]} { set Clades [split $Clades ","] } set LesEmpty {} set LesOX {} foreach Clade $Clades { set OX [Tax $Clade TaxId] if {$OX==""} { lappend LesEmpty $Clade ; continue } set CladeOf($OX) $Clade lappend LesOX $OX } #rR ne sert plus ...il suffit de trier bêtement les classes #set LesOrderedOX [lsort -command CompareCladeAncestor $LesOX] foreach OX $LesOX { set Class [TaxClass $OX] lappend LesOrderedClass $Class set OXDeLaClass($Class) $OX } set LesOrderedClass [lsort -decreasing $LesOrderedClass] set LesOrderedOX {} foreach Class $LesOrderedClass { lappend LesOrderedOX $OXDeLaClass($Class) } set LesOrdered {} foreach OX $LesOrderedOX { lappend LesOrdered $CladeOf($OX) } foreach Empty $LesEmpty { lappend LesOrdered $Empty } if {$GetWhat=="JoinedList"} { return [join $LesOrdered ","] } return $LesOrdered } proc TestArClade {} { foreach Ligne [LesLignesDuFichier [GscopeFile AHalma04100 taxobla]] { scan $Ligne "%s %s %s" E S OX Espionne [format "%-30s %s OX = %s" [ArCladeOf $OX Name] [Tax $OX Name] $OX] } } proc TestArchaeaGenomesDeClaudine {} { foreach OS [ClaudineArchaea ListOf OS] { regsub -all " +" [string trim $OS] "_" OS Espionne [format "%-30s %s" [ArCladeOf $OS Name] $OS] } } proc ArCladeOf {{Qui ""} {Quoi ""}} { global ArCladeOf if {$Quoi=="Clade"} { set Quoi "Name" } if {[regexp -nocase "taxid" $Quoi]} { set Quoi "OX" } if {$Quoi=="" && [regexp {^[0-9]+$} $Qui]} { set Quoi "OX" } if {$Quoi=="" && ! [regexp {^[0-9]+$} $Qui]} { set Quoi "Name" } if {[info exists ArCladeOf($Qui,Quoi)]} { return $ArCladeOf($Qui,$Quoi) } set OX [Tax $Qui TaxId] set OS [Tax $Qui Name] foreach CX [ArClade ListOf OrderedOX] CS [ArClade ListOf OrderedName] { if {[JeSuisTonAncetre $CX $OX]} { set ArCladeOf($OX,OX) $CX set ArCladeOf($OS,OX) $CX set ArCladeOf($OX,Name) $CS set ArCladeOf($OS,Name) $CS if {[info exists ArCladeOf($OX,$Quoi)]} { return $ArCladeOf($OX,$Quoi) } } } return "" } proc CompareCladeAncestor {A B} { #rR je crois que ça ne sert plus .. il suffit de trier les classes. #rR attention il y a aussi CompareArCladeAncestor où on a déjà mémorisé if {$A==$B} { return 0 } if {[JeSuisTonAncetre $B $A]} { return -1 } if {[JeSuisTonAncetre $A $B]} { return 1 } return 0 } proc CompareArCladeAncestor {A B} { #rR attention il y a aussi CompareCladeAncestor où on utilise directement JeSuisTonAncetre global ArClade ArClade if {$A==$B} { return 0 } if {[info exists ArClade($B,AncestorOf_$A)]} { return -1 } if {[info exists ArClade($A,AncestorOf_$B)]} { return 1 } return 0 } proc ArCladeOLD {{Qui ""} {Quoi ""}} { global ArClade if {[info exists ArClade($Qui,$Quoi)]} { return $ArClade($Qui,$Quoi) } if {[info exists ArClade("EstCharge")]} { if {[info exists ArClade($Qui,OX)]} { set OX $ArClade($Qui,OX) if {[info exists ArClade($OX,$Quoi)]} { return $ArClade($OX,$Quoi) } } return "" } set ArClade("EstCharge") 1 set Fichier "/home/ripp/vrac/ArClade.txt" set ArClade(Filename,) $Fichier foreach Ligne [LesLignesDuFichier $Fichier] { set Name [string trim $Ligne " \t"] if {$Name==""} { continue } regsub -all " " $Name "_" Name set OX [Tax $Name TaxId] if {$OX==""} { #FaireLire "$Name has no TaxId. I'll use Archaea instead" set Name "Archaea" set OX [Tax $Name TaxId] } set ArClade($Name,Name) $Name set ArClade($OX,OX) $OX set ArClade($Name,OX) $OX set ArClade($OX,Name) $Name lappend ArClade(ListOf,OX) $OX lappend ArClade(ListOf,Name) $Name } set ArClade(ListOf,OX) [lsort -unique $ArClade(ListOf,OX)] set ArClade(ListOf,Name) [lsort -unique $ArClade(ListOf,Name)] foreach A $ArClade(ListOf,OX) { foreach B $ArClade(ListOf,OX) { if {$A==$B} { continue } if {[JeSuisTonAncetre $A $B]} { set ArClade($A,AncestorOf_$B) 1 } } } set ArClade(ListOf,OrderedOX) [lsort -command CompareArCladeAncestor $ArClade(ListOf,OX)] foreach OX $ArClade(ListOf,OrderedOX) { lappend ArClade(ListOf,OrderedName) $ArClade($OX,Name) } #parray ArClade foreach D [list Bacteria Eukaryota Virus] { set N [Tax $D Name] if {$N=="root"} { set N "Other" } lappend ArClade(ListOf,OrderedOX) $D lappend ArClade(ListOf,OrderedName) $N } return [ArClade $Qui $Quoi] } proc ArClade {{Qui ""} {Quoi ""}} { global ArClade if {[info exists ArClade($Qui,$Quoi)]} { return $ArClade($Qui,$Quoi) } if {[info exists ArClade("EstCharge")]} { if {[info exists ArClade($Qui,OX)]} { set OX $ArClade($Qui,OX) if {[info exists ArClade($OX,$Quoi)]} { return $ArClade($OX,$Quoi) } } return "" } set ArClade("EstCharge") 1 set LesClades [LesLignesDuFichier "/genomics/link/OI/fiches/PhylAr_ListOf_PhyOS.txt"] set LesClades [OrderedClades $LesClades] foreach Name $LesClades { set OX [Tax $Name TaxId] if {$OX==""} { #FaireLire "$Name has no TaxId. I'll use Archaea instead" set Name "Archaea" set OX [Tax $Name TaxId] } set ArClade($Name,Name) $Name set ArClade($OX,OX) $OX set ArClade($Name,OX) $OX set ArClade($OX,Name) $Name lappend ArClade(ListOf,OX) $OX lappend ArClade(ListOf,Name) $Name } set ArClade(ListOf,AllOX) $ArClade(ListOf,OX) set ArClade(ListOf,AllName) $ArClade(ListOf,Name) foreach Name [list Bacteria Eukaryota Viruses] { set OX [Tax $Name TaxId] if {$Name=="root"} { set Name "Other" } lappend ArClade(ListOf,AllOX) $OX lappend ArClade(ListOf,AllName) $Name } return [ArClade $Qui $Quoi] } proc ArchaeaGenomesDeClaudine {{GetWhat ""}} { OiDomain A foreach OS [OiCode ListOf OS] { scan $OS "%s %s" Ge Es set GeEs "$Ge$Es" set OX [OiCode $OS OX] #Espionne "$OX $GeEs \t\t$OS" lappend LesOXde($GeEs) $OX } set LesGS {} set Rates 0 set LesMemes {} set LesCommeSoeur {} set LesRates {} set LesClaudine {} set NbAvecSoeur 0 foreach G [ClaudineArchaea ListOf G] { set GX [ClaudineArchaea $G OX] set GS [ClaudineArchaea $G "Organism_Name"] set OS [OiCode $GX OS] set Clade [ArCladeOf $GX Name] lappend LesClaudine [format "%s %9d %-50s %s %s %s" $G $GX $GS Clade = $Clade] if {$OS!=""} { set Meme($GX) 1 lappend LesMemes [format "%-9s %9d %-50s %-80s %s" $G $GX $GS $OS Clade = $Clade] continue } set LesParents [list $GX] set PX $GX while {$OS==""} { set PX [Tax $PX Parent] if {$PX=="" || $PX==1} { break } lappend LesParents $PX set OS [OiCode $PX OS] if {$OS!=""} { Espionne "$LesParents $OS" } } set LesSoeurs {} set PX [Tax $GX Parent] if {$PX!="" && $PX!=1} { foreach OXSoeur [Tax $PX Children] { set OS [OiCode $OXSoeur OS] if {$OS!=""} { lappend LesSoeurs "$OS OX = $OXSoeur" set YaSoeur($OXSoeur) 1 } } if {$LesSoeurs!={}} { incr NbAvecSoeur lappend LesCommeSoeur "" lappend LesCommeSoeur "$G $GX $Clade" lappend LesCommeSoeur $GS foreach Soeur $LesSoeurs { lappend LesCommeSoeur $Soeur } } if {$LesSoeurs!={}} { continue } } lappend LesRates [format "%9s %9d %-40s %s %s %s" $G $GX $GS Clade = $Clade] } foreach OX [OiCode ListOf OX] { if {[info exists Meme($OX)]} { lappend LesMemeQueYannis $OX continue } lappend LesNouveauxDeYannis "$OX [OiCode $OX OS]" } set LesNouveauxDeYannis [lsort -index 1 $LesNouveauxDeYannis] # return [AfficheListe $LesClaudine "" "Ceux de Claudine"] Espionne "[llength $LesClaudine] de Claudine" Espionne "[llength $LesMemes] Memes" Espionne "$NbAvecSoeur AvecSoeur" Espionne "[llength $LesRates] Rates" Espionne "[llength [OiCode ListOf OX]] de Yannis" Espionne "[llength $LesNouveauxDeYannis] Nouveaux chez Yannis" set LesFenetres {} lappend LesFenetres [AfficheListe $LesClaudine "" "Ceux de Claudine"] lappend LesFenetres [AfficheListe $LesMemes "" "LesMemes"] # lappend LesFenetres [AfficheListe $LesCommeSoeur "" "LesSoeurs"] lappend LesFenetres [AfficheListe $LesRates "" "LesRates"] lappend LesFenetres [AfficheListe $LesNouveauxDeYannis "" "LesNouveauxDeYannis"] lappend LesFenetres [AfficheListe [OiCode ListOf Info] "" "Ceux de Yannis"] return $LesFenetres } proc ClaudineArchaea {{Qui ""} {Quoi ""}} { global CA if {[info exists CA($Qui,$Quoi)]} { return $CA($Qui,$Quoi) } if {[info exists CA("EstCharge")]} { return "" } set CA("EstCharge") 1 set Fichier "/home/ripp/vrac/ClaudineArchaea.csv" LoadTxl $Fichier CA 0 ";" "" "WholeLine" set LesG {} set LesOX {} set LesOS {} foreach I $CA(ListOf,Index) { if { ! [regexp "^Go" $I]} { continue } lappend LesG $I set OX [GoldArchaea $I OX] set CA($I,OX) $OX if {$OX!=""} { lappend LesOX $OX lappend LesOS [Tax $OX Name] } } set CA(ListOf,G) $LesG set CA(ListOf,OX) $LesOX set CA(ListOf,OS) $LesOS return [ClaudineArchaea $Qui $Quoi] } proc GoldArchaea {{Qui ""} {Quoi ""}} { global GoldArchaea if {[info exists GoldArchaea($Qui,$Quoi)]} { return $GoldArchaea($Qui,$Quoi) } if {[info exists GoldArchaea($Qui,Go)]} { set Go $GoldArchaea($Qui,Go) if {[info exists GoldArchaea($Go,$Quoi)]} { return $GoldArchaea($Go,$Quoi) } } if {[info exists GoldArchaea("EstCharge")]} { return "" } set GoldArchaea("EstCharge") 1 set Fichier "/home/ripp/gscope/archaeaTax.txt" foreach Ligne [LesLignesDuFichier $Fichier] { lassign [split $Ligne "\t"] Go OS Dom OX Date set Go [string trim $Go] set OS [string trim $OS] set OX [string trim $OX] set Dom [string trim $Dom] set Date [string trim $Date] set GoldArchaea($Go,Go) $Go set GoldArchaea($Go,OS) $OS set GoldArchaea($Go,OX) $OX set GoldArchaea($Go,Dom) $Dom set GoldArchaea($Go,Date) $Date lappend GoldArchaea(ListOf,Go) $Go lappend GoldArchaea(ListOf,OS) $OS lappend GoldArchaea(ListOf,OX) $OX set GoldArchaea($OS,Go) $Go set GoldArchaea($OX,Go) $Go } return [GoldArchaea $Qui $Quoi] } proc OiCodeDoublons {} { set LesE [OiCodeForDomain E ListOf OI] set LesA [OiCodeForDomain A ListOf OI] set LesAE [ListsIntersection $LesA $LesE] Espionne "[llength $LesA] [llength $LesE] [llength $LesAE]" EspionneL $LesAE } proc GeEsFrom {OS} { #rR Normalement on prend Hom sa #rR Mais traitement spécial pour les bactéries qui commencent pas Bac (comme Bacteri Bacill ...) if {[string index [OiDomain] 0]=="B" && [string range [string totitle $OS] 0 2]=="Bac"} { set Ge "B" set FinOS [string range $OS [string first " " $OS] end] regsub -all " " $FinOS "" FinOS regsub -all -nocase {[^a-z0-9]} $FinOS "" FinOS regsub -all {[0-9]} $FinOS "d" FinOS append FinOS "xxxxxx" set Es [string range $FinOS 0 3] } else { scan $OS "%s %s" Ge Es set Ge [string range $Ge 0 2] set Es [string range $Es 0 1] } set GeEs [string totitle "$Ge$Es"] regsub -all {[0-9]} $GeEs "d" GeEs return $GeEs } proc OiCodes {LesQui {Quoi ""} {LesDomaines ""}} { global OiCodes if {[regexp {[ \t\,\;\n\r]+} $LesQui]} { set LesQui [LesMotsDuTexte $LesQui]} #rR il se peut qu'on ait dèjaà tout mémorisé set ToutDejaVu 1 set LaReponse {} foreach Qui $LesQui { if { ! [info exists OiCodes($Qui,$Quoi)]} { set ToutDejaVu 0 ; break } lappend LaReponse "$Qui=$OiCodes($Qui,$Quoi)" } if {$ToutDejaVu} { return [join $LaReponse "\n"] } if {$LesDomaines==""} { #rR 20220207 set LesDomaines [list Archaea Bacteria Eukaryota Transverse] set LesDomaines [list Archaea Bacteria Eukaryota] } else { set LesDomaines [LesMotsDuTexte $LesDomaines] } foreach Domaine $LesDomaines { #OiDomain "MemorizeThenSetTo" $Domaine set ToutTrouve 1 set DomaineCourant $Domaine foreach Qui $LesQui { Espionne "$Domaine $Qui OiCode $Qui $Quoi" if {[info exists QuoiDe($Qui)] && $QuoiDe($Qui)!=""} { continue } Espionne " $Domaine $Qui $Quoi" set Q [OiCodeForDomain $Domaine $Qui $Quoi] if {$Q!=""} { set QuoiDe($Qui) $Q } else { foreach DomainePossible $LesDomaines { #rR on essaie d'abord les autres domaines et on y reste si on trouve if {$DomainePossible==$DomaineCourant} { continue } Espionne "************* $DomainePossible $Qui $Quoi" set QQ [OiCodeForDomain $DomainePossible $Qui $Quoi] if {$QQ!=""} { set Domaine $DomainePossible set QuoiDe($Qui) $QQ continue } } set ToutTrouve 0 } #Espionne "$Qui =$QuoiDe($Qui)=" } if {$ToutTrouve} { break } #OiDomain "BackToMemorized" } set LesQuiQuoi {} foreach Qui $LesQui { set R "" if {[info exists QuoiDe($Qui)]} { set R $QuoiDe($Qui) } lappend LesQuiQuoi "$Qui=$R" set OiCodes($Qui,$Quoi) $R } set QuiQuoi [join $LesQuiQuoi "\n"] return $QuiQuoi } proc OiCode {{Qui ""} {Quoi ""}} { global OiCode JeMeSignale #rR OX est le TaxId, OS le vrai nom de l'organisme, OI le petit nom, OW l'organisme bien écrit #rR On définit ici comment doit s'appeler un organisme son OiCode par exemple EHomsa pour Homo sapiens #rR On nomme les fichiers OI_OW_OX et on rajoute pour chaque entête OI=EHomsa OX=9606 #rR Ces fichiers sont rangés dans le sous-répertoire NotaBene (les bien nommés ! ;) ) #rR OW est en fait le OS en remplaçant les caractères louches par _ #rR Attention Si on veut remplacer NotaBene par autre chose il faut le faire partout ... #rR OiCode tient compte de OiDomain : Archaea Bacteria Eukaryota etc. if {[regexp -nocase "PreFixe" $Quoi]} { set Quoi "OI" } if {$Qui=="Reset"} { if {[info exists OiCode]} { unset OiCode } return "" } if {[info exists OiCode($Qui,$Quoi)]} { return $OiCode($Qui,$Quoi) } if {[info exists OiCode("EstCharge")]} { if {[info exists OiCode($Qui,OX)]} { set OX $OiCode($Qui,OX) if {[info exists OiCode($OX,$Quoi)]} { return $OiCode($OX,$Quoi) } } if {$Qui=="ListOf" && $Quoi=="OXOS"} { set LesOXOS {} foreach OX $OiCode(ListOf,OX) { lappend LesOXOS "$OX $OiCode($OX,OS)" } return $LesOXOS } return "" } set OiCode("EstCharge") 1 set OiFromFullFilename 0 ; #rR 0 on va le chercher dans la première ligne. 1 c'est le premier Homsa_ set OsFromFullFilename 0 ; #rR 0 on va le chercher dans la première ligne. 1 c'est le premier entre les deux autres set OxFromFullFilename 0 ; #rR 0 on va le chercher dans la première ligne. 1 c'est le dernier _9606 set ProteomesDir [OiDomain Dir] set NotaBeneDir "$ProteomesDir/NotaBene" set OiCode(ProteomesDir,) $ProteomesDir set OiCode(NotaBeneDir,) $NotaBeneDir # set Alphabet " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" set Alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ" NousAllonsAuBoulot $ProteomesDir Espionne $ProteomesDir file mkdir NotaBene set FichierBlackList "BlackList.txt" if {[file exists $FichierBlackList]} { foreach Ligne [LesLignesDuFichier $FichierBlackList] { if {[regexp "#" $Ligne]} { continue } scan $Ligne "%d" OX lappend OiCode(ListOf,BlackListed) $OX set OiCode($OX,IsBlackListed) 1 } set OiCode(ListOf,BlackListed) [lsort -unique -integer $OiCode(ListOf,BlackListed)] } set OiCode(ListOf,Filename) {} #rR attention il y a deux manières de procéder ... #rR juste ci dessous on a déjà traité une partie et créé les fichiers OI_OW_OX foreach Fichier [lsort [glob -nocomplain "NotaBene/*"]] { set Queue [file tail $Fichier] set OI "" ; if {$OiFromFullFilename && ! [regexp -nocase {^([a-z]+)_} $Queue Match OI ]} { continue } set OW "" ; if { ! [regexp -nocase {^([a-z]+)_(.+)_([0-9]+)$} $Queue Match debut OW]} { continue } ; #rR On le prend toujours là set OX "" ; if {$OxFromFullFilename && ! [regexp -nocase {_([0-9]+)$} $Queue Match OX ]} { continue } set OS "" ; if {$OsFromFullFilename} { set OS $OW ; regsub -all "_" $OS " " OS } ; #rR Attention c'est pas vraiment le OS d'origine ... set Ligne [PremiereLigneDuFichier $Fichier] regsub -all " = " $Ligne " " Ligne if {$OI=="" && ! [regexp {OI=([^=]+)( [A-Z][A-Z]=|$)} $Ligne Match OI]} { FaireLire "merde $Ligne"; continue } if {$OS=="" && ! [regexp {OS=([^=]+)( [A-Z][A-Z]=|$)} $Ligne Match OS]} { FaireLire "merde $Ligne"; continue } if {$OX=="" && ! [regexp {OX=([^=]+)( [A-Z][A-Z]=|$)} $Ligne Match OX]} { FaireLire "merde $Ligne"; continue } regsub -all {[\[\]']} $OS "" OS set OiCode($OX,OI) $OI set OiCode($OX,OS) $OS set GeEs [GeEsFrom $OS] set OiCode($OX,GeEs) $GeEs if { ! [info exists NbCops($GeEs)]} { set NbCops($GeEs) 0 } set Info [format "%-8s %9d %s" $OI $OX $OS] lappend LesGeEs $GeEs lappend LesOX $OX lappend LesOS $OS incr NbCops($GeEs) set Filename $OS regsub -nocase -all {[^a-z0-9\-_]+} $Filename "_" Filename set OWcalcule [string trim $Filename "_"] if {$OW!=$OWcalcule && [OuiOuNon "from $Fichier\n$OWcalcule is not $OW\nDo I use $OWcalcule"]} { set OW $OWcalcule } set OiCode($OX,OW) $OW set OiCode($OW,OX) $OX set OiCode($OX,Info) $Info set OiCode($Info,OX) $OX set FullFilename "${OI}_${OW}_${OX}" set OiCode($FullFilename,OX) $OX set OiCode($OX,FullFilename) $FullFilename lappend OiCode(ListOfAll,FullFilename) $FullFilename set FullFilePath "$NotaBeneDir/$FullFilename" set OiCode($FullFilePath,OX) $OX set OiCode($OX,FullFilePath) $FullFilePath lappend OiCode(ListOfAll,FullFilePath) $FullFilePath } foreach Fichier [lsort [glob -nocomplain *.fasta]] { if { ! [regexp {^UP[^_]+_([0-9]+).fasta$} $Fichier Match OX]} { if { ! [regexp {_([0-9]+).fasta$} $Fichier Match OX]} { if { ! [regexp {_new_([0-9]+).fasta$} $Fichier]} { FaireLire "Je ne sais pas quoi faire de $Fichier" } continue } if {[info exists OiCode($OX,FullFilename)]} { continue } set FichierNouveau $Fichier regsub {.fasta$} $FichierNouveau "" FichierNouveau append FichierNouveau "_new.fasta" set OX [ConvertFastaToUniprotStandard $Fichier $FichierNouveau] if {$OX==""} { continue } if { ! [regexp {^([0-9]+) is already converted} $OX Match OX]} { set Original "${Fichier}_Original" if {[FileAbsent $Original]} { file rename $Fichier $Original } regsub {_[0-9]+_new.fasta$} $FichierNouveau "_new_$OX.fasta" FichierNouveauNouveau if {[file exists $FichierNouveauNouveau]} { file delete $FichierNouveauNouveau } file rename $FichierNouveau $FichierNouveauNouveau set Fichier $FichierNouveauNouveau } } if {[info exists OiCode($OX,FullFilename)]} { continue } #FaireLire "Tiens ! Un nouveau \n$Fichier\nMerci de vérifier le programme !!!!!!!!!!!!!!!" #rR là on traite des nouveaux ... #rR on le fera en bas avec la ListOf Filename set Ligne [PremiereLigneDuFichier $Fichier] regsub -all " = " $Ligne " " Ligne if { ! [regexp {OS=([^=]+) [A-Z][A-Z]=} $Ligne Match OS]} { FaireLire "ca merde $Ligne"; continue } regsub -all {[\[\]']} $OS "" OS set GeEs [GeEsFrom $OS] set DomaineConnu 0 if {[string index [OiDomain] 0]=="A"} { set GeEs "A$GeEs" ; set DomaineConnu 1 } if {[string index [OiDomain] 0]=="B"} { set GeEs "B$GeEs" ; set DomaineConnu 1 } if {[string index [OiDomain] 0]=="E"} { set GeEs "E$GeEs" ; set DomaineConnu 1 } if {[string index [OiDomain] 0]=="V"} { set GeEs "V$GeEs" ; set DomaineConnu 1 } if {[string index [OiDomain] 0]=="Q"} { set GeEs "Q$GeEs" ; set DomaineConnu 1 } if { ! $DomaineConnu } { set GeEs "X$GeEs" } if { ! [info exists NbCops($GeEs)]} { set NbCops($GeEs) 0 } set Info [format "%-8s %9d %s" $GeEs $OX $OS] set OiCode($OX,Info) $Info ; #rR il changera peut-être si deux ont le même GeEs lappend LesGeEs $GeEs lappend LesOX $OX lappend LesOrga $OS incr NbCops($GeEs) set Filename $OS regsub -nocase -all {[^a-z0-9\-_]+} $Filename "_" Filename set OWcalcule [string trim $Filename "_"] set OiCode($OX,OW) $OWcalcule set Filename "${OWcalcule}_${OX}" ; #rR attention ici on ne connait pas encore OI set OiCode($OX,Filename) $Filename lappend OiCode(ListOf,Filename) $Filename set OiCode($OX,Origine) $Fichier set OiCode($OX,OS) $OS } foreach GeEs $LesGeEs OX $LesOX { lappend OiCode(ListOf,GeEs) $GeEs set OI "" set Info $OiCode($OX,Info) if {! [info exists OiCode($OX,OI)]} { set OI $GeEs if {$NbCops($GeEs)==1} { set OiCode($GeEs,NbCops) 1 } else { if { ! [info exists OiCode($GeEs,NbCops)]} { set OiCode($GeEs,NbCops) 0 } incr OiCode($GeEs,NbCops) set N [expr $OiCode($GeEs,NbCops) - 1] if {$NbCops($GeEs)<=26} { set Car [string index $Alphabet $N] } else { set D [expr $N/26] set U [expr $N%26] set Car "[string index $Alphabet $D][string index $Alphabet $U]" } append OI $Car } set OiCode($OX,OI) $OI set Info [format "%-8s %9d %s" $OI $OX $OS] } set OW $OiCode($OX,OW) set OS $OiCode($OX,OS) set OI $OiCode($OX,OI) set OiCode($OX,Info) $Info set OiCode($Info,OX) $OX lappend OiCode($GeEs,ListOfOX) $OX lappend OiCode($GeEs,ListOfOI) $OI lappend OiCode($GeEs,ListOfOS) $OS lappend OiCode($GeEs,ListOfInfo) $Info set OiCode($OX,OX) $OX if {[info exists OiCode($OX,FullFilename)]} { set OiCode($OX,Fasta) "$ProteomesDir/$OiCode($OX,FullFilename)" } set OiCode($OI,OX) $OX set OiCode($OS,OX) $OX lappend LesOS $OS lappend LesOW $OW lappend LesOI $OI } set LesOX [lsort -integer $LesOX] set LesOS [lsort -unique $LesOS] set LesOW [lsort -unique $LesOW] set LesOI [lsort -unique $LesOI] foreach OI $LesOI { set OX $OiCode($OI,OX) lappend LesInfo $OiCode($OX,Info) } if {1} { foreach Filename $OiCode(ListOf,Filename) { #if { ! [OuiOuNonMemo "Do I add OI and OX to this new fasta file"]} { Espionne "Skip $Filename" ; continue } if { ! [regexp {_([0-9]+)$} $Filename Match OX]} { continue } if { ! [info exists OiCode($OX,OI)]} { FaireLire "Merde $Filename" } set OI $OiCode($OX,OI) set FullFilename "${OI}_$Filename" set FastaFile "NotaBene/$FullFilename" set OW "" if { ! [regexp -nocase {^([a-z]+)_(.+)_([0-9]+)$} $FullFilename Match debut OW]} { FaireLire "$FastaFile has no correct format" continue } set OiCode($OW,OX) $OX set OS [Tax $OX Name] regsub -all "'" $OS "" OS set OiCode($OS,OX) $OX set Info [format "%-8s %9d %s" $OI $OX $OS] set OiCode($OW,OX) $OX set OiCode($Info,OX) $OX if {[FileAbsent $FastaFile]} { set Origine $OiCode($OX,Origine) set Nouveau [RajouteEnFinDeEnteteFasta $Origine " OI=$OI OX=$OX" $FastaFile] } set FullFilename "$FastaFile" set OiCode($OX,FullFilename) $FullFilename set OiCode($FullFilename,OX) $OX lappend OiCode(ListOf,FullFilename) $FullFilename set FullFilePath "$ProteomesDir/$FastaFile" set OiCode($OX,FullFilePath) $FullFilePath set OiCode($FullFilePath,OX) $OX lappend OiCode(ListOf,FullFilePath) $FullFilePath Espionne $FullFilePath } } set OiCode(ListOfAll,OX) $LesOX set OiCode(ListOfAll,OI) $LesOI set OiCode(ListOfAll,OS) $LesOS set OiCode(ListOfAll,OW) $LesOW set OiCode(ListOfAll,Info) $LesInfo foreach K [list OX OI OS OW Info FullFilePath FullFilename] { set OiCode(ListOf,$K) {} if { ! [info exists OiCode(ListOfAll,$K)]} { Espionne "OiCode(ListOfAll,$K) does not exist"; continue } foreach V $OiCode(ListOfAll,$K) { if {! [info exists OiCode($V,OX)]} { #Espionne $OX #Espionne $K #Espionne $V continue } set OX $OiCode($V,OX) if {[info exists OiCode($OX,IsBlackListed)]} { continue } lappend OiCode(ListOf,$K) $V } } OnRevientDuBoulot return [OiCode $Qui $Quoi] } proc OiProteomeSize {Qui} { global OiProteomeSize if {[info exists OiProteomeSize($Qui)]} { return $OiProteomeSize($Qui) } if {[info exists OiProteomeSize("EstCharge")]} { return "" } set OiProteomeSize("EstCharge") 1 set FichierMemo "[OiCode NotaBeneDir]/proteomesize_memo.txt" if {[file exists $FichierMemo]} { array set OiProteomeSize [ContenuDuFichier $FichierMemo] return [OiProteomeSize $Qui] } foreach OX [OiCode ListOf OX] { set OI [OiCode $OX OI] set Path [OiCode $OX FullFilePath] if {[FileAbsent $Path]} { continue } set L [exec sh -c "grep '^>' $Path | wc -l"] set OiProteomeSize($OX) $L set OiProteomeSize($OI) $L set All "$L $OX $OI" lappend OiProteomeSize(All) $All } Sauve [array get OiProteomeSize] dans $FichierMemo return [OiProteomeSize $Qui] } proc ConvertFastaToUniprotStandard {Fichier NewFichier} { if { ! [regexp {^.+_([0-9]+).fasta$} $Fichier Match OX]} { return "" } set OS [Tax $OX Name] if {$OS==""} { return "" } if {[regexp "_new_$OX.fasta" $Fichier] && [regexp {OR=} [PremiereLigneDuFichier $Fichier]]} { Espionne "$Fichier is already converted" return "$OX is already converted" } set LeNew {} foreach Ligne [LesLignesDuFichier $Fichier] { if { ! [regexp "^>" $Ligne]} { lappend LeNew $Ligne ; continue } scan $Ligne "%s" Access regsub -all ">" $Access "" Access set Gene "" ; regexp { gene=([^ ]+) } $Ligne Match Gene set Tran "" ; regexp { transcript=([^ ]+) } $Ligne Match Tran set Prod "" ; regexp { gene_product=([^\|]+) \|} $Ligne Match Prod #if {$Gene!=""} { set Access "$Gene" } if {$Tran!=""} { set Access "$Tran" } set Origine $Ligne regsub -all ">" $Origine "" Origine regsub -all "=" $Origine ":" Origine regsub -all {\|} $Origine "" Origine regsub -all { +} $Origine " " Origine set Origine [string trim $Origine] set TexteProd "" if { 0 && $Prod!=""} { set TexteProd " $Prod" } ; #rR attention on ne met plus Prod set TexteGN "" if {$Gene!=""} { set TexteGN " GN=$Gene" } set Entete ">${Access}_$OX OS=$OS$TexteGN OR=$Origine" lappend LeNew $Entete } SauveLesLignes $LeNew dans $NewFichier return $OX } proc RefaireLesProteomesNonUniprotStandard {{Domaine ""}} { if {$Domaine==""} { set Domaine [OiDomain] } NousAllonsAuBoulot "/genomics/link/OrthoInspector_Proteomes/$Domaine" foreach Fichier [lsort [glob -nocomplain "*fasta_Original"]] { Espionne Espionne $Fichier set OX "" if { ! [regexp {_([0-9]+)\.fasta_Original$} $Fichier Match OX]} { continue } Espionne $OX foreach NewCree [glob -nocomplain "*_new_$OX.fasta"] { Espionne $NewCree file delete $NewCree } foreach NB [glob -nocomplain "NotaBene/*_$OX"] { Espionne $NB file delete $NB } set FastaAConvertir "" regsub {_Original$} $Fichier "" FastaAConvertir file copy -force $Fichier $FastaAConvertir } OnRevientDuBoulot }