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

#rR gscope_webservice.tcl

proc IdCard {Document {Quoi ""}} {
    #rR Attention je triche pour les retour a la ligne qui compte pour 2 carac en php mais pas en tcl
    #rR Attention je triche en php en faisant utf8_decode pour tout les chmaps

    global IdCard

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

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

    set Url "[LbgiUrl]/puzz/phpRR/lance.php?action=IdCard::card&document=$Document&getwhat=GetCard"
    set Serial [ContenuDuFichier $Url]
    regsub -all "\n" $Serial "@!" Serial
    ArrayFromSerial $Serial TabCard

    set LesT {}
    set LesC {}
    foreach i [lsort -integer [array names TabCard]] {
	lassign $TabCard($i) t T c C
	set T [lindex $T 1]
	set C [lindex $C 1]
	regsub -all "@!" $C "\n" C 
	lappend IdCard($Document,ListOfFields) $T
	set IdCard($Document,$T) $C
    }
    return [IdCard $Document $Quoi]
}

proc Cps {{Pattern ""} {Genome ""} {Mismatch ""} {GetWhat ""}} {

    regsub -all -nocase {[^A-Z]} $Pattern "" Pattern

    if {$Genome==""} { set Genome "human_2006_nomask" }
    if {$Mismatch==""} { set Mismatch 0 }
    set Pattern [string trim $Pattern]
    if {[string length $Pattern] < 5} { return "Error: Pattern contain at least $MinLength bases" } 
    set    UrlCps "http://kilida.u-strasbg.fr:8086/CST_Java_Servlet/InterfaceWebCST?action=search&access_program=1"
    append UrlCps "&genome=$Genome"
    append UrlCps "&pattern=$Pattern"

    Espionne $UrlCps
    set LesHits {}
    set LeNice {}
    foreach Ligne [LesLignesDuFichier $UrlCps] {
Espionne $Ligne
	set C ""; set S ""; set D ""; set F ""; set H ""
	if { ! [regexp -nocase {^chr[^1-9XY]*([0-9XY]+) +\(?([FBR\+\-])\)? +([0-9]+)[ \-]+ ([0-9]+) +[^A-Z]*([A-Z]+)} $Ligne Match C S D F H]} { continue }
	regsub -nocase {[F]}  $S "+" S
	regsub -nocase {[RB]} $S "-" S
	set C "chr$C"
	lappend LesHits "$C:$D-${F}($S) $H"
	lappend LeNice [format "%-5s %9d %9d (%s) %s" $C $D $F $S $H]
    }
    if {$GetWhat=="Show"}    { return [AfficheListe $LeNice "" "Hits on $Genome"] }
    if {$GetWhat=="GetNice"} { return [join $LeNice "\n"] }
    if {$GetWhat=="GetText"} { return [join $LesHits "\n"] }
    return $LesHits
}

proc Login {} {
    global env
    set Login $env(LOGNAME)
    return $Login
}

proc AddLinxTest {} {
    return [AddLinx "poch" "" "http://raymondripp.fr" "Le site de RR" "public"]
}
 
proc AddLinx {{Login ""} {LinkName ""} {Link ""} {Description ""} {Belongs ""}} {
    if {$LinkName==""} { set LinkName [Entre "FromGscope"] }
    if {$Login==""} { set Login [Login] }
    if {$Link==""}        { set Link64 "" } else { set Link64 [Base64Encode $Link] }
    if {$Description==""} { set Desc64 "" } else { set Desc64 [Base64Encode $Description] }
    if {$Belongs==""}     { set Belo64 "" } else { set Belo64 [Base64Encode $Belongs] }
    set Url "[LbgiUrl]/MyLinx.php?do=addlinx&lo=$Login&ln=$LinkName&li=$Link64&de=$Desc64&be=$Belo64"
    set Status [ContenuDuFichier $Url]
#rR faut il le faire ici   ????????????????????????
    MyLinx ResetMyLinx
    return $Status
}

