# Show the system information

## Execute environment: LINUX
cat /etc/lsb-release
### DISTRIB_ID=Ubuntu
### DISTRIB_RELEASE=20.04
### DISTRIB_CODENAME=focal
### DISTRIB_DESCRIPTION="Ubuntu 20.04.4 LTS"

## Execute environment: QIIME2
qiime info
### System versions
### Python version: 3.8.12
### QIIME 2 release: 2021.11
### QIIME 2 version: 2021.11.0
### q2cli version: 2021.11.0

### Installed plugins
### alignment: 2021.11.0
### composition: 2021.11.0
### cutadapt: 2021.11.0
### dada2: 2021.11.0
### deblur: 2021.11.0
### demux: 2021.11.0
### diversity: 2021.11.0
### diversity-lib: 2021.11.0
### emperor: 2021.11.0
### feature-classifier: 2021.11.0
### feature-table: 2021.11.0
### fragment-insertion: 2021.11.0
### gneiss: 2021.11.0
### longitudinal: 2021.11.0
### metadata: 2021.11.0
### phylogeny: 2021.11.0
### picrust2: 2021.11
### quality-control: 2021.11.0
### quality-filter: 2021.11.0
### rescript: 2021.11.0+3.g8aa880e
### sample-classifier: 2021.11.0
### taxa: 2021.11.0
### types: 2021.11.0
### vsearch: 2021.11.0

### Application config directory
### ${HOME}/anaconda3/envs/qiime2-2021.11/var/q2cli

### Getting help
### To get help with QIIME 2, visit https://qiime2.org



#0 Preprocess
# Define variables
JOBS=$(($(grep cpu.cores /proc/cpuinfo | sort -u | sed 's/[^0-9]//g')/2))
THREADS=$(grep processor /proc/cpuinfo | wc -l)

## Input data directory **absolute path**
INDIR="${HOME}/raw"

## Output directory name
OUTDIR="${HOME}/$(date "+%y%m%d")_qiime2"

## Type of run
TYPE='paired-end'

## Primer information
FWD='CCTACGGGNBGCASCAG'
REV='GACTACNVGGGTATCTAATCC'

## Reference database
DB='silva-1381-SSU-Pro341F-Pro805R-classifier.qza'


# Make output directories
mkdir -p ${OUTDIR}/{manifest,qza,qzv,log}


# Make "fastq manifest" file
echo -e "sample-id\tforward-absolute-filepath\treverse-absolute-filepath" > ${OUTDIR}/manifest/manifest.tsv

