Skip to content

Conversation

@ktf
Copy link
Member

@ktf ktf commented Jun 19, 2025

  • Add support for EXTRA_PATCH in root dictionary generation

@github-actions
Copy link
Contributor

REQUEST FOR PRODUCTION RELEASES:
To request your PR to be included in production software, please add the corresponding labels called "async-" to your PR. Add the labels directly (if you have the permissions) or add a comment of the form (note that labels are separated by a ",")

+async-label <label1>, <label2>, !<label3> ...

This will add <label1> and <label2> and removes <label3>.

The following labels are available
async-2023-pbpb-apass4
async-2023-pp-apass4
async-2024-pp-apass1
async-2022-pp-apass7
async-2024-pp-cpass0
async-2024-PbPb-apass1
async-2024-ppRef-apass1
async-2024-PbPb-apass2
async-2023-PbPb-apass5

@ktf
Copy link
Member Author

ktf commented Jun 19, 2025

@pzhristov This is my best attempt so far to fix the ARM issue / new ROOT streamer.

@davidrohr
Copy link
Collaborator

How many ENUMs did we actually store in ROOT files?
And do we really explicitly need to load the streamer, like in the GPUWorkflowSpec.cxx? Doesn't it simply go to the dictionary. I find this super ugly.
I would either try to tell ROOT they should fix their data formats, and for files written with the old root just assume 32 bit.
Otherwise, if this only affects some CCDB objects, I'd create V2 versions of these objects and upload new files there, and switch to them.

@ktf
Copy link
Member Author

ktf commented Jun 20, 2025

As far as I can tell, the explicit load is needed for non virtual classes. I do the vector, rather CalDet/CalArray because those classes are more complicated to stream by hand (and still non virtual classes).

@ktf
Copy link
Member Author

ktf commented Jun 21, 2025

Regarding V2, it was said they are too many to convert.

@ktf
Copy link
Member Author

ktf commented Jun 21, 2025

Regarding ROOT, i think that's what they do, and why it now fails: they have no information on what they are actually deserialising. When i check for the class, i get a vector , where two shorts have been put into one int. The only place where that information is available is in the user code.

@wiechula
Copy link
Collaborator

I will check again with Costin to discuss the conversion. I think it will be possible, even if there are many objects.

@ktf ktf force-pushed the pr14427 branch 2 times, most recently from 8e0af1a to afee20a Compare June 23, 2025 10:47
@ktf
Copy link
Member Author

ktf commented Jun 23, 2025

@pcanal any better way than this to register the custom streamer?

@davidrohr
Copy link
Collaborator

@ktf : But I do not fully understand. Apparently, in the new ROOT they store the size, or they take it from the variable type in the dictionary. They must also store the ROOT version in the file, no? So for all files stored with an older ROOT version, they could just use 32bit instead of the new behavior. Then it should be backward-compatible?

@wiechula : The, I know it is annoying, but I would prefer this over writing custom streamers.

@ktf
Copy link
Member Author

ktf commented Jun 26, 2025

@davidrohr I think the issue in the old way of doing things is that there is no information at the reading level whether you are reading N 16 bit enums or N/2 32 bit enums, hence the issue, both in terms of unaligned writes to memory and extra bytes being written for odd values of N. At least that's my understanding. Indeed I do not quite get why we cannot simply read the stored buffer and recast it to the correct type later. @pcanal can you please comment here?

@davidrohr
Copy link
Collaborator

@davidrohr I think the issue in the old way of doing things is that there is no information at the reading level whether you are reading N 16 bit enums or N/2 32 bit enums, hence the issue, both in terms of unaligned writes to memory and extra bytes being written for odd values of N. At least that's my understanding. Indeed I do not quite get why we cannot simply read the stored buffer and recast it to the correct type later. @pcanal can you please comment here?

@pcanal @ktf : So if I understand correctly, in old versions ROOT wrote 32 bits unconditionally (which might be misaligned, or write extra bytes, but it was always 32 bits). New ROOT versions know the size of the enum, and can read / write the correct number of bytes. So what I would do:

  • If the file was written with a new ROOT version, we just read/write normally, as we do know.
  • If the file was written with an old ROOT version, we know it has 32bits per value. So we just read 32 bits, and store only the correct n bits to memory (dropping the rest). In that way, we should read old files in a backward-compatible way? We could still fail, if the file was written with the old ROOT, and the value size is > 32 bit, since then apparently we didn't store all entries.

