//it is incomplete and might not compile; need to cjeck the data structures type file; type aux { file faa; file phr; file pin; file psq; }; aux file_array[]; (file phr, file pin, file psq) formatdb (file input) { app { formatdb "-i" @input; } } (file output) blast(file input1, file phr1, file pin1, file psq1, file input2, file phr2, file pin2, file psq2) { app{ blastall "-p" "blastp" "-d" @input1 "-i" @input2 "-m" "9" "-o" @output; } } (file output) reciprocal(file reciprocalScript, file input1, file input2) { app { perl @reciprocalScript "-i1" @input1 "-i2" @input2 "-o" @output; } } file FASTA_files[] ; file reciprocalScript <"simple_reciprocal_best_hits.01b.pl">; foreach f, i in FASTA_files { file_array[i].faa = f; file_array[i].phr = ; file_array[i].pin = ; file_array[i].psq = ; (f.phr, f.pin, f.psq) = formatdb(f.faa); //constructs the auxiliary files needed in blast step } foreach i, i_index in file_array { foreach j, j_index in file_array { file output1 = ; output1 = blast(i.faa, i.phr, i,pin, i.psq, j.faa, j.phr, j.pin, j.psq); file output2 = ; // output2 = blast(a[j],a[i]); would be desired to call it this way ... output2 = blast(j.faa, j.phr, j.pin, j.psq, i.faa, i.phr, i.pin, i.psq); file output = ; output = reciprocal(reciprocalScript, output1, output2); } }