Hi all,

forget about it. I have found the problem. Sometimes it already helps to 
explain a problem to someone else to get a different look at it.

The function call querying the array was actually a nested call of 
multiple functions and in one of the functions the parameter was 
accidetally set to a an empty string because the function initially 
wasn't prepared for working with an array as parameter.

Regards,
Rolf

Am 29.09.16 um 12:25 schrieb Rolf Huehne:
> 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
>


------------------------------------------------------------------------------
_______________________________________________
Jmol-users mailing list
Jmol-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jmol-users

Reply via email to