@pcanal
Copy link

pcanal commented Jun 26, 2025

And do we really explicitly need to load the streamer, like in the GPUWorkflowSpec.cxx?
@pcanal any better way than this to register the custom streamer?

You can/should use a I/O customization rule, see for example: root-project/root#17009 (comment). Nowadays there is almost never a good reason to use a custom streamer :)

I would either try to tell ROOT they should fix their data formats

We did: root-project/root#17009 :)

and for files written with the old root just assume 32 bit.

Unfortunately the way the old file are written depends on the custom in memory size. By definition, it is not 32 bits and the file has no clue what that size (only the process that wrote it knows ... and the code at the time, so the information must come from the O2 code ...)

Indeed I do not quite get why we cannot simply read the stored buffer and recast it to the correct type later.

Essentially this is what the I/O customization rule needs to do (i.e. that function needs to encode what the size of the enums was when they were written).

So what I would do:
If the file was written with a new ROOT version, we just read/write normally, as we do know.
If the file was written with an old ROOT version, we know it has 32bits per value. So we just read 32 bits, and store only the correct n bits to memory (dropping the rest). In that way, we should read old files in a backward-compatible way? We could still fail, if the file was written with the old ROOT, and the value size is > 32 bit, since then apparently we didn't store all entries.

This is almost correct. Unfortunately the ROOT file version is not a good marker. For example if you take an old file and new file and fast merge with hadd, the resulting file will appear as a new file but will have some of the data written in the old/broken format and some in the new format.

The discriminant is actually the (T)Class layout checksum or (if you are assigning them) the Class version (in which case you have must increase the number as you start using the new version of ROOT).

