status CAFFile::writeDescription() { Track *track = getTrack(); Tag desc("desc"); int64_t chunkLength = 32; double sampleRate = track->f.sampleRate; Tag formatID("lpcm"); uint32_t formatFlags = 0; if (track->f.byteOrder == AF_BYTEORDER_LITTLEENDIAN) formatFlags |= kCAFLinearPCMFormatFlagIsLittleEndian; if (track->f.isFloat()) formatFlags |= kCAFLinearPCMFormatFlagIsFloat; uint32_t bytesPerPacket = track->f.bytesPerFrame(false); uint32_t framesPerPacket = 1; uint32_t channelsPerFrame = track->f.channelCount; uint32_t bitsPerChannel = track->f.sampleWidth; if (track->f.compressionType == AF_COMPRESSION_G711_ULAW) { formatID = "ulaw"; formatFlags = 0; bytesPerPacket = channelsPerFrame; bitsPerChannel = 8; } else if (track->f.compressionType == AF_COMPRESSION_G711_ALAW) { formatID = "alaw"; formatFlags = 0; bytesPerPacket = channelsPerFrame; bitsPerChannel = 8; } else if (track->f.compressionType == AF_COMPRESSION_IMA) { formatID = "ima4"; formatFlags = 0; bytesPerPacket = track->f.bytesPerPacket; framesPerPacket = track->f.framesPerPacket; bitsPerChannel = 16; } if (!writeTag(&desc) || !writeS64(&chunkLength) || !writeDouble(&sampleRate) || !writeTag(&formatID) || !writeU32(&formatFlags) || !writeU32(&bytesPerPacket) || !writeU32(&framesPerPacket) || !writeU32(&channelsPerFrame) || !writeU32(&bitsPerChannel)) return AF_FAIL; return AF_SUCCEED; }
void summarizeLibraryTypeCounts(boost::filesystem::path& opath){ LibraryFormat fmt1(ReadType::SINGLE_END, ReadOrientation::NONE, ReadStrandedness::U); LibraryFormat fmt2(ReadType::SINGLE_END, ReadOrientation::NONE, ReadStrandedness::U); std::ofstream ofile(opath.string()); fmt::MemoryWriter errstr; auto log = spdlog::get("jointLog"); uint64_t numFmt1{0}; uint64_t numFmt2{0}; uint64_t numAgree{0}; uint64_t numDisagree{0}; for (auto& rl : readLibraries_) { auto fmt = rl.format(); auto& counts = rl.libTypeCounts(); // If the format is un-stranded, check that // we have a similar number of mappings in both // directions and then aggregate the forward and // reverse counts. if (fmt.strandedness == ReadStrandedness::U) { std::vector<ReadStrandedness> strands; switch (fmt.orientation) { case ReadOrientation::SAME: case ReadOrientation::NONE: strands.push_back(ReadStrandedness::S); strands.push_back(ReadStrandedness::A); break; case ReadOrientation::AWAY: case ReadOrientation::TOWARD: strands.push_back(ReadStrandedness::AS); strands.push_back(ReadStrandedness::SA); break; } fmt1.type = fmt.type; fmt1.orientation = fmt.orientation; fmt1.strandedness = strands[0]; fmt2.type = fmt.type; fmt2.orientation = fmt.orientation; fmt2.strandedness = strands[1]; numFmt1 = 0; numFmt2 = 0; numAgree = 0; numDisagree = 0; for (size_t i = 0; i < counts.size(); ++i) { if (i == fmt1.formatID()) { numFmt1 = counts[i]; } else if (i == fmt2.formatID()) { numFmt2 = counts[i]; } else { numDisagree += counts[i]; } } numAgree = numFmt1 + numFmt2; double ratio = static_cast<double>(numFmt1) / (numFmt1 + numFmt2); if ( std::abs(ratio - 0.5) > 0.01) { errstr << "NOTE: Read Lib [" << rl.readFilesAsString() << "] :\n"; errstr << "\nDetected a strand bias > 1\% in an unstranded protocol " << "check the file: " << opath.string() << " for details\n"; log->warn() << errstr.str(); errstr.clear(); } ofile << "========\n" << "Read library consisting of files: " << rl.readFilesAsString() << "\n\n" << "Expected format: " << rl.format() << "\n\n" << "# of consistent alignments: " << numAgree << "\n" << "# of inconsistent alignments: " << numDisagree << "\n" << "strand bias = " << ratio << " (0.5 is unbiased)\n" << "# alignments with format " << fmt1 << ": " << numFmt1 << "\n" << "# alignments with format " << fmt2 << ": " << numFmt2 << "\n" << "\n========\n"; } else { numAgree = 0; numDisagree = 0; for (size_t i = 0; i < counts.size(); ++i) { if (i == fmt.formatID()) { numAgree = counts[i]; } else { numDisagree += counts[i]; } } // end for ofile << "========\n" << "Read library consisting of files: " << rl.readFilesAsString() << "\n\n" << "Expected format: " << rl.format() << "\n\n" << "# of consistent alignments: " << numAgree << "\n" << "# of inconsistent alignments: " << numDisagree << "\n" << "\n========\n"; } //end else double disagreeRatio = static_cast<double>(numDisagree) / (numAgree + numDisagree); if (disagreeRatio > 0.05) { errstr << "NOTE: Read Lib [" << rl.readFilesAsString() << "] :\n"; errstr << "\nGreater than 5\% of the alignments (but not, necessarily reads) " << "disagreed with the provided library type; " << "check the file: " << opath.string() << " for details\n"; log->warn() << errstr.str(); errstr.clear(); } ofile << "---- counts for each format type ---\n"; for (size_t i = 0; i < counts.size(); ++i) { ofile << LibraryFormat::formatFromID(i) << " : " << counts[i] << "\n"; } ofile << "------------------------------------\n\n"; } ofile.close(); }