{ Les snippets de bioinfo-fr.net }

À ajouter dans le .bashrc pour une utilisation rapide
function screenAllServ ()
{
echo -e "#######################\n### Current screens ###\n#######################"
for servName in Serv1 Serv2 Serv3
do
ssh username@$servName.adresse.de.mon.serveur.com "echo -e \"----\n<><><> \"\$(hostname)\"<><><>\"; ls /var/run/screen/S-username/ | cat"
done
}
0/5 - [0 vote]
Cartographie R [R]

Il est basé en partie sur les éléments donnés par la R-Graph Gallery (https://www.r-graph-gallery.com/). De plus amples explications sont disponibles sur ce site.
Les données en entrée doivent suivre une projection Mercator (EPSG 3857).
packages additionels: "ggplot2,ggmap, broom, sp, rgdal, maptools, plyr, rgeos"
R version 3.4.4
OS: Linux Xubuntu 16.04
library(ggmap)
library(ggplot2)
library(broom)
library(sp)
library(rgdal)
library(maptools)
library(plyr)
library(rgeos)
# stockage des projections usuelles
l93a<-"+init=epsg:27572"
l93<-"+init=epsg:2154"
wgs84<-"+init=epsg:4326"
merca<-"+init=epsg:3857"
# Chargement d'une couche de polygones représentant des secteurs de prospection
secteurs<-readOGR( dsn= getwd() , layer="secteurs")
proj4string(secteurs)<-CRS(l93)
# Extraction des vertex du polygone pour être représenté sous ggplot.
secteurs@data$id = rownames(secteurs@data)
secteurs.points = fortify(secteurs,region="id")
secteurs.df = join(secteurs.points, secteurs@data,by="id")
# Création d'un point géolocalisé d'inventaire
# !ATTENTION ! Tout doit être en epsg 3857
centro<-as.data.frame(cbind(lon=c(44.95),lat=c(6.10)))# tableau contenant les points EN MERCATOR (EPSG=3857 !!!)
# Récupération d'un fond cartographique googlemap satellite
# Le fond cartographique couvre la zone spécifiée entre guillemet (donc ici la France). La recherche s'effectue comme dans Googl...aps.
map <- ggmap(get_googlemap("France", zoom = 10, maptype = "satellite"))# zoom à 0-> terre entière, zoom à 20-> champs en détail,
# Assemblage final
carte<-map +
geom_point(data=centro,aes(x=lat,y=lon,colour=rownames(centro),shape=rownames(centro)),size=3)+
xlab("Longitude")+ ylab("Latitude")+
scale_color_manual(values=c("blue"))+
theme(legend.position='none')
0/5 - [0 vote]

Demande en entrée un tableau avec le nom du regroupement, le nombre d'individus statistiques où le caractère observé est absent, apparait, disparait et se maintient entre t et t+1.
Packages additionels: "treemap", "RColorBrewer"
R version 3.4.4
OS: Linux Xubuntu 16.04
setwd()
library(treemap)
library(RColorBrewer)
tabl #contient vos données en entrée classe data.frame
## Préparation des vecteurs nécessaires au fonctionnement de du script:
Somme<-rep(0,nrow(tabl)) # stock le nombre total d'individus statistiques
stat_mcnemar<-rep(0,nrow(tabl)) # stock la VTZ² pour chaque regroupement
pvalue_mcnemar<-rep(0,nrow(tabl)) # stock la p.value pour chaque regroupement
Applicable<-rep(NA,nrow(tabl)) # stock la condition d'appliation du test
Linkimg<-rep(0,nrow(tabl)) # stock le lien vers la sortie graphique
## Boucle de calcul des paramètres du test et des sorties graphiques par regroupement
for (i in c(1:nrow(tabl))){
# Vérifie que le test de Mac-Nemar est applicable
Somme[i]<-sum(tabl[i,c(1:4)])
Applicable[i]<- tabl[i,3]+tabl[i,2]
# Produit une matrice pour le test de Mac-Nemar
mat<-matrix(c(tabl[i,4],tabl[i,2],tabl[i,3],tabl[i,1]),ncol=2)
# Stockage des résultats du test avec signalement des regroupements où il n'est pas applicable
if (Applicable[i] < 20) stat_mcnemar[i]<- "test non applicable"
else stat_mcnemar[i]<-mcnemar.test(mat)$statistic
if (Applicable[i] < 20) pvalue_mcnemar[i]<- "test non applicable"
else pvalue_mcnemar[i]<-mcnemar.test(mat)$p.value
# Export du graphique résumant la répartition des mailles sur le site et stockage du chemin d'accès dans le tableau
sign<-NULL
if (mcnemar.test(mat)$p.value == "NaN") sign<- c("NA") else
if (mcnemar.test(mat)$p.value < 0.01) sign<-c("***") else
if (mcnemar.test(mat)$p.value < 0.05) sign<-c("**") else
if (mcnemar.test(mat)$p.value < 0.1) sign<-c("*") else sign<-c("-")
# permet de synthétiser la p.value sous forme d'un code à étoiles
value=c(export[i,4],export[i,2],export[i,3],export[i,1])
group=c(paste("Maintien: ",export[i,4]," mailles",sep=''),
paste("Apparition: ",export[i,2]," mailles",sep=''),
paste("Disparition: ",export[i,3]," mailles",sep=''),
paste("Absence: ",export[i,1]," mailles",sep=''))
Tab=data.frame(group,value)
Titre<-NULL
if (Applicable[i] == 0) Titre<- c("Non Applicable") else
Titre<- paste(round(mcnemar.test(mat)$statistic,3)," (",sign,")",sep='')
photo<-paste(getwd(),rownames(export[i,]),".jpg",sep='')
colors <- c("#FFFF00","#FF0000","#0000FF","#FF00FF")
group=c("Maintien","Apparition","Disparition","Absence")
jpeg(filename=photo,res=600,width=6,height=6,units="cm")
treemap(Tab,
index="group",
vSize="value",
type="index",
palette=colors,
fontsize.labels = 5,
force.print.labels = T,
fontface.labels = 4,
title= Titre,
fontsize.title = 10,
border.lwds= 0.5,
fontcolor.labels="black")
dev.off()
Linkimg[i]<-photo
}
export1<-cbind(tabl,Somme,stat_mcnemar,pvalue_mcnemar,Linkimg)
write.csv(export1,paste(getwd(),"/res-mcnemar.csv",sep=''))
0/5 - [0 vote]

Exemple
Vous voulez compter le nombre d'occurence de chaque type, à partir du fichier tabulé suivant :
id value type
1 5698 typeA
2 569 typeB
3 3658 typeC
4 532 typeB
5 123 typeA
Vous obtenez :
typeA 2
typeB 2
typeC 1
Usage :
Le fichier tabulé doit avoir une ligne avec les noms de colonnes
Pour le lancer
./count_file.sh fichier_tabulé.txt numero_de_colonne_à_compter
#!/bin/bash
#s'il manque un argument, le script n'est pas lance
if [ $# -ne 2 ]; then echo 'Syntaxe: count_file.sh DE_file_with_annot.txt column_number_to_count'; exit 66; fi
#ecrit un fichier temporaire sans les noms de colonnes
tail -n +2 $1 >> $1.temp
#recupere le prefixe du nom de fichier pour ecrire le nom du fichier de sortie
prefix=$(basename $1 .txt)
output=$prefix"_column_num_"$2"_count.txt"
#creation du fichier de sortie et du fichier temporaire de sortie
temp="temp.txt"
touch $output
touch $temp
#lecture du fichier tabule ligne par ligne
while read line
do
#recupere la valeur de la colonne a compter
current_value=`echo "$line" | awk -F $"\t" '{print $'$2'}'`
#cherche dans le fichier de sortie si cette valeur existe. Si elle existe, augmente d'un le compteur pour cette valeur. Si elle n'existe pas, elle est cree et son compteur est initie a 1. Ecrit l'ancien fichier de sortie + les nouvelles infos dans un fichier temporaire
awk -F $"\t" -v value="$current_value" 'BEGIN{ OFS = FS ; found = "no"} {if( $1 == value ) {print $1, $2+1 ; found = "ok"} else {print $0}} END {if (found == "no") {print value, 1} }' $output >> $temp
#remplace le fichier de sortie par le fichier temporaire
mv $temp $output
done<$1.temp
#efface le fichier tabule sans les noms de colonnes
rm $1.temp
1/5 - [1 vote]

Je vous présente ici une méthode pour faire des ACP interactives (avec zoom, masquage des groupes, noms des points en mouseover, etc.).
Il vous faut installer dplyr, cowplot et plotly depuis CRAN.
library(cowplot)
library(plotly)
library(dplyr)
plotPCA <- function(
my_pca,
colorby = NULL,
xaxs = "PC1", yaxs = "PC2",
title = NULL,
palette = function(x) rainbow(x, s = 0.6),
continuous_color = FALSE,
...
) {
# obtaining % of variance explained by each axis
varxaxs <- (summary(my_pca)$importance["Proportion of Variance", xaxs] * 100) %>% round(digits = 1)
varyaxs <- (summary(my_pca)$importance["Proportion of Variance", yaxs] * 100) %>% round(digits = 1)
myplot <- tibble(
myxaxs = my_pca$x[, xaxs],
myyaxs = my_pca$x[, yaxs],
texts = rownames(my_pca$x),
colors = if (is.null(colorby)) {NA} else {colorby}
) %>%
ggplot(aes(x = myxaxs, y = myyaxs, color = colors, text = texts)) +
geom_point() +
labs(x = paste0(xaxs, " (", varxaxs, "%)"), y = paste0(yaxs, " (", varyaxs, "%)"), title = title, color = NULL) +
background_grid()
if (continuous_color) {
myplot <- myplot + scale_color_gradientn(colors = palette(64))
} else {
myplot <- myplot + scale_color_manual(values = palette(n_distinct(colorby)))
}
ggplotly(myplot, tooltip = "text", ...)
}
# generating data for the example
metadata <- tibble(
group = rep(c("group1", "group2", "group3"), each = 50),
names = paste("sample", 1:150),
latent_variable = c(
rnorm(100) + 4,
rnorm(50)
)
)
my_data <- matrix(rnorm(150 * 15), nrow = 150)
my_data[1:100, 1:10] <- my_data[1:50, 1:10] + 3 # PC1 axis differences
my_data[1:50, 11:15] <- my_data[1:50, 11:15] + 2 # PC2 differences
rownames(my_data) <- metadata$names
# basic example (click on legend to hide/display specific groups):
plotPCA(prcomp(my_data), colorby = metadata$group)
# changing axis and title
plotPCA(prcomp(my_data), colorby = metadata$group, xaxs = "PC2", yaxs = "PC3", title = "PC1 not shown")
# changing color palette:
plotPCA(prcomp(my_data), colorby = metadata$group, palette = viridis::viridis)
# continuous colors:
plotPCA(prcomp(my_data), colorby = metadata$latent_variable, palette = viridis::viridis, continuous_color = TRUE)
# saving as html:
p <- plotPCA(prcomp(my_data), colorby = metadata$group)
htmlwidgets::saveWidget(p, "my_great_pca.html", selfcontained = TRUE)
0/5 - [0 vote]

my %C = ( 'N' => 'N', 'A' => 'T', 'T' => 'A', 'U' => 'A', 'C' => 'G', 'G' => 'C',
'M' => 'K', 'K' => 'M', 'R' => 'Y', 'Y' => 'R', 'W' => 'W', 'S' => 'S',
'V' => 'B', 'B' => 'V', 'H' => 'D', 'D' => 'H', 'X' => 'X',
'n' => 'n', 'a' => 't', 't' => 'a', 'u' => 'a', 'c' => 'g', 'g' => 'c',
'm' => 'k', 'k' => 'm', 'r' => 'y', 'y' => 'r', 'w' => 'w', 's' => 's',
'v' => 'b', 'b' => 'v', 'h' => 'd', 'd' => 'h', 'x' => 'x', '-' => '-' );
=head2 RevCompl
Title : RevCompl
Usage : RevCompl($sequence)
Function: Reverse complement a sequence
Example :
Returns : the reverse complement sequence
Args : $sequence the sequence to reverse complement
Notes :
=cut
sub RevCompl {
join( '', map { $C{$_} } reverse( split( '', shift @_ ) ) );
}
0/5 - [0 vote]
Python cProfile as a decorator [Python]

import cProfile
def profileit(func):
def profiled_func(*args, **kwargs):
profile = cProfile.Profile()
print("Profiling " + "\033[95m" + func.__name__ + "\033[0m") # colors
try:
profile.enable()
result = func(*args, **kwargs)
profile.disable()
return result
finally:
profile.print_stats(sort="time")
return profiled_func
##########
# Example #
##########
@profileit
def times2():
for i in range(500000):
j = i * 2
j = add_one(j)
def add_one(n):
return n+1
times2()
5/5 - [1 vote]
Parseur de fichier gff3 basique [Python]

{ numéro de l'ORF : [start, stop, strand ], ... }
Les print en commentaire permettent d'afficher le contenue du gff3 sur le terminal
contentGFF = ["seqid", "source", "type", "start", "end", "score", "strand", "phase", "attributes"]
def gff3parser (filename, dictOrf):
""" parser de gff3 """
with open(filename) as f:
for line in f:
if line.startswith("#"):
continue
content = line.strip().split("\t")
if len(content) == len(contentGFF):
value = [content[3], content[4], content[6]]
#print(value)
#print(content[8])
numORF = content[8].strip().split(";")
#print(numORF)
for product in numORF:
if re.search(r"^product=ORF\d{0,3}", product):
keys = product[11:]
dictOrf[keys] = value
return {}
# Usage :
orf = {}
gff3parser(gffname,orf) #avec gffname le nom du fichier gff3 à parser
1/5 - [1 vote]

Par exemple, l'annotation de ENSG00000134046.11 a été modifié 11 fois.
Cette petit expression régulière permet de s'en débarrasser, pour faciliter les croisements de listes de gènes.
x <- c("ENSG00000134046.11", "ENSG00000229807.10")
sub("\\.[0-9]*$", "", x)
# [1] "ENSG00000134046" "ENSG00000229807"
0/5 - [0 vote]
Parseur de csv basique [Python]

- Délimiteur réglable
- Pas de limite de colonnes, mais nécessite des lignes "complètes" ET une ligne d'en-têtes de colonnes
- Retourne un générateur, théoriquement plus léger en mémoire. Mais itérable une seule fois !
import csv as L
def readCSV(file):
with open(file) as csvfile:
readCSV = L.reader(csvfile, delimiter=";")
firstRow=True
columnName=[]
for row in readCSV:
if firstRow:
firstRow=False
for col in row:
columnName.append(col)
else:
aRow={}
i=0
for col in columnName:
aRow[col]=row[i]
i+=1
yield aRow
2/5 - [3 votes]