I strongly recommend to not use this PR (as I see it now, since it does something like // We always save things with the old format. which is really ... sad :) ). Instead please use the an I/O customization rule that can be made to run conditionally on only the affected on-file objects (For better or worse, the rule need to be set/applied to the Class that contains the vector of enums as there is no good way to attach the rule to the vector type itself.

@ktf
Copy link
Member Author

ktf commented Jun 26, 2025

Does the happy solution allow for reading new data with the old releases?

@davidrohr
Copy link
Collaborator

How can we increase the class number for std::vector<enum type>?

At least I do agree that just checking the file version is broken, since it will not work if the file is created with the old version but modified with the new version.

Unfortunately, I assume we will need to support old and new O2 versions which means old and new ROOT versions for some time.

But actually, I am against trying to fix this in O2. I would as I wrote before just replace all such CCDB objects by new ones with V2 and change the name in O2 to the V2 version in parallel to bumping ROOT. This is painful now once, but at least it is a clean solution without the need of adding bogus custom streamers.

@pcanal
Copy link

pcanal commented Jun 26, 2025

Does the happy solution allow for reading new data with the old releases?

Of course not as is ... but the old releases can be patched with a I/O customization rule to read the new class layout/files.

@ktf
Copy link
Member Author

ktf commented Jun 26, 2025

Does the happy solution allow for reading new data with the old releases?
Of course not as is ... but the old releases can be patched with a I/O customization rule to read the new class layout/files.

Then I frankly think the sad solution is "Sad but True".

@ktf
Copy link
Member Author

ktf commented Jun 26, 2025

But actually, I am against trying to fix this in O2. I would as I wrote before just replace all such CCDB objects by new ones with V2 and change the name in O2 to the V2 version in parallel to bumping ROOT. This is painful now once, but at least it is a clean solution without the need of adding bogus custom streamers.

This means old code can only use old objects for the calibration. If that is fine, I have no objections.

@pcanal
Copy link

pcanal commented Jun 26, 2025

How can we increase the class number for std::vector?

You can not. You would update the line ClassDefNV(classname, number); for every class that contains a std::vector<enum type with non default size>.

@davidrohr
Copy link
Collaborator

OK, but afaik we are storing the std::vector<enum type> directly, don't we?

From my side, I think it is fine if old code uses only old objects. In any case, this is only one object, correct? Worst case, one can still create a new object with the old O2.
I think @wiechula should comment if that is ok. If yes, I would go with a V2 object.

@alibuild
Copy link
Collaborator

alibuild commented Jul 6, 2025

Error while checking build/O2/fullCI_slc9 for afee20a at 2025-07-15 07:35:

No log files found

Full log here.

@davidrohr
Copy link
Collaborator

For reference, I just tried with root v6-36-00-alice4 rebased to v6-36-02 and with AliceO2 with this PR locally merged, and my async reco test crashes when loading the PadFlags vector with segfault. Stack trace is:

#0  TBufferFile::ReadFastArray (this=0x7ffe5ecdab90, h=0x7f68e5eef010, n=1152519426) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/src/TBufferFile.cxx:1327
#1  0x00007f74bb16889b in TEmulatedCollectionProxy::ReadBuffer (this=0x5556db4dc290, b=..., obj=<optimized out>) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/src/TEmulatedCollectionProxy.cxx:620
#2  0x00007f74bb116418 in TClass::Streamer (this=0x5556d80cad70, obj=<optimized out>, b=..., onfile_class=0x5556c191f1a0) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/core/meta/inc/TClass.h:623
#3  TBufferFile::ReadFastArray (this=0x7ffe5ecdab90, start=<optimized out>, cl=0x5556d80cad70, n=<optimized out>, streamer=<optimized out>, onFileClass=0x5556c191f1a0) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/src/TBufferFile.cxx:1649
#4  0x00007f74bb444127 in TStreamerInfo::ReadBuffer<char**> (this=0x5556d3a5db70, b=..., arr=@0x7ffe5ecda920: 0x5556d9facaa0, compinfo=compinfo@entry=0x5556db3e1a88, first=first@entry=0, last=last@entry=1, narr=360, eoffset=0, arrayMode=3) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/src/TStreamerInfoReadBuffer.cxx:1353
#5  0x00007f74bb25c399 in TStreamerInfoActions::VectorLooper::GenericRead (buf=..., start=<optimized out>, end=0x5556db8eb820, loopconfig=<optimized out>, config=0x5556db3e1a70) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/src/TStreamerInfoActions.cxx:2209
#6  0x00007f74bb112fa4 in TStreamerInfoActions::TConfiguredAction::operator() (this=0x5556db43a670, buffer=..., start_collection=0x5556db8e5e20, end_collection=0x5556db8eb820, loopconf=0x5556d5781330) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/inc/TStreamerInfoActions.h:131
#7  TBufferFile::ApplySequence (this=0x7ffe5ecdab90, sequence=..., start_collection=0x5556db8e5e20, end_collection=0x5556db8eb820) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/src/TBufferFile.cxx:3813
#8  0x00007f74bb30317b in TStreamerInfoActions::ReadSTLMemberWiseSameClass (buf=..., addr=<optimized out>, conf=conf@entry=0x5556db4306b0, vers=<optimized out>) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/src/TStreamerInfoActions.cxx:805
#9  0x00007f74bb3033ce in TStreamerInfoActions::ReadSTL<&TStreamerInfoActions::ReadSTLMemberWiseSameClass, &TStreamerInfoActions::ReadSTLObjectWiseFastArray> (buf=..., addr=0x5556d956b9c0, conf=0x5556db4306b0) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/src/TStreamerInfoActions.cxx:4524
#10 0x00007f74bb113b8d in TStreamerInfoActions::TConfiguredAction::operator() (this=0x5556d2bb1400, buffer=..., object=0x5556d956b9c0) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/inc/TStreamerInfoActions.h:123
#11 TBufferFile::ApplySequence (this=0x7ffe5ecdab90, sequence=..., obj=0x5556d956b9c0) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/src/TBufferFile.cxx:3747
#12 0x00007f74bb11c099 in TBufferFile::ReadClassBuffer (this=0x7ffe5ecdab90, cl=0x5556c198ad00, pointer=0x5556d956b9c0, onFileClass=<optimized out>) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/src/TBufferFile.cxx:3666
#13 0x00007f74bb1b1e76 in TClass::Streamer (this=0x5556c198ad00, obj=0x5556d956b9c0, b=..., onfile_class=0x0) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/core/meta/inc/TClass.h:623
#14 TKey::ReadObjectAny (this=0x5556d3a5da40, expectedClass=<optimized out>) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/src/TKey.cxx:1118
#15 0x00007f74bb16b6b2 in TDirectoryFile::GetObjectChecked (this=0x7ffe5ecdb5d0, namecycle=<optimized out>, expectedClass=0x5556c198ad00) at /var/tmp/portage/sci-physics/root-6.36.02/work/root-6.36.02/io/io/src/TDirectoryFile.cxx:1115
#16 0x00007f74bfb4ebe2 in o2::framework::(anonymous namespace)::extractFromTFile (what=0x7f74bfde9642 "ccdb_object", file=..., cl=0x5556c198ad00) at /home/qon/alice/sw/SOURCES/O2/dev/0/Framework/Core/src/DataRefUtils.cxx:33
#17 o2::framework::DataRefUtils::decodeCCDB (ref=..., tinfo=...) at /home/qon/alice/sw/SOURCES/O2/dev/0/Framework/Core/src/DataRefUtils.cxx:106
#18 0x00007f74c7a9a79e in o2::framework::DataRefUtils::as<o2::framework::CCDBSerialized<o2::tpc::CalDet<o2::tpc::PadFlags>, void> > (ref=...) at /home/qon/alice/sw/SOURCES/O2/dev/0/Framework/Core/include/Framework/DataRefUtils.h:174
#19 o2::framework::InputRecord::get<o2::tpc::CalDet<o2::tpc::PadFlags>*, char const*> (this=<optimized out>, binding=binding@entry=0x7f74c7aa4989 "tpcidcpadflags", part=part@entry=0) at /home/qon/alice/sw/SOURCES/O2/dev/0/Framework/Core/include/Framework/InputRecord.h:415
#20 0x00007f74c7a8d480 in o2::gpu::GPURecoWorkflowSpec::fetchCalibsCCDBTPC<o2::gpu::GPUCalibObjectsTemplate<o2::gpu::ConstPtr> > (this=this@entry=0x5556bb090e30, pc=..., newCalibObjects=..., oldCalibObjects=...) at /home/qon/alice/sw/SOURCES/O2/dev/0/Framework/Core/include/Framework/ProcessingContext.h:37
#21 0x00007f74c7a52678 in o2::gpu::GPURecoWorkflowSpec::doCalibUpdates (this=this@entry=0x5556bb090e30, pc=..., oldCalibObjects=...) at /home/qon/alice/sw/SOURCES/O2/dev/0/GPU/Workflow/src/GPUWorkflowSpec.cxx:1093

@ktf
Copy link
Member Author

ktf commented Jul 16, 2025 via email

@github-actions
Copy link
Contributor

This PR did not have any update in the last 30 days. Is it still needed? Unless further action in will be closed in 5 days.

@github-actions github-actions bot added the stale label Aug 16, 2025
@ktf ktf removed the stale label Aug 21, 2025
@ktf
Copy link
Member Author

ktf commented Sep 1, 2025

Updated with the last attempt.

@alibuild
Copy link
Collaborator

alibuild commented Sep 1, 2025

Error while checking build/O2/fullCI_slc9 for c10da95 at 2025-09-08 20:49:

## sw/BUILD/O2-sim-challenge-test-latest/log
./sim-challenge.logtask timeout reached .. killing all processes
./digi.log[ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/37}
./digi.log[ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/38}
./digi.log[ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/40}
./digi.log[ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/42}
./digi.log[ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/43}
./digi.log[ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/45}
./digi.log[ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/46}
./digi.log[ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/47}
./digi.log[ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/48}
./digi.log[ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/49}
./digi.log[4960:internal-dpl-clock]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/37}
./digi.log[4960:internal-dpl-clock]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/38}
./digi.log[4960:internal-dpl-clock]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/40}
./digi.log[4960:internal-dpl-clock]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/42}
./digi.log[4960:internal-dpl-clock]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/43}
./digi.log[4960:internal-dpl-clock]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/45}
./digi.log[4960:internal-dpl-clock]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/46}
./digi.log[4960:internal-dpl-clock]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/47}
./digi.log[4960:internal-dpl-clock]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/48}
./digi.log[4960:internal-dpl-clock]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/49}
./digi.log[4989:SimReader]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/37}
./digi.log[4989:SimReader]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/38}
./digi.log[4989:SimReader]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/40}
./digi.log[4989:SimReader]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/42}
./digi.log[4989:SimReader]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/43}
./digi.log[4989:SimReader]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/45}
./digi.log[4989:SimReader]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/46}
./digi.log[4989:SimReader]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/47}
./digi.log[4989:SimReader]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/48}
./digi.log[4989:SimReader]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/49}
./digi.log[5047:TRDDigitizer]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/37}
./digi.log[5047:TRDDigitizer]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/38}
./digi.log[5047:TRDDigitizer]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/40}
./digi.log[5047:TRDDigitizer]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/42}
./digi.log[5047:TRDDigitizer]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/43}
./digi.log[5047:TRDDigitizer]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/45}
./digi.log[5047:TRDDigitizer]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/46}
./digi.log[5047:TRDDigitizer]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/47}
./digi.log[5047:TRDDigitizer]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/48}
./digi.log[5047:TRDDigitizer]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/49}
./digi.log[5076:Digitizations]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/37}
./digi.log[5076:Digitizations]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/38}
./digi.log[5076:Digitizations]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/40}
./digi.log[5076:Digitizations]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/42}
./digi.log[5076:Digitizations]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/43}
./digi.log[5076:Digitizations]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/45}
./digi.log[5076:Digitizations]: [ERROR] Found duplicate input binding with different spec.:collisioncontext {SIM/COLLISIONCONTEXT/46}
[0 more errors; see full log]