proc MyLinx {{Qui ""} {Quoi ""}} {
    global MyLinx
    if {$Qui=="ResetMyLinx"} { unset -nocomplain MyLinx ; return "" }
    set Login [Login]
    if {[info exists MyLinx($Qui,$Quoi)]}  { return $MyLinx($Qui,$Quoi) }
    if {[info exists MyLinx("EstCharge")]} { return "" }
    set MyLinx("EstCharge") 1
    set Url "[LbgiUrl]/MyLinx.php?login=$Login&getwhat=GetSerial"
    set Serial [ContenuDuFichier $Url]
    set MLX [SeriallistFromSerial $Serial]
    foreach {sLn sLnLiDeBe} [lindex $MLX 1] {
	set Ln [lindex $sLn 1]
	lappend MyLinx(ListOf,LinkName) $Ln
	foreach {sK sV} [lindex $sLnLiDeBe 1] {
	    set K [lindex $sK 1]
	    set V [lindex $sV 1]
	    set MyLinx($Ln,$K) $V
	}
    }
    return [MyLinx $Qui $Quoi]
}

proc TestQsub {{GetWhat ""}} {
    set S "-b y pwd"
    set S "tcsh -c 'pwd; hostname; pwd; ls'"
    return [Qsub $S $GetWhat "" "" "" ""]
}

proc Qsub {CommandeOuFichier {GetWhat ""} {O ""} {E ""} {Q ""} {Options ""}} {

    if {[regexp {^(sh|csh|bash|tcsh|tclsh|java) } $CommandeOuFichier]} {
	set CommandeOuFichier "-b y $CommandeOuFichier"
    }
    if {[regexp -- {^\-b y } $CommandeOuFichier]} {
	append Options " -b y"
	regsub -- {^\-b y } $CommandeOuFichier "" CommandeOuFichier
    }
    set Binary [regexp -- {-b y} $Options]

    set Notice [expr ! [regexp -nocase "NoNotice" $GetWhat]]
    regsub -nocase "NoNotice" $GetWhat "" GetWhat
    if {$GetWhat==""} { set GetWhat "GetAll" }

    if {$Q==""} { set Q "qsub" }
    if { ! $Binary && [regexp {[ ;]} $CommandeOuFichier]} {
	set ScriptFile "[TmpFile Qsub].tcsh"
	Sauve $CommandeOuFichier dans $ScriptFile
	file attribute $ScriptFile -permissions 0775
	if {$O==""} { regsub ".tcsh$" $ScriptFile ".log" O }
    } else {
	set ScriptFile $CommandeOuFichier
    }
    if {$O==""} { set O "[TmpFile Qsub].log" }
    if {$E==""} { set E $O }
    if {$E=="Oerror"} { regsub ".log$" $O "_error.log" E }
    
    set QsubCommand "\"source /usr/N1GE6/default/common/settings.csh ; $Q -l arch=lx24-amd64 -o $O -e $E -cwd -V $Options $ScriptFile\""
    if { ! [regexp -nocase "NoEval" $GetWhat]} {
	if {$Notice} { AppendAuFichier $O "[Date _] I run $Q\n$QsubCommand\n**********\n" }
	set Retour [eval exec tcsh -c $QsubCommand]
    }
    if {[regexp -nocase "GetCommand" $GetWhat] } { return $QsubCommand }
    if {[regexp -nocase "GetO"       $GetWhat] } { return $O }
    if {[regexp -nocase "GetE"       $GetWhat] } { return $E }
    if {[regexp -nocase "GetAll"     $GetWhat] } { return [list $O $E $QsubCommand $Retour] }
    return $Retour
}

proc WebServiceOOOOOOOOOOLD {Qui Commande args} {
    #rR args est une liste key value key value key value

    set Url [WebServiceUrl $Qui]
    
    set QueryEncode [eval ::http::formatQuery "webcommand" $Commande $args]

    Espionne $QueryEncode

    set Token [eval ::http::geturl $Url -query $QueryEncode]
    set Retour [::http::data $Token]
    set Retour [string trim $Retour]

    set iGetWhat [lsearch $args "getwhatfromserial"]
    if {$iGetWhat>=0} {
	set GetWhat [lindex $args [incr iGetWhat]]
	if {$GetWhat=="GetList"}       { return [ListFromSerial $Retour] }
	if {$GetWhat=="GetFirstValue"} { return [FirstElementFromSerial $Retour] }
    } 

    return $Retour
}

proc TestWebServiceOLD {} { ;#rR ????????
    package require http

    return [WebService "http://www.uniprot.org/mapping/?" toto [list from ACC to P_REFSEQ_AC format tab query P13368]]    
}