ls -1v ${INDIR} | perl -nle 'if(/_S[0-9]{1,3}_L001_R1/){print "$`"}' > ${OUTDIR}/manifest/sample-id.txt
ls -1v ${INDIR}/*R1* > ${OUTDIR}/manifest/forward-absolute-filepath.txt
ls -1v ${INDIR}/*R2* > ${OUTDIR}/manifest/reverse-absolute-filepath.txt

paste -d "\t" \
	${OUTDIR}/manifest/sample-id.txt \
	${OUTDIR}/manifest/forward-absolute-filepath.txt \
	${OUTDIR}/manifest/reverse-absolute-filepath.txt \
	>> ${OUTDIR}/manifest/manifest.tsv



#1 Importing data
qiime tools import \
	--type 'SampleData[PairedEndSequencesWithQuality]' \
	--input-path ${OUTDIR}/manifest/manifest.tsv \
	--input-format PairedEndFastqManifestPhred33V2 \
	--output-path ${OUTDIR}/input.qza

# Quality check
qiime demux summarize \
	--i-data ${OUTDIR}/input.qza \
	--o-visualization ${OUTDIR}/input.qzv

qiime tools export \
	--input-path ${OUTDIR}/input.qzv \
	--output-path ${OUTDIR}/input-summary



#2 Trimming primer and adapter sequences
FWDRC=$(echo "${FWD}" | tr ACGTMRYKVHDBacgtmrykvhdb TGCAKYRMBDHVtgcakyrmbdhv | rev)
REVRC=$(echo "${REV}" | tr ACGTMRYKVHDBacgtmrykvhdb TGCAKYRMBDHVtgcakyrmbdhv | rev)

nohup qiime cutadapt trim-paired \
	--i-demultiplexed-sequences ${OUTDIR}/input.qza \
	--p-cores ${THREADS} \
	--p-adapter-f ${REVRC} \
	--p-adapter-r ${FWDRC} \
	--p-front-f ${FWD} \
	--p-front-r ${REV} \
	--p-times 10 \
	--p-match-read-wildcards \
	--p-match-adapter-wildcards \
	--p-minimum-length 100 \
	--p-discard-untrimmed \
	--o-trimmed-sequences ${OUTDIR}/sequences.qza \
	--verbose \
	&> ${OUTDIR}/cutadapt.log &
wait

# Quality check
qiime demux summarize \
	--i-data ${OUTDIR}/sequences.qza \
	--o-visualization ${OUTDIR}/sequences.qzv

qiime tools export \
	--input-path ${OUTDIR}/sequences.qzv \
	--output-path ${OUTDIR}/trimmed-summary



#3 DADA2
## Determine truncate parameters based on the quality score
TRUNC1=280
TRUNC2=206

<< COMMENT_OUT
TRUNC: a truncated length after removing bases, which represent < threshold quality score (QS=20) at the first quartile, from 3' end with viewing quality-plot.html
COMMENT_OUT

## Denoising, quality filtering, correcting reading errors, removing chimera, PhiX and singleton sequences, merging reads, and dereplicating
nohup qiime dada2 denoise-paired \
	--i-demultiplexed-seqs ${OUTDIR}/sequences.qza \
	--p-n-threads 0 \
	--p-trunc-len-f ${TRUNC1} \
	--p-trunc-len-r ${TRUNC2} \
	--p-max-ee-f 2 \
	--p-max-ee-r 5 \
	--o-table ${OUTDIR}/table.qza \
	--o-representative-sequences ${OUTDIR}/rep-seqs.qza \
	--o-denoising-stats ${OUTDIR}/denoising-stats.qza \
	--verbose \
	&> ${OUTDIR}/dada2.log &
wait

# Summarize a feature table
qiime feature-table summarize \
	--i-table ${OUTDIR}/table.qza \
	--o-visualization ${OUTDIR}/table.qzv

qiime tools export \
	--input-path ${OUTDIR}/table.qzv \
	--output-path ${OUTDIR}/table

# Mapping feature IDs to representative sequences
qiime feature-table tabulate-seqs \
	--i-data ${OUTDIR}/rep-seqs.qza \
	--o-visualization ${OUTDIR}/rep-seqs.qzv

qiime tools export \
	--input-path ${OUTDIR}/rep-seqs.qzv \
	--output-path ${OUTDIR}/rep-seqs

# Viewing representative sequences stats
qiime metadata tabulate \
	--m-input-file ${OUTDIR}/rep-seqs.qza \
	--o-visualization ${OUTDIR}/rep-seqs-stats.qzv

qiime tools export \
	--input-path ${OUTDIR}/rep-seqs-stats.qzv \
	--output-path ${OUTDIR}/rep-seqs-stats

# Viewing denoizing stats
qiime metadata tabulate \
	--m-input-file ${OUTDIR}/denoising-stats.qza \
	--o-visualization ${OUTDIR}/denoising-stats.qzv

qiime tools export \
	--input-path ${OUTDIR}/denoising-stats.qzv \
	--output-path ${OUTDIR}/denoising-stats



#4 Taxonomical assignment to ASV
nohup qiime feature-classifier classify-sklearn \
	--i-classifier ${DB} \
	--i-reads ${OUTDIR}/rep-seqs.qza \
	--p-n-jobs ${JOBS} \
	--o-classification ${OUTDIR}/taxonomy.qza &
wait

qiime metadata tabulate \
	--m-input-file ${OUTDIR}/taxonomy.qza \
	--o-visualization ${OUTDIR}/taxonomy.qzv

qiime tools export \
	--input-path ${OUTDIR}/taxonomy.qzv \
	--output-path ${OUTDIR}/taxonomy



#5 Generating bar plot
qiime taxa barplot \
	--i-table ${OUTDIR}/table.qza \
	--i-taxonomy ${OUTDIR}/taxonomy.qza \
	--o-visualization ${OUTDIR}/taxa-bar-plots.qzv

qiime tools export \
	--input-path ${OUTDIR}/taxa-bar-plots.qzv \
	--output-path ${OUTDIR}/taxa-bar-plots



#6 Postprocess
# Collect qza, qzv and log files
mv ${OUTDIR}/*.qza ${OUTDIR}/qza
mv ${OUTDIR}/*.qzv ${OUTDIR}/qzv
mv ${OUTDIR}/*.log ${OUTDIR}/log



exit 0