From a6742a45c9b9c28016d7fd697192d3dd955a15e4 Mon Sep 17 00:00:00 2001
From: Alessandro Frigeri <alessandro.frigeri@inaf.it>
Date: Thu, 27 Jun 2019 16:45:30 +0200
Subject: [PATCH] updated examples

---
 examples/Apollo12_soils.py                    |   8 +-
 examples/example1.ipynb                       | 205 +++++++++++++++---
 examples/specimen.py                          |  18 ++
 ...ns_weight.py => total_specimens_weight.py} |  19 +-
 moondb/__pycache__/__init__.cpython-37.pyc    | Bin 481 -> 476 bytes
 moondb/__pycache__/core.cpython-37.pyc        | Bin 12107 -> 13484 bytes
 moondb/__pycache__/helpers.cpython-37.pyc     | Bin 227 -> 222 bytes
 moondb/core.py                                |  64 +++++-
 8 files changed, 254 insertions(+), 60 deletions(-)
 mode change 100644 => 100755 examples/specimen.py
 rename examples/{specimens_weight.py => total_specimens_weight.py} (55%)

diff --git a/examples/Apollo12_soils.py b/examples/Apollo12_soils.py
index ddc0da4..e7c2faa 100644
--- a/examples/Apollo12_soils.py
+++ b/examples/Apollo12_soils.py
@@ -1,6 +1,6 @@
-import moondb,sys
-
+#!/usr/bin/env python3
 
+import moondb,sys
 
 # Let's setup the data filter
 f = moondb.AnalysisFilter()
@@ -11,8 +11,10 @@ f.specimenType = ["SOIL"]
 results = f.get_results()
 
 for r in results:
+   print('\nDataset: ',r.dataset) 
+   print('Lab,Specie,value')
    for dr in r.dataResults:
-      print(dr.laboratory,dr.variable,dr.value,dr.unit)
+      print(",".join([dr.laboratory,dr.variable,dr.value+dr.unit]))
       
 
 
diff --git a/examples/example1.ipynb b/examples/example1.ipynb
index d3c69fa..c30e54f 100644
--- a/examples/example1.ipynb
+++ b/examples/example1.ipynb
@@ -1,111 +1,246 @@
 {
  "cells": [
   {
-   "cell_type": "code",
-   "execution_count": 9,
+   "cell_type": "markdown",
    "metadata": {},
-   "outputs": [],
    "source": [
-    "import moondb"
+    "## MoonDB Jupyter notebook workbook\n",
+    "#### Alessandro Frigeri, IAPS/INAF, Rome Italy\n",
+    "\n",
+    "\n"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 104,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "{'name': 'Apollo 11'}\n",
-      "{'name': 'Apollo 12'}\n",
-      "{'name': 'Apollo 14'}\n",
-      "{'name': 'Apollo 15'}\n",
-      "{'name': 'Apollo 16'}\n",
-      "{'name': 'Apollo 17'}\n",
-      "{'name': 'Luna 16'}\n",
-      "{'name': 'Luna 20'}\n",
-      "{'name': 'Luna 24'}\n"
+      "The autoreload extension is already loaded. To reload it, use:\n",
+      "  %reload_ext autoreload\n",
+      "/home/alf/gitwrk/pymoondb/moondb/__init__.py\n"
      ]
     }
    ],
    "source": [
-    "m = moondb.get_missions()"
+    "# First we import the moondb module\n",
+    "%load_ext autoreload\n",
+    "%autoreload 2\n",
+    "\n",
+    "%aimport moondb\n",
+    "\n",
+    "print(moondb.__file__)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 33,
+   "execution_count": 105,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['Apollo 11',\n",
+       " 'Apollo 12',\n",
+       " 'Apollo 14',\n",
+       " 'Apollo 15',\n",
+       " 'Apollo 16',\n",
+       " 'Apollo 17',\n",
+       " 'Luna 16',\n",
+       " 'Luna 20',\n",
+       " 'Luna 24']"
+      ]
+     },
+     "execution_count": 105,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
-    "f = moondb.Filter()\n",
-    "#f.specimenType = [\"SOIL\"]\n",
-    "results = f.get_results()"
+    "# Let's get a list of the missions in MoonDB\n",
+    "\n",
+    "mlist = moondb.get_missions()\n",
+    "\n",
+    "[m.name for m in mlist]"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 34,
+   "execution_count": 106,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "MoonDB holds 2991 specimens from  Apollo 17.\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Now, we want to know how many specimens are available from the Apollo 17 missions\n",
+    "\n",
+    "f = moondb.SpecimenFilter()\n",
+    "mission = 'Apollo 17'\n",
+    "f.missionName = [ mission ]\n",
+    "results = f.get_results()\n",
+    "specimen_list = [r for r in results]\n",
+    "\n",
+    "print(\"MoonDB holds {} specimens from  Apollo 17.\".format(len(specimen_list)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 79,
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/plain": [
-       "37034"
+       "['COMPOSITE',\n",
+       " 'ROCK',\n",
+       " 'ROCK/Basalt/Ilmenite Basalt',\n",
+       " 'ROCK/Basalt/Unclassified Basalt',\n",
+       " 'ROCK/Breccia/Fragmental Breccia',\n",
+       " 'ROCK/Breccia/Impact Melt Breccia',\n",
+       " 'ROCK/Breccia/Regolith Breccia',\n",
+       " 'ROCK/Breccia/Unclassified Breccia',\n",
+       " 'ROCK/Crustal/Crustal:Cataclasite',\n",
+       " 'ROCK/Crustal/Crustal:Norite',\n",
+       " 'ROCK/Crustal/Crustal:Troctolite',\n",
+       " 'SOIL/Soil:1-2mm',\n",
+       " 'SOIL/Soil:2-4mm',\n",
+       " 'SOIL/Soil:4-10mm',\n",
+       " 'SOIL/Soil:<1mm',\n",
+       " 'SOIL/Soil:Unsieved',\n",
+       " 'Unknown']"
       ]
      },