proc TestWebService {} {
    set R [WebService "Gx" Execute \
	       querytext "GxFun::SignalIntensity&&0&1&301&&T&&&GeneAsText&limit 10"]
    return $R

    set R [WebService "Gx" GxDbSqlExec querytext "select name,pk_tissue from tissue" getwhatfromserial "GetList"]
    return $R

    set R [WebService "Gx" GxDbSqlExec \
	    querytext "select probeset_id,pk_probeset from probeset where probeset_id in ('1415670_at','1415672_at');" \
	    getwhatfromserial "GetList"]
    return $R

}

proc WebService {Qui Commande args} {
    #rR args est une liste key value key value key value
    #rR pour Execute il faut utiliser querytext 
    #rR voir les exemples dans TestWebService

    package require http

    set Url [WebServiceUrl $Qui]
    
    if {$Commande==""} {
	set QueryEncode [::http::formatQuery                        {*}$args]
    } else {
	set QueryEncode [::http::formatQuery "webcommand" $Commande {*}$args]
    }
#    set QueryEncode [::http::formatQuery from ACC to P_REFSEQ_AC format tab query P13368]

#    Espionne $QueryEncode

    set Token  [::http::geturl $Url -query $QueryEncode]
    set Retour [::http::data $Token]
    set Retour [string trim $Retour]

    set iGetWhat [lsearch $args "getwhatfromserial"]
    if {$iGetWhat>=0} {
	set GetWhat [lindex $args [incr iGetWhat]]
	if {$GetWhat=="GetList"}       { return [ListFromSerial $Retour] }
	if {$GetWhat=="GetFirstValue"} { return [FirstElementFromSerial $Retour] }
    } 

    return $Retour
}

proc FirstElementFromSerial Texte {
    set LesKV [ListFromSerial $Texte]
    set V [lindex $LesKV 0]
    return $V
}

proc ValueFromSerial Texte {
    return [ValueFromSeriallist [SeriallistFromSerial $Texte]]
}

proc ArrayFromSerial {Texte aT} {
    upvar $aT T
    return [ArrayFromSeriallist [SeriallistFromSerial $Texte] T]
}

proc ListFromSerial {Texte} {
    return [ListFromSeriallist [SeriallistFromSerial $Texte]]
}

proc ValueFromSeriallist Liste {
    return [lindex $Liste 1]
}

proc ArrayFromSeriallist {Liste aT} {
    upvar $aT T
    foreach {K V} [lindex $Liste 1] {
	set T([ValueFromSeriallist $K]) [ValueFromSeriallist $V]
    }
    return $aT
}

proc ListFromSeriallist {Liste} {
    set L {}
    foreach {K V} [lindex $Liste 1] {
	lappend L [ValueFromSeriallist $V]
    }
    return $L
}

proc TestSeriallistFromSerial {{F ""}} {
    if {$F!=""} { 
	set Texte [ContenuDuFichier $F]
    } else {
	set Texte "a:4:{i:0;s:10:\"1415670_at\";i:1;s:6:\"270637\";i:2;s:10:\"1415672_at\";i:3;s:6:\"270639\";}"
    }
#    ArrayFromSerial $Texte A
#parray A
#    exit
    set R [SeriallistFromSerial $Texte]
    return $R

    set A(coucou) 1
    ArrayFromSerial $Texte A
parray A
    exit
}

proc SeriallistFromSerial {Texte} {
    set fin [string length $Texte]
    set deb 0
    return [RecurSeriallistFromSerial Texte deb $fin]
}