Full log here.

@alibuild
Copy link
Collaborator

alibuild commented Sep 8, 2025

Error while checking build/O2/fullCI_slc9 for f54d259 at 2025-09-09 00:26:

## sw/BUILD/O2-latest/log
/sw/BUILD/9276ce87f7e40dae175ba48812c0165106d8e7fb/O2/DataFormats/Detectors/TPC/G__O2DataFormatsTPC.cxx:10194:29: error: 'name' was not declared in this scope; did you mean 'tzname'?
/sw/BUILD/9276ce87f7e40dae175ba48812c0165106d8e7fb/O2/DataFormats/Detectors/TPC/G__O2DataFormatsTPC.cxx:10194:34: error: no matching function for call to 'TClass::GetClass<<expression error> >()'
/sw/BUILD/9276ce87f7e40dae175ba48812c0165106d8e7fb/O2/DataFormats/Detectors/TPC/G__O2DataFormatsTPC.cxx:10194:34: error: template argument 1 is invalid
/sw/BUILD/9276ce87f7e40dae175ba48812c0165106d8e7fb/O2/DataFormats/Detectors/TPC/G__O2DataFormatsTPC.cxx:10194:54: error: 'STREAMER' was not declared in this scope
/sw/BUILD/9276ce87f7e40dae175ba48812c0165106d8e7fb/O2/DataFormats/Detectors/TPC/G__O2DataFormatsTPC.cxx:10196:28: error: 'R__dummyStreamer10196' was not declared in this scope; did you mean 'R__dummyStreamer10193'?
/sw/BUILD/9276ce87f7e40dae175ba48812c0165106d8e7fb/O2/DataFormats/Detectors/TPC/G__O2DataFormatsTPC.cxx:10197:1: error: expected declaration before '}' token
/sw/BUILD/9276ce87f7e40dae175ba48812c0165106d8e7fb/O2/DataFormats/Detectors/TPC/G__O2DataFormatsTPC.cxx:10199:70: error: expected '}' at end of input
ninja: build stopped: subcommand failed.

