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

Reply via email to