-     "execution_count": 34,
+     "execution_count": 79,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "len(results)"
+    "# Get a list of type of specimen of Apollo 17 available in MoonDB\n",
+    "s_list = [s.specimenType for s in specimen_list]\n",
+    "list(sorted(set(s_list)))"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
    "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 108,
+   "metadata": {
+    "scrolled": true
+   },
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "{'analysisCode': '15100,3#3#0158', 'analyzedMaterial': 'WHOLE ROCK', 'comment': '0.97 g, 950C', 'dataset': 'IRVING, 1972#TABLE 1', 'citation': 'IRVING, 1972', 'dataResults': [{'unit': 'ppm', 'laboratory': 'UNKNOWN', 'variable': 'H', 'methodName': 'UNKNOWN', 'methodComment': 'COMBUSTION (NEW LINE, YIELDING LOW BLANKS)', 'value': '90.0', 'methodCode': 'UNKNOWN'}, {'unit': 'per mil', 'laboratory': 'UNKNOWN', 'variable': 'DELTA_D', 'methodName': 'UNKNOWN', 'methodComment': 'COMBUSTION (NEW LINE, YIELDING LOW BLANKS)', 'value': '-554.0', 'methodCode': 'UNKNOWN'}, {'unit': 'ppm', 'laboratory': 'UNKNOWN', 'variable': 'C', 'methodName': 'UNKNOWN', 'methodComment': 'COMBUSTION (NEW LINE, YIELDING LOW BLANKS)', 'value': '99.0', 'methodCode': 'UNKNOWN'}, {'unit': 'per mil', 'laboratory': 'UNKNOWN', 'variable': 'DELTA_C13', 'methodName': 'UNKNOWN', 'methodComment': 'COMBUSTION (NEW LINE, YIELDING LOW BLANKS)', 'value': '7.9', 'methodCode': 'UNKNOWN'}]}\n"
+      "2991\n"
      ]
     }
    ],
    "source": [
-    "an = print(results[0])"
+    "#\n",
+    "# Let's see the analyses done on the first specimen\n",
+    "#\n",
+    "\n",
+    "s_list = [s for s in specimen_list]\n",
+    "\n",
+    "print(len(s_list))\n",
+    "\n",
+    "s0 = s_list[0]\n",
+    "\n",
+    "an_list = [a for a in s0.get_analyses()]"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": 109,
    "metadata": {},
-   "outputs": [],
-   "source": []
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[result of MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY (code MC-ICP-MS), result of MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY (code MC-ICP-MS), result of MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY (code MC-ICP-MS), result of MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY (code MC-ICP-MS), result of MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY (code MC-ICP-MS), result of MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY (code MC-ICP-MS), result of MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY (code MC-ICP-MS), result of MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY (code MC-ICP-MS), result of CACULATED (code CALC)]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# now we check the results of the first analysis\n",
+    "\n",
+    "#result_of\n",
+    "\n",
+    "print(an_list[0].dataResultsObj)"
+   ]
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
-   "metadata": {},
+   "execution_count": 103,
+   "metadata": {
+    "scrolled": true
+   },
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "None\n"
+      "Apollo 17 specimen:  76535,16\n",
+      "Result: Os 8.5 ppb (MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY)\n",
+      "Result: Ir 55.0 ppb (MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY)\n",
+      "Result: Ru 81.0 ppb (MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY)\n",
+      "Result: Pt 54.0 ppb (MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY)\n",
+      "Result: Pd 89.0 ppb (MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY)\n",
+      "Result: Re 9.0 ppb (MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY)\n",
+      "Result: Re187_Os188 5.1 Not Applicable (MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY)\n",
+      "Result: Os187_Os188 0.1511 Not Applicable (MULTICOLLECTOR INDUCTIVELY COUPLED PLASMA MASS SPECTROMETRY)\n",
+      "Result: G_Os(T) -348.0 Not Applicable (CACULATED)\n"
      ]
     }
    ],
    "source": [
-    "print(anaobj)"
+    "\n",
+    "\n",
+    "\n",
+    "print(mission+\" specimen: \",s0.specimenName)\n",
+    "for r in an_list[0].dataResultsObj:\n",
+    "   print('Result: {} {} {} ({})'.format(r.variable,r.value,r.unit,r.methodName))"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -130,7 +265,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.6.8"
+   "version": "3.7.3"
   }
  },
  "nbformat": 4,
