---
# System prepended metadata

title: rnaseq-trinity-abundance.sh

---

# rnaseq-trinity-abundance.sh

#!/bin/bash

# É necessário passar um argumento que servirá como input,um diretório contendo os arquivos no formato .fastq
input=$1

# Para validação desse argumento, se não foi passado, printe na tela a mensagem que está faltando um diretório de entrada,
# Se não existe esse diretório, printe na tela um mensagem dizendo que está errado o argumento passado.

if [ ! ${input} ]
then   
        echo "Missing input (renamed for Trinity) directory"
        exit
else   
        if [ ! -d ${input} ]
        then   
                echo "Wrong input (renamed for Trinity) directory ${input}"
                exit
        fi
fi

# É necessário passar como segundo argumento o diretório contendo o arquivo de montagem

trinity_output=$2

# É realizada a validação desse argumento, "trinity_output", similarmente ao argumento anterior

if [ ! ${trinity_output} ]
then   
        echo "Missing Trinity output directory"
        exit
else   
        if [ ! -d ${trinity_output} ]
        then   
                echo "Wrong Trinity output directory ${trinity_output}"
                exit
        fi
fi

#É necessário passar como terceiro argumento o diretório para armazenar o resultado da avaliação de abundância
output=$3

# Novamente é feita a validação desse argumento
if [ ! ${output} ]
then   
        echo "Missing output directory"
        exit
else   
        if [ ! -d ${output} ]
        then   
                echo "Wrong output directory ${output}"
                exit
        fi
fi

# Criando uma variável do número de processadores a serem utilizados
num_threads="8"

# Arquivos e diretórios de saída (output) 
# Criando a variável para o diretório de saída:

abundance_out="${output}/abundance"

# Criando o diretório de saída utilizando a função mkdir
mkdir -p ${abundance_out}

# Criando as variáveis para as reads1 (left) e reads2(right):

left=()
right=()

# Printa a mensagem entre aspas na tela:
echo "Collecting reads step ..."

# Para a variável left, encontrar todos os arquivos que finalizam o nome com .prinseq_1.fastq:

left=($(find ${input} -type f -name '*.prinseq_1.fastq'))

# Remoção dos arquivos gerados que são desnecessaríos:

rm -f ${abundance_out}/samples.txt
rm -f ${abundance_out}/quant_files.txt
rm -f ${abundance_out}/groups.txt

echo -e "id\tname\tgroup" > ${abundance_out}/groups.txt

# A estrutura for foi utilizada para fazer um loop da função abaixo para todas reads2 de uma só vez: Declarar a variável
# right: reads 2.
for l in ${left[@]}; do
	repname=`basename ${l} | sed 's/\..*$//'`
	condname=`echo ${repname} | sed 's/[0-9]\+//'`
	r=`echo ${l} | sed 's/_1.fastq/_2.fastq/'`
	right=(${right[@]} ${r})

	echo -e "${condname}\t${abundance_out}/${repname}\t${l}\t${r}" >> ${abundance_out}/samples.txt
	echo -e "${abundance_out}/${repname}/quant.sf" >> ${abundance_out}/quant_files.txt

	echo -e "${repname}\t${repname}\t${condname}" >> ${abundance_out}/groups.txt
done


#echo ${left[*]}
#echo ${right[*]}

# Criação de duas variáveis:trinity_fasta e trinity_trans_map: Buscar dentro do diretório de saída do programa Trinity,
# o arquivo de montagem (FASTA) para a primeira variável e o arquivo gene_trans_map para a segunda:

trinity_fasta=`find ${trinity_output} -type f -name 'Trinity*.fasta'`
trinity_trans_map=`find ${trinity_output} -type f -name Trinity*.gene_trans_map`

echo "Estimating abundances ..."

# Script pertencente ao programa Trinity para estimação da abundancia:

${TRINITY_HOME}/util/align_and_estimate_abundance.pl 	--transcripts	${trinity_fasta} \
							--est_method	salmon \
							--salmon_add_opts "--validateMappings" \
							--samples_file	${abundance_out}/samples.txt \
							--gene_trans_map ${trinity_trans_map} \
							--prep_reference \
							--thread_count ${num_threads} \
							--seqType fq \
							--output_dir ${abundance_out} \
							 > ${abundance_out}/align_and_estimate_abundance.log.out.txt \
							2> ${abundance_out}/align_and_estimate_abundance.log.err.txt

## --transcripts: Arquivo FASTA de montagem: variável trinity_fasta
## --est_method: Método de estimação da abundancia, o método salmon é rápido e realiza o processo em 2 etapas: indexação da
# referência e quantificação.
## --salmon_add_opts: Opções a serem adicionadas para o método salmon
## --samples_file: Arquivo contendo as reads, separado por condição
## --gene_trans_map: Arquivo gene_trans_map: variável trinity_trans_map
## --prep_reference: Constrói um index
## --thread_count: Número de processadores a serem utilizados
## --seqType: Formato do arquivo de sequencias: fastq
## --output_dir: Diretório que ira conter os resultados gerados

echo "Constructing abundance matrix ..."

#Construção da matriz de abundancia, utilizando um script também presente no programa Trinity:

${TRINITY_HOME}/util/abundance_estimates_to_matrix.pl	--est_method salmon \
							--gene_trans_map ${trinity_trans_map} \
							--name_sample_by_basedir \
							--cross_sample_norm none \
							--quant_files ${abundance_out}/quant_files.txt \
							--out_prefix ${abundance_out}/abundance \
							 > ${abundance_out}/abundance_estimates_to_matrix.log.out.txt \
							2> ${abundance_out}/abundance_estimates_to_matrix.log.err.txt 

# --name_sample_by_basedir: Nomeia a coluna da amostra pelo nome do diretório e não pelo nome do arquivo
# --cross_sample_norm: Método de normalização
# --quant_files: Diretório contendo uma lista de todos os arquivos alvos.
# --out_prefix: Valores a serem utilizados para o método de estimação


echo "Calculating Differentially Expressed Genes ..."

# Criação do diretório para análise de genes diferencialmente expressos:

mkdir -p ${abundance_out}/DEG

# Análise de genes diferencialmente expressos utilizando o DESeq, utilizando como entrada a matriz gerada no passo anterior:

run-DESeq2.R 	--in="${abundance_out}/abundance.gene.counts.matrix"  \
		--groups="${abundance_out}/groups.txt" \
		--out="${abundance_out}/DEG" \
		 > ${abundance_out}/DEG/run-DESeq2.log.out.txt \
		2> ${abundance_out}/DEG/run-DESeq2.log.err.txt