proc RecurSeriallistFromSerial {aTexte aiT fin} {
    upvar $aTexte Texte
    upvar $aiT iT
    while {[set Prem [string index $Texte $iT]] eq ";" || $Prem eq ":" || $Prem eq "\}"} { incr iT }
    if {$iT>=$fin} { return {} }
    if {0 && $iT%1000==0} { Espionne $iT }    
    set X [string index $Texte $iT]

    if {$X=="N"} {
	incr iT 2
	return ""
    } 
    if {$X=="i" || $X=="d"} {
	set V ""
	incr iT 2
	while 1 {
	    set Z [string index $Texte $iT]
	    incr iT
	    if {$iT > $fin} { return "ERROR scanning_{$X}_in_$Texte" }
	    if {$Z eq ";"} { break }
	    append V $Z
	}
	set Liste [list "i" $V]
	return $Liste
    }
    if {$X=="s"} {
	set N ""
	incr iT 2
	while 1 {
	    set Z [string index $Texte $iT]
	    incr iT
	    if {$iT > $fin} { return "ERROR scanning_{$X}_in_$Texte" }
	    if {$Z eq ":"} { break }
	    append N $Z
	}
	incr iT 1                 ;# on passe le "
	set d [expr $iT]
	set f [expr $iT+$N-1]
	set S [string range $Texte $d $f]
	set Liste [list "s" $S]
	incr iT $N
	incr iT
	return $Liste
    }
    if {$X=="a"} {
	set N ""
	incr iT 2
	while 1 {
	    set Z [string index $Texte $iT]
	    incr iT
	    if {$iT > $fin} { return "ERROR scanning_{$X}_in_$Texte" }
	    if {$Z eq ":"} { break }
	    append N $Z
	}
	incr iT
	set LKV {}
	for {set i 0} {$i<$N} {incr i} {
	    lappend LKV [RecurSeriallistFromSerial Texte iT $fin] [RecurSeriallistFromSerial Texte iT $fin]
	}
	set Liste [list "a" $LKV]
	return $Liste
    }
    return "ERROR scanning_unknown_{$X}_in_$Texte"
}

proc WithWebService {{Qui ""} {Valeur ""}} {
    global WithWebService

    if {[string equal -nocase $Valeur "TestIfExists"]} { return [info exists WithWebService($Qui)] }

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

    if {$Valeur!=""} { set WithWebService($Qui) $Valeur}
    if {[info exists WithWebService($Qui)]} { return $WithWebService($Qui) }
    set WithWebService($Qui) 1
    return [WithWebService $Qui]
}

proc ArraytypeWithPipeWork {{Qui ""} {Valeur ""}} {
    global ArraytypeWithPipeWork

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

    if {$Valeur!=""} { set ArraytypeWithPipeWork($Qui) $Valeur}
    if {[info exists ArraytypeWithPipeWork($Qui)]} { return $ArraytypeWithPipeWork($Qui) }
    set ArraytypeWithPipeWork($Qui) 1
    return [ArraytypeWithPipeWork $Qui]
}

proc WebServiceUrl {{Qui ""}} {
    if {$Qui=="GxDb"   } { return "http://gx.lbgi.fr/gx/phpRR/lance.php?action=Munitions::WebService" }
    if {$Qui=="Gx"     } { return "http://gx.lbgi.fr/gx/phpRR/lance.php?action=Munitions::WebService" }
    if {$Qui=="Genoret"} { return "http://genoret.lbgi.fr/genoret/phpRR/lance.php?action=Munitions::WebService" }
    return $Qui
}

proc CreateArrayFromList {aT Index Liste} {
    upvar $aT T

    foreach a $Liste {
	set T($Index) $a
	incr Index
    }
    return $aT
}

proc CreateArray {aT Index args} {
    upvar $aT T

    return [CreateArrayFromList T $Index $args]
}

proc PhpSerialize {aT {TypeK ""} {TypeV ""}} {
    upvar $aT T
    return [SerialFromArray T $TypeK $TypeV]
} 

proc SerialFromArray {aT {TypeK ""} {TypeV ""}} {
    upvar $aT T

    if {$TypeK==""} { set TypeK "s" }
    if {$TypeV==""} { set TypeV "s" }

    set LesKey [lsort -integer [array names T]]
    set N [llength $LesKey]
    set LesElements {}
    foreach K $LesKey {
	set V $T($K)
	if {$TypeK=="i"} {
	    set EK "i:$K"
	} else {
	    set LK [string length $K]
	    set EK "s:$LK:\"$K\""
	}
	if {$TypeV=="i" || $TypeV=="d"} {
	    set EV "$TypeV:$V"
	} else {
	    set LV [string length $V]
	    set EV "s:$LV:\"$V\""
	}
	lappend LesElements "$EK;$EV"
    }
    set Elements [join $LesElements ";"]
    set S "a:$N:{$Elements;}"
    return $S
    
} 

proc SerialFromList {Liste} {
    CreateArrayFromList T 0 $Liste
    return [SerialFromArray T "i" "s"]
} 

proc SerialFromLinesOfFile {File} {
    set Liste [LesLignesDuFichier $File]
    CreateArrayFromList T 0 $Liste
    return [SerialFromArray T "i" "s"]
} 







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