Full log here.

@alibuild
Copy link
Collaborator

alibuild commented Sep 9, 2025

Error while checking build/O2/fullCI_slc9 for 45b40ee at 2025-09-09 14:33:

## sw/BUILD/O2-latest/log
/sw/BUILD/9276ce87f7e40dae175ba48812c0165106d8e7fb/O2/DataFormats/Detectors/TPC/G__O2DataFormatsTPC.cxx:10193:28: error: deduced type 'void' for 'ROOT::R__dummyStreamer10199' is incomplete
ninja: build stopped: subcommand failed.

Full log here.

@alibuild
Copy link
Collaborator

alibuild commented Sep 9, 2025

Error while checking build/O2/fullCI_slc9 for 70d812e at 2025-09-12 06:59:

## sw/BUILD/O2Physics-latest/log
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
[0 more errors; see full log]

Full log here.

@alibuild
Copy link
Collaborator

Error while checking build/O2/fullCI_slc9 for 7db8df1 at 2025-09-22 22:03:

## sw/BUILD/O2Physics-latest/log
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
[0 more errors; see full log]

Full log here.

@alibuild
Copy link
Collaborator

alibuild commented Sep 23, 2025

Error while checking build/O2/fullCI_slc9 for fb1b397 at 2025-09-24 18:45:

