Hi all, I am observing a strange degradation problem with a complex global variable, consisting of nested hashes and arrays (Jmol 14.6.3_2016.09.18):
Immediately after I have added another hash level containing an array everything is fine. When I provide the new array as parameter to a function it is there. But when I do the same function call again the array has become an empty string. This is fully reproducible. I tried to build a simple test system that mimics the levels and how the new hash and array are added and queried by another function to demonstrate the problem, but wasn't succesful (no degradation). The real dataset is quite large. Exported with 'write var' it takes 59 megabytes of disk space. A compressed version is temporarily available at http://jenalib.leibniz-fli.de/ImgLibPDB/tmp/network_data_with_genes_of_interest-2016_09_29.txt.gz The hash key for the subhash is 'genesOfInterest' and the key for the array is 'nodeIds'. But the system below at least demonstrates the number of hash levels and how the new hash and array are added: ---- Example system -------------- testData = [level2: [level3: {}]] function fillTest(dataRef, count) { var level3 = {}; var testHash = {}; for (var i from [1 count]) { testHash[i] = [atomId: i]; } level3 = dataRef..level2..level3; level3..level4 = {}; level3..level4..level5 = testHash.array("id").select("(atomId)"); } function readTest(testPar) { print "type=" + testPar.type; print "size=" + testPar.size; } print "==== 1 =====\n" + testData; fillTest(testData,5); print "==== 2 =====\n" + testData; readTest(testData..level2..level3..level4..level5); ---- Example output -------------- ==== 1 ===== { "level2" : { "level3" : { } } } ==== 2 ===== { "level2" : { "level3" : { "level4" : { "level5" : [ 1 2 3 4 5 ] } } } } type=array size=5 ---------------------------------- Bob, do you have any idea how this can happen? Maybe I have made a wrong assumption regarding variables in Jmol: If a hash is provided as a parameter to a function it is used there by reference and it is not created a copy used within the function. The example above at least shouldn't work without the assumption being true. The use of the 'level3' variable in the 'fillTest' function is common within my system. It is created as a local hash variable to make sure it is a hash. And if it is already provided in the parameter hash it is replaced by the existing subhash (by reference through '='). If not the new hash is inserted at the end of the function into the parameter hash. I never observed any problems with this strategy before. The newly added data always stayed within the global variable provided as parameter to the function. Regards, Rolf ------------------------------------------------------------------------------ _______________________________________________ Jmol-users mailing list Jmol-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-users