OUTPUT BUFFER:
*proc AnnotationXml {FichierAnnotation {Quoi ""} args} { #FichierAnnotation "" "FichierMacsims.xml" ?"query"? #FichierAnnotation "GO" "FichierGeneOntology.xml" #FichierAnnotation "EC" "SortieDeProcedureEC" #FichierAnnotation "DE" "SortieDeProcedureMeilleureDef" #FichierAnnotation "PFAM" "SortieDeProcedurePFAM" # Lit xml existant ou crée document vide if {[file isfile $FichierAnnotation]} { set fh [open $FichierAnnotation "r"] dom parse -channel $fh doc close $fh $doc documentElement root } else { dom createDocument "annotation" doc $doc documentElement root #$root appendChild [$doc createElement "macsims"] #$root appendChild [$doc createElement "ec"] #$root appendChild [$doc createElement "gene_ontology"] #$root appendChild [$doc createElement "definition"] #$root appendChild [$doc createElement "pfam"] } # Création des noeuds principaux s'ils n'existent pas encore foreach n [list "macsims" "ec" "gene_ontology" "definition" "pfam"] { if {[llength [$root selectNodes "/annotation/$n"]] == 0} { $root appendChild [$doc createElement $n] } } if {$Quoi eq ""} { set FichierMacsims [lindex $args 0] set Query [lindex $args 1] if {$Query eq ""} {set Query [regexp -inline {^[^.]+} [file tail $FichierMacsims]]} if {[file isfile $FichierMacsims]} { # Tente de parser le fichier MACSIMS set retryCount 5 while {$retryCount && [catch { ParseMACSIMS $FichierMacsims macsims }]} { incr retryCount -1 } if {!$retryCount} {error "Probleme avec $FichierMacsims"} # Récupère le groupe de la query set groupeQuery $macsims(Groupe,$macsims($Query,Groupe)) # Récupère le noeud macsims set macsimsNode [$root selectNodes "/annotation/macsims"] # Supprime tous les noeud enfants foreach node [$macsimsNode childNodes] {$node delete} # ... et les attributs foreach attrib [$macsimsNode attributes] {$macsimsNode removeAttribute $attrib} # Crée les commandes de creation de noeuds dom createNodeCmd "elementNode" AnnotationXml::normd dom createNodeCmd "elementNode" AnnotationXml::cluster dom createNodeCmd "elementNode" AnnotationXml::query dom createNodeCmd "elementNode" AnnotationXml::access dom createNodeCmd "textNode" AnnotationXml::text $macsimsNode appendFromScript { AnnotationXml::normd {AnnotationXml::text $macsims(Alignement,Score)} AnnotationXml::cluster "size" [llength $groupeQuery] { AnnotationXml::query {AnnotationXml::text $Query} foreach nom $groupeQuery { if {$nom ne $Query} { AnnotationXml::access {AnnotationXml::text $nom} } } } } } } elseif {$Quoi eq "EC"} { set SortieDeProcedure [lindex $args 0] if {[llength $SortieDeProcedure] == 3} { set commun [lindex $SortieDeProcedure 0] set lClasses [lindex $SortieDeProcedure 1] set lECs [lindex $SortieDeProcedure 2] } else { set commun "" set lClasses "" set lECs "" } # Récupère le noeud ec set ecNode [$root selectNodes "/annotation/ec"] # Supprime tous les noeud enfants foreach node [$ecNode childNodes] {$node delete} # ... et les attributs foreach attrib [$ecNode attributes] {$ecNode removeAttribute $attrib} if {$commun ne "" && $lClasses ne "" && $lECs ne ""} { # Crée les commandes de creation de noeuds dom createNodeCmd "elementNode" AnnotationXml::common dom createNodeCmd "elementNode" AnnotationXml::classes dom createNodeCmd "elementNode" AnnotationXml::class dom createNodeCmd "elementNode" AnnotationXml::sources dom createNodeCmd "elementNode" AnnotationXml::source dom createNodeCmd "textNode" AnnotationXml::text $ecNode appendFromScript { AnnotationXml::common {AnnotationXml::text $commun} AnnotationXml::classes { foreach {classe def} $lClasses { AnnotationXml::class "number" $classe {AnnotationXml::text $def} } } AnnotationXml::sources { foreach liste $lECs { foreach {access ec} $liste {} AnnotationXml::source "ec" $ec { AnnotationXml::text $access } } } } } } elseif {$Quoi eq "GO"} { set FichierGeneOntology [lindex $args 0] if {[file isfile $FichierGeneOntology]} { # Parse le fichier GOAnno ParseGOAnno $FichierGeneOntology goanno # Récupère toute la hiérarchie go des parents set ascendants {} foreach go [concat $goanno(GPO,BiologicalProcess,GOs) $goanno(GPO,CellularComponent,GOs) $goanno(GPO,MolecularFunction,GOs)] { set ascendants [concat $ascendants [TousLesAscendantsGO $go]] } set ascendants [lsort -dictionary -index 2 [lsort -unique $ascendants]] # Récupère le noeud gene ontology set goNode [$root selectNodes "/annotation/gene_ontology"] # Supprime tous les noeud enfants foreach node [$goNode childNodes] {$node delete} # ... et les attributs foreach attrib [$goNode attributes] {$goNode removeAttribute $attrib} # Crée les commandes de creation de noeuds dom createNodeCmd "elementNode" AnnotationXml::gpo dom createNodeCmd "elementNode" AnnotationXml::hierarchy dom createNodeCmd "elementNode" AnnotationXml::go dom createNodeCmd "textNode" AnnotationXml::text $goNode appendFromScript { AnnotationXml::gpo { foreach {type xmlType ontoType} [list "BiologicalProcess" "biological_process" "process" "CellularComponent" "cellular_component" "component" "MolecularFunction" "molecular_function" "function"] { foreach go $goanno(GPO,$type,GOs) { set niv [lsort -unique [Onto $ontoType $go "LesNiveaux"]] set parents [Onto $ontoType $go "LesParents"] AnnotationXml::go "id" $go "type" $xmlType "levels" $niv "parents" $parents { AnnotationXml::text $goanno(GPO,$type,$go,Definition) } } } } AnnotationXml::hierarchy { foreach goList $ascendants { foreach {go type niv def parents} $goList {} if {$type == "process"} { set type "biological_process" } elseif {$type == "component"} { set type "cellular_component" } elseif {$type == "function"} { set type "molecular_function" } AnnotationXml::go "id" $go "type" $type "levels" $niv "parents" $parents { AnnotationXml::text $def } } } } } } elseif {$Quoi eq "DE"} { set SortieDeProcedure [lindex $args 0] set score [lindex $SortieDeProcedure 0] set def [lindex $SortieDeProcedure 1] # Récupère le noeud gene ontology set deNode [$root selectNodes "/annotation/definition"] # Supprime tous les noeud enfants foreach node [$deNode childNodes] {$node delete} # ... et les attributs foreach attrib [$deNode attributes] {$deNode removeAttribute $attrib} if {$score ne "" && $def ne ""} { # Crée les commandes de creation de noeuds dom createNodeCmd "textNode" AnnotationXml::text $deNode setAttribute "score" $score $deNode appendFromScript { AnnotationXml::text $def } } } elseif {$Quoi eq "PFAM"} { set SortieDeProcedure [lindex $args 0] # Récupère le noeud pfam set pfNode [$root selectNodes "/annotation/pfam"] # Supprime tous les noeud enfants foreach node [$pfNode childNodes] {$node delete} # ... et les attributs foreach attrib [$pfNode attributes] {$pfNode removeAttribute $attrib} if {[llength $SortieDeProcedure] != 0} { # Crée les commandes de creation de noeuds dom createNodeCmd "elementNode" AnnotationXml::pfam_a dom createNodeCmd "textNode" AnnotationXml::text $pfNode appendFromScript { foreach lPf $SortieDeProcedure { foreach {access type accessPf dePf from longueurSeq} $lPf {} AnnotationXml::pfam_a "access" $accessPf "from" $from "length" $longueurSeq { AnnotationXml::text $dePf } } } } } # Sauve le fichier set fh [open $FichierAnnotation "w"] puts $fh "" $doc asXML -channel $fh -doctypeDeclaration 0 close $fh $doc delete }