## sw/BUILD/O2Physics-latest/log
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
Error in cling::AutoLoadingVisitor::InsertIntoAutoLoadingState:
[0 more errors; see full log]

Full log here.

@ktf
Copy link
Member Author

ktf commented Sep 24, 2025

Apparently, this only works with the new ROOT (6.36.04) and not with the production on (6.32.06). Any idea why that would be the case?

@alibuild
Copy link
Collaborator

Error while checking build/O2/fullCI_slc9 for b247f5c at 2025-09-28 13:16:

## sw/BUILD/O2-full-system-test-latest/log
task timeout reached .. killing all processes
[38881:BadMapCalibSpec]: [12:36:57][ERROR] Insufficient statistics: 0 entries in lowE histo, do nothing


## sw/BUILD/o2checkcode-latest/log
--
========== List of errors found ==========
++ GRERR=0
++ grep -v clang-diagnostic-error error-log.txt
++ grep ' error:'
++ GRERR=1
++ [[ 1 == 0 ]]
++ mkdir -p /sw/INSTALLROOT/3068eca543fac89842878422b043d539093ad03a/slc9_x86-64/o2checkcode/1.0-local363/etc/modulefiles
++ cat
--

Full log here.

* Add support for EXTRA_PATCH in root dictionary generation
@ktf
Copy link
Member Author

ktf commented Sep 29, 2025

Code is disabled for the current version of ROOT.

@ktf ktf merged commit 1c52969 into AliceO2Group:dev Sep 29, 2025
11 checks passed
sawenzel added a commit to sawenzel/AliceO2 that referenced this pull request Nov 18, 2025
This commit expands on AliceO2Group#14427
and fixes the issue brought up in https://its.cern.ch/jira/browse/O2-4671.

After debugging/testing it turns out that the approach taken via a customer streamer
for std::vector<o2::tpc::PadFlags> does not take effect in the ROOT/IO because
apparently ROOT still prefers to use the CollectionProxy for std::vector and does not
employ the custom streamer.

Instead, after discussion with @pcanal, this commit proposes to implement a
custom stream just for the mData data member of CalArray<o2::tpc::PadFlags>.
This is the only place where we use o2::tpc::PadFlags in IO and it fixes the problem
when reading CCDB objects with containing such data.

I have verified that the following code
```
o2-ccdb-downloadccdbfile -p TPC/Calib/IDC_PadStatusMap_A -t 1731274461770 -d ./ -o tpc_idc.root --no-preserve-path
root tpc_idc.root
gFile->Get<o2::tpc::CalDet<o2::tpc::PadFlags>>("ccdb_object")
```
correctly executes the custom streamer function.

Note that there is also no need to make the code ROOT version dependent. We need to fix the reading in any
case and the writing will just stay the same.

Concerning situations, where future classes will write data containing std::vector<o2::tpc::PadFlags>
we should be protected by the fact that this bug has been fixed >= ROOT 6.36 in any case.

This commit relates also to

root-project/root#17009
sawenzel added a commit to sawenzel/AliceO2 that referenced this pull request Nov 18, 2025
This commit expands on AliceO2Group#14427
and fixes the issue brought up in https://its.cern.ch/jira/browse/O2-4671.

After debugging/testing it turns out that the approach taken via a customer streamer
for std::vector<o2::tpc::PadFlags> does not take effect in the ROOT/IO because
apparently ROOT still prefers to use the CollectionProxy for std::vector and does not
employ the custom streamer.

