[med-svn] [Git][med-team/pftools][upstream] New upstream version 3.2.8
Andreas Tille (@tille)
gitlab at salsa.debian.org
Thu Sep 23 14:17:00 BST 2021
Andreas Tille pushed to branch upstream at Debian Med / pftools
Commits:
b51b2b73 by Andreas Tille at 2021-09-23T14:12:57+02:00
New upstream version 3.2.8
- - - - -
15 changed files:
- CMakeLists.txt
- + Docker/Dockerfile
- + Docker/README.docker
- README.md
- src/C/prg/pfscan.c
- src/C/utils/io.c
- src/C/utils/system.c
- src/Perl/fasta_to_fastq.pl
- src/Perl/make_iupac_cmp.pl
- src/Perl/scramble_fasta.pl
- src/Perl/sort_fasta.pl
- tests/examples/test_V3.sh.cmake
- tests/examples/test_V3_output.sh.cmake
- tests/examples/test_pfsearchV3_iupac.pl.cmake
- tests/examples/test_scan_search.pl.cmake
Changes:
=====================================
CMakeLists.txt
=====================================
@@ -1,10 +1,10 @@
#########################################################################################
# PfTools versioning
#
-SET(VERSION "3.2.6")
+SET(VERSION "3.2.8")
SET(MAJOR_VERSION "3")
SET(MINOR_VERSION "2")
-SET(PATCH_VERSION "6")
+SET(PATCH_VERSION "8")
SET(DATA_PATH "share/data" CACHE STRING "Installation data folder" )
SET(DOC_PATH "share/doc" CACHE STRING "Installation doc folder" )
SET(MAN1_PATH "share/man/man1" CACHE STRING "Installation man1 folder" )
@@ -396,7 +396,7 @@ ADD_SUBDIRECTORY(data)
#########################################################################################
# Enabling TESTING
include(CTest)
-SET(TESTS_DIRECTORY "${PROJECT_BINARY_DIR}/Tests" CACHE PATH "Directory for tests")
+SET(TESTS_DIRECTORY "${PROJECT_SOURCE_DIR}/Tests" CACHE PATH "Directory for tests")
SET(TESTS_DATA_DIR "${PROJECT_SOURCE_DIR}/tests")
IF (NOT EXISTS "${TESTS_DIRECTORY}" )
FILE(MAKE_DIRECTORY "${TESTS_DIRECTORY}" )
=====================================
Docker/Dockerfile
=====================================
@@ -0,0 +1,101 @@
+FROM ubuntu:20.04 AS compile
+
+ARG PFTOOLS_VERSION
+ARG BUILD_DATE
+ENV PFTOOLS_PATH=/var/lib/pftools
+
+RUN echo '# OS update' \
+ && export DEBIAN_FRONTEND=noninteractive \
+ && apt-get update -y \
+ && apt-get install -y --no-install-recommends \
+ build-essential \
+ libpcre++-dev \
+ gfortran \
+ libgfortran5 \
+ ca-certificates \
+ git \
+ cmake \
+ zlib1g-dev \
+ libpng-dev \
+ libfile-slurp-perl \
+ && echo '# Install Pftools V3' \
+ && git clone --depth=1 "https://github.com/sib-swiss/pftools3.git" \
+ && mkdir pftools3/build \
+ && cd pftools3/build \
+ && cmake .. -DCMAKE_INSTALL_PREFIX:PATH=$PFTOOLS_PATH -DCMAKE_BUILD_TYPE=Release -DUSE_GRAPHICS=OFF -DUSE_PDF=ON \
+ && make \
+ && make install \
+ && make test \
+ && gzip -9 $PFTOOLS_PATH/share/man/man5/*.5 $PFTOOLS_PATH/share/man/man1/*.1
+
+
+FROM ubuntu:20.04 AS binary
+
+ARG PFTOOLS_VERSION
+ARG BUILD_DATE
+ENV PFTOOLS_PATH=/var/lib/pftools
+
+# METADATA
+# Use Open Containers Initiative (OCI)
+# See https://rehansaeed.com/docker-labels-depth/
+# See https://github.com/opencontainers/image-spec/blob/master/annotations.md
+# Exist also another structured label initiative: http://label-schema.org/ superceded by OCI now
+LABEL org.opencontainers.image.title="pftools3 - A suite of tools to build and search generalized profiles"
+LABEL org.opencontainers.image.version=$PFTOOLS_VERSION
+LABEL org.opencontainers.image.vendor="SIB Swiss Institute of Bioinformatics"
+LABEL org.opencontainers.image.authors="sebastien.moretti at sib.swiss"
+LABEL org.opencontainers.image.url="https://github.com/sib-swiss/pftools3"
+LABEL org.opencontainers.image.documentation="https://github.com/sib-swiss/pftools3"
+LABEL org.opencontainers.image.licenses="GPL-2.0"
+LABEL org.opencontainers.image.description="pftools3 - A suite of tools to build and search generalized profiles"
+LABEL org.opencontainers.image.created=$BUILD_DATE
+
+COPY --from=compile $PFTOOLS_PATH/ $PFTOOLS_PATH/
+RUN echo '# OS update' \
+ && export DEBIAN_FRONTEND=noninteractive \
+ && apt-get update -y \
+ && apt-get install -y --no-install-recommends \
+ man-db \
+ ca-certificates \
+ libfile-slurp-perl \
+ libc6 \
+ libgcc1 \
+ libgfortran5 \
+ libpcre3 \
+ libquadmath0 \
+ && ln -s $PFTOOLS_PATH/bin/* /usr/local/bin/ \
+ && ln -s $PFTOOLS_PATH/share/man/man5/* /usr/share/man/man5/ \
+ && ln -s $PFTOOLS_PATH/share/man/man1/* /usr/share/man/man1/ \
+ && mandb \
+ && apt autoremove -y \
+ && apt-get clean \
+ && rm -fr /var/lib/apt/lists/* \
+ && update-ca-certificates
+
+
+# SECURITY
+## Control root access
+ENV USER=pftools3
+RUN groupadd -g 1001 ${USER} && useradd -r -u 1001 -g ${USER} ${USER}
+USER ${USER}
+ENV HOME=/home/${USER}
+WORKDIR ${HOME}
+##Rest of Dockerfile with this user
+ENV LC_ALL="C"
+
+
+#TODO man pages do not work???
+# TEST
+RUN for pl in $PFTOOLS_PATH/bin/*.pl; do perl -cw $pl; done \
+ && pfscanV3 -h \
+ && pfscan -h || true \
+ && echo \
+ && pfsearchV3 -h \
+ && pfsearch -h || true
+
+
+HEALTHCHECK CMD pfscanV3 -h || exit 1
+
+
+CMD ["bash"]
+
=====================================
Docker/README.docker
=====================================
@@ -0,0 +1,16 @@
+# Build Docker image
+export PFTOOLS_VERSION=3.2.6
+docker build -t pftools:$PFTOOLS_VERSION --no-cache=true --build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') --build-arg PFTOOLS_VERSION=$PFTOOLS_VERSION -f Dockerfile . 2>&1 >pftools.Dockerfile.log
+
+
+# List Docker local images (imported or built)
+docker images
+
+
+# Inspect images
+docker inspect pftools:$PFTOOLS_VERSION
+
+
+# Run pfscanV3 in the Docker image
+docker run --name pftools --rm -i -t pftools:$PFTOOLS_VERSION pfscanV3
+
=====================================
README.md
=====================================
@@ -24,13 +24,12 @@ it was originally published in
A generalized profile syntax for biomolecular sequence motifs
and its function in automatic sequence interpretation.
Proc Int Conf Intell Syst Mol Biol. 1994;2:53-61.
- PubMed PMID: [7584418](https://www.ncbi.nlm.nih.gov/pubmed/7584418) .
+ PubMed PMID: [7584418](https://www.ncbi.nlm.nih.gov/pubmed/7584418).
# Command-line tutorial
-In the doc/example subdirectory, the [test_V3.sh](https://raw.githubusercontent.com/sib-swiss/pftools3/master/doc/example/test_V3.sh) shell script is a good starting
-point for using pfsearchV3/pfscanV3
+After installation, in the share/examples/ subdirectory, the *test_V3.sh* shell script is a good starting point for using pfsearchV3/pfscanV3.
# Algorithms description
=====================================
src/C/prg/pfscan.c
=====================================
@@ -397,7 +397,7 @@ int main (int argc, char *argv[])
exit(1);
}
else if (ProfileCount == 1) {
- fputs("pfscanV3 is not meant to be used with a single profile, use pfsearchV3 to get better performance in such case.\n",stderr);
+ fputs("pfscanV3 is not meant to be used with a single profile, use pfsearchV3 to get better performance in such case.\n", stderr);
}
/* Create an array of pointer to Profiles separating pattern from matrix */
@@ -1017,7 +1017,7 @@ int main (int argc, char *argv[])
} else {
printf("PREFIX profile:<http://example.org/yourprofiledb>\n");
}
-
+
}
/* Initialize the print mutex */
=====================================
src/C/utils/io.c
=====================================
@@ -16,7 +16,7 @@
#include <string.h>
#include "pfProfile.h"
-const char NormalizationModeName[3][16] = {
+const char NormalizationModeName[3][16] = {
"linear\0\0\0\0\0\0\0\0\0\0",
"gle_zscore\0\0\0\0\0\0",
"gle_zscave\0\0\0\0\0\0"
@@ -67,7 +67,7 @@ unsigned int out_profile = 0;
* This structure is fed by the Line Analyzer which parses the input, transforms delimiting symbols
* into '\0' end character and sets the starting pointer within the ProfileLine structure.
*/
-struct ProfileLine {
+struct ProfileLine {
char * command;
char * subcommand;
char * keywords[32];
@@ -89,7 +89,7 @@ static inline size_t GetLine(FILE * const stream, char * const restrict Destinat
if (Destination[length-1] == '\n') Destination[--length] = '\0';
return length;
}
- else
+ else
return 0;
}
@@ -98,7 +98,7 @@ static inline size_t GetLine(FILE * const stream, char * const restrict Destinat
*/
static inline char * FirstChar(const char * restrict Line, const uintptr_t MaxMemPoint)
{
- char * pos = (char*) Line;
+ char * pos = (char*) Line;
while ( (*pos == ' ') || (*pos == '\t') ) {
if ( (uintptr_t) ++pos == MaxMemPoint) break;
}
@@ -115,7 +115,7 @@ static inline char * CopyUptoSymbol(char * const restrict Destination, const cha
if ( Line[i] == Symbol){
return (char*) &Line[i+1];
}
- else
+ else
Destination[i] = Line[i];
}
return NULL;
@@ -131,7 +131,7 @@ static inline char * CopyUptoSymbolTerminated(char * const restrict Destination,
Destination[i] = '\0';
return (char*) &Line[i+1];
}
- else
+ else
Destination[i] = Line[i];
}
Destination[MaxLength] = '\0';
@@ -219,7 +219,7 @@ static inline size_t CountAndReplaceSymbol(char * const restrict String, const c
#ifdef _DEBUG_VERBOSE_
else {
fputc((int) *pos,stdout);
- }
+ }
#endif
++pos;
}
@@ -262,7 +262,7 @@ static inline size_t CountSymbol(const char * const restrict String, const char
#ifdef _DEBUG_VERBOSE_
else {
fputc((int) *pos,stdout);
- }
+ }
#endif
++pos;
}
@@ -281,7 +281,7 @@ static int AnalyzeLine(char * restrict currentLine, struct ProfileLine * const r
const uintptr_t MaxMemPoint = (uintptr_t) ¤tLine[LineSize-1];
#ifdef _VERBOSE_
if (out_profile) {
- if (UseColor)
+ if (UseColor)
printf("\e[31;40mLine : %s\e[0m\n", currentLine);
else
printf("Line : %s\n", currentLine);
@@ -289,7 +289,7 @@ static int AnalyzeLine(char * restrict currentLine, struct ProfileLine * const r
#endif
/* Set Multiple line to false */
*MultipleLine = false;
-
+
/* Clear result first */
memset(prfLine, 0, sizeof(struct ProfileLine)-SUB_COMMAND_MAX_SIZE);
@@ -298,7 +298,7 @@ static int AnalyzeLine(char * restrict currentLine, struct ProfileLine * const r
prfLine->command = Position;
const _Bool isMatrix = (Position[0] == 'M' && Position[1] == 'A') ? true : false;
prfLine->isMatrix = isMatrix;
-
+
/* Get to end of command and replace space by '\0' */
while ( *Position != ' ' && (uintptr_t)Position <= MaxMemPoint) ++Position;
while ( *Position == ' ' && (uintptr_t)Position <= MaxMemPoint) *Position++ = '\0';
@@ -321,12 +321,12 @@ static int AnalyzeLine(char * restrict currentLine, struct ProfileLine * const r
} else {
#ifdef _VERBOSE_
if (out_profile) {
- if (UseColor)
+ if (UseColor)
printf(" \e[31;40mMULTIPLE MA LINES DETECTED\e[0m");
else
printf(" MULTIPLE MA LINES DETECTED");
}
-#endif
+#endif
prfLine->subcommand = previousSubCommand;
*MultipleLine = true;
}
@@ -432,12 +432,12 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
StoredIntegerFormat IIPD_BOUNDARIES [ INSERTION_BOUNDARIES_SIZE] __attribute__((aligned(16)));
StoredIntegerFormat IMPD_ALPHABET [ ALPHABET_MEMORY_SIZE] __attribute__((aligned(16)));
TransitionScores IIPD_TRANSITIONS __attribute__((aligned(16)));
-
+
char currentLine[PROFILE_MAX_LINE_SIZE] __attribute__((aligned(16)));
-
+
struct ProfileLine AnalyzedLine;
- union Scores DefaultScores = {
+ union Scores DefaultScores = {
Insertion : { IIPD_ALPHABET,
IIPD_BOUNDARIES,
&IIPD_TRANSITIONS,
@@ -449,7 +449,7 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
union Scores WorkingScores;
char * ProfileSequence = 0;
size_t Line = *LineOffset, Alphabet_Length=0, Length=0;
-
+
int InsertionCounter=-1, MatchCounter=0;
int res;
_Bool LZCO = false;
@@ -457,24 +457,24 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
char DefaultMatchSymbol;
char DefaultInsertionSymbol;
-
+
/*
* Initialize position-independent profile parameters
*
* - general specification
*/
-
+
prf->isCircular = false;
prf->Length = 0UL;
- prf->isReversed = false;
-
+ prf->isReversed = false;
+
/* - disjoint mode */
prf->DisjointData.MDIS = 1;
strcpy(prf->DisjointData.CDIS[0], "UNIQUE\0");
strcpy(prf->DisjointData.CDIS[1], "PROTECT\0");
prf->DisjointData.JDIP[0] = 0;
prf->DisjointData.JDIP[1] = 2;
-
+
/* - normalization modes */
prf->NormalizationData.JNOR = 0;
@@ -492,22 +492,22 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
/* - cut-off */
prf->CutOffData.JCUT = 0;
-
+
/* Pattern */
prf->Pattern = NULL;
-
+
InitializeDefault(&DefaultScores, &DefaultMatchSymbol, &DefaultInsertionSymbol);
-
+
memset(previousSubCommand, 0, sizeof(char)*SUB_COMMAND_MAX_SIZE);
-
+
/*
* Read profile
*/
#ifdef _VERBOSE_
_Bool FirstCall = true;
#endif
-
- while (!feof(prfStream)) {
+
+ while (!feof(prfStream)) {
const size_t length = GetLine(prfStream, currentLine, PROFILE_MAX_LINE_SIZE);
if (length == 0) continue;
++Line;
@@ -530,7 +530,7 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
fprintf(stderr,"Error %i in analysis at line %lu\n", res, Line);
return 1;
}
-
+
/* Header or matrix */
if (!AnalyzedLine.isMatrix)
{
@@ -543,9 +543,9 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
prf->Type = PF_PATTERN;
}
else {
- goto MissingType;
+ goto MissingType;
}
- }
+ }
else if ( (AnalyzedLine.command[0] == 'A' && AnalyzedLine.command[1] == 'C' ) ) {
CopyUptoSymbol(prf->AC_Number, AnalyzedLine.subcommand, ';', 64);
}
@@ -623,17 +623,17 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
Alphabet_Length = ALPHABET_SIZE;
prf->Alphabet_Length = Alphabet_Length;
-
+
} else if (strcmp(AnalyzedLine.keywords[keys], "LENGTH")==0) {
Length = (size_t) atoi(AnalyzedLine.values[keys]);
prf->Length = Length;
-
+
// Allocates memory
prf->Sequence = (char*) malloc((Length+1)*sizeof(char));
if (prf->Sequence == NULL) goto AllocationError;
ProfileSequence = prf->Sequence;
memset(ProfileSequence, 0, (1+Length)*sizeof(char));
-
+
if ( AllocateScores(&WorkingScores, Alphabet_Length, Length) != 0 ) goto AllocationError;
/* Copy score pointers to profile */
@@ -677,7 +677,7 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
if (JNOR >= MAXN) goto TooManyNormalization;
register SNormalizationItem * const nrmItem = &(nrm->Values[JNOR]);
nrmItem->CNTX[0] = ' ';
-
+
for (size_t keys=0; keys<AnalyzedLine.counter;++keys) {
if (strcmp(AnalyzedLine.keywords[keys], "FUNCTION")==0) {
char ctmp[] = "GRIBSKOV";
@@ -718,14 +718,14 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
if ( endptr == NULL ) {
fprintf(stderr, "Line %lu : unable to convert %s to float\n", Line, AnalyzedLine.values[keys]);
return 1;
- }
+ }
if ( endptr == AnalyzedLine.values[keys] ) {
fprintf(stderr, "Line %lu : conversion error of %s to float\n"
" : error code %i = %s",
Line, AnalyzedLine.values[keys], errno, strerror(errno));
-
+
return 1;
- }
+ }
}
}
}
@@ -760,7 +760,7 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
const uintptr_t MaxMemory = (uintptr_t) pos + strlen(pos);
const size_t count = 1 + CountAndReplaceSymbol(AnalyzedLine.values[keys], ',', MaxMemory);
if (count > MAXN) goto TooManyScores;
-
+
for (size_t i=0; i<count; ++i) {
char * newpos;
ctItem->RCUT[i] = strtof(pos, &newpos);
@@ -769,7 +769,7 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
return 1;
}
while(*newpos != '\0') ++newpos;
- pos = newpos + 1;
+ pos = newpos + 1;
}
ctItem->JCNM = (int) count;
} else if (strcmp(AnalyzedLine.keywords[keys], "MODE")==0) {
@@ -798,14 +798,14 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
if ( key[0] == 'S' && key[1] == 'Y') {
if (key[3] == 'M') {
DefaultMatchSymbol = AnalyzedLine.values[keys][1];
- }
+ }
else if (key[3] == 'I') {
DefaultInsertionSymbol = AnalyzedLine.values[keys][1];
}
}
else if ( key[0] == 'M' && key[1] == '0' ) {
if ( ReadScore(AnalyzedLine.values[keys], &(DefaultScores.Match.Alphabet[0])) != 0 ) goto ReadError;
- }
+ }
else if ( key[0] == 'M' && key[1] == '\0' ) {
const char * pos = AnalyzedLine.values[keys];
const uintptr_t MaxMemory = (uintptr_t) pos + strlen(pos);
@@ -814,7 +814,7 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
StoredIntegerFormat data;
if ( ReadScore(AnalyzedLine.values[keys], &data) != 0 ) goto ReadError;
for (size_t i=0; i<Alphabet_Length; ++i) DefaultScores.Match.Alphabet[i+1] = data;
- }
+ }
else {
if ( ReadScores(AnalyzedLine.values[keys], &(DefaultScores.Match.Alphabet[1]), count) != 0 ) goto ReadError;
}
@@ -883,7 +883,7 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
/* Read the scores */
for (size_t keys=0; keys<AnalyzedLine.counter;++keys) {
const char * key = AnalyzedLine.keywords[keys];
- if ( key[0] == 'S' && key[1] == 'Y' ) continue;
+ if ( key[0] == 'S' && key[1] == 'Y' ) continue;
StoredIntegerFormat *ptr;
const size_t type = GetInsertionMemory(key, &WorkingScores.Insertion, &ptr);
switch (type){
@@ -927,7 +927,7 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
// fprintf(stderr, "Line %lu : implicit Insertion : %lu <= %lu\n", Line, InsertionCounter, MatchCounter);
#ifdef _VERBOSE_
if (out_profile) {
- if (UseColor)
+ if (UseColor)
puts(" \e[0;32m IMPLICIT INSERTION OF I\e[0m\n");
else
puts(" IMPLICIT INSERTION OF I\n");
@@ -938,7 +938,7 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
memcpy(WorkingScores.Insertion.Transitions, DefaultScores.Insertion.Transitions, sizeof(TransitionScores));
// CopyPreviousInsertionProfile(&WorkingScores.Insertion);
-
+
NextInsertionProfile(&WorkingScores.Insertion);
++InsertionCounter;
}
@@ -992,14 +992,14 @@ static int internalReadProfile(FILE* prfStream, struct Profile * const prf, cons
}
}
}
-
- /*
+
+ /*
* End of file reached without end of profile keyword. This typically happens when profile
* has empty lines after the last end of profile keyword.
* Let us check this and return here with special value -1.
- */
+ */
if (Length < 1) return -1;
-
+
END_OF_PROFILE:
if (prf->Type == PF_MATRIX) {
/* Insert possible missing I when profile starts with M */
@@ -1011,7 +1011,7 @@ END_OF_PROFILE:
++InsertionCounter;
}
- if (SetExtraTable)
+ if (SetExtraTable)
{
register int ret;
if ((ret = PrepareExtraTable(prf)) != 0) return ret;
@@ -1022,7 +1022,7 @@ END_OF_PROFILE:
/* Copy default values */
memcpy(WorkingScores.Match.Alphabet, DefaultScores.Match.Alphabet, (ALPHABET_MEMORY_SIZE)*sizeof(StoredIntegerFormat));
}
-
+
/* CHECK CONSISTENCY */
if (MatchCounter != Length) {
if ( MatchCounter < Length )
@@ -1059,7 +1059,7 @@ END_OF_PROFILE:
fprintf(stderr,
"Warning: Disjointness parameter 2 (%i) out of bound. Parameter set to acceptable value.\n",
prf->DisjointData.NDIP[1]);
- prf->DisjointData.NDIP[1] = Length;
+ prf->DisjointData.NDIP[1] = Length;
}
if (prf->DisjointData.NDIP[1] < prf->DisjointData.NDIP[0]) {
@@ -1068,18 +1068,18 @@ END_OF_PROFILE:
prf->DisjointData.NDIP[0] = tmp;
}
}
-
+
*LineOffset = Line;
return 0;
-
+
/*
* ERRORS
*/
-
+
// MissingSymbol:
// fprintf(stderr, "Missing symbol %c at line %lu of %s\n\tLine: %s\n",Symbol,Line, FileName, prfLine);
// return 1;
-
+
MissingType:
if (prf->Identification[0] != '\0') {
fprintf(stderr, "Missing MATRIX or PATTERN keyword at line %lu of profile %s\n\tLine: %s\n", Line, prf->Identification, currentLine);
@@ -1087,7 +1087,7 @@ MissingType:
fprintf(stderr, "Missing MATRIX or PATTERN keyword at line %lu of %s\n\tLine: %s\n", Line, FileName, currentLine);
}
goto FIN;
-
+
AlphabetSizeTooLarge:
fprintf(stderr, "Alphabet size exceeds hard defined size: %u > %lu\n", ALPHABET_SIZE, prf->Alphabet_Length);
goto FIN;
@@ -1097,9 +1097,9 @@ NormalizationError:
Line, FileName);
for (int i=0; i<KNOR; ++i) fprintf(stderr, "%s ", prf->NormalizationData.CNOR[i]);
fputs("\n", stderr);
-
+
goto FIN;
-
+
TooManyNormalization:
fprintf(stderr, "Too many normalization parameters at line %lu of %s\n\tMaximum is %i.\n", Line, FileName, 0);
goto FIN;
@@ -1128,14 +1128,14 @@ AllocationError:
fputs("Unable to allocate sufficient memory\n", stderr);
if (prf->Sequence) free(prf->Sequence);
goto FIN;
-
+
WrongType:
fprintf(stderr, "MA keyword should not appear in PATTERN profile at line %lu of %s\n", Line, FileName);
goto FIN;
-
+
NoLength:
fprintf(stderr, "Profile does not bear a LENGTH in GENERAL_SPEC option at line %lu of %s\n", Line, FileName);
-
+
FIN:
return 1;
}
@@ -1150,17 +1150,17 @@ static int ComplementAlphabet(struct Profile * const prf)
Alphabet_Mapping[x - (unsigned char) 'A'] = Alphabet_Mapping[y - (unsigned char) 'A'];\
Alphabet_Mapping[y - (unsigned char) 'A'] = ctmp;\
}
- memcpy(prf->Complement_Alphabet_Mapping, prf->Alphabet_Mapping, ALPHABET_SIZE+2);
- if (prf->Type == PF_MATRIX) {
+ memcpy(prf->Complement_Alphabet_Mapping, prf->Alphabet_Mapping, ALPHABET_SIZE+2);
+ if (prf->Type == PF_MATRIX) {
unsigned char * const restrict Alphabet_Mapping = prf->Complement_Alphabet_Mapping;
-
+
SWAP_ALPHABET('A', 'T');
SWAP_ALPHABET('C', 'G');
SWAP_ALPHABET('M', 'K');
SWAP_ALPHABET('R', 'Y');
SWAP_ALPHABET('V', 'B');
SWAP_ALPHABET('H', 'D');
-
+
return 0;
}
else {
@@ -1206,7 +1206,7 @@ int PrepareExtraTable(struct Profile * const prf)
ScoreTuple * restrict const LastScores = lprf->Scores.Insertion.LastSequenceProtein;
const int MLOW = NLOW/4*3;
const size_t Length = lprf->Length;
-
+
if ( lprf->isCircular) {
for (size_t i=0; i<=Length; ++i) {
register const size_t offset = INSERTION_TRANSITIONS_SIZE*i;
@@ -1217,13 +1217,13 @@ int PrepareExtraTable(struct Profile * const prf)
CHECK_AND_SET(InsertionScores[offset + _XM], InsertionBoundaries[Boffset + _B1], InsertionBoundaries[Boffset + _BM]);
CHECK_AND_SET(InsertionScores[offset + _XI], InsertionBoundaries[Boffset + _B1], InsertionBoundaries[Boffset + _BI]);
CHECK_AND_SET(InsertionScores[offset + _XD], InsertionBoundaries[Boffset + _B1], InsertionBoundaries[Boffset + _BD]);
-
- // Minimize dummy element
+
+ // Minimize dummy element
InsertionScores[offset + _DUMMY] = NLOW;
CHECK_AND_SET(InsertionScores[offset + _MX], InsertionBoundaries[Boffset + _E0], InsertionBoundaries[Boffset + _ME]);
CHECK_AND_SET(InsertionScores[offset + _IX], InsertionBoundaries[Boffset + _E0], InsertionBoundaries[Boffset + _IE]);
CHECK_AND_SET(InsertionScores[offset + _DX], InsertionBoundaries[Boffset + _E0], InsertionBoundaries[Boffset + _DE]);
-
+
CHECK_AND_SET(FirstScores[i].To[MATCH] , InsertionBoundaries[Boffset + _B0], InsertionBoundaries[Boffset + _BM]);
CHECK_AND_SET(FirstScores[i].To[INSERTION], InsertionBoundaries[Boffset + _B0], InsertionBoundaries[Boffset + _BI]);
CHECK_AND_SET(FirstScores[i].To[DELETION] , InsertionBoundaries[Boffset + _B0], InsertionBoundaries[Boffset + _BD]);
@@ -1232,11 +1232,11 @@ int PrepareExtraTable(struct Profile * const prf)
CHECK_AND_SET(LastScores[i].From[INSERTION], InsertionBoundaries[Boffset + _E1], InsertionBoundaries[Boffset + _IE]);
CHECK_AND_SET(LastScores[i].From[DELETION] , InsertionBoundaries[Boffset + _E1], InsertionBoundaries[Boffset + _DE]);
}
- }
+ }
else {
const size_t NDIP1 = lprf->DisjointData.NDIP[0];
const size_t NDIP2 = lprf->DisjointData.NDIP[1];
-
+
for (size_t i=0; i<NDIP1; ++i) {
register const size_t offset = INSERTION_TRANSITIONS_SIZE*i;
register const size_t Boffset = INSERTION_BOUNDARIES_SIZE*i;
@@ -1244,8 +1244,8 @@ int PrepareExtraTable(struct Profile * const prf)
CHECK_AND_SET(InsertionScores[offset + _XM], InsertionBoundaries[Boffset + _B1], InsertionBoundaries[Boffset + _BM]);
CHECK_AND_SET(InsertionScores[offset + _XI], InsertionBoundaries[Boffset + _B1], InsertionBoundaries[Boffset + _BI]);
CHECK_AND_SET(InsertionScores[offset + _XD], InsertionBoundaries[Boffset + _B1], InsertionBoundaries[Boffset + _BD]);
-
- // Minimize dummy element
+
+ // Minimize dummy element
InsertionScores[offset + _DUMMY] = NLOW;
CHECK_AND_SET(InsertionScores[offset + _MX], NLOW, InsertionBoundaries[Boffset + _ME]);
CHECK_AND_SET(InsertionScores[offset + _IX], NLOW, InsertionBoundaries[Boffset + _IE]);
@@ -1266,8 +1266,8 @@ int PrepareExtraTable(struct Profile * const prf)
CHECK_AND_SET(InsertionScores[offset + _XM], InsertionBoundaries[Boffset + _B1], InsertionBoundaries[Boffset + _BM]);
CHECK_AND_SET(InsertionScores[offset + _XI], InsertionBoundaries[Boffset + _B1], InsertionBoundaries[Boffset + _BI]);
CHECK_AND_SET(InsertionScores[offset + _XD], InsertionBoundaries[Boffset + _B1], InsertionBoundaries[Boffset + _BD]);
-
- // Minimize dummy element
+
+ // Minimize dummy element
InsertionScores[offset + _DUMMY] = NLOW;
CHECK_AND_SET(InsertionScores[offset + _MX], InsertionBoundaries[Boffset + _E1], InsertionBoundaries[Boffset + _ME]);
CHECK_AND_SET(InsertionScores[offset + _IX], InsertionBoundaries[Boffset + _E1], InsertionBoundaries[Boffset + _IE]);
@@ -1288,8 +1288,8 @@ int PrepareExtraTable(struct Profile * const prf)
CHECK_AND_SET(InsertionScores[offset + _XM], NLOW, InsertionBoundaries[Boffset + _BM]);
CHECK_AND_SET(InsertionScores[offset + _XI], NLOW, InsertionBoundaries[Boffset + _BI]);
CHECK_AND_SET(InsertionScores[offset + _XD], NLOW, InsertionBoundaries[Boffset + _BD]);
-
- // Minimize dummy element
+
+ // Minimize dummy element
InsertionScores[offset + _DUMMY] = NLOW;
CHECK_AND_SET(InsertionScores[offset + _MX], InsertionBoundaries[Boffset + _E1], InsertionBoundaries[Boffset + _ME]);
CHECK_AND_SET(InsertionScores[offset + _IX], InsertionBoundaries[Boffset + _E1], InsertionBoundaries[Boffset + _IE]);
@@ -1324,15 +1324,15 @@ int PrepareExtraTable(struct Profile * const prf)
ScoreTuple * restrict const LastScores = lprf->Scores.Insertion.LastSequenceProtein;
const int MLOW = NLOW/4*3;
const size_t Length = lprf->Length;
-
+
if ( lprf->isCircular) {
fputs("No coverage on circular profile", stderr);
return 1;
- }
+ }
else {
const size_t NDIP1 = lprf->DisjointData.NDIP[0];
const size_t NDIP2 = lprf->DisjointData.NDIP[1];
-
+
for (size_t i=0; i<NDIP1; ++i) {
register const size_t offset = INSERTION_TRANSITIONS_SIZE*i;
register const size_t Boffset = INSERTION_BOUNDARIES_SIZE*i;
@@ -1340,8 +1340,8 @@ int PrepareExtraTable(struct Profile * const prf)
CHECK_AND_SET(InsertionScores[offset + _XM], InsertionBoundaries[Boffset + _B1], InsertionBoundaries[Boffset + _BM]);
CHECK_AND_SET(InsertionScores[offset + _XI], InsertionBoundaries[Boffset + _B1], InsertionBoundaries[Boffset + _BI]);
CHECK_AND_SET(InsertionScores[offset + _XD], InsertionBoundaries[Boffset + _B1], InsertionBoundaries[Boffset + _BD]);
-
- // Minimize dummy element
+
+ // Minimize dummy element
InsertionScores[offset + _DUMMY] = NLOW;
CHECK_AND_SET(InsertionScores[offset + _MX], NLOW, InsertionBoundaries[Boffset + _ME]);
CHECK_AND_SET(InsertionScores[offset + _IX], NLOW, InsertionBoundaries[Boffset + _IE]);
@@ -1362,8 +1362,8 @@ int PrepareExtraTable(struct Profile * const prf)
CHECK_AND_SET(InsertionScores[offset + _XM], NLOW, InsertionBoundaries[Boffset + _BM]);
CHECK_AND_SET(InsertionScores[offset + _XI], NLOW, InsertionBoundaries[Boffset + _BI]);
CHECK_AND_SET(InsertionScores[offset + _XD], NLOW, InsertionBoundaries[Boffset + _BD]);
-
- // Minimize dummy element
+
+ // Minimize dummy element
InsertionScores[offset + _DUMMY] = NLOW;
CHECK_AND_SET(InsertionScores[offset + _MX], NLOW, InsertionBoundaries[Boffset + _ME]);
CHECK_AND_SET(InsertionScores[offset + _IX], NLOW, InsertionBoundaries[Boffset + _IE]);
@@ -1384,8 +1384,8 @@ int PrepareExtraTable(struct Profile * const prf)
CHECK_AND_SET(InsertionScores[offset + _XM], NLOW, InsertionBoundaries[Boffset + _BM]);
CHECK_AND_SET(InsertionScores[offset + _XI], NLOW, InsertionBoundaries[Boffset + _BI]);
CHECK_AND_SET(InsertionScores[offset + _XD], NLOW, InsertionBoundaries[Boffset + _BD]);
-
- // Minimize dummy element
+
+ // Minimize dummy element
InsertionScores[offset + _DUMMY] = NLOW;
CHECK_AND_SET(InsertionScores[offset + _MX], InsertionBoundaries[Boffset + _E1], InsertionBoundaries[Boffset + _ME]);
CHECK_AND_SET(InsertionScores[offset + _IX], InsertionBoundaries[Boffset + _E1], InsertionBoundaries[Boffset + _IE]);
@@ -1412,7 +1412,7 @@ struct Profile * ReverseProfile(const struct Profile * const restrict inprf)
struct Profile * const restrict outprf = _mm_malloc(sizeof(struct Profile), 16);
if (outprf == NULL) return NULL;
register const size_t prfLength = inprf->Length;
-
+
/* Copy parameters */
#if 1
memcpy(outprf, inprf, sizeof(struct Profile));
@@ -1431,7 +1431,7 @@ struct Profile * ReverseProfile(const struct Profile * const restrict inprf)
#endif
outprf->DisjointData.NDIP[0] = (int) prfLength - inprf->DisjointData.NDIP[1] + 1;
outprf->DisjointData.NDIP[1] = (int) prfLength - inprf->DisjointData.NDIP[0] + 1;
-
+
/* Allocates memory for profile sequence */
char * Sequence = malloc(prfLength*sizeof(char));
if (Sequence == NULL) {
@@ -1442,14 +1442,14 @@ struct Profile * ReverseProfile(const struct Profile * const restrict inprf)
for (size_t iprf=0; iprf<prfLength; ++iprf) {
Sequence[iprf] = inprf->Sequence[prfLength-1-iprf];
}
-
+
/* Allocates memory for score tables*/
if (AllocateScores(&(outprf->Scores), inprf->Alphabet_Length, prfLength) != 0) {
free(Sequence);
_mm_free(outprf);
return NULL;
}
-
+
/* Transfer match and insertion alphabets */
{
register const size_t AlignedStep = inprf->Scores.Insertion.AlignStep;
@@ -1460,7 +1460,7 @@ struct Profile * ReverseProfile(const struct Profile * const restrict inprf)
outMatch += AlignedStep;
inMatch -= AlignedStep;
}
-
+
register const StoredIntegerFormat * restrict inInsertion = &inprf->Scores.Insertion.Alphabet[AlignedStep*(inprf->Length)];
register StoredIntegerFormat * restrict outInsertion = outprf->Scores.Insertion.Alphabet;
for (size_t iprf=0; iprf<=prfLength; ++iprf) {
@@ -1469,7 +1469,7 @@ struct Profile * ReverseProfile(const struct Profile * const restrict inprf)
inInsertion -= AlignedStep;
}
}
-
+
/* Transfer boundaries */
register const StoredIntegerFormat (*inBoundaries)[INSERTION_BOUNDARIES_SIZE] = (const StoredIntegerFormat (*)[INSERTION_BOUNDARIES_SIZE]) inprf->Scores.Insertion.Boundaries;
register StoredIntegerFormat (*outBoundaries)[INSERTION_BOUNDARIES_SIZE] = (StoredIntegerFormat (*)[INSERTION_BOUNDARIES_SIZE]) outprf->Scores.Insertion.Boundaries;
@@ -1484,9 +1484,9 @@ struct Profile * ReverseProfile(const struct Profile * const restrict inprf)
outBoundaries[iprf][_ME] = inBoundaries[prfLength-iprf][_BM];
outBoundaries[iprf][_BD] = inBoundaries[prfLength-iprf][_DE];
outBoundaries[iprf][_DE] = inBoundaries[prfLength-iprf][_BD];
- outBoundaries[iprf][_BE] = inBoundaries[prfLength-iprf][_BE];
+ outBoundaries[iprf][_BE] = inBoundaries[prfLength-iprf][_BE];
}
-
+
/* Transfer transitions */
register const TransitionScores *inTransitions = (TransitionScores*) inprf->Scores.Insertion.Transitions;
register TransitionScores *outTransitions = (TransitionScores*) outprf->Scores.Insertion.Transitions;
@@ -1494,11 +1494,11 @@ struct Profile * ReverseProfile(const struct Profile * const restrict inprf)
outTransitions[iprf].Element[_DD] = inTransitions[prfLength-iprf].Element[_DD];
outTransitions[iprf].Element[_DI] = inTransitions[prfLength-iprf].Element[_ID];
outTransitions[iprf].Element[_DM] = inTransitions[prfLength-iprf].Element[_MD];
-
+
outTransitions[iprf].Element[_MD] = inTransitions[prfLength-iprf].Element[_DM];
outTransitions[iprf].Element[_MM] = inTransitions[prfLength-iprf].Element[_MM];
outTransitions[iprf].Element[_MI] = inTransitions[prfLength-iprf].Element[_IM];
-
+
outTransitions[iprf].Element[_ID] = inTransitions[prfLength-iprf].Element[_DI];
outTransitions[iprf].Element[_IM] = inTransitions[prfLength-iprf].Element[_MI];
outTransitions[iprf].Element[_II] = inTransitions[prfLength-iprf].Element[_II];
@@ -1522,13 +1522,13 @@ int ReadProfile(const char * const restrict FileName, struct Profile * const prf
if (prfStream == NULL) {
return -1;
}
-
+
/*
- * Read all internal data
+ * Read all internal data
*/
/* Clean Profile structure */
memset(newPrf, 0, sizeof(struct Profile));
- while (!feof(prfStream)) {
+ while (!feof(prfStream)) {
/* Read one profile structure at a time*/
const int res = internalReadProfile(prfStream, newPrf, SetExtraTable, FileName, &Line);
++nprf;
@@ -1541,7 +1541,7 @@ int ReadProfile(const char * const restrict FileName, struct Profile * const prf
if (tmpPrf) {
/* Clean Profile structure */
memset(tmpPrf, 0, sizeof(struct Profile));
-
+
tmpPrf->previous = newPrf;
newPrf->next = tmpPrf;
newPrf = tmpPrf;
@@ -1562,15 +1562,15 @@ int ReadProfile(const char * const restrict FileName, struct Profile * const prf
else {
nprf = -1;
}
- break;
+ break;
}
}
-
+
/*
- * Close the file
+ * Close the file
*/
fclose(prfStream);
-
+
return nprf;
}
@@ -1598,9 +1598,9 @@ int WriteProfile(const char * const restrict FileNameIn, struct Profile * const
if (prfStreamIn == NULL) {
return 1;
}
-
+
/*
- * Write down the header data
+ * Write down the header data
*/
fprintf(prfStreamOut,
"ID %s; MATRIX.\n"
@@ -1609,7 +1609,7 @@ int WriteProfile(const char * const restrict FileNameIn, struct Profile * const
"DE %s\n",
prf->Identification, prf->AC_Number, prf->Date, prf->Description
);
-
+
/*
* Follow the initial profile and parse/reuse
*/
@@ -1617,8 +1617,8 @@ int WriteProfile(const char * const restrict FileNameIn, struct Profile * const
int res;
_Bool MultipleLine;
memset(previousSubCommand, 0, sizeof(char)*SUB_COMMAND_MAX_SIZE);
-
- while (!feof(prfStreamIn)) {
+
+ while (!feof(prfStreamIn)) {
const size_t length = GetLine(prfStreamIn, currentLine, PROFILE_MAX_LINE_SIZE);
++Line;
if (length == 0) continue;
@@ -1626,12 +1626,12 @@ int WriteProfile(const char * const restrict FileNameIn, struct Profile * const
/* Make a copy */
memcpy(currentLineCopy, currentLine, length+1);
currentLineCopy[length] = '\0';
-
+
if ((res=AnalyzeLine(currentLine, &AnalyzedLine, &MultipleLine)) != 0) {
fprintf(stderr,"Error %i in analysis at line %lu\n", res, Line);
return 1;
}
-
+
/* Header or matrix */
if (!AnalyzedLine.isMatrix)
{
@@ -1650,7 +1650,7 @@ int WriteProfile(const char * const restrict FileNameIn, struct Profile * const
CommentStorage[CommentStorageUsed++] = '\n';
CommentStorage[CommentStorageUsed] = '\0';
}
- else if ( (AnalyzedLine.command[0] == 'D' && AnalyzedLine.command[1] == 'R' ) ||
+ else if ( (AnalyzedLine.command[0] == 'D' && AnalyzedLine.command[1] == 'R' ) ||
(AnalyzedLine.command[0] == 'N' && AnalyzedLine.command[1] == 'R' ) ||
(AnalyzedLine.command[0] == '3' && AnalyzedLine.command[1] == 'D' ) ||
(AnalyzedLine.command[0] == 'P' && AnalyzedLine.command[1] == 'R' ) ||
@@ -1685,7 +1685,7 @@ int WriteProfile(const char * const restrict FileNameIn, struct Profile * const
const int Mode = nrmItem->NNOR;
const int Priority = nrmItem->NNPR;
const char * Text = nrmItem->CNTX;
-
+
fprintf(prfStreamOut, "MA /NORMALIZATION: MODE=%i; FUNCTION=%s;", Mode, Function);
for (int iCoef=1; iCoef<=nCoef; ++iCoef) {
fprintf(prfStreamOut, " R%1.1i=%f;", iCoef, nrmItem->RNOP[iCoef-1]);
@@ -1707,7 +1707,7 @@ int WriteProfile(const char * const restrict FileNameIn, struct Profile * const
const unsigned int HScore = cutItem->HCUT;
const char * Text = cutItem->CCUT;
const int nModes = cutItem->JCNM;
-
+
fprintf(prfStreamOut, "MA /CUT_OFF: LEVEL=%i; SCORE=%i;", Level, RScore);
if (HScore>0) {
fprintf(prfStreamOut, " H_SCORE=%u;", HScore);
@@ -1747,27 +1747,27 @@ int WriteProfile(const char * const restrict FileNameIn, struct Profile * const
else {
fprintf(stderr,"The following unknown line has been avoided\n->%s\n",currentLineCopy);
}
-
+
}
}
-
+
END_OF_PROFILE:
-
+
/*
- * Write down the comments now
+ * Write down the comments now
*/
if (CommentStorageUsed>0) fputs(CommentStorage, prfStreamOut);
-
+
/*
- * Write down the additional comments now
+ * Write down the additional comments now
*/
if (AdditionalComments) fputs(AdditionalComments, prfStreamOut);
-
+
/*
* Terminate profile
*/
fputs("//\n", prfStreamOut);
-
+
fclose(prfStreamIn);
free(CommentStorage);
return 0;
@@ -1784,12 +1784,12 @@ void FreeProfile(struct Profile * const prf, const _Bool IsPointer)
_mm_free(nextPrf);
nextPrf = tmpPrf;
}
-
+
FreeScores(&(prf->Scores));
free(prf->Sequence);
FreeAverage(&prf->Average);
if (prf->Pattern) free(prf->Pattern);
-
+
if (IsPointer) {
_mm_free(prf);
} else {
@@ -1804,9 +1804,9 @@ int ReadProfileMatch(const char * const restrict FileName, struct UniProtMatch *
char currentLine[PROFILE_MAX_LINE_SIZE] __attribute__((aligned(16)));
struct ProfileLine AnalyzedLine;
_Bool MultipleLine;
-
+
memset(Data, 0, sizeof(struct UniProtMatch));
-
+
/*
* Try to open the file, upon failure emmit error
*/
@@ -1814,8 +1814,8 @@ int ReadProfileMatch(const char * const restrict FileName, struct UniProtMatch *
if (prfStream == NULL) {
return -1;
}
-
-
+
+
/*
* Count the number of UniProt statement
*/
@@ -1824,7 +1824,7 @@ int ReadProfileMatch(const char * const restrict FileName, struct UniProtMatch *
long FirstAppearanceInFile = 0;
size_t StartingLine = 0;
while (!feof(prfStream)) {
- const long FilePosition = ftell(prfStream);
+ const long FilePosition = ftell(prfStream);
const size_t length = GetLine(prfStream, currentLine, PROFILE_MAX_LINE_SIZE);
if (length == 0) continue;
if ((res=AnalyzeLine(currentLine, &AnalyzedLine, &MultipleLine)) != 0) {
@@ -1846,19 +1846,19 @@ int ReadProfileMatch(const char * const restrict FileName, struct UniProtMatch *
}
++Line;
}
-
+
/*
* Allocate the memory to hold the data
*/
char (* const UniqueIdentifier)[16] = (char (*)[16]) malloc(Count*16*sizeof(char));
char (* const EntryName)[16] = (char(*)[16]) malloc(Count*16*sizeof(char));
char * const State = (char*) malloc(Count*sizeof(char));
-
+
if (UniqueIdentifier == NULL || EntryName == NULL || State == NULL) {
res = -2;
goto FIN;
}
-
+
/*
* Fill in the data
*/
@@ -1874,9 +1874,9 @@ int ReadProfileMatch(const char * const restrict FileName, struct UniProtMatch *
unsigned int Profile_partial = 0;
unsigned int Profile_false_neg = 0;
unsigned int Profile_false_pos = 0;
-
+
while (!feof(prfStream)) {
- const long FilePosition = ftell(prfStream);
+ const long FilePosition = ftell(prfStream);
const size_t length = GetLine(prfStream, currentLine, PROFILE_MAX_LINE_SIZE);
if (length == 0) continue;
if ((res=AnalyzeLine(currentLine, &AnalyzedLine, &MultipleLine)) != 0) {
@@ -1915,7 +1915,7 @@ int ReadProfileMatch(const char * const restrict FileName, struct UniProtMatch *
default:
Profile_unknown++;
}
-
+
++lCount;
}
}
@@ -1927,7 +1927,7 @@ int ReadProfileMatch(const char * const restrict FileName, struct UniProtMatch *
}
++Line;
}
-
+
/*
* Assign data to structure
*/
@@ -1940,18 +1940,18 @@ int ReadProfileMatch(const char * const restrict FileName, struct UniProtMatch *
Data->Partial = Profile_partial;
Data->False_negative = Profile_false_neg;
Data->False_posistive = Profile_false_pos;
-
+
/*
- * Close the file
+ * Close the file
*/
fclose(prfStream);
return 0;
-
+
FIN1:
FreeProfileMatch(Data);
FIN:
fclose(prfStream);
-
+
return res;
}
@@ -1973,7 +1973,7 @@ void FreeProfileMatch(struct UniProtMatch * Data)
"| PFDUMP v" PF_VERSION " |\n"\
"%----------------------------------------------------------------------------%\n"\
"Built on " __DATE__ " at " __TIME__ ".\n"
-
+
/* default value for header is 4 digits*/
// #define INT_FORMAT "%4i"
// #define NLOW_FORMAT "NLOW"
@@ -1999,13 +1999,13 @@ static unsigned int out_clean = 0;
static const struct option long_options[] =
{
/*
- * These options set a flag.
+ * These options set a flag.
*/
-
- /*
- * These options don't set a flag. We distinguish them by their indices.
+
+ /*
+ * These options don't set a flag. We distinguish them by their indices.
*/
- {"help", no_argument, 0, 'h'},
+ {"help", no_argument, 0, 'h'},
{"all", no_argument, 0, 'A'},
{"alphabet", no_argument, 0, 'a'},
{"color", no_argument, 0, 'c'},
@@ -2029,10 +2029,10 @@ static void __attribute__((noreturn)) Usage(FILE * stream)
" --color [-c] : output profile reading with colors\n"
" --reverse [-r] : reverse profile\n"
" --all [-A] : output everything\n"
- " --tables [-T] : output score tables\n"
+ " --tables [-T] : output score tables\n"
" --alphabet [-a] : output alphabet\n"
" --profile [-p] : output profile reading\n"
- " --match-table [-m] : output match table\n"
+ " --match-table [-m] : output match table\n"
" --insertion-table [-i] : output insertion table\n"
" --boundary-table [-b] : output boundary table\n"
" --transition-table [-t] : output transition table\n"
@@ -2049,7 +2049,7 @@ int main(int argc, char *argv[])
////////////////////////////////////////////////////////////////////////////////////////////////
// OPTIONS
////////////////////////////////////////////////////////////////////////////////////////////////
-
+
while (1) {
/* getopt_long stores the option index here. */
int option_index = 0;
@@ -2096,24 +2096,24 @@ int main(int argc, char *argv[])
} else {
ProfileFile = argv[optind];
}
-
+
if (ReadProfile(ProfileFile, &prf, false) < 0) {
FreeProfile(&prf, false);
return 1;
}
-
+
if (prf.Type == PF_PATTERN) {
FreeProfile(&prf, false);
return 0;
}
-
+
if (out_clean) {
const char Footer[] = "CC Tests output with pfdump\n";
WriteProfile(ProfileFile, &prf, Footer, stdout);
FreeProfile(&prf, false);
return 0;
}
-
+
if (isReversed) {
rprf = ReverseProfile(&prf);
if (rprf == NULL) {fputs("Error while reversing profile\n",stderr); exit(1);}
@@ -2122,7 +2122,7 @@ int main(int argc, char *argv[])
pprf = &prf;
}
PrepareExtraTable(pprf);
-
+
if (out_alphabet) {
puts("Alphabet Mapping");
for (size_t i=0; i<ALPHABET_SIZE; ++i) {
@@ -2132,10 +2132,10 @@ int main(int argc, char *argv[])
puts("\n");
}
const size_t prfLength = pprf->Length + 1;
-
+
struct SMatch * const Match = &pprf->Scores.Match;
struct SInsertion * const Insertion = &pprf->Scores.Insertion;
-
+
if (out_match) {
printf("Match matrix with alignment %lu\n\n",Match->AlignStep );
printf(" | ");
@@ -2148,7 +2148,7 @@ int main(int argc, char *argv[])
fputs(LINE, stdout);
}
fputs("\n", stdout);
-
+
for (size_t iprf=0; iprf<prfLength; ++iprf) {
const StoredIntegerFormat * MatchLine = &Match->Alphabet[iprf*Match->AlignStep];
printf("%3lu | ", iprf+1);
@@ -2205,11 +2205,11 @@ int main(int argc, char *argv[])
fputs("\n", stdout);
}
}
-
+
if (out_boundaries) {
printf("\nInsertion boundaries matrix with alignment %i\n\n", INSERTION_BOUNDARIES_SIZE );
char Header[] = " " SPACE "_B0" SPACE "_B1" SPACE "_E0" SPACE "_E1" SPACE "_BM" SPACE "_BI" SPACE "_BD" SPACE "_BE" SPACE "_ME" SPACE "_IE" SPACE "_DE\n";
-
+
fputs(Header, stdout);
fputs(" |", stdout);
for (size_t i=0; i<strlen(Header)-5; ++i) fputc('-', stdout);
@@ -2232,7 +2232,7 @@ int main(int argc, char *argv[])
const TransitionScores * restrict InsertionLine = pprf->Scores.Insertion.Transitions;
const ScoreTuple * const restrict FirstSeq = pprf->Scores.Insertion.FirstSequenceProtein;
const ScoreTuple * const restrict LastSeq = pprf->Scores.Insertion.LastSequenceProtein;
-
+
#define PRINT_VALUE(x) { \
if (x == NLOW) {\
printf(NLOW_FORMAT " ");\
@@ -2242,7 +2242,7 @@ int main(int argc, char *argv[])
printf(INT_FORMAT " ", x);\
}\
}
-
+
printf("\nInsertion transition matrix with alignment %i\n\n", INSERTION_TRANSITIONS_SIZE );
char Header2[] = " " SPACE "MATCH " SPACE SPACE " " SPACE " |" SPACE "INSERTION" SPACE SPACE SPACE " |" SPACE "DELETION " SPACE SPACE SPACE\
" |" SPACE "EXTRA " SPACE SPACE " |"\
@@ -2267,39 +2267,39 @@ int main(int argc, char *argv[])
PRINT_VALUE(InsertionLine[iprf].From[MATCH].To[INSERTION]);
PRINT_VALUE(InsertionLine[iprf].From[MATCH].To[DELETION]);
PRINT_VALUE(InsertionLine[iprf].From[MATCH].To[EXTRA]);
-
+
PRINT_VALUE(InsertionLine[iprf].From[INSERTION].To[MATCH]);
PRINT_VALUE(InsertionLine[iprf].From[INSERTION].To[INSERTION]);
PRINT_VALUE(InsertionLine[iprf].From[INSERTION].To[DELETION]);
PRINT_VALUE(InsertionLine[iprf].From[INSERTION].To[EXTRA]);
-
+
PRINT_VALUE(InsertionLine[iprf].From[DELETION].To[MATCH]);
PRINT_VALUE(InsertionLine[iprf].From[DELETION].To[INSERTION]);
PRINT_VALUE(InsertionLine[iprf].From[DELETION].To[DELETION]);
PRINT_VALUE(InsertionLine[iprf].From[DELETION].To[EXTRA]);
-
+
fputs(" ",stdout);
-
+
PRINT_VALUE(InsertionLine[iprf].From[EXTRA].To[MATCH]);
PRINT_VALUE(InsertionLine[iprf].From[EXTRA].To[INSERTION]);
PRINT_VALUE(InsertionLine[iprf].From[EXTRA].To[DELETION]);
-
+
fputs(" ",stdout);
-
+
PRINT_VALUE(LastSeq[iprf].From[MATCH]);
PRINT_VALUE(LastSeq[iprf].From[INSERTION]);
PRINT_VALUE(LastSeq[iprf].From[DELETION]);
-
+
fputs(" ",stdout);
-
+
PRINT_VALUE(FirstSeq[iprf].To[MATCH]);
PRINT_VALUE(FirstSeq[iprf].To[INSERTION]);
PRINT_VALUE(FirstSeq[iprf].To[DELETION]);
-
+
fputs("\n", stdout);
}
}
-
+
FreeProfile(pprf, isReversed);
return 0;
}
=====================================
src/C/utils/system.c
=====================================
@@ -908,7 +908,7 @@ void getSystemInfo(SystemInfo * const info)
for (size_t i=0; i<13; ++i) info->CPU_Vendor[i] = '\0';
/* Available number of logical processor seen by OS */
- info->nOverallCores = (unsigned int) sysconf(_SC_NPROCESSORS_CONF);
+ info->nOverallCores = (unsigned int) sysconf(_SC_NPROCESSORS_ONLN);
const char NOBrand[] = "Not supported by this cpu";
strcpy(info->CPU_Name, NOBrand);
=====================================
src/Perl/fasta_to_fastq.pl
=====================================
@@ -1,3 +1,4 @@
+#!/usr/bin/env perl
#Copyright (c) 2010 LUQMAN HAKIM BIN ABDUL HADI (csilhah at nus.edu.sg)
#
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
@@ -12,7 +13,6 @@
#LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
#IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#!/usr/bin/perl
use strict;
my $file = $ARGV[0];
@@ -20,26 +20,26 @@ open FILE, $file;
my ($header, $sequence, $sequence_length, $sequence_quality);
while(<FILE>) {
- chomp $_;
- if ($_ =~ /^>(.+)/) {
- if($header ne "") {
- print "\@".$header."\n";
- print $sequence."\n";
- print "+"."\n";
- print $sequence_quality."\n";
- }
- $header = $1;
- $sequence = "";
- $sequence_length = "";
- $sequence_quality = "";
+ chomp $_;
+ if ($_ =~ /^>(.+)/) {
+ if($header ne '') {
+ print "\@".$header."\n";
+ print $sequence."\n";
+ print "+"."\n";
+ print $sequence_quality."\n";
}
- else {
- $sequence .= $_;
- $sequence_length = length($_);
- my $qual = "!''*((((***+))%%%++)(%%%%).1***-+*''))**55CCF>>>>>>CCCCCCC65";
- my @qual = split //, $qual;
- for(my $i=0; $i<$sequence_length; $i++) {$sequence_quality .= $qual[$i % length($qual)]}
- }
+ $header = $1;
+ $sequence = '';
+ $sequence_length = '';
+ $sequence_quality = '';
+ }
+ else {
+ $sequence .= $_;
+ $sequence_length = length($_);
+ my $qual = "!''*((((***+))%%%++)(%%%%).1***-+*''))**55CCF>>>>>>CCCCCCC65";
+ my @qual = split //, $qual;
+ for(my $i=0; $i<$sequence_length; $i++) {$sequence_quality .= $qual[$i % length($qual)]}
+ }
}
close FILE;
print "\@".$header."\n";
=====================================
src/Perl/make_iupac_cmp.pl
=====================================
@@ -1,4 +1,4 @@
-#!/bin/env perl
+#!/usr/bin/env perl
use strict;
use Getopt::Std;
=====================================
src/Perl/scramble_fasta.pl
=====================================
@@ -1,4 +1,4 @@
-#!/bin/env perl
+#!/usr/bin/env perl
use strict;
@@ -13,7 +13,7 @@ usage:
scramble_fasta.pl [options] fasta-file...
-This script produces"random" or "shuffled" sequences according to a
+This script produces "random" or "shuffled" sequences according to a
model and to a set of parameters. All sequences are read and written
in FASTA format. No distinction is made between DNA and protein
sequences. All letter are converted to uppercase. Gaps are
=====================================
src/Perl/sort_fasta.pl
=====================================
@@ -1,4 +1,4 @@
-#!/bin/env perl
+#!/usr/bin/env perl
use strict;
use Getopt::Std;
=====================================
tests/examples/test_V3.sh.cmake
=====================================
@@ -19,9 +19,9 @@ PFW=$<TARGET_FILE:pfw>
PTOH=$<TARGET_FILE:ptoh>
PTOF=$<TARGET_FILE:ptof>
P2FT=$<TARGET_FILE:2ft> # NB: sh does not allow variable name starting with a digit
-
-SORT_PSA=@PERL_SCRIPT_DIR@/sort_fasta.pl # FIXME: use cmake syntax
-MAKE_IUPAC_CMP=@PERL_SCRIPT_DIR@/make_iupac_cmp.pl # FIXME: use cmake syntax
+
+SORT_PSA=@PERL_SCRIPT_DIR@/sort_fasta.pl # FIXME: use cmake syntax
+MAKE_IUPAC_CMP=@PERL_SCRIPT_DIR@/make_iupac_cmp.pl # FIXME: use cmake syntax
SCRAMBLE=@PERL_SCRIPT_DIR@/scramble_fasta.pl # FIXME: use cmake syntax
CMPDIR=@DATA_DIR@/Matrices
@@ -29,15 +29,15 @@ TMPDIR=/tmp/test_V3
mkdir -p $TMPDIR
#----------------------------------------------------------------------#
-# The PFTOOLS is a powerful software to align biological sequences.
-# Owing to the 'generalized profile syntax', it allows the fine-tuning
-# of an alignent scoring system, beyond what is feasible by most other
-# software. Despite the PFTOOLS are crippled by a lot of legacy code,
-# they are still extremely useful for precision work .
+# The PFTOOLS is a powerful software to align biological sequences.
+# Owing to the 'generalized profile syntax', it allows the fine-tuning
+# of an alignent scoring system, beyond what is feasible by most other
+# software. Despite the PFTOOLS are crippled by a lot of legacy code,
+# they are still extremely useful for precision work.
#
# Nota bene to use this script as a testsuite:
-# (1) The output order of pfsearch is reproducible, as well as the one of
-# pfsearchV3 with -t 1.
+# (1) The output order of pfsearch is reproducible, as well as the one of
+# pfsearchV3 with -t 1.
# (2) Refrain using any pipe.
#----------------------------------------------------------------------#
@@ -45,7 +45,7 @@ mkdir -p $TMPDIR
# Searching for the occurence of the SH3 domain within the VAV oncogene,
# using pfsearch V2 ...
#----------------------------------------------------------------------#
-$PFSEARCH -f ./sh3.prf ./VAV_HUMAN.seq
+$PFSEARCH -f ./sh3.prf ./VAV_HUMAN.seq
#----------------------------------------------------------------------#
# ...and using pfsearch V3:
@@ -53,8 +53,8 @@ $PFSEARCH -f ./sh3.prf ./VAV_HUMAN.seq
$PFSEARCHV3 -n -t 1 -f ./sh3.prf ./VAV_HUMAN.seq
#----------------------------------------------------------------------#
-# Create a database of sequences and a database of profiles, each one
-# with two entries.
+# Create a database of sequences and a database of profiles, each one
+# with two entries.
#----------------------------------------------------------------------#
cat ./VAV_HUMAN.seq ./VAV_RAT.seq > $TMPDIR/VAV.seq
cat ./sh2.prf ./sh3.prf > $TMPDIR/SHX.prf
@@ -79,10 +79,10 @@ $PFSEARCHV3 -f -n -t 2 -o 6 ./sh3.prf -f $TMPDIR/VAV.seq >> $TMPDIR/SHX.pfsearch
$PFSCANV3 -f -n -o 6 $TMPDIR/SHX.prf $TMPDIR/VAV.seq > $TMPDIR/SHX.pfscan3.hit
#----------------------------------------------------------------------#
-# All these commands produces exactly the same list of matched
-# sequences, with the same raw scores and coordinates.
+# All these commands produces exactly the same list of matched
+# sequences, with the same raw scores and coordinates.
#
-# However the output order is not necessarily preserved here.
+# However the output order is not necessarily preserved here.
#
# Let's verify that the output are comparable after fixing FASTA headers
#----------------------------------------------------------------------#
@@ -95,7 +95,7 @@ diff $TMPDIR/SHX.pfscan2.out $TMPDIR/SHX.pfsearch2.out # expecting no differenc
diff $TMPDIR/SHX.pfscan2.out $TMPDIR/SHX.pfsearch3.out # expecting no difference
#----------------------------------------------------------------------#
-# Pfsearch/pfscan V2 supports the following input formats for sequence:
+# Pfsearch/pfscan V2 supports the following input formats for sequence:
# FASTA, Swiss-Prot and EMBL.
#----------------------------------------------------------------------#
$PFSEARCH -f ./sh3.prf ./VAV_HUMAN.seq # FASTA
@@ -105,10 +105,10 @@ $PFSEARCH ./sh3.prf ./GTPA_HUMAN.dat # SwissProt
$PFSCAN ./GTPA_HUMAN.dat ./sh3.prf # SwissProt
$PFSEARCH ./ecp.prf ./CVPBR322.embl # EMBL
-$PFSCAN ./CVPBR322.embl ./ecp.prf # EMBL
+$PFSCAN ./CVPBR322.embl ./ecp.prf # EMBL
#----------------------------------------------------------------------#
-# Pfsearch/pfscan V3 supports the following input formats for sequence:
+# Pfsearch/pfscan V3 supports the following input formats for sequence:
# FASTA and FASTQ.
#----------------------------------------------------------------------#
$PFSEARCHV3 -n -t 1 -f ./sh3.prf ./VAV_HUMAN.seq # FASTA
@@ -117,7 +117,7 @@ cat ./CVPBR322.embl \
| perl -ne 'if(/^ID +(\w+)/){print ">$1\n"}elsif(/^ /){s/[\s\d]+//g;print "$_\n";}' \
> $TMPDIR/CVPBR322.fa # Extract FASTA from EMBL
$PFSEARCHV3 -n -t 1 -f ./ecp.prf $TMPDIR/CVPBR322.fa
-$PFSCANV3 -n -t 1 -f ./ecp.prf $TMPDIR/CVPBR322.fa
+$PFSCANV3 -n -t 1 -f ./ecp.prf $TMPDIR/CVPBR322.fa
$PFSEARCHV3 -n -t 1 -q ./hiv.prf ./hiv.fastq # FASTQ
$PFSCANV3 -n -t 1 -q ./hiv.prf ./hiv.fastq # FASTQ
@@ -136,8 +136,8 @@ $PFSEARCHV3 -n -fb ./ecp.prf $TMPDIR/CVPBR322.fa | sort -nr > $TMPDIR/ecp.CVPBR3
diff -b $TMPDIR/ecp.CVPBR322.2.hit $TMPDIR/ecp.CVPBR322.3.hit # expecting no difference
#----------------------------------------------------------------------#
-# The different PSA (i.e FASTA) output formats differ by the content
-# their headers. The usage of XPSA (-o 6) is strongly recommended, the
+# The different PSA (i.e FASTA) output formats differ by the content
+# their headers. The usage of XPSA (-o 6) is strongly recommended, the
# other formats being preserved for legacy.
#----------------------------------------------------------------------#
$PFSEARCHV3 -n -f -o 1 -N 15 ./sh3.prf ./VAV_HUMAN.seq | $SORT_PSA -
@@ -147,10 +147,10 @@ $PFSEARCHV3 -n -f -o 4 -N 15 ./sh3.prf ./VAV_HUMAN.seq | $SORT_PSA -
$PFSEARCHV3 -n -f -o 6 -N 15 ./sh3.prf ./VAV_HUMAN.seq | $SORT_PSA - # recommended
#----------------------------------------------------------------------#
-# Multiple sequence alignment (MSA) can easily be produced from PSA
+# Multiple sequence alignment (MSA) can easily be produced from PSA
# using psa2msa (V2)
#----------------------------------------------------------------------#
-$PFSEARCHV3 -n -f -o 6 ./ecp.prf $TMPDIR/CVPBR322.fa | $SORT_PSA - | $PSA2MSA
+$PFSEARCHV3 -n -f -o 6 ./ecp.prf $TMPDIR/CVPBR322.fa | $SORT_PSA - | $PSA2MSA
#----------------------------------------------------------------------#
# V3 has two new output formats: TSV and SAM
@@ -169,15 +169,15 @@ $PFSEARCHV3 -n -t 1 -q -o 8 ./hiv.prf ./hiv.fastq # FASTQ to SAM
$PFSEARCHV3 -n -t 1 -q -b -o 8 ./hiv.prf ./hiv.fastq # FASTQ to SAM
#----------------------------------------------------------------------#
-# Index can optionaly be used to speed-up database upload for pfsearch.
-# This should be especially usefull for repetitive database searches
-# using the heuristic.
+# Index can optionaly be used to speed-up database upload for pfsearch.
+# This should be especially usefull for repetitive database searches
+# using the heuristic.
#----------------------------------------------------------------------#
$PFINDEX -f -o $TMPDIR/CVPBR322.fa.idx $TMPDIR/CVPBR322.fa
$PFSEARCHV3 -n -f -o 7 ./ecp.prf $TMPDIR/CVPBR322.fa | sort > $TMPDIR/A.out # FASTA to TSV
$PFSEARCHV3 -n -f -i $TMPDIR/CVPBR322.fa.idx -o 7 ./ecp.prf $TMPDIR/CVPBR322.fa | sort > $TMPDIR/B.out # FASTA to TSV
-diff $TMPDIR/A.out $TMPDIR/B.out
+diff $TMPDIR/A.out $TMPDIR/B.out
$PFINDEX -q -o $TMPDIR/hiv.fastq.idx ./hiv.fastq
$PFSEARCHV3 -n -q -b -o 8 ./hiv.prf ./hiv.fastq | sort > $TMPDIR/A.out
@@ -185,23 +185,23 @@ $PFSEARCHV3 -n -q -b -o 8 -i $TMPDIR/hiv.fastq.idx ./hiv.prf ./hiv.fastq | sort
diff $TMPDIR/A.out $TMPDIR/B.out
#----------------------------------------------------------------------#
-# Profile and/or sequence can be reversed on the fly. If both are
+# Profile and/or sequence can be reversed on the fly. If both are
# reversed the match score is the same
#----------------------------------------------------------------------#
$PFSEARCHV3 -f -a rand_dna.prf rand_dna.seq
$PFSEARCHV3 -f -a -r -R rand_dna.prf rand_dna.seq
#----------------------------------------------------------------------#
-# There is a much better support of rev/comp search in DNA sequences,
+# There is a much better support of rev/comp search in DNA sequences,
# featuring the full IUPAC code.
# To illustrate these capabilities, let build a profile for bacterial
-# 16S sequence, starting from the Rfam seed RF00177.msa. First create
+# 16S sequence, starting from the Rfam seed RF00177.msa. First create
# an adhoc substitution matrix
#----------------------------------------------------------------------#
$MAKE_IUPAC_CMP -M 20 -m -30 > $TMPDIR/iupac20-30.cmp
#----------------------------------------------------------------------#
-# ... let build a profile for bacterial 16S sequence, starting from
+# ... let build a profile for bacterial 16S sequence, starting from
# the Rfam seed RF00177.msa.
#----------------------------------------------------------------------#
cat ./RF00177.msa \
@@ -224,7 +224,7 @@ cat ./SRR9619541.sample.fastq \
> $TMPDIR/permut.fa
# $PFCALIBRATEV3 -F $TMPDIR/permut.fa $TMPDIR/16S.prf.tmp > $TMPDIR/16S.prf
-# $PFSEARCHV3 -t 1 -n -q $TMPDIR/16S.prf $TMPDIR/small.sample.fastq
+# $PFSEARCHV3 -t 1 -n -q $TMPDIR/16S.prf $TMPDIR/small.sample.fastq
#----------------------------------------------------------------------#
# Verify handling of characters not in the profile alphabet
@@ -240,7 +240,7 @@ ACGTWACGT
EOI
$PFMAKE -m -3 -S 0.01 -F 100 $TMPDIR/ACGTAACGT.seq $CMPDIR/dna_50_40.cmp > $TMPDIR/ACGTAACGT.prf
-$PFSEARCHV3 -fa -o 6 $TMPDIR/ACGTAACGT.prf $TMPDIR/ACGTAACGT.seq # raw_score=450 PSA=ACGTAACGT
+$PFSEARCHV3 -fa -o 6 $TMPDIR/ACGTAACGT.prf $TMPDIR/ACGTAACGT.seq # raw_score=450 PSA=ACGTAACGT
$PFSEARCHV3 -fa -o 6 $TMPDIR/ACGTAACGT.prf $TMPDIR/ACGTWACGT.seq # raw_score=383 PSA=ACGTWACGT (not ACGTXACGT)
=====================================
tests/examples/test_V3_output.sh.cmake
=====================================
@@ -13,6 +13,3 @@ mkdir -p $TMPDIR
sh -ve ./test_V3.sh > $TMPDIR/test_V3.out 2>/dev/null
diff ./test_V3.out $TMPDIR/test_V3.out
-
-
-
=====================================
tests/examples/test_pfsearchV3_iupac.pl.cmake
=====================================
@@ -1,4 +1,4 @@
-#!/bin/env perl
+#!/usr/bin/env perl
use strict;
=====================================
tests/examples/test_scan_search.pl.cmake
=====================================
@@ -1,4 +1,4 @@
-#!/bin/env perl
+#!/usr/bin/env perl
use strict;
View it on GitLab: https://salsa.debian.org/med-team/pftools/-/commit/b51b2b7349627b2841d5d88e473a859b292d2696
--
View it on GitLab: https://salsa.debian.org/med-team/pftools/-/commit/b51b2b7349627b2841d5d88e473a859b292d2696
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20210923/97625ec8/attachment-0001.htm>
More information about the debian-med-commit
mailing list