本文整理汇总了C++中Genome::startContig方法的典型用法代码示例。如果您正苦于以下问题:C++ Genome::startContig方法的具体用法?C++ Genome::startContig怎么用?C++ Genome::startContig使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Genome
的用法示例。
在下文中一共展示了Genome::startContig方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: QueryFileSize
const Genome *
ReadFASTAGenome(
const char *fileName,
const char *pieceNameTerminatorCharacters,
bool spaceIsAPieceNameTerminator,
unsigned chromosomePaddingSize)
{
//
// We need to know a bound on the size of the genome before we create the Genome object.
// A bound is the number of bytes in the FASTA file, because we store at most one base per
// byte. Get the file size to use for this bound.
//
_int64 fileSize = QueryFileSize(fileName);
bool isValidGenomeCharacter[256];
for (int i = 0; i < 256; i++) {
isValidGenomeCharacter[i] = false;
}
isValidGenomeCharacter['A'] = isValidGenomeCharacter['T'] = isValidGenomeCharacter['C'] = isValidGenomeCharacter['G'] = isValidGenomeCharacter['N'] = true;
isValidGenomeCharacter['a'] = isValidGenomeCharacter['t'] = isValidGenomeCharacter['c'] = isValidGenomeCharacter['g'] = isValidGenomeCharacter['n'] = true;
FILE *fastaFile = fopen(fileName, "r");
if (fastaFile == NULL) {
WriteErrorMessage("Unable to open FASTA file '%s' (even though we already got its size)\n",fileName);
return NULL;
}
int lineBufferSize = 0;
char *lineBuffer;
//
// Count the chromosomes
//
unsigned nChromosomes = 0;
while (NULL != reallocatingFgets(&lineBuffer,&lineBufferSize,fastaFile)) {
if (lineBuffer[0] == '>') {
nChromosomes++;
}
}
rewind(fastaFile);
Genome *genome = new Genome(fileSize + (nChromosomes+1) * (size_t)chromosomePaddingSize, fileSize + (nChromosomes+1) * (size_t)chromosomePaddingSize, chromosomePaddingSize, nChromosomes + 1);
char *paddingBuffer = new char[chromosomePaddingSize+1];
for (unsigned i = 0; i < chromosomePaddingSize; i++) {
paddingBuffer[i] = 'n';
}
paddingBuffer[chromosomePaddingSize] = '\0';
bool warningIssued = false;
bool inAContig = false;
while (NULL != reallocatingFgets(&lineBuffer, &lineBufferSize, fastaFile)) {
if (lineBuffer[0] == '>') {
inAContig = true;
//
// A new contig. Add in the padding first.
//
genome->addData(paddingBuffer);
//
// Now supply the chromosome name.
//
if (NULL != pieceNameTerminatorCharacters) {
for (int i = 0; i < strlen(pieceNameTerminatorCharacters); i++) {
char *terminator = strchr(lineBuffer+1, pieceNameTerminatorCharacters[i]);
if (NULL != terminator) {
*terminator = '\0';
}
}
}
if (spaceIsAPieceNameTerminator) {
char *terminator = strchr(lineBuffer, ' ');
if (NULL != terminator) {
*terminator = '\0';
}
terminator = strchr(lineBuffer, '\t');
if (NULL != terminator) {
*terminator = '\0';
}
}
char *terminator = strchr(lineBuffer, '\n');
if (NULL != terminator) {
*terminator = '\0';
}
terminator = strchr(lineBuffer, '\r');
if (NULL != terminator) {
*terminator = '\0';
}
genome->startContig(lineBuffer+1);
} else {
if (!inAContig) {
WriteErrorMessage("\nFASTA file doesn't beging with a contig name (i.e., the first line doesn't start with '>').\n");
soft_exit(1);
}
//
// Convert it to upper case and truncate the newline before adding it to the genome.
//.........这里部分代码省略.........
示例2: Genome
//
// Makes a copy of a Genome, but with only one of the sex chromosomes.
//
// The fate of the mitochondrion is that of the X chromosome.
//
Genome *
Genome::copy(bool copyX, bool copyY, bool copyM) const
{
Genome *newCopy = new Genome(getCountOfBases(),getCountOfBases(), chromosomePadding);
if (NULL == newCopy) {
WriteErrorMessage("Genome::copy: failed to allocate space for copy.\n");
return NULL;
}
const Genome::Contig *currentContig = NULL;
const Genome::Contig *nextContig = getContigAtLocation(0);
unsigned offsetInReference = 0;
while (offsetInReference < getCountOfBases()) {
if (NULL != nextContig && offsetInReference >= nextContig->beginningOffset) {
//
// Start of a new contig. See if we want to skip it.
//
currentContig = nextContig;
nextContig = getNextContigAfterLocation(offsetInReference + 1);
if ((!copyX && !strcmp(currentContig->name,"chrX")) ||
(!copyY && !strcmp(currentContig->name,"chrY")) ||
(!copyM && !strcmp(currentContig->name,"chrM"))) {
//
// Yes, skip over this contig.
//
nextContig = getNextContigAfterLocation(offsetInReference + 1);
if (NULL == nextContig) {
//
// The chromosome that we're skipping was the last one, so we're done.
//
break;
} else {
offsetInReference = nextContig->beginningOffset;
continue;
}
} // If skipping this chromosome
newCopy->startContig(currentContig->name);
} // If new contig beginning
const size_t maxCopySize = 10000;
char dataBuffer[maxCopySize + 1];
unsigned amountToCopy = maxCopySize;
if (nextContig && nextContig->beginningOffset < offsetInReference + amountToCopy) {
amountToCopy = nextContig->beginningOffset - offsetInReference;
}
if (getCountOfBases() < offsetInReference + amountToCopy) {
amountToCopy = getCountOfBases() - offsetInReference;
}
memcpy(dataBuffer,getSubstring(offsetInReference,amountToCopy), amountToCopy);
dataBuffer[amountToCopy] = '\0';
newCopy->addData(dataBuffer);
offsetInReference += amountToCopy;
}
newCopy->fillInContigLengths();
newCopy->sortContigsByName();
return newCopy;
}