Instead, after discussion with @pcanal, this commit proposes to implement a
custom stream just for the mData data member of CalArray<o2::tpc::PadFlags>.
This is the only place where we use o2::tpc::PadFlags in IO and it fixes the problem
when reading CCDB objects containing such data.

I have verified that the following code
```
o2-ccdb-downloadccdbfile -p TPC/Calib/IDC_PadStatusMap_A -t 1731274461770 -d ./ -o tpc_idc.root --no-preserve-path
root tpc_idc.root
gFile->Get<o2::tpc::CalDet<o2::tpc::PadFlags>>("ccdb_object")
```
correctly executes the custom streamer function.

Note that there is also no need to make the code ROOT version dependent. We need to fix the reading in any
case and the writing will just stay the same.

Concerning situations, where future classes will write data containing std::vector<o2::tpc::PadFlags>
we should be protected by the fact that this bug has been fixed >= ROOT 6.36 in any case.

This commit relates also to

root-project/root#17009

The commit also re-enables dictionary creation of related classes
and adds a dictionary for CalArray<o2::tpc::PadFlags> previously missing.
sawenzel added a commit to sawenzel/AliceO2 that referenced this pull request Nov 18, 2025
This commit expands on AliceO2Group#14427
and fixes the issue brought up in https://its.cern.ch/jira/browse/O2-4671.

After debugging/testing it turns out that the approach taken via a customer streamer
for std::vector<o2::tpc::PadFlags> does not take effect in the ROOT/IO because
apparently ROOT still prefers to use the CollectionProxy for std::vector and does not
employ the custom streamer.

Instead, after discussion with @pcanal, this commit proposes to implement a
custom stream just for the mData data member of CalArray<o2::tpc::PadFlags>.
This is the only place where we use o2::tpc::PadFlags in IO and it fixes the problem
when reading CCDB objects containing such data.

I have verified that the following code
```
o2-ccdb-downloadccdbfile -p TPC/Calib/IDC_PadStatusMap_A -t 1731274461770 -d ./ -o tpc_idc.root --no-preserve-path
root tpc_idc.root
gFile->Get<o2::tpc::CalDet<o2::tpc::PadFlags>>("ccdb_object")
```
correctly executes the custom streamer function.

Note that there is also no need to make the code ROOT version dependent. We need to fix the reading in any
case and the writing will just stay the same.

Concerning situations, where future classes will write data containing std::vector<o2::tpc::PadFlags>
we should be protected by the fact that this bug has been fixed >= ROOT 6.36 in any case.

This commit relates also to

root-project/root#17009

The commit also re-enables dictionary creation of related classes
and adds a dictionary for CalArray<o2::tpc::PadFlags> previously missing.
sawenzel added a commit that referenced this pull request Nov 19, 2025
This commit expands on #14427
and fixes the issue brought up in https://its.cern.ch/jira/browse/O2-4671.

After debugging/testing it turns out that the approach taken via a customer streamer
for std::vector<o2::tpc::PadFlags> does not take effect in the ROOT/IO because
apparently ROOT still prefers to use the CollectionProxy for std::vector and does not
employ the custom streamer.

Instead, after discussion with @pcanal, this commit proposes to implement a
custom stream just for the mData data member of CalArray<o2::tpc::PadFlags>.
This is the only place where we use o2::tpc::PadFlags in IO and it fixes the problem
when reading CCDB objects containing such data.

I have verified that the following code
```
o2-ccdb-downloadccdbfile -p TPC/Calib/IDC_PadStatusMap_A -t 1731274461770 -d ./ -o tpc_idc.root --no-preserve-path
root tpc_idc.root
gFile->Get<o2::tpc::CalDet<o2::tpc::PadFlags>>("ccdb_object")
```
correctly executes the custom streamer function.

Note that there is also no need to make the code ROOT version dependent. We need to fix the reading in any
case and the writing will just stay the same.

Concerning situations, where future classes will write data containing std::vector<o2::tpc::PadFlags>
we should be protected by the fact that this bug has been fixed >= ROOT 6.36 in any case.

This commit relates also to

root-project/root#17009

The commit also re-enables dictionary creation of related classes
and adds a dictionary for CalArray<o2::tpc::PadFlags> previously missing.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

5 participants