PrototypeNormalizer.scala 4.66 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
   Copyright 2016-2017 The NOMAD Developers Group

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
 */
Daria M. Tomecka's avatar
Daria M. Tomecka committed
16
17
18
19
20
21
22
23
24
package eu.nomad_lab.normalizers

import eu.{ nomad_lab => lab }
import eu.nomad_lab.DefaultPythonInterpreter
import org.{ json4s => jn }
import scala.collection.breakOut
import eu.nomad_lab.normalize.ExternalNormalizerGenerator
import eu.nomad_lab.meta
import eu.nomad_lab.query
Daria M. Tomecka's avatar
Daria M. Tomecka committed
25
26
27
28
29
30
31
import eu.nomad_lab.resolve._
import eu.nomad_lab.h5.EmitJsonVisitor
import eu.nomad_lab.h5.H5EagerScanner
import eu.nomad_lab.h5.SectionH5
import eu.nomad_lab.parsers.ExternalParserWrapper
import eu.nomad_lab.JsonUtils
import scala.collection.mutable.StringBuilder
Daria M. Tomecka's avatar
Daria M. Tomecka committed
32

Daria M. Tomecka's avatar
Daria M. Tomecka committed
33
34
object PrototypesNormalizer extends ExternalNormalizerGenerator(
  name = "PrototypesNormalizer",
Daria M. Tomecka's avatar
Daria M. Tomecka committed
35
  info = jn.JObject(
Daria M. Tomecka's avatar
Daria M. Tomecka committed
36
    ("name" -> jn.JString("PrototypesNormalizer")) ::
Daria M. Tomecka's avatar
Daria M. Tomecka committed
37
      ("parserId" -> jn.JString("PrototypesNormalizer" + lab.PrototypesVersionInfo.version)) ::
Daria M. Tomecka's avatar
Daria M. Tomecka committed
38
39
40
41
      ("versionInfo" -> jn.JObject(
        ("nomadCoreVersion" -> jn.JObject(lab.NomadCoreVersionInfo.toMap.map {
          case (k, v) => k -> jn.JString(v.toString)
        }(breakOut): List[(String, jn.JString)])) ::
Daria M. Tomecka's avatar
Daria M. Tomecka committed
42
          (lab.PrototypesVersionInfo.toMap.map {
Daria M. Tomecka's avatar
Daria M. Tomecka committed
43
44
45
46
47
            case (key, value) =>
              (key -> jn.JString(value.toString))
          }(breakOut): List[(String, jn.JString)])
      )) :: Nil
  ),
48
  context = "calculation_context",
Daria M. Tomecka's avatar
Daria M. Tomecka committed
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  filter = query.CompiledQuery(query.QueryExpression("section_system"), meta.KnownMetaInfoEnvs.publicMeta),
  cmd = Seq(DefaultPythonInterpreter.pythonExe(), "${envDir}/normalizers/prototypes/normalizer/normalizer-prototypes/classify4me_prototypes.py",
    "${contextUri}", "${archivePath}"),
  resList = Seq(
    "normalizer-prototypes/setup_paths.py",
    "normalizer-prototypes/classify4me_prototypes.py",
    "nomad_meta_info/public.nomadmetainfo.json",
    "nomad_meta_info/common.nomadmetainfo.json",
    "nomad_meta_info/meta_types.nomadmetainfo.json",
    "nomad_meta_info/stats.nomadmetainfo.json"
  ) ++ DefaultPythonInterpreter.commonFiles(),
  dirMap = Map(
    "normalizer-prototypes" -> "normalizers/prototypes/normalizer/normalizer-prototypes",
    "nomad_meta_info" -> "nomad-meta-info/meta_info/nomad_meta_info",
    "python" -> "python-common/common/python/nomadcore"
  ) ++ DefaultPythonInterpreter.commonDirMapping(),
  metaInfoEnv = lab.meta.KnownMetaInfoEnvs.all
) {
Daria M. Tomecka's avatar
Daria M. Tomecka committed
67
  val trace: Boolean = false
Daria M. Tomecka's avatar
Daria M. Tomecka committed
68
69

  override def stdInHandler(context: ResolvedRef)(wrapper: ExternalParserWrapper)(pIn: java.io.OutputStream): Unit = {
Daria M. Tomecka's avatar
Daria M. Tomecka committed
70
71
72
    val out: java.io.Writer = new java.io.BufferedWriter(new java.io.OutputStreamWriter(pIn));
    val stringBuilder = if (trace)
      new StringBuilder
Daria M. Tomecka's avatar
Daria M. Tomecka committed
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
    else
      null
    def writeOut(s: String): Unit = {
      out.write(s)
      if (trace) stringBuilder ++= s
    }
    def flush(): Unit = {
      out.flush()
      if (trace) {
        logger.info(stringBuilder.result())
        stringBuilder.clear()
      }
    }
    writeOut("[")
    var isFirst = true
    try {
      context match {
        case Calculation(archiveSet, c) =>
Daria M. Tomecka's avatar
Daria M. Tomecka committed
91
92
93
          val sysTable = c.sectionTable(Seq("section_run", "section_system"))

          def outputSysSection(sysSection: SectionH5): Unit = {
Daria M. Tomecka's avatar
Daria M. Tomecka committed
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
            if (!isFirst)
              writeOut(",")
            else
              isFirst = false
            //writeOut(s"""{
            //              |  "context": ${JsonUtils.escapeString(m.toRef.toUriStr(archiveSet.objectKind))},
            //              |  "section_system": """.stripMargin)
            val visitor = new EmitJsonVisitor(
              writeOut = writeOut
            )
            val scanner = new H5EagerScanner
            scanner.scanResolvedRef(Section(archiveSet, sysSection), visitor)
            //writeOut("}")
            flush()
          }

Daria M. Tomecka's avatar
Daria M. Tomecka committed
110
111
          val nSys = sysTable.lengthL
          if (nSys > 0)
112
113
            outputSysSection(sysTable(0))
          if (nSys > 1)
Daria M. Tomecka's avatar
Daria M. Tomecka committed
114
            outputSysSection(sysTable(nSys - 1))
Daria M. Tomecka's avatar
Daria M. Tomecka committed
115
116
117
118
119
120
121
122
123
124
125
126
127

          writeOut("]")
          flush()
        case r =>
          throw new Exception(s"FhiAimsBasisNormalizer expected a calculation as context, but got $r")
      }
    } finally {
      out.close()
      pIn.close()
      wrapper.sendStatus = ExternalParserWrapper.SendStatus.Finished
    }
  }
}