Skip to content

Commit 00e9de8

Browse files
committed
Build with rntuple sub-float support
1 parent af380fc commit 00e9de8

2 files changed

Lines changed: 90 additions & 43 deletions

File tree

build/jsroot.js

Lines changed: 89 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const version_id = 'dev',
1414

1515
/** @summary version date
1616
* @desc Release date in format day/month/year like '14/04/2022' */
17-
version_date = '18/02/2026',
17+
version_date = '19/02/2026',
1818

1919
/** @summary version id and date
2020
* @desc Produced by concatenation of {@link version_id} and {@link version_date}
@@ -122454,20 +122454,17 @@ function createMemberStreamer(element, file, no_string) {
122454122454
member.factor = 1 / element.fFactor;
122455122455
member.min = element.fXmin;
122456122456
member.read = function(buf) { return buf.ntou4() * this.factor + this.min; };
122457-
} else
122458-
if ((element.fXmin === 0) && member.double32)
122459-
member.read = function(buf) { return buf.ntof(); };
122460-
else {
122461-
member.nbits = Math.round(element.fXmin);
122462-
if (member.nbits === 0)
122463-
member.nbits = 12;
122464-
member.dv = new DataView(new ArrayBuffer(8), 0); // used to cast from uint32 to float32
122465-
member.read = function(buf) {
122466-
const theExp = buf.ntou1(), theMan = buf.ntou2();
122467-
this.dv.setUint32(0, (theExp << 23) | ((theMan & ((1 << (this.nbits + 1)) - 1)) << (23 - this.nbits)));
122468-
return ((1 << (this.nbits + 1) & theMan) ? -1 : 1) * this.dv.getFloat32(0);
122469-
};
122470-
}
122457+
} else if ((element.fXmin === 0) && member.double32)
122458+
member.read = function(buf) { return buf.ntof(); };
122459+
else {
122460+
member.nbits = Math.round(element.fXmin) || 12;
122461+
member.dv = new DataView(new ArrayBuffer(8), 0); // used to cast from uint32 to float32
122462+
member.read = function(buf) {
122463+
const theExp = buf.ntou1(), theMan = buf.ntou2();
122464+
this.dv.setUint32(0, (theExp << 23) | ((theMan & ((1 << (this.nbits + 1)) - 1)) << (23 - this.nbits)));
122465+
return ((1 << (this.nbits + 1) & theMan) ? -1 : 1) * this.dv.getFloat32(0);
122466+
};
122467+
}
122471122468

122472122469
member.readarr = function(buf, len) {
122473122470
const arr = this.double32 ? new Float64Array(len) : new Float32Array(len);
@@ -122478,23 +122475,21 @@ function createMemberStreamer(element, file, no_string) {
122478122475

122479122476
if (member.type < kOffsetL)
122480122477
member.func = function(buf, obj) { obj[this.name] = this.read(buf); };
122481-
else
122482-
if (member.type > kOffsetP) {
122483-
member.cntname = element.fCountName;
122484-
member.func = function(buf, obj) {
122485-
obj[this.name] = (buf.ntou1() === 1) ? this.readarr(buf, obj[this.cntname]) : null;
122486-
};
122487-
} else
122488-
if (element.fArrayDim < 2) {
122489-
member.arrlength = element.fArrayLength;
122490-
member.func = function(buf, obj) { obj[this.name] = this.readarr(buf, this.arrlength); };
122491-
} else {
122492-
member.arrlength = element.fMaxIndex[element.fArrayDim - 1];
122493-
member.minus1 = true;
122494-
member.func = function(buf, obj) {
122495-
obj[this.name] = buf.readNdimArray(this, (buf2, handle) => handle.readarr(buf2, handle.arrlength));
122496-
};
122497-
}
122478+
else if (member.type > kOffsetP) {
122479+
member.cntname = element.fCountName;
122480+
member.func = function(buf, obj) {
122481+
obj[this.name] = (buf.ntou1() === 1) ? this.readarr(buf, obj[this.cntname]) : null;
122482+
};
122483+
} else if (element.fArrayDim < 2) {
122484+
member.arrlength = element.fArrayLength;
122485+
member.func = function(buf, obj) { obj[this.name] = this.readarr(buf, this.arrlength); };
122486+
} else {
122487+
member.arrlength = element.fMaxIndex[element.fArrayDim - 1];
122488+
member.minus1 = true;
122489+
member.func = function(buf, obj) {
122490+
obj[this.name] = buf.readNdimArray(this, (buf2, handle) => handle.readarr(buf2, handle.arrlength));
122491+
};
122492+
}
122498122493
break;
122499122494

122500122495
case kAnyP:
@@ -127961,7 +127956,7 @@ async function treeProcess(tree, selector, args) {
127961127956

127962127957
for (let k = 0; k < handle.arr.length; ++k) {
127963127958
const elem = handle.arr[k];
127964-
if ((elem.type <= 0) || (elem.type >= kOffsetL) || (elem.type === kCharStar))
127959+
if ((elem.type <= 0) || (elem.type >= kOffsetL) || (elem.type === kCharStar) || (elem.type === kFloat16) || (elem.type === kDouble32))
127965127960
handle.process_arrays = false;
127966127961
}
127967127962

@@ -177495,7 +177490,7 @@ const kBit = 0x00,
177495177490
kUInt32 = 0x08,
177496177491
kInt64 = 0x09,
177497177492
kUInt64 = 0x0A,
177498-
// kReal16 = 0x0B, not used yet
177493+
kReal16 = 0x0B,
177499177494
kReal32 = 0x0C,
177500177495
kReal64 = 0x0D,
177501177496
kIndex32 = 0x0E,
@@ -177512,8 +177507,8 @@ const kBit = 0x00,
177512177507
kSplitReal64 = 0x19,
177513177508
kSplitIndex32 = 0x1A,
177514177509
kSplitIndex64 = 0x1B,
177515-
// kReal32Trunc = 0x1C, not used yet
177516-
// kReal32Quant = 0x1D, not used yet
177510+
kReal32Trunc = 0x1C,
177511+
kReal32Quant = 0x1D,
177517177512
LITTLE_ENDIAN = true;
177518177513

177519177514
class RBufferReader {
@@ -178330,6 +178325,62 @@ class ReaderItem {
178330178325
};
178331178326
this.sz = 4;
178332178327
break;
178328+
case kReal16:
178329+
this.func = function(obj) {
178330+
const value = this.view.getUint16(this.o, LITTLE_ENDIAN);
178331+
this.shift_o(2);
178332+
// reimplementing of HalfToFloat
178333+
let fbits = (value & 0x8000) << 16,
178334+
abs = value & 0x7FFF;
178335+
if (abs) {
178336+
fbits |= 0x38000000 << (abs >= 0x7C00 ? 1 : 0);
178337+
for (; abs < 0x400; abs <<= 1, fbits -= 0x800000);
178338+
fbits += abs << 13;
178339+
}
178340+
this.buf.setUint32(0, fbits, true);
178341+
obj[this.name] = this.buf.getFloat32(0, true);
178342+
};
178343+
this.sz = 2;
178344+
this.buf = new DataView(new ArrayBuffer(4), 0);
178345+
break;
178346+
case kReal32Trunc:
178347+
case kReal32Quant:
178348+
this.nbits = this.column.bitsOnStorage;
178349+
if (this.coltype === kReal32Trunc)
178350+
this.buf = new DataView(new ArrayBuffer(4), 0);
178351+
else {
178352+
this.factor = (this.column.maxValue - this.column.minValue) / ((1 << this.nbits) - 1);
178353+
this.min = this.column.minValue;
178354+
}
178355+
178356+
this.func = function(obj) {
178357+
let res = 0, len = this.nbits;
178358+
// extract nbits from the
178359+
while (len > 0) {
178360+
if (this.o2 === 0) {
178361+
this.byte = this.view.getUint8(this.o);
178362+
this.o2 = 8; // number of bits in the value
178363+
}
178364+
const pos = this.nbits - len; // extracted bits
178365+
if (len >= this.o2) {
178366+
res |= (this.byte & ((1 << this.o2) - 1)) << pos; // get all remaining bits
178367+
len -= this.o2;
178368+
this.o2 = 0;
178369+
this.shift_o(1);
178370+
} else {
178371+
res |= (this.byte & ((1 << len) - 1)) << pos; // get only len bits from the value
178372+
this.o2 -= len;
178373+
this.byte >>= len;
178374+
len = 0;
178375+
}
178376+
}
178377+
if (this.buf) {
178378+
this.buf.setUint32(0, res << (32 - this.nbits), true);
178379+
obj[this.name] = this.buf.getFloat32(0, true);
178380+
} else
178381+
obj[this.name] = res * this.factor + this.min;
178382+
};
178383+
break;
178333178384
case kInt64:
178334178385
case kIndex64:
178335178386
this.func = function(obj) {
@@ -178458,12 +178509,8 @@ class ReaderItem {
178458178509
async unzipBlob(blob, cluster_locations, page_indx) {
178459178510
const colEntry = cluster_locations[this.id], // Access column entry
178460178511
numElements = Number(colEntry.pages[page_indx].numElements),
178461-
elementSize = this.column.bitsOnStorage / 8;
178462-
178463-
let expectedSize = numElements * elementSize;
178464-
// Special handling for boolean fields
178465-
if (this.coltype === kBit)
178466-
expectedSize = Math.ceil(numElements / 8);
178512+
elementSize = this.column.bitsOnStorage / 8,
178513+
expectedSize = Math.ceil(numElements * elementSize);
178467178514

178468178515
// Check if data is compressed
178469178516
if ((colEntry.compression === 0) || (blob.byteLength === expectedSize))

modules/core.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const version_id = 'dev',
66

77
/** @summary version date
88
* @desc Release date in format day/month/year like '14/04/2022' */
9-
version_date = '18/02/2026',
9+
version_date = '19/02/2026',
1010

1111
/** @summary version id and date
1212
* @desc Produced by concatenation of {@link version_id} and {@link version_date}

0 commit comments

Comments
 (0)