From 797693e8bbe32b1dd0297849e6def7cac8a2873f Mon Sep 17 00:00:00 2001 From: Andres Rios Tascon Date: Thu, 19 Dec 2024 10:45:54 -0500 Subject: [PATCH] feat: RNTuples with custom-length floats and suppressed columns (#167) * Added code and root files for RNTuples with custom floats and suppressed columns * Minor include fixes --- dev/make-root/rntuple_float_types.C | 136 ++++++++++++++++++ .../rntuple_multiple_representations.C | 43 ++++++ .../test_float_types_rntuple_v1-0-0-0.root | Bin 0 -> 1890 bytes ...iple_representations_rntuple_v1-0-0-0.root | Bin 0 -> 1724 bytes 4 files changed, 179 insertions(+) create mode 100644 dev/make-root/rntuple_float_types.C create mode 100644 dev/make-root/rntuple_multiple_representations.C create mode 100644 src/skhep_testdata/data/test_float_types_rntuple_v1-0-0-0.root create mode 100644 src/skhep_testdata/data/test_multiple_representations_rntuple_v1-0-0-0.root diff --git a/dev/make-root/rntuple_float_types.C b/dev/make-root/rntuple_float_types.C new file mode 100644 index 0000000..9f523e4 --- /dev/null +++ b/dev/make-root/rntuple_float_types.C @@ -0,0 +1,136 @@ +/* https://root.cern/doc/master/ntpl001__staff_8C.html */ +R__LOAD_LIBRARY(ROOTNTuple) +#include +#include +#include +#include +#include +#include + +#include +#include + +using RNTupleModel = ROOT::Experimental::RNTupleModel; +using RNTupleWriter = ROOT::Experimental::RNTupleWriter; +template +using RField = ROOT::Experimental::RField; +using EColumnType = ROOT::Experimental::EColumnType; + +void rntuple_float_types() { + std::string rootFileName{"test_float_types_rntuple_v1-0-0-0.root"}; + auto model = RNTupleModel::Create(); + + auto trunc10 = std::make_unique>("trunc10"); + trunc10->SetColumnRepresentatives({{EColumnType::kReal32Trunc}}); + trunc10->SetTruncated(10); + model->AddField(std::move(trunc10)); + + auto trunc16 = std::make_unique>("trunc16"); + trunc16->SetColumnRepresentatives({{EColumnType::kReal32Trunc}}); + trunc16->SetTruncated(16); + model->AddField(std::move(trunc16)); + + auto trunc24 = std::make_unique>("trunc24"); + trunc24->SetColumnRepresentatives({{EColumnType::kReal32Trunc}}); + trunc24->SetTruncated(24); + model->AddField(std::move(trunc24)); + + auto trunc31 = std::make_unique>("trunc31"); + trunc31->SetColumnRepresentatives({{EColumnType::kReal32Trunc}}); + trunc31->SetTruncated(31); + model->AddField(std::move(trunc31)); + + auto quant1 = std::make_unique>("quant1"); + quant1->SetColumnRepresentatives({{EColumnType::kReal32Quant}}); + quant1->SetQuantized(-2.f, 3.f, 1); + model->AddField(std::move(quant1)); + + auto quant8 = std::make_unique>("quant8"); + quant8->SetColumnRepresentatives({{EColumnType::kReal32Quant}}); + quant8->SetQuantized(-2.f, 3.f, 8); + model->AddField(std::move(quant8)); + + auto quant16 = std::make_unique>("quant16"); + quant16->SetColumnRepresentatives({{EColumnType::kReal32Quant}}); + quant16->SetQuantized(-2.f, 3.f, 16); + model->AddField(std::move(quant16)); + + auto quant20 = std::make_unique>("quant20"); + quant20->SetColumnRepresentatives({{EColumnType::kReal32Quant}}); + quant20->SetQuantized(-2.f, 3.f, 20); + model->AddField(std::move(quant20)); + + auto quant24 = std::make_unique>("quant24"); + quant24->SetColumnRepresentatives({{EColumnType::kReal32Quant}}); + quant24->SetQuantized(-2.f, 3.f, 24); + model->AddField(std::move(quant24)); + + auto quant25 = std::make_unique>("quant25"); + quant25->SetColumnRepresentatives({{EColumnType::kReal32Quant}}); + quant25->SetQuantized(-2.f, 3.f, 25); + model->AddField(std::move(quant25)); + + auto quant32 = std::make_unique>("quant32"); + quant32->SetColumnRepresentatives({{EColumnType::kReal32Quant}}); + quant32->SetQuantized(-2.f, 3.f, 32); + model->AddField(std::move(quant32)); + + auto ntuple = RNTupleWriter::Recreate(std::move(model), "ntuple", rootFileName); + auto e = ntuple->CreateEntry(); + + *e->GetPtr("trunc10") = 1.23456789f; // 00111111100111100000011001010010 + *e->GetPtr("trunc16") = 1.23456789f; + *e->GetPtr("trunc24") = 1.23456789f; + *e->GetPtr("trunc31") = 1.23456789f; + *e->GetPtr("quant1") = 1.23456789f; + *e->GetPtr("quant8") = 1.23456789f; + *e->GetPtr("quant16") = 1.23456789f; + *e->GetPtr("quant20") = 1.23456789f; + *e->GetPtr("quant24") = 1.23456789f; + *e->GetPtr("quant25") = 1.23456789f; + *e->GetPtr("quant32") = 1.23456789f; + + ntuple->Fill(*e); + + *e->GetPtr("trunc10") = 1.4660155e13f; // 01010101010101010101010101010101 + *e->GetPtr("trunc16") = 1.4660155e13f; + *e->GetPtr("trunc24") = 1.4660155e13f; + *e->GetPtr("trunc31") = 1.4660155e13f; + *e->GetPtr("quant1") = 1.6666666f; // 00111111110101010101010101010101 + *e->GetPtr("quant8") = 1.6666666f; + *e->GetPtr("quant16") = 1.6666666f; + *e->GetPtr("quant20") = 1.6666666f; + *e->GetPtr("quant24") = 1.6666666f; + *e->GetPtr("quant25") = 1.6666666f; + *e->GetPtr("quant32") = 1.6666666f; + + ntuple->Fill(*e); + + *e->GetPtr("trunc10") = -6.2875986e-22f; // 10011100001111100000011111110000 + *e->GetPtr("trunc16") = -6.2875986e-22f; + *e->GetPtr("trunc24") = -6.2875986e-22f; + *e->GetPtr("trunc31") = -6.2875986e-22f; + *e->GetPtr("quant1") = -6.2875986e-22f; + *e->GetPtr("quant8") = -6.2875986e-22f; + *e->GetPtr("quant16") = -6.2875986e-22f; + *e->GetPtr("quant20") = -6.2875986e-22f; + *e->GetPtr("quant24") = -6.2875986e-22f; + *e->GetPtr("quant25") = -6.2875986e-22f; + *e->GetPtr("quant32") = -6.2875986e-22f; + + ntuple->Fill(*e); + + *e->GetPtr("trunc10") = -1.9060668f; // 10111111111100111111100111111111 + *e->GetPtr("trunc16") = -1.9060668f; + *e->GetPtr("trunc24") = -1.9060668f; + *e->GetPtr("trunc31") = -1.9060668f; + *e->GetPtr("quant1") = -1.9060668f; + *e->GetPtr("quant8") = -1.9060668f; + *e->GetPtr("quant16") = -1.9060668f; + *e->GetPtr("quant20") = -1.9060668f; + *e->GetPtr("quant24") = -1.9060668f; + *e->GetPtr("quant25") = -1.9060668f; + *e->GetPtr("quant32") = -1.9060668f; + + ntuple->Fill(*e); +} diff --git a/dev/make-root/rntuple_multiple_representations.C b/dev/make-root/rntuple_multiple_representations.C new file mode 100644 index 0000000..df72bf4 --- /dev/null +++ b/dev/make-root/rntuple_multiple_representations.C @@ -0,0 +1,43 @@ +/* https://root.cern/doc/master/ntpl001__staff_8C.html */ +R__LOAD_LIBRARY(ROOTNTuple) +#include +#include +#include +#include +#include +#include + +#include +#include + +using RNTupleModel = ROOT::Experimental::RNTupleModel; +using RNTupleWriter = ROOT::Experimental::RNTupleWriter; +using RFieldBase = ROOT::Experimental::RFieldBase; +using EColumnType = ROOT::Experimental::EColumnType; + +void rntuple_multiple_representations() { + std::string rootFileName{"test_multiple_representations_rntuple_v1-0-0-0.root"}; + auto model = RNTupleModel::Create(); + + auto fldReal = RFieldBase::Create("real", "float").Unwrap(); + fldReal->SetColumnRepresentatives({{EColumnType::kReal32}, {EColumnType::kReal16}}); + model->AddField(std::move(fldReal)); + auto ptrReal = model->GetDefaultEntry().GetPtr("real"); + + auto ntuple = RNTupleWriter::Recreate(std::move(model), "ntuple", rootFileName); + + *ptrReal = 1.0; + ntuple->Fill(); + ntuple->CommitCluster(); + + ROOT::Experimental::Internal::RFieldRepresentationModifier::SetPrimaryColumnRepresentation( + const_cast(ntuple->GetModel().GetConstField("real")), 1); + *ptrReal = 2.0; + ntuple->Fill(); + ntuple->CommitCluster(); + + ROOT::Experimental::Internal::RFieldRepresentationModifier::SetPrimaryColumnRepresentation( + const_cast(ntuple->GetModel().GetConstField("real")), 0); + *ptrReal = 3.0; + ntuple->Fill(); +} diff --git a/src/skhep_testdata/data/test_float_types_rntuple_v1-0-0-0.root b/src/skhep_testdata/data/test_float_types_rntuple_v1-0-0-0.root new file mode 100644 index 0000000000000000000000000000000000000000..b59b82fc1a984f4ae9905a9dd352585b811ee100 GIT binary patch literal 1890 zcmbVNYfw{16yDt2o5YYPD$s~nVnHifArOLzA|O!FqLGBhR7V@ZB!a|XLn5G90jn_D z77YM!fb?4Fym=kEEwJ!j9= zBqeD9c*O<)$N`|o!GWHm;h?~gibFjJ0HK3=FEo6hoTEO0Z^~1g@6QJjl?2agStO+&0238VJMT5T(u6Ihg9i)> zGSHx_l>j5?T;-1UB*e1Rv=yKLBE2W`H94ri@Kr(WgFBj6)Rp5ll3_)_`aeEe%& ztXfM5X>=bR!*`T`$@e*Cc5neqdjN4@uI`f{ESMos#Ry^m!XD5Z0G$IE6Tm1gU=CPv z(<*KqmIzny4rZ!~j~gC~BDUmk+FacZvuhH65czfOo!^{YO3UXooNl=0*!=Pl^-jD} z-`-{a{pzsm@(0cuV&V3>)(KOdm#%PP6*jrKgt!cLBu?`WCX7`lvZiz%LKV_OW;WsN zQ^Eq^3X(UcWR4=bE4#JFKJ^JRx&0Uz9UV~6Un!hbB<9a(e@sJ$XnH`wV1MPj%-bTS zh*#x7ZE=N0M{`wn|A9b@-RZLJmTRS9BC6@>TE|O_uJK38mBh1;!3#@e^6x^zcX11#3p6QxTX1^QH$!*k>^v|}7;ftA_2Kj9 z^e+Odl%6$hX@x7BpyxiTtJ27C!Fw_{PWwAJ<_aWp1yRLVZ&RgukVOAO6&6G;04&T} z5G=|}9N+{M8KBrw(qTb|#{oFc?2js;b;x3|pbCh`1}O}vbu2h-wTIKbGiCKmsP8^x zkEQ-@S}|6vuk&`|RvorefBeTUH<{el7dz!$`AdqvtWZA{oP1R8>@HZymU_K>mKiFO zRIUm;eQL%|;wWOUiA9#^m>e8f$X~jtn>mUw?avaJZPhA)`}WQ+i)|T#|CNdhVg;%hS7KXdmU? za$3JSwfKBaUguiXXL{!H#)%xS8;zd~l&f7L&fdwYzPYubZz7Af@zCww)Si==Xze$7Z1jSm^Xqs63*{ Z@?gGQ9^@wxCFXyW2fQEjxD5 literal 0 HcmV?d00001 diff --git a/src/skhep_testdata/data/test_multiple_representations_rntuple_v1-0-0-0.root b/src/skhep_testdata/data/test_multiple_representations_rntuple_v1-0-0-0.root new file mode 100644 index 0000000000000000000000000000000000000000..5e6764a870f8223b77963c1fa9a6097b83c6ad11 GIT binary patch literal 1724 zcmXTQ&o5zM_`%D-z>vbgz_tg7qk!xrAZ7&ONi0D6Cj$e^As{^iC_pAS$NUDUv#?z1 zZWKc-*kq7FKpP=|HN-75C)KzlwYVfcw=}0Dvmhrmz9_YzD782>uOzV~Ge565z9_Gx z6eM0|sA~X%dPN|&lckA)7331IYZw@&0NpSNh@q}w(Sy4W>N*T+4cIpa!1}ddsu_)- z>QY#PoO1GkAs7|RSjoU}fPq0{tNvew1Fg&qUsxD{d^Vs$h+ja#9^~&IqEKe0XKbox zV0idHDAWxZfWgjCl$w~s3Z&C=@)JwWFacR2JPZol3<8V{U#?8aTD?=nOpRB8p?T)r z`HIJywEI8BFila6Y&1H}v4E>>qv4A=${;;vV7IcMx%D1U1_a=4WngHqU$@y%*qycd z2TgYhrz+&lb_F#RXJbvfO6|WHZcaE z*;I$F3mBF)3=9E`;IK>xV3^9x(8A0N5&!~NXsr3q4CF~LFiJ4V?6?66Lk^~&KoxHq z?0|F;Q>Lmy+6fchFv$fUwoJNnegc!Bl{G`*(jLyaIRdM5;!h;*QZ1U0cirlBZsq2s zSIdu|zQ400H($}m*##SI>1=GT8tvrX-t(BY%2~(ywYO@{o=FNu; zfu^V0H#T=Gkkaw-*aGV`)iQ-D-)Nt6$V zJ0rs>7KRGOy_3%S9dZyjW}oHja^=YEwr>7Jn}Ss;QoQw986O!8(;78JQn%lncBJZ& zrOhuEyVi2~W1IcB13grdg#S#MyKVF4&)NGTxu0p9O*}lONbJmX{%NmWW*zDHvh<6H z#qX9qtRg#Wsu~{W9o}{~Xk}pe@q@MtKgHBM4`UPWza&1WO SC~C+}E5Lliwx`^53IhPZEaqSU literal 0 HcmV?d00001