From d597fd88f5a400a7e9f95436beff65de9a55dbd3 Mon Sep 17 00:00:00 2001 From: Codex Date: Wed, 15 Jul 2026 02:44:15 +0000 Subject: [PATCH] Align in-memory splice-junction records --- extras/tests/scripts/testJunctionAlignment.sh | 14 ++++++++++++ extras/tests/testJunctionAlignment.cpp | 22 +++++++++++++++++++ source/OutSJ.cpp | 8 +++---- source/OutSJ.h | 7 +++--- 4 files changed, 43 insertions(+), 8 deletions(-) create mode 100755 extras/tests/scripts/testJunctionAlignment.sh create mode 100644 extras/tests/testJunctionAlignment.cpp diff --git a/extras/tests/scripts/testJunctionAlignment.sh b/extras/tests/scripts/testJunctionAlignment.sh new file mode 100755 index 00000000..881bc634 --- /dev/null +++ b/extras/tests/scripts/testJunctionAlignment.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" +build_dir="$(mktemp -d)" +trap 'rm -rf "${build_dir}"' EXIT + +"${CXX:-g++}" \ + -std=c++11 -Wall -Wextra \ + -I"${repo_dir}/source" \ + "${repo_dir}/extras/tests/testJunctionAlignment.cpp" \ + -o "${build_dir}/testJunctionAlignment" + +"${build_dir}/testJunctionAlignment" diff --git a/extras/tests/testJunctionAlignment.cpp b/extras/tests/testJunctionAlignment.cpp new file mode 100644 index 00000000..322b261f --- /dev/null +++ b/extras/tests/testJunctionAlignment.cpp @@ -0,0 +1,22 @@ +#include "OutSJ.h" + +#include +#include +#include + +using JunctionStorage=decltype(std::declval().dataVec); + +static_assert(std::is_same::value, + "junction storage must provide uint64 alignment"); +static_assert(Junction::startP % alignof(uint) == 0, "unaligned junction start"); +static_assert(Junction::gapP % alignof(uint32) == 0, "unaligned junction gap"); +static_assert(Junction::countUniqueP % alignof(uint32) == 0, "unaligned unique count"); +static_assert(Junction::countMultipleP % alignof(uint32) == 0, "unaligned multiple count"); +static_assert(Junction::overhangLeftP % alignof(uint16) == 0, "unaligned left overhang"); +static_assert(Junction::overhangRightP % alignof(uint16) == 0, "unaligned right overhang"); +static_assert(Junction::dataSize % alignof(uint64) == 0, "unaligned junction records"); + +int main() +{ + return 0; +} diff --git a/source/OutSJ.cpp b/source/OutSJ.cpp index f97aa917..97ff1bcf 100644 --- a/source/OutSJ.cpp +++ b/source/OutSJ.cpp @@ -5,8 +5,8 @@ OutSJ::OutSJ (uint nSJmax, Parameters &Pin, Genome &genomeIn) : oneSJ(genomeIn), //data = new char [oneSJ.dataSize*nSJmax]; //allocate big array of SJ loci and properties Nstore = nSJmax; - dataVec.resize(oneSJ.dataSize*Nstore); - data = dataVec.data(); + dataVec.resize(oneSJ.dataSize*Nstore/sizeof(dataVec[0])); + data = reinterpret_cast(dataVec.data()); memset(data,0,oneSJ.dataSize*Nstore); N=0;//initialize the counter }; @@ -61,8 +61,8 @@ void OutSJ::collapseSJ() {//collapse junctions. Simple version now: re-sort ever void OutSJ::dataSizeIncrease() { Nstore *= 2; - dataVec.resize(oneSJ.dataSize*Nstore); - data = dataVec.data(); + dataVec.resize(oneSJ.dataSize*Nstore/sizeof(dataVec[0])); + data = reinterpret_cast(dataVec.data()); }; Junction::Junction(Genome &genOut) : genOut(genOut) { diff --git a/source/OutSJ.h b/source/OutSJ.h index ebaec017..d75604c3 100644 --- a/source/OutSJ.h +++ b/source/OutSJ.h @@ -11,7 +11,7 @@ class Junction {//one junction const static uint strandP=gapP+sizeof(uint32); const static uint motifP=strandP+sizeof(char); const static uint annotP=motifP+sizeof(char); - const static uint countUniqueP=annotP+sizeof(char); + const static uint countUniqueP=((annotP+sizeof(char)+alignof(uint32)-1)/alignof(uint32))*alignof(uint32); const static uint countMultipleP=countUniqueP+sizeof(uint32); const static uint overhangLeftP=countMultipleP+sizeof(uint32); const static uint overhangRightP=overhangLeftP+sizeof(uint16); @@ -22,7 +22,7 @@ class Junction {//one junction uint32 *countUnique, *countMultiple; uint16 *overhangLeft, *overhangRight; - const static uint dataSize=overhangRightP+sizeof(uint16); + const static uint dataSize=((overhangRightP+sizeof(uint16)+alignof(uint64)-1)/alignof(uint64))*alignof(uint64); Junction(Genome &genomeIn); void junctionPointer(char* sjPoint, uint isj); @@ -38,7 +38,7 @@ class OutSJ { public: //all junctions char* data; //sj array[Njunctions][dataSize] - vector dataVec; + vector dataVec; uint64 N, Nstore; //N=number of junctions stored; Nstore=storage size Junction oneSJ; @@ -56,4 +56,3 @@ class OutSJ { int compareSJ(const void* i1, const void* i2); //external functions #endif -