diff --git a/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/usagestats/SparkAtomicActionUsageJob.java b/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/usagestats/SparkAtomicActionUsageJob.java index 5f099b8f2..9b444c6fa 100644 --- a/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/usagestats/SparkAtomicActionUsageJob.java +++ b/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/usagestats/SparkAtomicActionUsageJob.java @@ -14,7 +14,6 @@ import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.SequenceFileOutputFormat; import org.apache.spark.SparkConf; import org.apache.spark.api.java.function.MapFunction; -import org.apache.spark.api.java.function.MapGroupsFunction; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Encoders; import org.apache.spark.sql.SaveMode; @@ -28,9 +27,7 @@ import eu.dnetlib.dhp.application.ArgumentApplicationParser; import eu.dnetlib.dhp.common.HdfsSupport; import eu.dnetlib.dhp.schema.action.AtomicAction; import eu.dnetlib.dhp.schema.common.ModelConstants; -import eu.dnetlib.dhp.schema.oaf.DataInfo; -import eu.dnetlib.dhp.schema.oaf.Measure; -import eu.dnetlib.dhp.schema.oaf.Result; +import eu.dnetlib.dhp.schema.oaf.*; import eu.dnetlib.dhp.schema.oaf.utils.OafMapperUtils; import scala.Tuple2; @@ -76,16 +73,22 @@ public class SparkAtomicActionUsageJob implements Serializable { isSparkSessionManaged, spark -> { removeOutputDir(spark, outputPath); - prepareResults(dbname, spark, workingPath); + prepareData(dbname, spark, workingPath + "/usageDb", "usage_stats", "result_id"); + prepareData(dbname, spark, workingPath + "/projectDb", "project_stats", "id"); + prepareData(dbname, spark, workingPath + "/datasourceDb", "datasource_stats", "repositor_id"); writeActionSet(spark, workingPath, outputPath); }); } - public static void prepareResults(String db, SparkSession spark, String workingPath) { + private static void prepareData(String dbname, SparkSession spark, String workingPath, String tableName, + String attribute_name) { spark .sql( - "Select result_id, downloads, views " + - "from " + db + ".usage_stats") + String + .format( + "select %s as id, sum(downloads) as downloads, sum(views) as views " + + "from %s.%s group by %s", + attribute_name, dbname, tableName, attribute_name)) .as(Encoders.bean(UsageStatsModel.class)) .write() .mode(SaveMode.Overwrite) @@ -94,23 +97,17 @@ public class SparkAtomicActionUsageJob implements Serializable { } public static void writeActionSet(SparkSession spark, String inputPath, String outputPath) { - readPath(spark, inputPath, UsageStatsModel.class) - .groupByKey((MapFunction) us -> us.getResult_id(), Encoders.STRING()) - .mapGroups((MapGroupsFunction) (k, it) -> { - UsageStatsModel first = it.next(); - it.forEachRemaining(us -> { - first.setDownloads(first.getDownloads() + us.getDownloads()); - first.setViews(first.getViews() + us.getViews()); - }); - - Result res = new Result(); - res.setId("50|" + k); - - res.setMeasures(getMeasure(first.getDownloads(), first.getViews())); - return res; - }, Encoders.bean(Result.class)) + getFinalIndicatorsResult(spark, inputPath + "/usageDb") .toJavaRDD() .map(p -> new AtomicAction(p.getClass(), p)) + .union( + getFinalIndicatorsProject(spark, inputPath + "/projectDb") + .toJavaRDD() + .map(p -> new AtomicAction(p.getClass(), p))) + .union( + getFinalIndicatorsDatasource(spark, inputPath + "/datasourceDb") + .toJavaRDD() + .map(p -> new AtomicAction(p.getClass(), p))) .mapToPair( aa -> new Tuple2<>(new Text(aa.getClazz().getCanonicalName()), new Text(OBJECT_MAPPER.writeValueAsString(aa)))) @@ -118,6 +115,39 @@ public class SparkAtomicActionUsageJob implements Serializable { } + private static Dataset getFinalIndicatorsResult(SparkSession spark, String inputPath) { + + return readPath(spark, inputPath, UsageStatsModel.class) + .map((MapFunction) usm -> { + Result r = new Result(); + r.setId("50|" + usm.getId()); + r.setMeasures(getMeasure(usm.getDownloads(), usm.getViews())); + return r; + }, Encoders.bean(Result.class)); + } + + private static Dataset getFinalIndicatorsProject(SparkSession spark, String inputPath) { + + return readPath(spark, inputPath, UsageStatsModel.class) + .map((MapFunction) usm -> { + Project p = new Project(); + p.setId("40|" + usm.getId()); + p.setMeasures(getMeasure(usm.getDownloads(), usm.getViews())); + return p; + }, Encoders.bean(Project.class)); + } + + private static Dataset getFinalIndicatorsDatasource(SparkSession spark, String inputPath) { + + return readPath(spark, inputPath, UsageStatsModel.class) + .map((MapFunction) usm -> { + Datasource d = new Datasource(); + d.setId("10|" + usm.getId()); + d.setMeasures(getMeasure(usm.getDownloads(), usm.getViews())); + return d; + }, Encoders.bean(Datasource.class)); + } + private static List getMeasure(Long downloads, Long views) { DataInfo dataInfo = OafMapperUtils .dataInfo( diff --git a/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/usagestats/UsageStatsModel.java b/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/usagestats/UsageStatsModel.java index df8a77eb6..07f69b0bb 100644 --- a/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/usagestats/UsageStatsModel.java +++ b/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/usagestats/UsageStatsModel.java @@ -4,16 +4,16 @@ package eu.dnetlib.dhp.actionmanager.usagestats; import java.io.Serializable; public class UsageStatsModel implements Serializable { - private String result_id; + private String id; private Long downloads; private Long views; - public String getResult_id() { - return result_id; + public String getId() { + return id; } - public void setResult_id(String result_id) { - this.result_id = result_id; + public void setId(String id) { + this.id = id; } public Long getDownloads() { diff --git a/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/actionmanager/usagestats/oozie_app/workflow.xml b/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/actionmanager/usagestats/oozie_app/workflow.xml index d94cf7d53..de188718a 100644 --- a/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/actionmanager/usagestats/oozie_app/workflow.xml +++ b/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/actionmanager/usagestats/oozie_app/workflow.xml @@ -89,7 +89,7 @@ --hive_metastore_uris${hiveMetastoreUris} --outputPath${outputPath} --usagestatsdb${usagestatsdb} - --workingPath${workingDir}/usageDb + --workingPath${workingDir} diff --git a/dhp-workflows/dhp-aggregation/src/test/java/eu/dnetlib/dhp/actionmanager/usagestats/SparkAtomicActionCountJobTest.java b/dhp-workflows/dhp-aggregation/src/test/java/eu/dnetlib/dhp/actionmanager/usagestats/SparkAtomicActionCountJobTest.java index 8aa718bae..5982c8820 100644 --- a/dhp-workflows/dhp-aggregation/src/test/java/eu/dnetlib/dhp/actionmanager/usagestats/SparkAtomicActionCountJobTest.java +++ b/dhp-workflows/dhp-aggregation/src/test/java/eu/dnetlib/dhp/actionmanager/usagestats/SparkAtomicActionCountJobTest.java @@ -24,6 +24,7 @@ import org.slf4j.LoggerFactory; import com.fasterxml.jackson.databind.ObjectMapper; import eu.dnetlib.dhp.schema.action.AtomicAction; +import eu.dnetlib.dhp.schema.oaf.OafEntity; import eu.dnetlib.dhp.schema.oaf.Result; public class SparkAtomicActionCountJobTest { @@ -68,24 +69,26 @@ public class SparkAtomicActionCountJobTest { @Test void testMatch() { String usageScoresPath = getClass() - .getResource("/eu/dnetlib/dhp/actionmanager/usagestats/usagestatsdb") + .getResource("/eu/dnetlib/dhp/actionmanager/usagestats") .getPath(); SparkAtomicActionUsageJob.writeActionSet(spark, usageScoresPath, workingDir.toString() + "/actionSet"); final JavaSparkContext sc = new JavaSparkContext(spark.sparkContext()); - JavaRDD tmp = sc + JavaRDD tmp = sc .sequenceFile(workingDir.toString() + "/actionSet", Text.class, Text.class) - .map(usm -> OBJECT_MAPPER.readValue(usm._2.getBytes(), AtomicAction.class)) - .map(aa -> (Result) aa.getPayload()); + .map(usm -> OBJECT_MAPPER.readValue(usm._2.getBytes(), AtomicAction.class)); + // .map(aa -> (Result) aa.getPayload()); - Assertions.assertEquals(9, tmp.count()); + Assertions.assertEquals(9, tmp.filter(aa -> ((OafEntity) aa.getPayload()).getId().startsWith("50|")).count()); + Assertions.assertEquals(9, tmp.filter(aa -> ((OafEntity) aa.getPayload()).getId().startsWith("10|")).count()); + Assertions.assertEquals(9, tmp.filter(aa -> ((OafEntity) aa.getPayload()).getId().startsWith("40|")).count()); - tmp.foreach(r -> Assertions.assertEquals(2, r.getMeasures().size())); + tmp.foreach(r -> Assertions.assertEquals(2, ((OafEntity) r.getPayload()).getMeasures().size())); tmp .foreach( - r -> r + r -> ((OafEntity) r.getPayload()) .getMeasures() .stream() .forEach( @@ -95,14 +98,14 @@ public class SparkAtomicActionCountJobTest { .forEach(u -> Assertions.assertFalse(u.getDataInfo().getDeletedbyinference())))); tmp .foreach( - r -> r + r -> ((OafEntity) r.getPayload()) .getMeasures() .stream() .forEach( m -> m.getUnit().stream().forEach(u -> Assertions.assertTrue(u.getDataInfo().getInferred())))); tmp .foreach( - r -> r + r -> ((OafEntity) r.getPayload()) .getMeasures() .stream() .forEach( @@ -113,7 +116,7 @@ public class SparkAtomicActionCountJobTest { tmp .foreach( - r -> r + r -> ((OafEntity) r.getPayload()) .getMeasures() .stream() .forEach( @@ -127,7 +130,7 @@ public class SparkAtomicActionCountJobTest { u.getDataInfo().getProvenanceaction().getClassid())))); tmp .foreach( - r -> r + r -> ((OafEntity) r.getPayload()) .getMeasures() .stream() .forEach( @@ -142,7 +145,7 @@ public class SparkAtomicActionCountJobTest { tmp .foreach( - r -> r + r -> ((OafEntity) r.getPayload()) .getMeasures() .stream() .forEach( @@ -157,12 +160,19 @@ public class SparkAtomicActionCountJobTest { Assertions .assertEquals( - 1, tmp.filter(r -> r.getId().equals("50|dedup_wf_001::53575dc69e9ace947e02d47ecd54a7a6")).count()); + 1, + tmp + .filter( + r -> ((OafEntity) r.getPayload()) + .getId() + .equals("50|dedup_wf_001::53575dc69e9ace947e02d47ecd54a7a6")) + .count()); Assertions .assertEquals( "0", tmp + .map(r -> ((OafEntity) r.getPayload())) .filter(r -> r.getId().equals("50|dedup_wf_001::53575dc69e9ace947e02d47ecd54a7a6")) .collect() .get(0) @@ -178,6 +188,7 @@ public class SparkAtomicActionCountJobTest { .assertEquals( "5", tmp + .map(r -> ((OafEntity) r.getPayload())) .filter(r -> r.getId().equals("50|dedup_wf_001::53575dc69e9ace947e02d47ecd54a7a6")) .collect() .get(0) @@ -194,6 +205,7 @@ public class SparkAtomicActionCountJobTest { .assertEquals( "0", tmp + .map(r -> ((OafEntity) r.getPayload())) .filter(r -> r.getId().equals("50|doi_________::17eda2ff77407538fbe5d3d719b9d1c0")) .collect() .get(0) @@ -209,6 +221,7 @@ public class SparkAtomicActionCountJobTest { .assertEquals( "1", tmp + .map(r -> ((OafEntity) r.getPayload())) .filter(r -> r.getId().equals("50|doi_________::17eda2ff77407538fbe5d3d719b9d1c0")) .collect() .get(0) @@ -225,6 +238,7 @@ public class SparkAtomicActionCountJobTest { .assertEquals( "2", tmp + .map(r -> ((OafEntity) r.getPayload())) .filter(r -> r.getId().equals("50|doi_________::3085e4c6e051378ca6157fe7f0430c1f")) .collect() .get(0) @@ -240,6 +254,7 @@ public class SparkAtomicActionCountJobTest { .assertEquals( "6", tmp + .map(r -> ((OafEntity) r.getPayload())) .filter(r -> r.getId().equals("50|doi_________::3085e4c6e051378ca6157fe7f0430c1f")) .collect() .get(0) @@ -251,6 +266,204 @@ public class SparkAtomicActionCountJobTest { .getUnit() .get(0) .getValue()); + + Assertions + .assertEquals( + "0", + tmp + .map(r -> ((OafEntity) r.getPayload())) + .filter(r -> r.getId().equals("40|f1__________::53575dc69e9ace947e02d47ecd54a7a6")) + .collect() + .get(0) + .getMeasures() + .stream() + .filter(m -> m.getId().equals("downloads")) + .collect(Collectors.toList()) + .get(0) + .getUnit() + .get(0) + .getValue()); + Assertions + .assertEquals( + "5", + tmp + .map(r -> ((OafEntity) r.getPayload())) + .filter(r -> r.getId().equals("40|f1__________::53575dc69e9ace947e02d47ecd54a7a6")) + .collect() + .get(0) + .getMeasures() + .stream() + .filter(m -> m.getId().equals("views")) + .collect(Collectors.toList()) + .get(0) + .getUnit() + .get(0) + .getValue()); + + Assertions + .assertEquals( + "0", + tmp + .map(r -> ((OafEntity) r.getPayload())) + .filter(r -> r.getId().equals("40|f11_________::17eda2ff77407538fbe5d3d719b9d1c0")) + .collect() + .get(0) + .getMeasures() + .stream() + .filter(m -> m.getId().equals("downloads")) + .collect(Collectors.toList()) + .get(0) + .getUnit() + .get(0) + .getValue()); + Assertions + .assertEquals( + "1", + tmp + .map(r -> ((OafEntity) r.getPayload())) + .filter(r -> r.getId().equals("40|f11_________::17eda2ff77407538fbe5d3d719b9d1c0")) + .collect() + .get(0) + .getMeasures() + .stream() + .filter(m -> m.getId().equals("views")) + .collect(Collectors.toList()) + .get(0) + .getUnit() + .get(0) + .getValue()); + + Assertions + .assertEquals( + "2", + tmp + .map(r -> ((OafEntity) r.getPayload())) + .filter(r -> r.getId().equals("40|f12_________::3085e4c6e051378ca6157fe7f0430c1f")) + .collect() + .get(0) + .getMeasures() + .stream() + .filter(m -> m.getId().equals("downloads")) + .collect(Collectors.toList()) + .get(0) + .getUnit() + .get(0) + .getValue()); + Assertions + .assertEquals( + "6", + tmp + .map(r -> ((OafEntity) r.getPayload())) + .filter(r -> r.getId().equals("40|f12_________::3085e4c6e051378ca6157fe7f0430c1f")) + .collect() + .get(0) + .getMeasures() + .stream() + .filter(m -> m.getId().equals("views")) + .collect(Collectors.toList()) + .get(0) + .getUnit() + .get(0) + .getValue()); + + Assertions + .assertEquals( + "0", + tmp + .map(r -> ((OafEntity) r.getPayload())) + .filter(r -> r.getId().equals("10|d1__________::53575dc69e9ace947e02d47ecd54a7a6")) + .collect() + .get(0) + .getMeasures() + .stream() + .filter(m -> m.getId().equals("downloads")) + .collect(Collectors.toList()) + .get(0) + .getUnit() + .get(0) + .getValue()); + Assertions + .assertEquals( + "5", + tmp + .map(r -> ((OafEntity) r.getPayload())) + .filter(r -> r.getId().equals("10|d1__________::53575dc69e9ace947e02d47ecd54a7a6")) + .collect() + .get(0) + .getMeasures() + .stream() + .filter(m -> m.getId().equals("views")) + .collect(Collectors.toList()) + .get(0) + .getUnit() + .get(0) + .getValue()); + + Assertions + .assertEquals( + "0", + tmp + .map(r -> ((OafEntity) r.getPayload())) + .filter(r -> r.getId().equals("10|d11_________::17eda2ff77407538fbe5d3d719b9d1c0")) + .collect() + .get(0) + .getMeasures() + .stream() + .filter(m -> m.getId().equals("downloads")) + .collect(Collectors.toList()) + .get(0) + .getUnit() + .get(0) + .getValue()); + Assertions + .assertEquals( + "1", + tmp + .map(r -> ((OafEntity) r.getPayload())) + .filter(r -> r.getId().equals("10|d11_________::17eda2ff77407538fbe5d3d719b9d1c0")) + .collect() + .get(0) + .getMeasures() + .stream() + .filter(m -> m.getId().equals("views")) + .collect(Collectors.toList()) + .get(0) + .getUnit() + .get(0) + .getValue()); + + Assertions + .assertEquals( + "2", + tmp + .map(r -> ((OafEntity) r.getPayload())) + .filter(r -> r.getId().equals("10|d12_________::3085e4c6e051378ca6157fe7f0430c1f")) + .collect() + .get(0) + .getMeasures() + .stream() + .filter(m -> m.getId().equals("downloads")) + .collect(Collectors.toList()) + .get(0) + .getUnit() + .get(0) + .getValue()); + Assertions + .assertEquals( + "6", + tmp + .map(r -> ((OafEntity) r.getPayload())) + .filter(r -> r.getId().equals("10|d12_________::3085e4c6e051378ca6157fe7f0430c1f")) + .collect() + .get(0) + .getMeasures() + .stream() + .filter(m -> m.getId().equals("views")) + .collect(Collectors.toList()) + .get(0) + .getUnit() + .get(0) + .getValue()); } } diff --git a/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/datasourceDb b/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/datasourceDb new file mode 100644 index 000000000..efbb4cfbd --- /dev/null +++ b/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/datasourceDb @@ -0,0 +1,9 @@ +{"id":"d1__________::53575dc69e9ace947e02d47ecd54a7a6","downloads":0,"views":5} +{"id":"d11_________::17eda2ff77407538fbe5d3d719b9d1c0","downloads":0,"views":1} +{"id":"d11_________::1d4dc08605fd0a2be1105d30c63bfea1","downloads":1,"views":3} +{"id":"d11_________::2e3527822854ca9816f6dfea5bff61a8","downloads":1,"views":1} +{"id":"d12_________::3085e4c6e051378ca6157fe7f0430c1f","downloads":2,"views":6} +{"id":"d12_________::33f710e6dd30cc5e67e35b371ddc33cf","downloads":0,"views":1} +{"id":"d12_________::39738ebf10654732dd3a7af9f24655f8","downloads":1,"views":3} +{"id":"d13_________::3c3b65f07c1a06c7894397eda1d11bbf","downloads":1,"views":10} +{"id":"d13_________::4938a71a884dd481d329657aa543b850","downloads":0,"views":3} \ No newline at end of file diff --git a/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/datasourceDb_old b/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/datasourceDb_old new file mode 100644 index 000000000..7337ba3e2 --- /dev/null +++ b/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/datasourceDb_old @@ -0,0 +1,12 @@ +{"id":"d1__________::53575dc69e9ace947e02d47ecd54a7a6","downloads":0,"views":4} +{"id":"d1__________::53575dc69e9ace947e02d47ecd54a7a6","downloads":0,"views":1} +{"id":"d11_________::17eda2ff77407538fbe5d3d719b9d1c0","downloads":0,"views":1} +{"id":"d11_________::1d4dc08605fd0a2be1105d30c63bfea1","downloads":1,"views":3} +{"id":"d11_________::2e3527822854ca9816f6dfea5bff61a8","downloads":1,"views":1} +{"id":"d12_________::3085e4c6e051378ca6157fe7f0430c1f","downloads":2,"views":3} +{"id":"d12_________::3085e4c6e051378ca6157fe7f0430c1f","downloads":0,"views":3} +{"id":"d12_________::33f710e6dd30cc5e67e35b371ddc33cf","downloads":0,"views":1} +{"id":"d12_________::39738ebf10654732dd3a7af9f24655f8","downloads":1,"views":3} +{"id":"d13_________::3c3b65f07c1a06c7894397eda1d11bbf","downloads":1,"views":8} +{"id":"d13_________::3c3b65f07c1a06c7894397eda1d11bbf","downloads":0,"views":2} +{"id":"d13_________::4938a71a884dd481d329657aa543b850","downloads":0,"views":3} \ No newline at end of file diff --git a/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/projectDb b/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/projectDb new file mode 100644 index 000000000..0b8cd1d70 --- /dev/null +++ b/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/projectDb @@ -0,0 +1,9 @@ +{"id":"f1__________::53575dc69e9ace947e02d47ecd54a7a6","downloads":0,"views":5} +{"id":"f11_________::17eda2ff77407538fbe5d3d719b9d1c0","downloads":0,"views":1} +{"id":"f11_________::1d4dc08605fd0a2be1105d30c63bfea1","downloads":1,"views":3} +{"id":"f11_________::2e3527822854ca9816f6dfea5bff61a8","downloads":1,"views":1} +{"id":"f12_________::3085e4c6e051378ca6157fe7f0430c1f","downloads":2,"views":6} +{"id":"f12_________::33f710e6dd30cc5e67e35b371ddc33cf","downloads":0,"views":1} +{"id":"f12_________::39738ebf10654732dd3a7af9f24655f8","downloads":1,"views":3} +{"id":"f13_________::3c3b65f07c1a06c7894397eda1d11bbf","downloads":1,"views":10} +{"id":"f13_________::4938a71a884dd481d329657aa543b850","downloads":0,"views":3} \ No newline at end of file diff --git a/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/projectDb_old b/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/projectDb_old new file mode 100644 index 000000000..0ecab2a82 --- /dev/null +++ b/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/projectDb_old @@ -0,0 +1,12 @@ +{"id":"f1__________::53575dc69e9ace947e02d47ecd54a7a6","downloads":0,"views":4} +{"id":"f1__________::53575dc69e9ace947e02d47ecd54a7a6","downloads":0,"views":1} +{"id":"f11_________::17eda2ff77407538fbe5d3d719b9d1c0","downloads":0,"views":1} +{"id":"f11_________::1d4dc08605fd0a2be1105d30c63bfea1","downloads":1,"views":3} +{"id":"f11_________::2e3527822854ca9816f6dfea5bff61a8","downloads":1,"views":1} +{"id":"f12_________::3085e4c6e051378ca6157fe7f0430c1f","downloads":2,"views":3} +{"id":"f12_________::3085e4c6e051378ca6157fe7f0430c1f","downloads":0,"views":3} +{"id":"f12_________::33f710e6dd30cc5e67e35b371ddc33cf","downloads":0,"views":1} +{"id":"f12_________::39738ebf10654732dd3a7af9f24655f8","downloads":1,"views":3} +{"id":"f13_________::3c3b65f07c1a06c7894397eda1d11bbf","downloads":1,"views":8} +{"id":"f13_________::3c3b65f07c1a06c7894397eda1d11bbf","downloads":0,"views":2} +{"id":"f13_________::4938a71a884dd481d329657aa543b850","downloads":0,"views":3} \ No newline at end of file diff --git a/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/usageDb b/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/usageDb new file mode 100644 index 000000000..495ae0fc5 --- /dev/null +++ b/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/usageDb @@ -0,0 +1,9 @@ +{"id":"dedup_wf_001::53575dc69e9ace947e02d47ecd54a7a6","downloads":0,"views":5} +{"id":"doi_________::17eda2ff77407538fbe5d3d719b9d1c0","downloads":0,"views":1} +{"id":"doi_________::1d4dc08605fd0a2be1105d30c63bfea1","downloads":1,"views":3} +{"id":"doi_________::2e3527822854ca9816f6dfea5bff61a8","downloads":1,"views":1} +{"id":"doi_________::3085e4c6e051378ca6157fe7f0430c1f","downloads":2,"views":6} +{"id":"doi_________::33f710e6dd30cc5e67e35b371ddc33cf","downloads":0,"views":1} +{"id":"doi_________::39738ebf10654732dd3a7af9f24655f8","downloads":1,"views":3} +{"id":"doi_________::3c3b65f07c1a06c7894397eda1d11bbf","downloads":1,"views":10} +{"id":"doi_________::4938a71a884dd481d329657aa543b850","downloads":0,"views":3} \ No newline at end of file diff --git a/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/usageDb_old b/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/usageDb_old new file mode 100644 index 000000000..eb3290eda --- /dev/null +++ b/dhp-workflows/dhp-aggregation/src/test/resources/eu/dnetlib/dhp/actionmanager/usagestats/usageDb_old @@ -0,0 +1,12 @@ +{"id":"dedup_wf_001::53575dc69e9ace947e02d47ecd54a7a6","downloads":0,"views":4} +{"id":"dedup_wf_001::53575dc69e9ace947e02d47ecd54a7a6","downloads":0,"views":1} +{"id":"doi_________::17eda2ff77407538fbe5d3d719b9d1c0","downloads":0,"views":1} +{"id":"doi_________::1d4dc08605fd0a2be1105d30c63bfea1","downloads":1,"views":3} +{"id":"doi_________::2e3527822854ca9816f6dfea5bff61a8","downloads":1,"views":1} +{"id":"doi_________::3085e4c6e051378ca6157fe7f0430c1f","downloads":2,"views":3} +{"id":"doi_________::3085e4c6e051378ca6157fe7f0430c1f","downloads":0,"views":3} +{"id":"doi_________::33f710e6dd30cc5e67e35b371ddc33cf","downloads":0,"views":1} +{"id":"doi_________::39738ebf10654732dd3a7af9f24655f8","downloads":1,"views":3} +{"id":"doi_________::3c3b65f07c1a06c7894397eda1d11bbf","downloads":1,"views":8} +{"id":"doi_________::3c3b65f07c1a06c7894397eda1d11bbf","downloads":0,"views":2} +{"id":"doi_________::4938a71a884dd481d329657aa543b850","downloads":0,"views":3} \ No newline at end of file diff --git a/dhp-workflows/dhp-graph-mapper/src/test/java/eu/dnetlib/dhp/oa/graph/raw/MappersTest.java b/dhp-workflows/dhp-graph-mapper/src/test/java/eu/dnetlib/dhp/oa/graph/raw/MappersTest.java index 4c488a894..bfd6d461d 100644 --- a/dhp-workflows/dhp-graph-mapper/src/test/java/eu/dnetlib/dhp/oa/graph/raw/MappersTest.java +++ b/dhp-workflows/dhp-graph-mapper/src/test/java/eu/dnetlib/dhp/oa/graph/raw/MappersTest.java @@ -1007,6 +1007,23 @@ class MappersTest { }); } + @Test + void testD4Science() throws IOException { + final String xml = IOUtils + .toString(Objects.requireNonNull(getClass().getResourceAsStream("d4science.xml"))); + final List actual = new OdfToOafMapper(vocs, false, true).processMdRecord(xml); + assertNotNull(actual); + assertFalse(actual.isEmpty()); + System.out.println("***************"); + System.out.println(new ObjectMapper().writeValueAsString(actual)); + System.out.println("***************"); + final Dataset d = (Dataset) actual.get(0); + assertValidId(d.getId()); + assertTrue(StringUtils.isNotBlank(d.getTitle().get(0).getValue())); + + } + + private void assertValidId(final String id) { // System.out.println(id); diff --git a/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/d4science.xml b/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/d4science.xml new file mode 100644 index 000000000..d202016fa --- /dev/null +++ b/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/d4science.xml @@ -0,0 +1,70 @@ + + + + alessia_____::028879484548f4e1c630e1c503e35231 + 4fed018e-c2ff-4afa-b7b5-1ca1beebf850 + 2023-03-17T13:30:02.026+01:00 + alessia_____ + 2023-05-19T14:07:51.701+02:00 + + + + http://data.d4science.org/ctlg/ResourceCatalogue/city-to-city_migration + + + + Pappalardo, Luca + + 0000-0002-1547-6007 + + + + City-to-city migration + + SoBigData++ + + + 2018-02-15 10:05 + + Dataset + + Census data recording the migration of people between metropolitan areas in + the US + + + Human Mobility data + + + + OPEN + 0021 + 2018-02-15 10:05 + + + AFL-3.0 + corda__h2020::871042 + + + + + https%3A%2F%2Fapi.d4science.org%2Fcatalogue%2Fitems + + + + + + + false + false + 0.9 + + + + + \ No newline at end of file diff --git a/dhp-workflows/dhp-graph-provision/src/test/java/eu/dnetlib/dhp/oa/provision/IndexRecordTransformerTest.java b/dhp-workflows/dhp-graph-provision/src/test/java/eu/dnetlib/dhp/oa/provision/IndexRecordTransformerTest.java index e0fbb2a2f..74f203cbf 100644 --- a/dhp-workflows/dhp-graph-provision/src/test/java/eu/dnetlib/dhp/oa/provision/IndexRecordTransformerTest.java +++ b/dhp-workflows/dhp-graph-provision/src/test/java/eu/dnetlib/dhp/oa/provision/IndexRecordTransformerTest.java @@ -128,6 +128,23 @@ public class IndexRecordTransformerTest { testRecordTransformation(record); } + @Test + public void testForEdithDemo() throws IOException, TransformerException { + final String record = IOUtils.toString(getClass().getResourceAsStream("edith-demo/10.1098-rsta.2020.0257.xml")); + testRecordTransformation(record); + } + + @Test + public void testForEdithDemoCovid() throws IOException, TransformerException { + final String record = IOUtils.toString(getClass().getResourceAsStream("edith-demo/10.3390-pr9111967-covid.xml")); + testRecordTransformation(record); + } + @Test + public void testForEdithDemoEthics() throws IOException, TransformerException { + final String record = IOUtils.toString(getClass().getResourceAsStream("edith-demo/10.2196-33081-ethics.xml")); + testRecordTransformation(record); + } + @Test void testDoiUrlNormalization() throws MalformedURLException { diff --git a/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/edith-demo/10.1098-rsta.2020.0257.xml b/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/edith-demo/10.1098-rsta.2020.0257.xml new file mode 100644 index 000000000..648a59a7c --- /dev/null +++ b/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/edith-demo/10.1098-rsta.2020.0257.xml @@ -0,0 +1,586 @@ + + +
+ doi_dedup___::e225555a08a082ad8f53f179bc59c5d0 + 2023-01-27T05:32:10Z +
+ + + + + + + + + + + + 10.1098/rsta.2020.0257 + 50|doiboost____::e225555a08a082ad8f53f179bc59c5d0 + 3211056089 + 50|od______1064::83eb0f76b60445d72bb7428a1b68ef1a + oai:ora.ox.ac.uk:uuid:9fc4563a-07e1-41d1-8b99-31ce2f8ac027 + 50|od_______267::6d978e42c57dfc79d61a84ab5be28cb8 + oai:pubmedcentral.nih.gov:8543046 + od_______267::6d978e42c57dfc79d61a84ab5be28cb8 + 34689630 + PMC8543046 + 10.1098/rsta.2020.0257 + + PMC8543046 + + 34689630 + + + + + + + + + A completely automated pipeline for 3D reconstruction of + human heart from 2D cine magnetic resonance slices. + + A completely automated pipeline for 3D reconstruction of + human heart from 2D cine magnetic resonance slices + + + Vicente Grau + Abhirup Banerjee + + Ernesto Zacur + Robin P. Choudhury + + Blanca Rodriguez + + Julia Camps + Yoram Rudy + Christopher M. Andrews + + + 2021-10-01 + Cardiac magnetic resonance (CMR) imaging is a valuable modality in the diagnosis and + characterization of cardiovascular diseases, since it can identify abnormalities in structure + and function of the myocardium non-invasively and without the need for ionizing radiation. + However, in clinical practice, it is commonly acquired as a collection of separated and + independent 2D image planes, which limits its accuracy in 3D analysis. This paper presents a + completely automated pipeline for generating patient-specific 3D biventricular heart models from + cine magnetic resonance (MR) slices. Our pipeline automatically selects the relevant cine MR + images, segments them using a deep learning-based method to extract the heart contours, and + aligns the contours in 3D space correcting possible misalignments due to breathing or subject + motion first using the intensity and contours information from the cine data and next with the + help of a statistical shape model. Finally, the sparse 3D representation of the contours is used + to generate a smooth 3D biventricular mesh. The computational pipeline is applied and evaluated + in a CMR dataset of 20 healthy subjects. Our results show an average reduction of misalignment + artefacts from 1.82 ± 1.60 mm to 0.72 ± 0.73 mm over 20 subjects, in terms of distance from the + final reconstructed mesh. The high-resolution 3D biventricular meshes obtained with our + computational pipeline are used for simulations of electrical activation patterns, showing + agreement with non-invasive electrocardiographic imaging. The automatic methodologies presented + here for patient-specific MR imaging-based 3D biventricular representations contribute to the + efficient realization of precision medicine, enabling the enhanced interpretability of clinical + data, the digital twin vision through patient-specific image-based modelling and simulation, and + augmented reality applications. + This article is part of the theme issue ‘Advanced computation in cardiovascular physiology: new + challenges and opportunities’. + + General Physics and Astronomy + + General Engineering + + General Mathematics + + Pipeline (computing) + + Cine mri + + Structure and function + + Cardiac magnetic resonance + + Magnetic resonance imaging + + medicine.diagnostic_test + + medicine + + Human heart + + Modality (human–computer interaction) + + 3D reconstruction + + Computer science + + Nuclear magnetic resonance + + 3. Good health + + 03 medical and health sciences + + 0302 clinical medicine + + 030218 Nuclear Medicine & + Medical Imaging + + 03021801 Radiology/Image + segmentation + + 03021801 Radiology/Image + segmentation - deep learning/datum + + 030204 Cardiovascular System + & Hematology + + 03020401 Aging-associated + diseases/Heart diseases + + 030217 Neurology & + Neurosurgery + + 03021701 Brain/Neural circuits + + + Articles + + Research Articles + + cardiac mesh reconstruction + + cine MRI + + misalignment correction + + electrophysiological + simulation + + ECGI + + Heart + + Humans + + Imaging, Three-Dimensional + + Magnetic Resonance Imaging + + Magnetic Resonance Imaging, Cine + + Magnetic Resonance Spectroscopy + + + 2021-10-25 + + 2021-10-25 + + 2021-12-13 + + 2021-01-01 + + 2023-01-05 + + 2021-05-28 + + 2023-01-05 + + The Royal Society + Crossref + + Philosophical transactions. Series A, Mathematical, physical, and engineering sciences + + + + Philosophical Transactions of the Royal + Society A: Mathematical, Physical and Engineering Sciences + + + + + + + + + true + false + 0.8 + dedup-result-decisiontree-v3 + + + + + openorgs____::6a7b1b4c40a067a1f209de6867fe094d + + + University of Oxford + University of Oxford + + + + doi_dedup___::015b27b0b7c55649236bf23a5c75f817 + + 10.6084/m9.figshare.15656924.v2 + + 2021-01-01 + Implementation Details of the Reconstruction + Pipeline and Electrophysiological Inference Results from A completely automated pipeline + for 3D reconstruction of human heart from 2D cine magnetic resonance slices + + The Royal Society + + 10.6084/m9.figshare.15656924 + + + + + corda__h2020::27f89b49dee12d828cc0f90f51727204 + + 823712 + + + ec__________::EC::H2020 + ec__________::EC::H2020::RIA + + CompBioMed2 + A Centre of Excellence in Computational Biomedicine + + + + doi_dedup___::be1ef3b30a8d7aa7e4dfe1570d5febf7 + + 2021-01-01 + 10.6084/m9.figshare.15656927 + + The Royal Society + 10.6084/m9.figshare.15656927.v1 + + + Montage Video of the Stepwise Performance of 3D + Reconstruction Pipeline on All 20 Patients from A completely automated pipeline for 3D + reconstruction of human heart from 2D cine magnetic resonance slices + + + + + doi_________::9f9f2328e11d379b14cb888209e33088 + + 2021-01-01 + 10.6084/m9.figshare.15656924.v1 + + Implementation Details of the Reconstruction + Pipeline and Electrophysiological Inference Results from A completely automated pipeline + for 3D reconstruction of human heart from 2D cine magnetic resonance slices + + The Royal Society + + + + + + 2021-10-01 + 34689630 + + + 34689630 + + The Royal Society + + PMC8543046 + + A completely automated + pipeline for 3D reconstruction of human heart from 2D cine magnetic resonance slices + + PMC8543046 + + + + 2023-01-05 + Royal Society + + A completely automated + pipeline for 3D reconstruction of human heart from 2D cine magnetic resonance slices + + + + 2021-10-25 + The Royal Society + + A completely + automated pipeline for 3D reconstruction of human heart from 2D cine magnetic resonance + slices. + + + + + 10.1098/rsta.2020.0257 + + + + + + + 2023-01-05 + + 34689630 + + + 10.1098/rsta.2020.0257 + + + http://creativecommons.org/licenses/by/4.0/ + + https://ora.ox.ac.uk/objects/uuid:9fc4563a-07e1-41d1-8b99-31ce2f8ac027 + + + + + + + + 10.1098/rsta.2020.0257 + + + + https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8543046 + + + + + + + 2021-10-25 + + 10.1098/rsta.2020.0257 + + + https://royalsociety.org/journals/ethics-policies/data-sharing-mining/ + + https://doi.org/10.1098/rsta.2020.0257 + + + + + + + 2021-10-25 + + 34689630 + + PMC8543046 + + + 10.1098/rsta.2020.0257 + + + + https://pubmed.ncbi.nlm.nih.gov/34689630 + + + + + + + 2021-10-01 + + 34689630 + + PMC8543046 + + + 10.1098/rsta.2020.0257 + + + + http://europepmc.org/articles/PMC8543046 + + + + + + +
+
\ No newline at end of file diff --git a/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/edith-demo/10.2196-33081-ethics.xml b/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/edith-demo/10.2196-33081-ethics.xml new file mode 100644 index 000000000..4c4443447 --- /dev/null +++ b/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/edith-demo/10.2196-33081-ethics.xml @@ -0,0 +1,238 @@ + + +
+ doi_dedup___::88a9861b26cdda1c3dd162d11f0bedbe + 2023-03-13T00:12:27+0000 + 2023-03-13T04:39:52.807Z +
+ + + + + + + + + + + + oai:pure.eur.nl:publications/70bf9bd0-5ea6-45fd-bb62-8d79b48cd69f + 50|narcis______::3df5b8b060b819af0d439dd6751c8a77 + 10.2196/33081 + 50|doiboost____::88a9861b26cdda1c3dd162d11f0bedbe + 3212148341 + od_______267::276eb3ebee07cf1f3e8bfc43926fd0c2 + 35099399 + PMC8844982 + oai:services.nod.dans.knaw.nl:Publications/eur:oai:pure.eur.nl:publications/70bf9bd0-5ea6-45fd-bb62-8d79b48cd69f + 50|dris___00893::107e97e645cbb06fb7b454ce2569d6c2 + 10.2196/33081 + 35099399 + PMC8844982 + + + + + + Mapping the Ethical Issues of Digital Twins for Personalised Healthcare Service (Preprint) + Preliminary Mapping Study + Ethical Issues of Digital Twins for Personalized Health Care Service: Preliminary Mapping Study + + Ki-hun Kim + Pei-hua Huang + Maartje Schermer + Public Health + + 2022-01-01 + Background: The concept of digital twins has great potential for transforming the existing health care system by making it more personalized. As a convergence of health care, artificial intelligence, and information and communication technologies, personalized health care services that are developed under the concept of digital twins raise a myriad of ethical issues. Although some of the ethical issues are known to researchers working on digital health and personalized medicine, currently, there is no comprehensive review that maps the major ethical risks of digital twins for personalized health care services. Objective This study aims to fill the research gap by identifying the major ethical risks of digital twins for personalized health care services. We first propose a working definition for digital twins for personalized health care services to facilitate future discussions on the ethical issues related to these emerging digital health services. We then develop a process-oriented ethical map to identify the major ethical risks in each of the different data processing phases. MethodsWe resorted to the literature on eHealth, personalized medicine, precision medicine, and information engineering to identify potential issues and developed a process-oriented ethical map to structure the inquiry in a more systematic way. The ethical map allows us to see how each of the major ethical concerns emerges during the process of transforming raw data into valuable information. Developers of a digital twin for personalized health care service may use this map to identify ethical risks during the development stage in a more systematic way and can proactively address them. ResultsThis paper provides a working definition of digital twins for personalized health care services by identifying 3 features that distinguish the new application from other eHealth services. On the basis of the working definition, this paper further layouts 10 major operational problems and the corresponding ethical risks. ConclusionsIt is challenging to address all the major ethical risks that a digital twin for a personalized health care service might encounter proactively without a conceptual map at hand. The process-oriented ethical map we propose here can assist the developers of digital twins for personalized health care services in analyzing ethical risks in a more systematic manner. + education + Health Informatics + Ethical issues + Healthcare service + Psychology + Internet privacy + business.industry + business + Preprint + Artificial Intelligence + Delivery of Health Care + Health Services + Humans + Precision Medicine + Telemedicine + 03 medical and health sciences + 0302 clinical medicine + + 030212 General & Internal Medicine + + 03021201 Health care/Health care quality - datum/health care + + 03021201 Health care/Health care quality - datum/electronic health + + 0301 basic medicine + + 030104 Developmental Biology + + 0303 health sciences + + 030304 Developmental Biology + + 030304 Developmental Biology - datum/datum management/ethical + + 06 humanities and the arts + 0603 philosophy, ethics and religion + + 060301 Applied Ethics + + 06030101 Bioethics/Coordinates on Wikidata - intelligence/artificial intelligence/ethical + + 06030101 Bioethics/Coordinates on Wikidata - datum/ethical + + + + 2021-11-17 + 2022-01-31 + 2022-01-01 + Crossref + + Journal of Medical Internet Research, 24(1):e33081. Journal of medical Internet Research + urn:issn:1439-4456 + VOLUME=24;ISSUE=1;ISSN=1439-4456;TITLE=Journal of Medical Internet Research + application/pdf + + + + + + true + false + 0.8 + dedup-result-decisiontree-v3 + + + + + + Ethical Issues of Digital Twins for Personalized Health Care Service: Preliminary Mapping Study + + 2022-01-01 + + + PMC8844982 + + 2021-08-23 + Ethical Issues of Digital Twins for Personalized Health Care Service: Preliminary Mapping Study. + 35099399 + + + Preliminary Mapping Study + 2022-01-01 + + + + 2022-01-31 + Mapping the Ethical Issues of Digital Twins for Personalised Healthcare Service (Preprint) + + + + + 10.2196/33081 + JMIR Publications Inc. + + + + + + 2021-08-23 + + 35099399 + PMC8844982 + 10.2196/33081 + + + https://pubmed.ncbi.nlm.nih.gov/35099399 + + + + + + + + 2022-01-01 + 2022-01-31 + + 10.2196/33081 + 10.2196/33081 + urn:nbn:nl:ui:15-70bf9bd0-5ea6-45fd-bb62-8d79b48cd69f + + + https://doi.org/10.2196/33081 + + + + + + + 2022-01-01 + + 10.2196/33081 + urn:nbn:nl:ui:15-70bf9bd0-5ea6-45fd-bb62-8d79b48cd69f + + + https://pure.eur.nl/en/publications/70bf9bd0-5ea6-45fd-bb62-8d79b48cd69f + + + + + + +
+
\ No newline at end of file diff --git a/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/edith-demo/10.3390-pr9111967-covid.xml b/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/edith-demo/10.3390-pr9111967-covid.xml new file mode 100644 index 000000000..6287f90ee --- /dev/null +++ b/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/edith-demo/10.3390-pr9111967-covid.xml @@ -0,0 +1,223 @@ + + +
+ doi_________::c166d06aeaed817937a79a400906a4b9 + 2023-03-09T00:12:02.045Z + 2023-03-09T00:24:00.8Z +
+ + + + + + + + + 50|openapc_____::c166d06aeaed817937a79a400906a4b9 + 10.3390/pr9111967 + pr9111967 + 50|doiboost____::c166d06aeaed817937a79a400906a4b9 + 3209532762 + 10.3390/pr9111967 + + + + + + + Digital Twins for Continuous mRNA Production + + + 2021-11-04 + The global coronavirus pandemic continues to restrict public life worldwide. An + effective means of limiting the pandemic is vaccination. Messenger ribonucleic acid (mRNA) + vaccines currently available on the market have proven to be a well-tolerated and effective + class of vaccine against coronavirus type 2 (CoV2). Accordingly, demand is presently + outstripping mRNA vaccine production. One way to increase productivity is to switch from the + currently performed batch to continuous in vitro transcription, which has proven to be a crucial + material-consuming step. In this article, a physico-chemical model of in vitro mRNA + transcription in a tubular reactor is presented and compared to classical batch and continuous + in vitro transcription in a stirred tank. The three models are validated based on a distinct and + quantitative validation workflow. Statistically significant parameters are identified as part of + the parameter determination concept. Monte Carlo simulations showed that the model is precise, + with a deviation of less than 1%. The advantages of continuous production are pointed out + compared to batchwise in vitro transcription by optimization of the space–time yield. + Improvements of a factor of 56 (0.011 µM/min) in the case of the continuously stirred tank + reactor (CSTR) and 68 (0.013 µM/min) in the case of the plug flow reactor (PFR) were found. + + Process Chemistry and Technology + + Chemical Engineering (miscellaneous) + + Bioengineering + + Coronavirus + + medicine.disease_cause + + medicine + + Continuous production + + Messenger RNA + + Continuous stirred-tank reactor + + Plug flow reactor model + + Mathematics + + In vitro transcription + + Biological system + + Yield (chemistry) + + Public life + + 03 medical and health sciences + + 0301 basic medicine + + 030104 Developmental Biology + + 0303 health sciences + + 030304 Developmental Biology + + 02 engineering and technology + + 0210 nano-technology + + 021001 Nanoscience & + Nanotechnology + + 01 natural sciences + + 0104 chemical sciences + + 010405 Organic Chemistry + + + 2021-11-05 + + 2021-11-04 + + Crossref + + + + 2146.08 + EUR + Processes + + + + false + false + 0.9 + null + + + + + + + + + 2021-11-04 + + 10.3390/pr9111967 + + + https://creativecommons.org/licenses/by/4.0/ + + https://doi.org/10.3390/pr9111967 + + + + + + +
+
\ No newline at end of file diff --git a/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/fields.xml b/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/fields.xml index 910a366f6..670db93b0 100644 --- a/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/fields.xml +++ b/dhp-workflows/dhp-graph-provision/src/test/resources/eu/dnetlib/dhp/oa/provision/fields.xml @@ -1,175 +1,348 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + diff --git a/pom.xml b/pom.xml index fb132bb02..2dd1ec428 100644 --- a/pom.xml +++ b/pom.xml @@ -801,7 +801,7 @@ 3.3.3 3.4.2 [2.12,3.0) - [2.12.1-patched] + [2.13.1-patched] [4.0.3] [6.0.5] [3.1.6]