diff --git a/examples/specimen.py b/examples/specimen.py
old mode 100644
new mode 100755
index 9aa96f1..d295d5f
--- a/examples/specimen.py
+++ b/examples/specimen.py
@@ -1,4 +1,22 @@
+#!/usr/bin/env python3
+
 import moondb
 
 s_12023 = moondb.get_specimens(sc=['12023'])[0]
 
+#print(s_12023)
+
+child = moondb.get_specimens(sc=['12023,114'])[0]
+
+#print(' A N A L Y S E S ')
+a = child.get_analyses()
+
+
+print(a[0])
+
+a0_results = a[0].dataResultsObj
+
+
+print('Result: {} {} {}'.format(a0_results[0].variable,a0_results[0].value,a0_results[0].unit,a0_results[0].methodName))
+
+
diff --git a/examples/specimens_weight.py b/examples/total_specimens_weight.py
similarity index 55%
rename from examples/specimens_weight.py
rename to examples/total_specimens_weight.py
index 7e446da..8acd814 100644
--- a/examples/specimens_weight.py
+++ b/examples/total_specimens_weight.py
@@ -1,3 +1,5 @@
+#!/usr/bin/env python3
+
 import moondb,sys
 
 
@@ -16,22 +18,7 @@ for m in moon_missions:
    weight_cum += weight
    print("MoonDB holds {:.3f} kg of specimens from {}".format(weight/1000.0,m.name))
 
-print("MoonDB contains a total of {:.3f} kg of specimen from the Moon!".format(weight_cum/1000.0))
-
-
-f = moondb.AnalysisFilter()
-f.mission = ["Apollo 11"]
-f.analyte = ["Na2O","CaO"]
-f.specimenType = ["SOIL"]
-
-
-
-results = f.get_results()
+print("\nMoonDB contains a total of {:.3f} kg of specimen from the Moon!".format(weight_cum/1000.0))
 
