From 1e29c5dbaa7a52ea5cde8513ac82a4a8a134455c Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 22 Aug 2023 21:47:07 +0300 Subject: [PATCH] add a workaround for root duplicating names --- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 27 +++++++++--------- .../src/jvmMain/kotlin/rootParser.kt | 2 +- .../resources/root/geometry_run_7-2076.zip | Bin 0 -> 48731 bytes .../kscience/visionforge/solid/SolidGroup.kt | 2 +- .../visionforge/solid/SolidReference.kt | 15 +++++++--- 5 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 demo/playground/src/jvmMain/resources/root/geometry_run_7-2076.zip diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index be9372b5..13b1cb55 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -4,6 +4,7 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.parseAsName import space.kscience.dataforge.names.plus +import space.kscience.dataforge.names.withIndex import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.isEmpty import space.kscience.visionforge.set @@ -223,7 +224,7 @@ private fun SolidGroup.addShape( "TGeoShapeAssembly" -> { val fVolume by shape.dObject(::DGeoVolume) fVolume?.let { volume -> - addRootVolume(volume, context, block = block) + addRootVolume(volume, context, name = volume.fName.ifEmpty { null }, block = block) } } @@ -348,29 +349,29 @@ private fun SolidGroup.addRootVolume( cache: Boolean = true, block: Solid.() -> Unit = {}, ) { - - val combinedName = if (volume.fName.isEmpty()) { - name - } else if (name == null) { - volume.fName - } else { - "${name}_${volume.fName}" + val combinedName = name?.parseAsName()?.let { + // this fix is required to work around malformed root files with duplicated node names + if (get(it) != null) { + it.withIndex(volume.hashCode().toString(16)) + } else { + it + } } if (!cache) { - val group = buildVolume(volume, context)?.apply(block) - setChild(combinedName?.let { Name.parse(it) }, group) + val group = buildVolume(volume, context)?.apply(block) ?: return + setChild(combinedName, group) } else { val templateName = volumesName + volume.name - val existing = getPrototype(templateName) + val existing = context.prototypeHolder.getPrototype(templateName) if (existing == null) { context.prototypeHolder.prototypes { - val group = buildVolume(volume, context) + val group = buildVolume(volume, context) ?: return@prototypes setChild(templateName, group) } } - ref(templateName, name).apply(block) + ref(templateName, combinedName).apply(block) } } diff --git a/demo/playground/src/jvmMain/kotlin/rootParser.kt b/demo/playground/src/jvmMain/kotlin/rootParser.kt index d5fea32e..85a2f0d3 100644 --- a/demo/playground/src/jvmMain/kotlin/rootParser.kt +++ b/demo/playground/src/jvmMain/kotlin/rootParser.kt @@ -26,7 +26,7 @@ private fun Meta.countTypes(): Sequence = sequence { } fun main() { - val string = ZipInputStream(TGeoManager::class.java.getResourceAsStream("/root/BM@N_geometry.zip")!!).use { + val string = ZipInputStream(TGeoManager::class.java.getResourceAsStream("/root/geometry_run_7-2076.zip")!!).use { it.nextEntry it.readAllBytes().decodeToString() } diff --git a/demo/playground/src/jvmMain/resources/root/geometry_run_7-2076.zip b/demo/playground/src/jvmMain/resources/root/geometry_run_7-2076.zip new file mode 100644 index 0000000000000000000000000000000000000000..1680404cd90cbb11d16f618bbda808c0c0208873 GIT binary patch literal 48731 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.() -> Unit) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 80db0b3e..7203f06f 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -2,7 +2,9 @@ package space.kscience.visionforge.solid import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.flow.filter import kotlinx.coroutines.launch import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -61,7 +63,7 @@ public class SolidReference( } override fun getValue(name: Name, inherit: Boolean?, includeStyles: Boolean?): Value? { - if(name == Vision.STYLE_KEY){ + if (name == Vision.STYLE_KEY) { return buildList { properties?.getValue(Vision.STYLE_KEY)?.list?.forEach { add(it) @@ -90,7 +92,7 @@ public class SolidReference( prototype.getStyleProperty(name)?.value?.let { return it } } - if(inheritFlag){ + if (inheritFlag) { //5. own inheritance parent?.properties?.getValue(name, inheritFlag, includeStyles)?.let { return it } //6. prototype inheritance @@ -226,9 +228,14 @@ internal class SolidReferenceChild( */ public fun MutableVisionContainer.ref( templateName: Name, - name: String? = null, + name: Name? = null, ): SolidReference = SolidReference(templateName).also { setChild(name, it) } +public fun MutableVisionContainer.ref( + templateName: Name, + name: String? = null, +): SolidReference = ref(templateName, name?.parseAsName()) + public fun MutableVisionContainer.ref( templateName: String, name: String? = null,