-for r in results:
-   for dr in r.dataResults:
-      print(dr)
-      #print(dr.laboratory,dr.variable,dr.value,dr.unit)
-      
 
 
diff --git a/moondb/__pycache__/__init__.cpython-37.pyc b/moondb/__pycache__/__init__.cpython-37.pyc
index 4ec4ae538fe0135d4b4557ef750fe953cfffc882..adf878aed3b8987b69e4ea9b800bebce4a87163d 100644
GIT binary patch
delta 74
zcmaFJe21CGiI<m)fq{Wx#}1L$jXVX622m`@`9-Nw>=~&!1*t{FD;bJd7#JYLFCG1i
Z{M=Oi#GEw!^vsg-qHO(w%E=oU4FCdK78w8l

delta 79
zcmcb^{E(T)iI<m)fq{Wxf%%!3jXVX6rngv<^NUiW*fUad3Q~)TS27f_GB7}hUxxY_
f`MIh3i8*Qd>6s<vMcMiVl_eSZdAgI=Fd6^=oRb)&

diff --git a/moondb/__pycache__/core.cpython-37.pyc b/moondb/__pycache__/core.cpython-37.pyc
index 563654845ade61e7230a3d4fbc4a3b2f8ef6331a..96bb62901a8a7c6de0f215953d4f30ea33a80d2e 100644
GIT binary patch
delta 6255
zcmX>dw<eR%iI<m)fq{X6`KU;2xB5gr3C2wm)otr@Iiolk8B!Qhm~*&txudwjY{nd(
zC?0o)6qXd$7KRkoW~M0KR1SBB6t)!h7KRk|W~OGwC_b<VM+#>PLkcHYgdZ%zmBQV^
zkircX5de$ur0}*dr0{}81i>PFDf}%ADg4b$&Gn2?LhcMH0x5zm3@L)mOi{w_3@Jh>
z!YvFb!p%%kBJK<+A}OLR3@M_`Oi`ll3@KtM;w=m*;>}D^V(ttn5-E}`3@MV$Oi|+Q
z3@K76(k%=r(#=d!67CEsGAXhx3@NhBOi_|4aw+mH3{g@k3Mq;$3{lc4N-4@M3{f&E
zD)lL<EeuhzDQYR|Eeug|DgG%MDVi;eQSvETDcUUzQ3@$KDY`8TQHm*gDf%r8QA#NW
zDTXZ!QOYSsDaI`fQ7S1WDW)w9QK~6sDdsH<QEDj`DV8k^QR*pHDb_6vQ5x<HDK;s#
zEet8P%}i06VBg!N*tamG*n`8PUdx>!#UaJ9g(1bUnJG#;RVT$Mn`r`5(YjQHW`-!;
zRPAPlD7_TtbjDP@c>NTY6xVd7RK0kE6gRMlVX9Gzdov>=L#o~a<An@SCKV2;CN2!I
z7Ez|DrYRnh3@Hqf3{hsOW+|SM3{mE(W+`5h3{e)TW+~p13{jS;M)j%YDL$zdsg}(w
zj0_W)3VFgAQms;aQ{2*-Qv7-uqpVYnQf*SLn;F5DSc8qTg*YvpA<C{oDpl8oAyz2L
zKGkl4L#ln2<3dKTIaMHYQtfb?k-`|vpc(K|5|kwUG?{L3rX-dmCg&s;7vEw{%S_El
znS7L~U4e~(fng;>5eEYU!!Hf}jQreG{luI!{q)R|@}g}0g38H-%<_z4lP5AeseqJf
zG8VBjFhJCUH5G9(FfiO=kB=`dDT<GmnEajD*$|Wqinvjgfh+*4En;P0U=U?sU?^r`
zU|`^2<X|ddoh-*DIk|-;osn(w8<rA1L6BAf1_lOACa`T$tOfa*c_k40;0E1dO)L)2
zE>W4>$Ev{11Jc3^BKRinWYsql1~I`(5d_GkMf?m54ALOm`4|`&xR_WNIbe{fh#%w*
zM!(4xY-)_mljGUsWK+PoFN!sVE0{r(`xaYJYH?{!$t{-Byv&kYll_H7d2ey$rj}&n
zr}!o2rrw%dC@fkJ6LHQ@Nlj)1g+2oV1Bhl~U|?_tSuMf9z>vaN!;r-w&XB?+&QQaU
z#VF2@!Ys}Z%%I8QSH)EXwnia8O`(ciK_fXoB~{@UqoyWPku1nt3ZRg|9uFMx@%2Ti
z1x4}kMj(qoHZm|)@k5-g7atFi^V4K2LJBaDnV<+M5(BZ6Km;Ptz$|dcffAAi$W&0w
za52Hd4HSM%MIhN^kY^{Wu?aF}fx<9^Ih7@a#fBjjM6=p3q_U>6rLgrfMzN=|rLv^3
zBZ+W;ML292QaDq%S{R}@Q@B%jS{S0ZQh0+IH2H3EIOZkhR2F9z-<sSYWL>Yxc#A(J
zH7&6;rzActF}WnasPYy!D0xFXT6~KSiQ}J?MP4*;!Ys9_Vo}J?Q>fxp$W1IsEy}D<
z%+X{jQUL{&D$ckl0tKW!D7>JtAP6%K9uL@^1qxnJ+DKu9rHo((O(s8x8^HF~GcXk4
zu^5!|oRBOQK(ZK|OZ_ytamPP1C_l60WEPhcse^n7igK`D5INcqEhiQ!GcYiif@~B5
zXDUR}5MmT!;$SXP24}3c$rfz&JShS#3{h+;g24=$LX&s1ovMe20w|S%3I}i=$zxz(
zNN1>JEP><{MsbE_#u%nrrdsBTpc-ZuhFGs!mUM<%)(V{(mJ}vQ1{a1{g<7@}rZk2c
zwm!yM_8Qg&%r)$wva*J?h9!mBhM`a|oS}pzjiH96kFl1chH(LN4aY)8#(IWAnQ(?0
zP+`g9SH-UnN;&$)1*yrIxv6>jh%nG(y~P=yo>~%Llv-R+qzwuhP@2ERmRL}bnwJ6&
z15HjydBvTW7oVS$6%Pu<Ta0;8?1_0$c48DqQG7m>QxwHq6kneo#R5`}7N)m&Kz1d9
zlYMG&7$|T-*^_~hg;9u+i;;zqkCBU!i;0Jki;<79N;DYiU_E4AewysK<5?5r15*YD
zRpi1Pk=wNx7#LhZw#tE{bn-=Zk;(Vj*;qK3inKtnnGJGHDnk@w3PTiAC?t<F+AyRr
z1v6+e-(m|$%`eDFEdo^;ewwVfT>-WbL4cA#kr@L6Lng>-P{!e6Dl(g#!0$3yo5Nfc
zWE`|k02_@KW<{WiCvS2jr}X4S96I2t4SRhBPRa$7-*LF%Qv}MuMUx{rRo&4FOOQ2S
zBOv(#;e0R)><4oO28LXaA3#n9RdO6mMdo0CaB|rY<&Uz-j@$~9ySNDYqhj(kE^k8q
zsG97^twn}EEEpIVO40mb0rtl?Zfm0aQ8!teSAKFS4?%x4Og_ltMaUmbleKv@$?%6I
z0|P@Xnm;VT{<zO;M3g_;CY$j&;d36S*zK4+gU=D4B2b#@n*5Vbfeb%bF)%Q+qWQsU
zasq#|0Vt8(Vga=iG?~FAP>~HNcY}nnWs$zg!UA|x49F`JC)Wvh5c108$<GAT$?%Fb
z0|P@Zl2@2Hn2M|?C-6&7&J_$MDmrFNek!PDi7jJ-Ga-TiXGdEG28QV%`#?ns2V;@#
zWNu;Gv?3``D1lmoMKT~3xOD|8?~3F>Tu?j9Pm=|$@VdnrA77l4Us4<&j}*3G`@mM&
zF)%R9L$b<l@_FG5MX)@W04ch~5?@-Bvk<0=fw9PGa)gMt7FYq80ITATPtHh9&IZ>w
zOF)W2EoKHrE~X;a&1XfF7#W==e-I5c02R}>Sh9-q^E8=@96>I30TCu30&EzV0GU{1
z0BY?|E)`Q}G?;u|SaR|<F=aQ9p|@DFQ!9&av6Us}l%^JIGTvfLLGm0(>n*`}kPV<}
zEj76$J|jOr`yj|kpa5lHEDD`0FYaI$0BSq1=Hw@)6c>epTSm87K=moQSsWmvjPjGR
zjvyHkv3ahzCbKZeiA9DWgV<6lN<cNM*5o@<y6i=u7HyHoWIkyrIk1Po1lVc3ph^!`
zWfz~A>?Uo_&cwyY$5fOwxkb9Z-W?PYpv<7jUgQa4dw~d06R8Lkc10j(gRKPjO*EOK
zIC3+Ki!<}{ii<!Yd5bMKKC>h>7u^@&8XBgOm63s=7?d1AH8dY12cr<97-LZi0|P_y
z<R+PnD6sX+;0P!JRSsbLG+A%47ngur14SMnHzk6Ic#!8=i%as8ve2y*MD}S(WkG5&
zKjS2M5yte%buy8YH_1vwBHIHhyrK3KrGiXGwWBBvBnA#fFaZurF|ZAZxdl0ydFdso
z$r*W>g{7&*;$Uksz}95Ri$@?^11eidwMG<V4Y+kvm6`%+RVU^Y%Y$vnoGdDzlLoed
z1rlJO<WK}E{)#|d3{93O4zSje)M9Y3MKLAj6&Yjk3^;~hO4UIz1gg40F$8Kii7^&s
zO|Fx%oGhnc8joxpsB|g<#RAk<QS6Dih)9ZJO3Ve@7R8c?C5nXMJ}b^FhV%`K^}znh
zo?Is*Ir)J?L<%^KgL<NH3v!SxV9Uvcv>bDySaPsf0Z#8ZiFqlxiACAPW*~pTQXa@(
zpcY|K?&LX&o@}5dND<rQ*NReRIk>_HW{@4o97y=Ef!dag9E?SIldY9hZNRAmjQ}SW
za4Z(1Cl*(bLC|s`A6%%vWKy1dLrGTwWCo5F8OUO<$*RijvLHo}bPu+J!zL#&Hz_62
z&KG3t<dez~+MxV;i#4S*x1boiX}8$pOY*&f{r!9<`=}^6fC8roGB^MV1dvrlRUj6^
zDliLVUr_-A1A`~XDp0uyYPl5^OkStbtOjcF-{OX5cW`f?2NrT5UXc#SK;6mVs?KRq
zAZ9d(hyf9?AR-P_9I_Q9f!H9UifTYCP?H3z6C@8A?zqKKlv)f)Z(wJE36R@vaf8wp
zWN@H3e3F`R8k*0*27?>+pw>AyD~jqt)`Cq$5FoRQsu>s<{6YQ(nF;Dx@GycQQ&IKg
z1b*Mi&(uOh^+1~SK?KCNAeQQ6e|33DEQ3Pe)_B6?cJ&U`LXhVei;6(%(X1_IU|`4u
zS<5ilM8nXj1f&Gi;M8O;Dg&|0K|}>eKNF;!t^~2Mj(&jSG-LB}jlE2eA|KQ(jp71T
zK#*|(O-68cPLl_{762y(aH?WS$xJRO0!4jM5Xk0W5CQH7gUX;=9H0@DoW$f*O%6yq
z3sgT8)qxa&s@o{0q7-o1H2JZ%ya<|4K_Q<#Sxm<PYkLXo1dtL)(nr(Vz`(!|4+<qv
zF~z~i!NI{?)G&FjPE|eFZQ#}mxXl7;(Nr;6DO7Pf7UbvT<SQ5&X)+dp(xN7-9|&kV
z75Raj3-WCgPiaw3PG*u`L1IyHYLNp2149%$M94UbtvEk9JGG?97bFTETmg?ArWO~0
zvUU-8n1DOEK0hZXHMs;_SAs(gT)%>P@!*j*@UT!3C?1MH9ZGQ54pRMr>n3o`0WR0U
zMJ}k7Rs?E46(Q<oa8U_rOB6+boDI%Dpjx#k9mLH5`K$=kSuDx|@v}h$xX=TQ9~9+-
zxS$LTPTfVIPz1N;ZZYQGVoZZ%yhe~3aKiQhvA|IPZZMckPSlgA2L)&pxE_HuFu*m#
zE#{omyjx7ghEYtpIpFXG7v<=^QgAeavezvRo80`A(wtN~kWeuw^Fu~S1Q<CO1sHi)
sIGFj^gm{H`g#?6Dgjo1Epiq#DkDZU1gPDVsLxO{ugN4g>GONBD0Qd~0fdBvi

delta 4958
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
TW)4;k2@Yls7B0KVX(ny}1aPx*

diff --git a/moondb/__pycache__/helpers.cpython-37.pyc b/moondb/__pycache__/helpers.cpython-37.pyc
index c7e04cde9e47a478e03dff61959bf3d407710eb1..9c6fa48130fde75483ad9a95d797f6f6d62d5f4d 100644
GIT binary patch
delta 44
zcmaFNc#o0CiI<m)fq{V`yG0~+B2T}Fwthx_ZmND_PMUstW=VNbwthk7#4Y*&2P6%S

delta 49
zcmcb|_?VH$iI<m)fq{Xc;>GEhi9G$12KpKKxvBbzIcfUonI+{#+4=>QB^mj7x)ayy
F0|0nP5TF16

diff --git a/moondb/core.py b/moondb/core.py
index 8083d63..9272b71 100644
--- a/moondb/core.py
+++ b/moondb/core.py
@@ -2,17 +2,19 @@
 # 
 # (c) 2019 Alessandro Frigeri, Istituto Nazionale di Astrofisica
 # 
-# MoonDB Python module
-# https://realpython.com/api-integration-in-python/
+# pymoondb: MoonDB Python module
+
 
 import sys
 import json 
 import urllib.parse
 import urllib3,socket
 import logging
-from dataclasses import dataclass
+from dataclasses import dataclass, field
 from collections import namedtuple
 
+#from dataclasses import dataclass, field
+
 import requests
 #import attr
 
@@ -35,6 +37,35 @@ class Landmark:
       point = "POINT ({} {})"
       return point.format(self.longitude,self.latitude)
 
+@dataclass
+class Result:
+   unit: str
+   laboratory: str
+   variable: str
+   methodName: str
+   methodComment:str 
+   value: str 
+   methodCode: str
+
+   def __repr__(self):
+      return "result of "+self.methodName+" (code "+self.methodCode+")"
+
+@dataclass
+class Analysis:
+   analysisCode: str
+   analyzedMaterial: str
+   comment: str
+   dataset: str
+   citation: str
+   dataResults: list = field(default_factory=list)
+   dataResultsObj: list = field(default_factory=list)
+
+   def __repr__(self):
+      return "Analysis:"+self.analysisCode+" on "+self.analyzedMaterial+" material"
+
+   def __str__(self):
+      return self.analysisCode+" on "+self.analyzedMaterial
+
 @dataclass
 class Specimen:
    specimenCode: str
@@ -52,6 +83,28 @@ class Specimen:
    pristinityDate: str
    description: str
 
+   def get_analyses(self):
+      an_obj_list = []
+      n,an_list = _get_resp('/data/specimen/'+self.specimenCode) 
+      for a in an_list:
+         r_o_list = []
+         for r in a['dataResults']:
+            r_o = Result(**r)
+            r_o_list.append(r_o)
+            #print(r_o)
+            a['dataResultsObj'] = r_o_list
+         an_o = Analysis(**a)
+         an_obj_list.append(an_o) 
+      return an_obj_list
+
+
+
+
+
+
+@dataclass
+class People:
+   name: str
 
 class SpecimenType:
    def __init__(self,name):
@@ -99,8 +152,8 @@ class AnalyisMethod:
    def __init__(self,name):
       self.name = name
 
-class Analysis:
-   __slots__ = ('analysisCode','analyzedMaterial','comment','dataset','citation','dataResults')
+#class Analysis:
+#   __slots__ = ('analysisCode','analyzedMaterial','comment','dataset','citation','dataResults')
 
 class DataResult:
    __slots__ = ('unit', 'laboratory', 'variable', 'methodName', 'methodComment', 'value', 'methodCode')
@@ -199,7 +252,6 @@ def get_specimens(sc=None,mn=None,ln=None,sty=None,ste=None):
 
    for s in sp_list:
       # dict unpack
-      # print(s)
       s_o = Specimen(**s)
       sp_obj_list.append(s_o)
 
-- 
GitLab